Browse Source

fix:订单数据

super-yimizi 1 day ago
parent
commit
e226fb1d06

+ 97 - 23
application/admin/controller/commission/Level.php

@@ -33,21 +33,44 @@ class Level extends Backend
     }
     
     /**
+     * 查看
+     */
+    public function index()
+    {
+        if (!$this->request->isAjax()) {
+            return $this->view->fetch();
+        }
+
+        list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+        
+        $list = $this->model
+                ->where($where)
+                ->order($sort, $order)
+                ->paginate($limit);
+
+        $result = array("total" => $list->total(), "rows" => $list->items());
+        return json($result);
+    }
+    
+    /**
      * 确保默认等级存在
      */
     private function ensureDefaultLevel()
     {
-        $defaultLevel = $this->model->find(1);
+        $defaultLevel = $this->model->where('level', 1)->find();
         if (!$defaultLevel) {
-            $this->model->save([
+            $data = [
                 'name' => '默认等级',
                 'level' => 1,
-                'commission_rules' => [
-                    'commission_self' => '0.00',
-                    'commission_first' => '0.00',
-                    'commission_second' => '0.00'
-                ]
-            ]);
+                'commission_rules' => json_encode([
+                    'commission_1' => '0.00',
+                    'commission_2' => '0.00',
+                    'commission_3' => '0.00'
+                ]),
+                'upgrade_type' => 0,
+                'upgrade_rules' => json_encode([])
+            ];
+            $this->model->save($data);
         }
     }
 
@@ -61,7 +84,23 @@ class Level extends Backend
             return $this->view->fetch();
         }
 
-        $params = $this->request->only(['name', 'level', 'image', 'commission_rules', 'upgrade_type', 'upgrade_rules']);
+        $params = $this->request->post("row/a");
+        
+        if (empty($params)) {
+            $this->error(__('Parameter %s can not be empty', 'row'));
+        }
+        
+        // 只保留允许的字段
+        $params = array_intersect_key($params, array_flip(['level', 'name', 'image', 'commission_rules']));
+        
+        // 处理JSON字段
+        if (isset($params['commission_rules']) && is_array($params['commission_rules'])) {
+            $params['commission_rules'] = json_encode($params['commission_rules']);
+        }
+        
+        // 设置默认值
+        $params['upgrade_type'] = 0;
+        $params['upgrade_rules'] = null;
 
         $this->model->save($params);
 
@@ -73,25 +112,52 @@ class Level extends Backend
      *
      * @param  $id
      */
-    public function edit($id = null)
+    public function edit($ids = null)
     {
+        $row = $this->model->where('level', $ids)->find();
+        if (!$row) {
+            $this->error(__('No Results were found'));
+        }
+        
         if (!$this->request->isAjax()) {
+            // 解析commission_rules JSON数据供编辑页面使用
+            if ($row['commission_rules']) {
+                if (is_string($row['commission_rules'])) {
+                    // 如果是字符串,则解码
+                    $commission_rules = json_decode($row['commission_rules'], true);
+                    if ($commission_rules) {
+                        $row['commission_rules'] = $commission_rules;
+                    }
+                } elseif (is_array($row['commission_rules'])) {
+                    // 如果已经是数组,直接使用
+                    // commission_rules 已经是数组了,无需处理
+                }
+            }
+            
+            $this->view->assign("row", $row);
             return $this->view->fetch('add');
         }
 
-        $params = $this->request->only(['level', 'name', 'image', 'commission_rules', 'upgrade_type', 'upgrade_rules']);
-
-        $result = Db::transaction(function () use ($id, $params) {
-
-            $this->svalidate($params);
-
-            $data = $this->model->where('level', $id)->find();
-            if (!$data) {
-                $this->error(__('No Results were found'));
-            }
+        $params = $this->request->post("row/a");
+        
+        if (empty($params)) {
+            $this->error(__('Parameter %s can not be empty', 'row'));
+        }
+        
+        // 只保留允许的字段
+        $params = array_intersect_key($params, array_flip(['level', 'name', 'image', 'commission_rules']));
+        
+        // 如果是编辑1级(默认等级),不允许修改level字段
+        if ($row['level'] == 1) {
+            unset($params['level']); // 移除level参数,保持原值
+        }
+        
+        // 处理JSON字段
+        if (isset($params['commission_rules']) && is_array($params['commission_rules'])) {
+            $params['commission_rules'] = json_encode($params['commission_rules']);
+        }
+        $result = $this->model->where('level', $ids)->update($params);
 
-            return $data->save($params);
-        });
 
         if ($result) {
             $this->success('更新成功', null, $result);
@@ -145,7 +211,15 @@ class Level extends Backend
             return $this->view->fetch();
         }
 
-        $data = $this->model->sheepFilter()->field('level, name, image, commission_rules')->select();
+        $data = $this->model->order('level', 'asc')->field('level, name, image, commission_rules')->select();
+        
+        // 解码JSON字段
+        foreach ($data as &$item) {
+            if (!empty($item['commission_rules'])) {
+                $item['commission_rules'] = json_decode($item['commission_rules'], true);
+            }
+        }
+        
         $this->success('选择等级', null, $data);
     }
 }

