初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

View File

@@ -0,0 +1,115 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\memberconsume\shop\controller;
use app\shop\controller\BaseShop;
use addon\memberconsume\model\Consume;
/**
* 会员消费
*/
class Config extends BaseShop
{
/**
* 消费返积分
*/
public function index()
{
if (request()->isJson()) {
//订单消费返积分设置数据
$data = [
'is_recovery_reward' => input('is_recovery_reward', 0),
'is_return_point' => input('is_return_point', 0),
'return_point_rate' => input('return_point_rate', 0),
'is_return_growth' => input('is_return_growth', 0),
'return_growth_rate' => input('return_growth_rate', 0),
'is_return_coupon' => input('is_return_coupon', 0),
'return_coupon' => input('return_coupon', ''),
];
$this->addLog('设置会员消费奖励');
$is_use = input('is_use', 0);//是否启用
$config_model = new Consume();
$res = $config_model->setConfig($data, $is_use, $this->site_id);
return $res;
} else {
$event_list = array (
[ 'name' => 'pay', 'title' => '订单付款'],
[ 'name' => 'receive', 'title' => '订单收货'],
[ 'name' => 'complete', 'title' => '订单完成'],
);
$this->assign('event_list', $event_list);
$config_model = new Consume();
//订单返积分设置
$config_result = $config_model->getConfig($this->site_id);
$this->assign('config', $config_result[ 'data' ]);
return $this->fetch('config/index');
}
}
/**
* 奖励记录
*/
public function lists()
{
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$status = input('status', '');
$order_no = input('order_no', '');
$username = input('username', '');
$condition = [];
if ($status !== '') {
$condition[] = [ 'pcr.type', '=', $status ];
}
if ($order_no) {
$condition[] = [ 'o.order_no', 'like', '%' . $order_no . '%' ];
}
if ($username) {
$condition[] = [ 'm.username', 'like', '%' . $username . '%' ];
}
$condition[] = [ 'pcr.site_id', '=', $this->site_id ];
$order = 'pcr.create_time desc';
$field = 'pcr.*,m.username,m.nickname,m.mobile,m.headimg,o.order_no';
$alias = 'pcr';
$join = [
[ 'member m', 'pcr.member_id = m.member_id', 'left' ],
[ 'order o', 'pcr.order_id = o.order_id', 'left' ],
];
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if ($start_time && !$end_time) {
$condition[] = [ 'pcr.create_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'pcr.create_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$condition[] = [ 'pcr.create_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
}
$config_model = new Consume();
$res = $config_model->getConsumeRecordPageList($condition, $page, $page_size, $order, $field, $alias, $join);
return $res;
} else {
$event_list = array (
[ 'name' => 'coupon', 'title' => '优惠券'],
[ 'name' => 'point', 'title' => '积分'],
[ 'name' => 'growth', 'title' => '成长值'],
);
$this->assign('event_list', $event_list);
return $this->fetch('config/lists');
}
}
}

View File

@@ -0,0 +1,158 @@
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">是否开启:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_use" lay-filter="is_use" value="1" lay-skin="switch" {if !empty($config) && $config.is_use==1 } checked {/if} >
</div>
<div class="word-aux">活动开启后用户在付款完成后将按活动设置发放相关奖励</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">奖励回收:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_recovery_reward" {if !empty($config) && $config.value.is_recovery_reward == 1 } checked {/if} value="1" title="是">
<input type="radio" name="is_recovery_reward" {if empty($config) || $config.value.is_recovery_reward == 0 } checked {/if} value="0" title="否">
</div>
</div>
<div class="word-aux">如果开启奖励回收,用户退款维权成功后,已发放的奖励会进行回收</div>
<div class="word-aux">回收说明:已使用的优惠券将无法收回,如果会员剩余积分/成长值不足将只扣除至0</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">奖励类型:</label>
<div class="layui-input-block">
<input type="checkbox" name="reward_type" lay-filter="reward_type" value="point" lay-skin="primary" {if isset($config.value.is_return_point) && $config.value.is_return_point == 1}checked{/if} title="送积分">
<input type="checkbox" name="reward_type" lay-filter="reward_type" value="growth" lay-skin="primary" {if isset($config.value.is_return_growth) && $config.value.is_return_growth == 1}checked{/if} title="送成长值">
<input type="checkbox" name="reward_type" lay-filter="reward_type" value="coupon" lay-skin="primary" {if isset($config.value.is_return_coupon) && $config.value.is_return_coupon == 1}checked{/if} title="送优惠券">
</div>
<input type="hidden" lay-verify="reward_type"/>
</div>
<div class="layui-form-item reward-content point {if !isset($config.value.is_return_point) || $config.value.is_return_point == 0}layui-hide{/if}">
<label class="layui-form-label">奖励积分:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="return_point_rate" value="{if condition="!empty($config.value)"}{$config.value.return_point_rate}{else/}0{/if}" lay-verify="return_point_rate" autocomplete="off" class="layui-input len-short">
</div>
<span class="layui-form-mid">%</span>
</div>
<div class="word-aux">比率必须为0-100的整数当设置为100时每消费1元奖励1个积分</div>
</div>
<div class="layui-form-item reward-content growth {if !isset($config.value.is_return_growth) || $config.value.is_return_growth == 0}layui-hide{/if}">
<label class="layui-form-label">奖励成长值:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="number" name="return_growth_rate" value="{if condition="!empty($config.value)"}{$config.value.return_growth_rate ?: 0}{else/}0{/if}" lay-verify="return_growth_rate" autocomplete="off" class="layui-input len-short">
</div>
<span class="layui-form-mid">%</span>
</div>
<div class="word-aux">比率必须为0-100的整数当设置为100时每消费1元奖励1个成长值</div>
</div>
<div class="layui-form-item reward-content coupon {if !isset($config.value.is_return_coupon) || $config.value.is_return_coupon == 0}layui-hide{/if}">
<label class="layui-form-label">奖励优惠券:</label>
<div class="layui-input-block">
<div><a href="javascript:;" class="text-color" id="select_coupon">选择优惠券</a></div>
<div class="word-aux" style="margin-left: 0">
<p>活动优惠券发放,不受优惠券自身数量和领取数量的限制</p>
</div>
<div id="coupon_list"></div>
<input type="hidden" lay-verify="return_coupon_ids"/>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script type="text/javascript" src="STATIC_JS/coupon_select.js"></script>
<script >
var laytpl;
var coupon_select = new CouponSelect({
tableElem:'#coupon_list',
selectElem:'#select_coupon',
selectedIds:'{$config.value.return_coupon}',
})
layui.use(['form','laytpl'], function(){
// 监听返积分是否启用
var form = layui.form,
repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form.render();
form.on('checkbox(reward_type)', function (data){
var reward_type = data.value;
var dom = $(".reward-content."+reward_type);
if(data.elem.checked){
dom.removeClass('layui-hide');
}else{
dom.addClass('layui-hide');
}
})
form.on('submit(save)', function(data){
if (repeat_flag) return;
repeat_flag = true;
data.field.is_return_point = getRewardTypeIsReturn('point');
data.field.is_return_growth = getRewardTypeIsReturn('growth');
data.field.is_return_coupon = getRewardTypeIsReturn('coupon');
if(!data.field.is_return_point) data.field.return_point_rate = 0;
if(!data.field.is_return_growth) data.field.return_growth_rate = 0;
if(data.field.is_return_coupon) data.field.return_coupon = coupon_select.getSelectedData().selectedIds.toString();
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("memberconsume://shop/config/index"),
data: data.field,
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
});
form.verify({
reward_type:function (value){
var checked_num = $("input[name='reward_type']:checked").length;
var is_use = $("input[name='is_use']:checked").length;
if(is_use && !checked_num){
return '请至少设置一种奖励';
}
},
return_point_rate: function(value){
return checkReturnRate('point', value);
},
return_growth_rate: function(value){
return checkReturnRate('growth', value);
},
return_coupon_ids: function (value){
var checked = getRewardTypeIsReturn('coupon');
if(checked && coupon_select.getSelectedData().selectedIds.length == 0){
return '请选择优惠券';
}
}
});
function checkReturnRate(reward_type, value){
var checked = getRewardTypeIsReturn(reward_type);
if(checked && !ns.getRegexp('>0num').test(value) || value > 100){
return '请输入1-100之间的整数';
}
}
function getRewardTypeIsReturn(reward_type){
return $("input[name='reward_type'][value='"+reward_type+"']:checked").length ? 1 : 0;
}
});
function back(){
location.hash = ns.hash("shop/promotion/market");
}
</script>

View File

@@ -0,0 +1,188 @@
<style>
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin .table-tab .layui-tab-title{margin-bottom: 15px;}
</style>
<!-- 搜索框 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">会员昵称:</label>
<div class="layui-input-inline">
<input type="text" name="username" placeholder="请输入会员昵称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">订单编号:</label>
<div class="layui-input-inline">
<input type="text" name="order_no" placeholder="请输入订单编号" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">奖励时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="activity_tab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="">全部</li>
{foreach $event_list as $k => $v}
<li lay-id="{$v['name']}">{$v['title']}</li>
{/foreach}
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="activity_list" lay-filter="activity_list"></table>
</div>
</div>
<!-- 状态 -->
<script type="text/html" id="status">
{{ d.status == 0 ? '已下架' : '已上架' }}
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">查看订单</a>
</div>
</script>
<script type="text/html" id="member_info">
<div class="table-title">
<div class="title-pic">
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' "/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color"
title="{{d.nickname}}">{{d.nickname}}</a>
</div>
</div>
</script>
<script>
layui.use(['form','element','laydate'], function() {
var table,
form = layui.form,
element = layui.element,
laydate = layui.laydate;
form.render();
element.on('tab(activity_tab)', function(){
table.reload({
page: {
curr: 1
},
where:{
'status':this.getAttribute('lay-id')
}
});
});
table = new Table({
elem: '#activity_list',
url: ns.url("memberconsume://shop/config/lists"),
cols: [
[{
title: '会员信息',
unresize: 'false',
width: '20%',
templet: '#member_info'
}, {
field: 'remark',
title: '内容',
unresize: 'false',
width: '30%'
}, {
title: '奖励类型',
unresize: 'false',
width: '20%',
align: 'left',
templet: function(data) {
if(data.type == 'point'){
return '积分';
}
if(data.type == 'growth'){
return '成长值';
}
if(data.type == 'coupon'){
return '优惠券';
}
}
}, {
field: 'create_time',
title: '奖励时间',
unresize: 'false',
width: '20%',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'detail': //详情
location.hash = ns.hash("shop/order/detail", {"order_id": data.order_id});
break;
}
});
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime'
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function add() {
location.hash = ns.hash("bundling://shop/bundling/add");
}
</script>