+ 70 - 36
application/admin/view/commission/level/add.html

@@ -1,22 +1,58 @@
+<style>
+    .level-select-container {
+        display: flex;
+        flex-wrap: wrap;
+        gap: 10px;
+        margin-bottom: 20px;
+    }
+    
+    .level-select-item {
+        margin-right: 10px;
+        margin-bottom: 10px;
+        cursor: pointer;
+        min-width: 80px;
+    }
+    
+    .level-select-item.disabled {
+        background-color: #ddd;
+        cursor: not-allowed;
+        opacity: 0.6;
+        pointer-events: none; /* 完全禁用点击 */
+    }
+    
+    .level-select-item.disabled.active {
+        background-color: #666;
+        color: white;
+    }
+    
+    .level-select-item.active {
+        background-color: #5cb85c;
+        color: white;
+    }
+    
+</style>
+
 <form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
 
     <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Level')}:</label>
+        <label class="control-label col-xs-12 col-sm-2">等级权重:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-level" data-rule="required" class="form-control" name="row[level]" type="number">
+            <input id="c-level" data-rule="required" class="form-control" name="row[level]" type="hidden" value="{$row.level|default=''}">
+            <div class="level-select-container"></div>
+            <span class="help-block">选择一个等级权重</span>
         </div>
     </div>
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" placeholder="请输入等级名称" value="{$row.name|default=''}">
         </div>
     </div>
     <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
+        <label class="control-label col-xs-12 col-sm-2">{:__('等级徽章')}:</label>
         <div class="col-xs-12 col-sm-8">
             <div class="input-group">
-                <input id="c-image" class="form-control" size="50" name="row[image]" type="text">
+                <input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="{$row.image|default=''}">
                 <div class="input-group-addon no-border no-padding">
                     <span><button type="button" id="faupload-image" class="btn btn-danger faupload" data-input-id="c-image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
                     <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
@@ -26,41 +62,39 @@
             <ul class="row list-inline plupload-preview" id="p-image"></ul>
         </div>
     </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Commission rules')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="row">
-                <div class="col-xs-4">
-                    <label>自购佣金比例(%):</label>
-                    <input class="form-control" name="row[commission_rules][commission_self]" type="number" step="0.01" value="0.00">
-                </div>
-                <div class="col-xs-4">
-                    <label>一级佣金比例(%):</label>
-                    <input class="form-control" name="row[commission_rules][commission_first]" type="number" step="0.01" value="0.00">
+    
+    <div class="panel panel-info">
+        <div class="panel-heading">
+            <h4 class="panel-title">佣金比例设置</h4>
+        </div>
+        <div class="panel-body">
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">一级(自购)佣金比例:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <div class="input-group">
+                        <input class="form-control" name="row[commission_rules][commission_1]" type="number" step="0.01" value="{$row.commission_rules.commission_1|default='0.00'}" data-rule="required">
+                        <span class="input-group-addon">%</span>
+                    </div>
                 </div>
-                <div class="col-xs-4">
-                    <label>二级佣金比例(%):</label>
-                    <input class="form-control" name="row[commission_rules][commission_second]" type="number" step="0.01" value="0.00">
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">二级佣金比例:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <div class="input-group">
+                        <input class="form-control" name="row[commission_rules][commission_2]" type="number" step="0.01" value="{$row.commission_rules.commission_2|default='0.00'}" data-rule="required">
+                        <span class="input-group-addon">%</span>
+                    </div>
                 </div>
             </div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Upgrade type')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            
-            <div class="radio">
-            {foreach name="upgradeTypeList" item="vo"}
-            <label for="row[upgrade_type]-{$key}"><input id="row[upgrade_type]-{$key}" name="row[upgrade_type]" type="radio" value="{$key}" {in name="key" value="0"}checked{/in} /> {$vo}</label> 
-            {/foreach}
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">三级佣金比例:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <div class="input-group">
+                        <input class="form-control" name="row[commission_rules][commission_3]" type="number" step="0.01" value="{$row.commission_rules.commission_3|default='0.00'}" data-rule="required">
+                        <span class="input-group-addon">%</span>
+                    </div>
+                </div>
             </div>
-
-        </div>
-    </div>
-    <div class="form-group upgrade-rules-container" style="display: none;">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Upgrade rules')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <textarea id="c-upgrade_rules" class="form-control" name="row[upgrade_rules]" cols="50" rows="5" placeholder="升级规则JSON格式"></textarea>
         </div>
     </div>
     <div class="form-group layer-footer">

+ 0 - 1
application/admin/view/commission/level/index.html

@@ -6,7 +6,6 @@
             <div class="tab-pane fade active in" id="one">
                 <div class="widget-body no-padding">
                     <div id="toolbar" class="toolbar">
-                        <a href="javascript:;" class="btn btn-success btn-addtabs" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
                         <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
                     </div>
                     <table id="table" class="table table-striped table-bordered table-hover table-nowrap"

+ 19 - 28
application/admin/view/commission/level/select.html

@@ -1,29 +1,20 @@
-{include file="/shopro/common/script" /}
-
-<div id="select" class="level-select" v-cloak>
-    <el-container class="panel-block">
-        <el-header class="sa-header">
-            <el-alert class="mt-4">
-                <template #title>温馨提示:更换等级后,该用户不会降级</template>
-            </el-alert>
-        </el-header>
-        <el-main>
-            <el-table height="100%" class="sa-table" :data="state.data" stripe>
-                <el-table-column prop="name" label="等级信息" min-width="150"></el-table-column>
-                <el-table-column label="等级权重" min-width="90">
-                    <template #default="scope"> 等级{{ scope.row.level }} </template>
-                </el-table-column>
-                <el-table-column label="操作" min-width="80" fixed="right">
-                    <template #default="scope">
-                        <span v-if="scope.row.level == state.level" class="sa-color--info"> 已选择 </span>
-                        <el-button v-else class="is-link" type="primary" @click="onSelect(scope.row.level)">选择
-                        </el-button>
-                    </template>
-                </el-table-column>
-            </el-table>
-        </el-main>
-        <el-footer class="sa-footer--submit sa-flex sa-row-right">
-            <el-button type="primary" @click="onConfirm">确定</el-button>
-        </el-footer>
-    </el-container>
+<div class="panel panel-default panel-intro">
+    <div class="panel-heading">
+        <div class="panel-title">选择分销商等级</div>
+    </div>
+    
+    <div class="panel-body">
+        <div class="alert alert-info">
+            <i class="fa fa-info-circle"></i> 温馨提示:更换等级后,该用户不会降级
+        </div>
+        
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
 </div>

+ 6 - 1
application/common/Service/Pay/PayOperService.php

@@ -292,7 +292,12 @@ class PayOperService
                 //OrderGoodsService::setGoodsStocksDec($order->order_sn);
                 //处理发票审核改为等待开具 、 
                 // 处理活动,加入拼团,完成拼团,添加赠品记录等 、 将订单参与活动信息改为已支付
-                // todo  支付成功后续使用异步队列处理   
+                // todo  支付成功后续使用异步队列处理 
+                $order = Order::with('items')
+                ->where('id', $order->id)
+                ->find();
+                $data = ['order' => $order, 'user' => $user];
+                \think\Hook::listen('order_paid_after', $data);
                 // 分销逻辑
             }     
         } 

+ 43 - 0
application/common/Service/User/UserService.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace app\common\Service\User;
+
+use app\common\exception\BusinessException;
+use app\common\model\User as UserModel;
+
+class UserService
+{
+
+    public static function getUserById($userId = 0)
+    {        
+        return UserModel::where('id', $userId)->find();;
+    }
+
+    /**
+     * @name 追加消费金额和总订单数
+     * @param  int|object   $userId      会员ID
+     * @param  float        $amount      变更金额
+     * @param  int          $orderCount  订单数量增量,默认为1
+     * @return boolean
+     */
+    public static function consume($userId = 0, $amount, $orderCount = 1)
+    {
+        // 判断金额
+        if ($amount == 0) {
+            return false;
+        }
+        $user = self::getUserById($userId);        
+        if (!$user) {
+            throw new BusinessException('未找到用户');
+        }
+        
+        // 更新会员消费金额和订单数量
+        $user->setInc('total_consume', $amount);
+        if ($orderCount > 0) {
+            $user->setInc('order_count', $orderCount);
+        }
+
+        return true;
+    }
+
+}

+ 24 - 0
application/listeners/Order.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\listeners;
+
+use app\common\Service\User\UserService;
+
+
+class Order
+{
+   
+
+    // 订单支付后
+    public function orderPaidAfter($params)
+    {
+        // 订单支付成功
+        $order = $params['order'];
+        $user = $params['user'];
+        // 添加消费金额
+        UserService::consume($user, $order['pay_fee']);     
+    }
+
+
+
+}

+ 3 - 0
application/tags.php

@@ -43,6 +43,9 @@ return [
     ],
     // 订单支付后
     'order_paid_after' => [
+        // 统计数量
+        'app\\listeners\\Order',
+        // 分销处理的 
         'app\\listeners\\Commission',
     ],
     // 订单确认收货

+ 123 - 55
public/assets/js/backend/commission/level.js

@@ -25,28 +25,40 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 columns: [
                     [
                         {checkbox: true},
-                        {field: 'level', title: __('等级权重'), width: 80},
+                        {field: 'level', title: __('等级权重'), width: 80, formatter: function(value, row, index) {
+                            return '等级' + value;
+                        }},
                         {field: 'name', title: __('等级名称'), operate: 'LIKE'},
                         {field: 'image', title: __('等级徽章'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
-                        {field: 'commission_rules.commission_1', title: __('一级佣金比例'), operate: false, formatter: function(value, row, index) {
-                            return (value || '0.00') + '%';
+                        {field: 'commission_rules', title: __('一级佣金比例'), operate: false, formatter: function(value, row, index) {
+                            if (typeof value === 'string') {
+                                try {
+                                    value = JSON.parse(value);
+                                } catch (e) {
+                                    value = {};
+                                }
+                            }
+                            return (value.commission_1 || '0.00') + '%';
                         }},
-                        {field: 'commission_rules.commission_2', title: __('二级佣金比例'), operate: false, formatter: function(value, row, index) {
-                            return (value || '0.00') + '%';
+                        {field: 'commission_rules', title: __('二级佣金比例'), operate: false, formatter: function(value, row, index) {
+                            if (typeof value === 'string') {
+                                try {
+                                    value = JSON.parse(value);
+                                } catch (e) {
+                                    value = {};
+                                }
+                            }
+                            return (value.commission_2 || '0.00') + '%';
                         }},
-                        {field: 'commission_rules.commission_3', title: __('三级佣金比例'), operate: false, formatter: function(value, row, index) {
-                            return (value || '0.00') + '%';
-                        }},
-                        {field: 'upgrade_type', title: __('升级方式'), searchList: {
-                            "0": __('手动升级'),
-                            "1": __('自动升级')
-                        }, formatter: function(value, row, index) {
-                            var typeMap = {
-                                '0': {text: '手动升级', color: 'info'},
-                                '1': {text: '自动升级', color: 'success'}
-                            };
-                            var type = typeMap[value] || {text: value, color: 'default'};
-                            return '<span class="label label-' + type.color + '">' + type.text + '</span>';
+                        {field: 'commission_rules', title: __('三级佣金比例'), operate: false, formatter: function(value, row, index) {
+                            if (typeof value === 'string') {
+                                try {
+                                    value = JSON.parse(value);
+                                } catch (e) {
+                                    value = {};
+                                }
+                            }
+                            return (value.commission_3 || '0.00') + '%';
                         }},
                         {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, 
                          buttons: [
@@ -60,20 +72,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                                  callback: function (data) {
                                      table.bootstrapTable('refresh');
                                  }
-                             },
-                             {
-                                 name: 'del',
-                                 text: __('删除'),
-                                 title: __('删除'),
-                                 classname: 'btn btn-xs btn-danger btn-delone',
-                                 icon: 'fa fa-trash',
-                                 url: 'commission/level/delete',
-                                 visible: function (row) {
-                                     return row.level != 1; // 默认等级不能删除
-                                 },
-                                 callback: function (data) {
-                                     table.bootstrapTable('refresh');
-                                 }
                              }
                          ], 
                          formatter: Table.api.formatter.operate}
@@ -138,36 +136,106 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             Table.api.bindevent(table);
         },
         api: {
+            // 默认等级选项
+            defaultLevels: [
+                {name: '一级', level: 1},
+                {name: '二级', level: 2},
+                {name: '三级', level: 3},
+                {name: '四级', level: 4},
+                {name: '五级', level: 5},
+                {name: '六级', level: 6},
+                {name: '七级', level: 7},
+                {name: '八级', level: 8},
+                {name: '九级', level: 9},
+                {name: '十级', level: 10}
+            ],
+            
             bindevent: function () {
                 Form.api.bindevent($("form[role=form]"));
                 
-                // 绑定升级类型变化事件
-                $(document).on('change', 'input[name="row[upgrade_type]"]', function() {
-                    var value = $(this).val();
-                    var upgradeRulesContainer = $('.upgrade-rules-container');
-                    if (value == '1') {
-                        upgradeRulesContainer.show();
-                    } else {
-                        upgradeRulesContainer.hide();
+                var self = this;
+                
+                // 初始化页面数据
+                self.initPageData();
+                
+                // 绑定等级选择事件
+                $(document).on('click', '.level-select-item', function() {
+                    var level = $(this).data('level');
+                    
+                    // 如果是禁用的按钮,不执行任何操作
+                    if ($(this).hasClass('disabled')) {
+                        return false;
+                    }
+                    
+                    var existLevels = $('.level-select-item.disabled').map(function() {
+                        return $(this).data('level');
+                    }).get();
+                    
+                    if (existLevels.indexOf(level) === -1) {
+                        $('.level-select-item').removeClass('active');
+                        $(this).addClass('active');
+                        $('input[name="row[level]"]').val(level);
                     }
                 });
-
-                // 添加升级条件
-                $(document).on('click', '.add-upgrade-rule', function() {
-                    var container = $(this).closest('.upgrade-rules-container').find('.upgrade-rules-list');
-                    var template = container.find('.upgrade-rule-item:first').clone();
-                    template.find('input').val('');
-                    container.append(template);
-                });
-
-                // 删除升级条件
-                $(document).on('click', '.remove-upgrade-rule', function() {
-                    var item = $(this).closest('.upgrade-rule-item');
-                    var container = item.closest('.upgrade-rules-list');
-                    if (container.find('.upgrade-rule-item').length > 1) {
-                        item.remove();
+            },
+            
+            initPageData: function() {
+                var self = this;
+                var currentLevel = $('input[name="row[level]"]').val();
+                var isEdit = currentLevel ? true : false;
+                
+                // 获取已存在的等级
+                $.ajax({
+                    url: Fast.api.fixurl('commission/level/select'),
+                    type: 'GET',
+                    success: function(ret) {
+                        if (ret.code === 1) {
+                            var existLevels = ret.data.map(function(item) {
+                                return parseInt(item.level);
+                            });
+                            
+                            if (isEdit) {
+                                // 编辑模式,移除当前编辑的等级
+                                var index = existLevels.indexOf(parseInt(currentLevel));
+                                if (index > -1) {
+                                    existLevels.splice(index, 1);
+                                }
+                            }
+                            
+                            self.renderLevelSelect(existLevels, currentLevel);
+                        } else {
+                            // 请求成功但返回错误,至少显示基本的等级选择器
+                            self.renderLevelSelect([], currentLevel);
+                        }
+                    },
+                    error: function(xhr, status, error) {
+                        // Ajax请求失败,至少显示基本的等级选择器
+                        self.renderLevelSelect([], currentLevel);
                     }
                 });
+            },
+            
+            renderLevelSelect: function(existLevels, currentLevel) {
+                var html = '';
+                
+                // 如果是编辑1级(默认等级),只显示1级并禁用选择
+                if (currentLevel && parseInt(currentLevel) === 1) {
+                    html += '<div class="level-select-item btn btn-default active disabled" data-level="1">';
+                    html += '一级(默认等级,不可修改)';
+                    html += '</div>';
+                } else {
+                    // 非1级或新建时,显示可选等级
+                    this.defaultLevels.forEach(function(item) {
+                        var disabled = existLevels.indexOf(item.level) !== -1 ? 'disabled' : '';
+                        var active = (currentLevel && parseInt(currentLevel) === item.level) ? 'active' : '';
+                        
+                        html += '<div class="level-select-item btn btn-default ' + disabled + ' ' + active + '" data-level="' + item.level + '">';
+                        html += item.name;
+                        html += '</div>';
+                    });
+                }
+                
+                $('.level-select-container').html(html);
             }
         }
     };