Browse Source

fix:后台重新审核

super-yimizi 2 days ago
parent
commit
8293c2f8fb

+ 13 - 0
application/admin/controller/commission/Agent.php

@@ -48,6 +48,19 @@ class Agent extends Backend
         
         [$where, $sort, $order, $offset, $limit] = $this->buildparams();
         
+        // 处理特殊筛选条件
+        $filter = $this->request->get("filter", '');
+        if ($filter) {
+            $filter = json_decode($filter, true);
+            if (isset($filter['tabActive'])) {
+                if ($filter['tabActive'] === 'pending') {
+                    $where['status'] = 'pending';
+                } elseif ($filter['tabActive'] === '0') {
+                    $where['level_status'] = ['>', 0];
+                }
+            }
+        }
+        
         $list = $this->model
             ->with(['user.parent_user', 'level_info', 'level_status_info', 'upgrade_level'])
             ->where($where)

+ 62 - 7
application/admin/controller/commission/Apply.php

@@ -42,7 +42,25 @@ class Apply extends Backend
             ->order($sort, $order)
             ->paginate($limit);
         
-        $result = ['total' => $list->total(), 'rows' => $list->items()];
+        // 标识是否是重新审核的申请
+        $rows = $list->items();
+        
+        // 使用IN查询一次性获取所有相关代理商数据,避免N+1查询问题
+        $userIds = array_column($rows, 'user_id');
+        $existAgents = [];
+        if (!empty($userIds)) {
+            $existAgents = \app\common\model\commission\Agent::where('user_id', 'in', $userIds)
+                ->column('user_id', 'user_id');
+        }
+        
+        foreach ($rows as $row) {
+            // 检查用户是否已经是代理商
+            $isExist = isset($existAgents[$row['user_id']]);
+            $row['is_reaudit'] = $isExist;
+            $row['is_reaudit_text'] = $isExist ? '重新审核' : '首次申请';
+        }
+        
+        $result = ['total' => $list->total(), 'rows' => $rows];
         return json($result);
     }
 
@@ -79,12 +97,20 @@ class Apply extends Backend
             $this->error('该申请已经处理过了');
         }
         
+        // 检查是否是重新审核(用户已经是代理商)
+        $existAgent = \app\common\model\commission\Agent::where('user_id', $row->user_id)->find();
+        $isReaudit = $existAgent ? true : false;
+        
         Db::transaction(function () use ($row) {
             $service = new AgentApplyService();
             $service->approveApply($row, $this->auth->id);
         });
         
-        $this->success('审核通过成功');
+        if ($isReaudit) {
+            $this->success('重新审核通过成功,代理商资料已更新');
+        } else {
+            $this->success('审核通过成功,代理商已创建');
+        }
     }
 
     /**
@@ -170,17 +196,46 @@ class Apply extends Backend
             
             $ids = explode(',', $ids);
             $service = new AgentApplyService();
+            $successCount = 0;
+            $reauditCount = 0;
             
-            Db::transaction(function () use ($ids, $service) {
-                foreach ($ids as $id) {
-                    $row = $this->model->get($id);
-                    if ($row && $row->status == ApplyModel::STATUS_PENDING) {
+            Db::transaction(function () use ($ids, $service, &$successCount, &$reauditCount) {
+                // 获取所有待审核的申请记录
+                $rows = $this->model->where('id', 'in', $ids)
+                    ->where('status', ApplyModel::STATUS_PENDING)
+                    ->select();
+                
+                if (!$rows->isEmpty()) {
+                    // 使用IN查询一次性获取所有相关代理商数据,避免N+1查询问题
+                    $userIds = $rows->column('user_id');
+                    $existAgents = [];
+                    if (!empty($userIds)) {
+                        $existAgents = \app\common\model\commission\Agent::where('user_id', 'in', $userIds)
+                            ->column('user_id', 'user_id');
+                    }
+                    
+                    foreach ($rows as $row) {
+                        // 检查是否是重新审核
+                        if (isset($existAgents[$row->user_id])) {
+                            $reauditCount++;
+                        } else {
+                            $successCount++;
+                        }
+                        
                         $service->approveApply($row, $this->auth->id);
                     }
                 }
             });
             
-            $this->success('批量审核成功');
+            $message = "批量审核完成";
+            if ($successCount > 0) {
+                $message .= ",新创建代理商 {$successCount} 个";
+            }
+            if ($reauditCount > 0) {
+                $message .= ",重新审核通过 {$reauditCount} 个";
+            }
+            
+            $this->success($message);
         } elseif ($action == 'del') {
             // 批量删除
             return $this->del($ids);

+ 1 - 0
application/admin/lang/zh-cn/commission/apply.php

@@ -15,6 +15,7 @@ return [
     'Approve' => '审核通过',
     'Reject' => '审核拒绝',
     'Operate' => '操作',
+    'Audit Type' => '审核类型',
     
     // 申请类型
     'Personal apply' => '个人申请',

+ 216 - 76
application/admin/view/commission/agent/detail.html

@@ -2,89 +2,229 @@
 
     <div class="panel-heading">
         {:build_heading(null,FALSE)}
+        <div class="panel-tools pull-right">
+            <a href="javascript:;" class="btn btn-primary btn-xs btn-refresh" title="刷新">
+                <i class="fa fa-refresh"></i> 刷新
+            </a>
+        </div>
     </div>
 
     <div class="panel-body">
         <div class="row">
             <div class="col-md-6">
-                <h4>分销商信息</h4>
-                <table class="table table-bordered">
-                    <tr>
-                        <td width="30%">用户ID</td>
-                        <td>{$row.user_id}</td>
-                    </tr>
-                    <tr>
-                        <td>昵称</td>
-                        <td>{$row.user.nickname|default='-'}</td>
-                    </tr>
-                    <tr>
-                        <td>手机号</td>
-                        <td>{$row.user.mobile|default='-'}</td>
-                    </tr>
-                    <tr>
-                        <td>分销等级</td>
-                        <td>{$row.level_info.name|default='-'} (等级{$row.level})</td>
-                    </tr>
-                    <tr>
-                        <td>状态</td>
-                        <td>
-                            {switch name="row.status"}
-                            {case value="normal"}<span class="label label-success">正常</span>{/case}
-                            {case value="pending"}<span class="label label-warning">审核中</span>{/case}
-                            {case value="freeze"}<span class="label label-info">冻结</span>{/case}
-                            {case value="forbidden"}<span class="label label-danger">禁用</span>{/case}
-                            {case value="reject"}<span class="label label-danger">拒绝</span>{/case}
-                            {default /}<span class="label label-default">{$row.status}</span>
-                            {/switch}
-                        </td>
-                    </tr>
-                    <tr>
-                        <td>总收益</td>
-                        <td>{$row.total_income}元</td>
-                    </tr>
-                    <tr>
-                        <td>成为分销商时间</td>
-                        <td>{$row.become_time|datetime}</td>
-                    </tr>
-                </table>
+                <div class="box box-success">
+                    <div class="box-header with-border">
+                        <h3 class="box-title">分销商信息</h3>
+                    </div>
+                    <div class="box-body">
+                        <div class="row">
+                            <div class="col-xs-12 text-center" style="margin-bottom: 15px;">
+                                <img src="{$row.user.avatar|default='/assets/img/avatar.png'}" 
+                                     style="width: 80px; height: 80px; border-radius: 50%;" 
+                                     alt="用户头像">
+                                <h4 style="margin: 10px 0;">{$row.user.nickname|default='用户'.$row.user_id}</h4>
+                            </div>
+                        </div>
+                        <table class="table table-bordered">
+                            <tr>
+                                <td width="30%">用户ID</td>
+                                <td>{$row.user_id}</td>
+                            </tr>
+                            <tr>
+                                <td>手机号</td>
+                                <td>{$row.user.mobile|default='-'}</td>
+                            </tr>
+                            <tr>
+                                <td>分销等级</td>
+                                <td>
+                                    {$row.level_info.name|default='-'} (等级{$row.level})
+                                    {if $auth->check('commission/agent/edit')}
+                                    <button class="btn btn-xs btn-primary" onclick="changeLevel({$row.user_id})">更换</button>
+                                    {/if}
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>状态</td>
+                                <td>
+                                    {switch name="row.status"}
+                                    {case value="normal"}<span class="label label-success">正常</span>{/case}
+                                    {case value="pending"}<span class="label label-warning">审核中</span>{/case}
+                                    {case value="freeze"}<span class="label label-info">冻结</span>{/case}
+                                    {case value="forbidden"}<span class="label label-danger">禁用</span>{/case}
+                                    {case value="reject"}<span class="label label-danger">拒绝</span>{/case}
+                                    {default /}<span class="label label-default">{$row.status}</span>
+                                    {/switch}
+                                    {if $auth->check('commission/agent/edit')}
+                                    <button class="btn btn-xs btn-warning" onclick="changeStatus({$row.user_id}, '{$row.status}')">修改状态</button>
+                                    {/if}
+                                </td>
+                            </tr>
+                            {if $row.level_status GT 0}
+                            <tr>
+                                <td>待升级等级</td>
+                                <td>
+                                    {$row.level_status_info.name|default='-'} (等级{$row.level_status})
+                                    {if $auth->check('commission/agent/edit')}
+                                    <button class="btn btn-xs btn-success" onclick="approveLevel({$row.user_id}, {$row.level_status})">同意</button>
+                                    <button class="btn btn-xs btn-danger" onclick="rejectLevel({$row.user_id})">拒绝</button>
+                                    {/if}
+                                </td>
+                            </tr>
+                            {/if}
+                            <tr>
+                                <td>上级分销商</td>
+                                <td>
+                                    {if $row.user.parent_user}
+                                    {$row.user.parent_user.nickname|default='用户'.$row.user.parent_user_id}
+                                    {else}
+                                    无
+                                    {/if}
+                                    <button class="btn btn-xs btn-primary" onclick="changeParentUser({$row.user_id})">更换</button>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>佣金比例</td>
+                                <td>
+                                    {if $row.level_info.commission_rules}
+                                    一级: {$row.level_info.commission_rules.commission_1|default='0.00'}% | 
+                                    二级: {$row.level_info.commission_rules.commission_2|default='0.00'}% | 
+                                    三级: {$row.level_info.commission_rules.commission_3|default='0.00'}%
+                                    {else}
+                                    -
+                                    {/if}
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>允许升级</td>
+                                <td>
+                                    {if $row.upgrade_lock EQ 0}
+                                    <span class="label label-success">是</span>
+                                    {else}
+                                    <span class="label label-danger">否</span>
+                                    {/if}
+                                    {if $auth->check('commission/agent/edit')}
+                                    <button class="btn btn-xs btn-info" onclick="toggleUpgradeLock({$row.user_id}, {$row.upgrade_lock})">切换</button>
+                                    {/if}
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>成为分销商时间</td>
+                                <td>{$row.become_time|datetime}</td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
             </div>
             <div class="col-md-6">
-                <h4>团队数据</h4>
-                <table class="table table-bordered">
-                    <tr>
-                        <td width="30%">直推分销商</td>
-                        <td>{$row.child_agent_count_1}</td>
-                    </tr>
-                    <tr>
-                        <td>二级分销商</td>
-                        <td>{$row.child_agent_count_2}</td>
-                    </tr>
-                    <tr>
-                        <td>团队分销商</td>
-                        <td>{$row.child_agent_count_all}</td>
-                    </tr>
-                    <tr>
-                        <td>直推订单数</td>
-                        <td>{$row.child_order_count_1}</td>
-                    </tr>
-                    <tr>
-                        <td>团队订单数</td>
-                        <td>{$row.child_order_count_all}</td>
-                    </tr>
-                    <tr>
-                        <td>直推订单金额</td>
-                        <td>{$row.child_order_money_1}元</td>
-                    </tr>
-                    <tr>
-                        <td>团队订单金额</td>
-                        <td>{$row.child_order_money_all}元</td>
-                    </tr>
-                    <tr>
-                        <td>待结算佣金</td>
-                        <td>{$row.pending_reward}元</td>
-                    </tr>
-                </table>
+                <div class="box box-info">
+                    <div class="box-header with-border">
+                        <h3 class="box-title">团队统计</h3>
+                        <div class="box-tools pull-right">
+                            <a href="javascript:;" class="btn btn-primary btn-xs" onclick="viewTeam({$row.user_id})">
+                                <i class="fa fa-users"></i> 查看团队
+                            </a>
+                        </div>
+                    </div>
+                    <div class="box-body">
+                        <div class="row">
+                            <div class="col-sm-6">
+                                <div class="info-box bg-aqua">
+                                    <span class="info-box-icon"><i class="fa fa-users"></i></span>
+                                    <div class="info-box-content">
+                                        <span class="info-box-text">团队人数</span>
+                                        <span class="info-box-number">{$row.child_user_count_all|default=0}</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-sm-6">
+                                <div class="info-box bg-green">
+                                    <span class="info-box-icon"><i class="fa fa-user"></i></span>
+                                    <div class="info-box-content">
+                                        <span class="info-box-text">一级团队人数</span>
+                                        <span class="info-box-number">{$row.child_user_count_1|default=0}</span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-sm-6">
+                                <div class="info-box bg-yellow">
+                                    <span class="info-box-icon"><i class="fa fa-star"></i></span>
+                                    <div class="info-box-content">
+                                        <span class="info-box-text">团队分销商</span>
+                                        <span class="info-box-number">{$row.child_agent_count_all|default=0}</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-sm-6">
+                                <div class="info-box bg-red">
+                                    <span class="info-box-icon"><i class="fa fa-diamond"></i></span>
+                                    <div class="info-box-content">
+                                        <span class="info-box-text">直推分销商</span>
+                                        <span class="info-box-number">{$row.child_agent_count_1|default=0}</span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="box box-warning">
+                    <div class="box-header with-border">
+                        <h3 class="box-title">业绩统计</h3>
+                    </div>
+                    <div class="box-body">
+                        <table class="table table-bordered">
+                            <tr>
+                                <td width="50%">团队分销总金额</td>
+                                <td>{$row.child_order_money_all|default=0}元</td>
+                            </tr>
+                            <tr>
+                                <td>团队分销订单</td>
+                                <td>{$row.child_order_count_all|default=0}单</td>
+                            </tr>
+                            <tr>
+                                <td>一级分销总金额</td>
+                                <td>{$row.child_order_money_1|default=0}元</td>
+                            </tr>
+                            <tr>
+                                <td>一级分销订单</td>
+                                <td>{$row.child_order_count_1|default=0}单</td>
+                            </tr>
+                            <tr>
+                                <td>二级分销总金额</td>
+                                <td>{$row.child_order_money_2|default=0}元</td>
+                            </tr>
+                            <tr>
+                                <td>二级分销订单</td>
+                                <td>{$row.child_order_count_2|default=0}单</td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+
+                <div class="box box-primary">
+                    <div class="box-header with-border">
+                        <h3 class="box-title">资产信息</h3>
+                    </div>
+                    <div class="box-body">
+                        <table class="table table-bordered">
+                            <tr>
+                                <td width="50%">累计佣金</td>
+                                <td class="text-success"><strong>{$row.total_income|default=0}元</strong></td>
+                            </tr>
+                            <tr>
+                                <td>待入账佣金</td>
+                                <td class="text-warning"><strong>{$row.pending_reward|default=0}元</strong></td>
+                            </tr>
+                            <tr>
+                                <td>消费金额</td>
+                                <td class="text-info"><strong>{$row.user.total_consume|default=0}元</strong></td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
             </div>
         </div>
     </div>
-</div>
+</div>

+ 102 - 78
application/admin/view/commission/agent/select.html

@@ -1,81 +1,105 @@
-{include file="/shopro/common/script" /}
+{__NOLAYOUT__}
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>{$site.name}</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimal-ui">
+    <link rel="shortcut icon" href="/assets/img/favicon.ico" />
+    {:build_head_html()}
+</head>
+<body>
 
-<style>
-    .agent-select .filter-item {
-        width: 330px;
-    }
-
-    .agent-select .filter-item .el-select {
-        width: 110px;
-    }
-</style>
+<div id="content-container" class="content-container">
+    <div class="row">
+        <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
+            <section class="content-header hide">
+                <h1>
+                    选择分销商
+                    <small>更换上级推荐人</small>
+                </h1>
+            </section>
+            <section class="content">
+                <div class="alert alert-warning">
+                    <h4><i class="icon fa fa-warning"></i> 温馨提示</h4>
+                    更换上级推荐人之后,该用户之后的所有团队和业绩将移至新的推荐人名下
+                </div>
 
-<div id="select" class="agent-select" v-cloak>
-    <el-container class="panel-block">
-        <el-header class="sa-header">
-            <el-alert class="mt-4">
-                <template #title>
-                    温馨提示:更换上级推荐人之后,该用户之后的所有团队和业绩将移至新的推荐人名下
-                </template>
-            </el-alert>
-            <div class="sa-flex sa-flex-wrap sa-row-between mt-4">
-                <div class="sa-flex">
-                    当前推荐人:
-                    <sa-user-profile type="agent" :user="state.userDetail.parent_user"
-                        :id="state.userDetail?.parent_user_id" :isHover="false"></sa-user-profile>
+                <div class="box box-primary">
+                    <div class="box-header with-border">
+                        <h3 class="box-title">选择新的上级分销商</h3>
+                        <div class="box-tools pull-right">
+                            <div class="input-group" style="width: 300px;">
+                                <div class="input-group-btn">
+                                    <select id="search-type" class="form-control" style="width: 120px;">
+                                        <option value="user_id">分销商ID</option>
+                                        <option value="user.nickname">分销商昵称</option>
+                                        <option value="user.mobile">分销商手机号</option>
+                                    </select>
+                                </div>
+                                <input type="text" id="search-value" class="form-control" placeholder="请输入查询内容">
+                                <div class="input-group-btn">
+                                    <button type="button" class="btn btn-default" onclick="searchAgent()">
+                                        <i class="fa fa-search"></i> 搜索
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="box-body">
+                        <div id="toolbar" class="toolbar">
+                            <label class="checkbox-inline">
+                                <input type="checkbox" id="set-platform" value="0"> 设为平台直推
+                            </label>
+                        </div>
+                        <div class="table-responsive">
+                            <table id="agent-table" class="table table-striped table-bordered">
+                                <thead>
+                                    <tr>
+                                        <th>选择</th>
+                                        <th>ID</th>
+                                        <th>分销商信息</th>
+                                        <th>等级</th>
+                                        <th>手机号</th>
+                                        <th>状态</th>
+                                        <th>操作</th>
+                                    </tr>
+                                </thead>
+                                <tbody id="agent-list">
+                                    <!-- 分销商列表将通过AJAX加载 -->
+                                </tbody>
+                            </table>
+                        </div>
+                        <div id="pagination" class="text-center">
+                            <!-- 分页将通过AJAX加载 -->
+                        </div>
+                    </div>
+                    <div class="box-footer">
+                        <div class="row">
+                            <div class="col-sm-6">
+                                <div id="current-parent" class="form-group">
+                                    <!-- 当前推荐人信息 -->
+                                </div>
+                            </div>
+                            <div class="col-sm-6 text-right">
+                                <button type="button" class="btn btn-primary" onclick="confirmChange()">
+                                    <i class="fa fa-check"></i> 确定更换
+                                </button>
+                                <button type="button" class="btn btn-default" onclick="Fast.api.close()">
+                                    <i class="fa fa-close"></i> 取消
+                                </button>
+                            </div>
+                        </div>
+                    </div>
                 </div>
-                <el-input class="filter-item" v-model="state.filter.data.user.value" placeholder="请输入查询内容">
-                    <template #prepend>
-                        <el-select v-model="state.filter.data.user.field">
-                            <el-option label="分销商ID" value="user_id"></el-option>
-                            <el-option label="分销商昵称" value="user.nickname"></el-option>
-                            <el-option label="分销商手机号" value="user.mobile"></el-option>
-                        </el-select>
-                    </template>
-                    <template #append>
-                        <button @click="getData">搜索</button>
-                    </template>
-                </el-input>
-            </div>
-        </el-header>
-        <el-main>
-            <el-table height="100%" class="sa-table" :data="state.data" stripe>
-                <el-table-column prop="user_id" label="ID" min-width="90"></el-table-column>
-                <el-table-column label="分销商信息" min-width="150">
-                    <template #default="scope">
-                        <sa-user-profile :user="scope.row.user" :id="scope.row.user_id" :isHover="false" />
-                    </template>
-                </el-table-column>
-                <el-table-column label="等级" min-width="150" align="center">
-                    <template #default="scope">
-                        <template v-if="scope.row.level_info">
-                            {{ scope.row.level_info.name }}
-                            (等级{{ scope.row.level_info.level }})
-                        </template>
-                        <template v-else>{{ scope.row.level }}</template>
-                    </template>
-                </el-table-column>
-                <el-table-column label="手机号" min-width="120" align="center">
-                    <template #default="scope">
-                        {{ scope.row.user ? scope.row.user.mobile : '-' }}
-                    </template>
-                </el-table-column>
-                <el-table-column label="操作" min-width="80" fixed="right">
-                    <template #default="scope">
-                        <span v-if="scope.row.user_id == state.parent_user_id" class="status"> 已选择 </span>
-                        <el-button v-else class="is-link" type="primary" @click="onSelect(scope.row)">选择</el-button>
-                    </template>
-                </el-table-column>
-            </el-table>
-        </el-main>
-        <el-footer class="sa-flex sa-row-between">
-            <el-checkbox v-model="state.parent_user_id" :true-label="0" :false-label="-1">设为平台直推</el-checkbox>
-            <sa-pagination class="is-ellipsis" v-model="pagination" @pagination-change="getData"></sa-pagination>
-        </el-footer>
-        <el-footer class="sa-footer--submit sa-flex sa-row-right">
-            <!-- {if $auth->check('shopro/commission/agent/changeParentUser')} -->
-            <el-button type="primary" @click="onConfirm">确定</el-button>
-            <!-- {/if} -->
-        </el-footer>
-    </el-container>
-</div>
+            </section>
+        </div>
+    </div>
+</div>
+
+
+{:build_suffix_html()}
+</body>
+</html>

+ 9 - 4
application/api/controller/commission/AgentApply.php

@@ -307,18 +307,23 @@ class AgentApply extends Base
             
             // 更新申请记录
             $updateData['updatetime'] = time();
-            // 如果修改了关键信息,可以考虑重新设置为待审核状态(根据业务需要)
-            // $updateData['status'] = ApplyModel::STATUS_PENDING;
+            // 修改后需要重新审核
+            $updateData['status'] = ApplyModel::STATUS_PENDING;
+            $updateData['admin_id'] = null;
+            $updateData['audit_time'] = null;
+            $updateData['reject_reason'] = null;
             
             $apply->save($updateData);
             
             // 可以在这里添加操作日志记录
             
-            $this->success('资料修改成功', [
+            $this->success('资料修改成功,请等待重新审核', [
                 'apply_type' => $apply->apply_type,
                 'apply_type_text' => $apply->apply_type_text,
                 'updated_fields' => array_keys($updateData),
-                'updated_data' => $updateData
+                'updated_data' => $updateData,
+                'status' => ApplyModel::STATUS_PENDING,
+                'status_text' => '待审核'
             ]);
             
         } catch (Exception $e) {

+ 448 - 46
public/assets/js/backend/commission/agent.js

@@ -28,6 +28,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         {field: 'user_id', title: __('ID'), width: 60},
                         {field: 'user.nickname', title: __('用户昵称'), operate: 'LIKE'},
                         {field: 'user.mobile', title: __('手机号'), operate: 'LIKE'},
+                        {field: 'level_info.name', title: __('分销等级'), formatter: function(value, row, index) {
+                            if (row.level_info) {
+                                return row.level_info.name + '(等级' + row.level_info.level + ')';
+                            }
+                            return row.level || '-';
+                        }},
                         {field: 'status', title: __('状态'), searchList: {
                             "normal": __('正常'),
                             "pending": __('审核中'),
@@ -56,6 +62,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         {field: 'total_income', title: __('总收益'), operate: 'BETWEEN'},
                         {field: 'child_agent_count_1', title: __('直推分销商'), width: 80},
                         {field: 'child_agent_count_all', title: __('团队分销商'), width: 80},
+                        {field: 'child_user_count_all', title: __('团队人数'), width: 80},
                         {field: 'pending_reward', title: __('待结算佣金'), width: 80},
                         {field: 'become_time', title: __('成为分销商时间'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime},
                         {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, 
@@ -72,6 +79,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                                  }
                              },
                              {
+                                 name: 'team',
+                                 text: __('团队'),
+                                 title: __('团队'),
+                                 classname: 'btn btn-xs btn-info btn-dialog',
+                                 icon: 'fa fa-users',
+                                 url: 'commission/agent/team',
+                                 callback: function (data) {
+                                     table.bootstrapTable('refresh');
+                                 }
+                             },
+                             {
                                  name: 'edit_status',
                                  text: __('编辑状态'),
                                  title: __('编辑状态'),
@@ -105,61 +123,445 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             Table.api.bindevent(table);
         },
         detail: function () {
+            var agentId = Fast.api.query('id');
+            var agentData = {};
+
+            // 获取分销商详情
+            function getDetail() {
+                Fast.api.ajax({
+                    url: 'commission/agent/detail',
+                    data: {id: agentId}
+                }, function(data) {
+                    agentData = data;
+                    updateDetailView(data);
+                });
+            }
+
+            // 更新详情视图
+            function updateDetailView(data) {
+                if (data.user) {
+                    $('#user-avatar').attr('src', data.user.avatar || '/assets/img/avatar.png');
+                    $('#user-nickname').text(data.user.nickname || data.user_id);
+                }
+
+                // 状态
+                var statusMap = {
+                    'normal': {text: '正常', class: 'label-success'},
+                    'pending': {text: '审核中', class: 'label-warning'},
+                    'freeze': {text: '冻结', class: 'label-info'},
+                    'forbidden': {text: '禁用', class: 'label-danger'},
+                    'reject': {text: '拒绝', class: 'label-danger'}
+                };
+                var status = statusMap[data.status] || {text: data.status, class: 'label-default'};
+                $('#agent-status').text(status.text).attr('class', 'label ' + status.class);
+
+                // 等级
+                if (data.level_info) {
+                    $('#agent-level').text(data.level_info.name + '(等级' + data.level_info.level + ')');
+                    if (data.level_info.commission_rules) {
+                        $('#commission-1').text(data.level_info.commission_rules.commission_1 || '0.00');
+                        $('#commission-2').text(data.level_info.commission_rules.commission_2 || '0.00');
+                        $('#commission-3').text(data.level_info.commission_rules.commission_3 || '0.00');
+                    }
+                } else {
+                    $('#agent-level').text(data.level);
+                }
+
+                // 待升级等级
+                if (data.level_status > 0 && data.level_status_info) {
+                    $('#upgrade-level-group').show();
+                    $('#upgrade-level').text(data.level_status_info.name + '(等级' + data.level_status + ')');
+                } else {
+                    $('#upgrade-level-group').hide();
+                }
+
+                // 上级分销商
+                if (data.user && data.user.parent_user) {
+                    $('#parent-agent').text(data.user.parent_user.nickname || '用户' + data.user.parent_user_id);
+                } else {
+                    $('#parent-agent').text('无');
+                }
+
+                // 允许升级
+                $('#upgrade-lock').prop('checked', data.upgrade_lock == 0);
+
+                // 统计数据
+                $('#child-user-count-all').text(data.child_user_count_all || 0);
+                $('#child-user-count-1').text(data.child_user_count_1 || 0);
+                $('#child-agent-count-all').text(data.child_agent_count_all || 0);
+                $('#child-agent-count-1').text(data.child_agent_count_1 || 0);
+                $('#child-order-money-all').text((data.child_order_money_all || 0) + '元');
+                $('#child-order-count-all').text(data.child_order_count_all || 0);
+                $('#child-order-money-1').text((data.child_order_money_1 || 0) + '元');
+                $('#child-order-count-1').text(data.child_order_count_1 || 0);
+                $('#total-income').text((data.total_income || 0) + '元');
+                $('#pending-reward').text((data.pending_reward || 0) + '元');
+                $('#total-consume').text(((data.user && data.user.total_consume) || 0) + '元');
+
+                // 申请信息
+                if (data.apply_info && data.apply_info.length > 0) {
+                    var applyHtml = '<form class="form-horizontal">';
+                    data.apply_info.forEach(function(item) {
+                        applyHtml += '<div class="form-group">';
+                        applyHtml += '<label class="col-sm-3 control-label">' + item.name + ':</label>';
+                        applyHtml += '<div class="col-sm-9">';
+                        if (item.type === 'image') {
+                            applyHtml += '<img src="' + item.value + '" style="max-width: 200px; max-height: 120px;">';
+                        } else {
+                            applyHtml += '<p class="form-control-static">' + item.value + '</p>';
+                        }
+                        applyHtml += '</div></div>';
+                    });
+                    applyHtml += '</form>';
+                    $('#apply-info').html(applyHtml);
+                } else {
+                    $('#apply-info').html('<p class="text-muted">暂无申请信息</p>');
+                }
+            }
+
+            // 详情页面特有的全局函数
+            window.changeStatus = function(userId, currentStatus) {
+                Layer.prompt({
+                    title: '修改状态',
+                    formType: 2,
+                    value: currentStatus,
+                    select: ['normal', 'pending', 'freeze', 'forbidden', 'reject'],
+                    selectTips: ['正常', '审核中', '冻结', '禁用', '拒绝']
+                }, function(value, index) {
+                    Fast.api.ajax({
+                        url: 'commission/agent/edit',
+                        data: {ids: userId, status: value}
+                    }, function() {
+                        Layer.close(index);
+                        location.reload();
+                    });
+                });
+            };
+
+            window.changeLevel = function(userId) {
+                Toastr.info('等级修改功能待完善');
+            };
+
+            window.changeParentUser = function(userId) {
+                Fast.api.open('commission/agent/select?id=' + userId, '更换上级分销商', {
+                    callback: function() {
+                        location.reload();
+                    }
+                });
+            };
+
+            window.approveLevel = function(userId, levelStatus) {
+                Fast.api.ajax({
+                    url: 'commission/agent/edit',
+                    data: {ids: userId, level_status: levelStatus}
+                }, function() {
+                    location.reload();
+                });
+            };
+
+            window.rejectLevel = function(userId) {
+                Fast.api.ajax({
+                    url: 'commission/agent/edit',
+                    data: {ids: userId, level_status: 0}
+                }, function() {
+                    location.reload();
+                });
+            };
+
+            window.toggleUpgradeLock = function(userId, currentLock) {
+                var newLock = currentLock == 0 ? 1 : 0;
+                Fast.api.ajax({
+                    url: 'commission/agent/edit',
+                    data: {ids: userId, upgrade_lock: newLock}
+                }, function() {
+                    location.reload();
+                });
+            };
+
+            window.viewTeam = function(userId) {
+                Fast.api.open('commission/agent/team?id=' + userId, '查看团队');
+            };
+
+            // 事件绑定
+            $(document).ready(function() {
+                $('.btn-refresh').click(function() {
+                    location.reload();
+                });
+
+                $('#refresh-detail').click(function() {
+                    getDetail();
+                });
+
+                $('#edit-status').click(function() {
+                    Layer.prompt({
+                        title: '修改状态',
+                        formType: 2,
+                        value: agentData.status,
+                        select: ['normal', 'pending', 'freeze', 'forbidden', 'reject'],
+                        selectTips: ['正常', '审核中', '冻结', '禁用', '拒绝']
+                    }, function(value, index) {
+                        Fast.api.ajax({
+                            url: 'commission/agent/edit',
+                            data: {ids: agentId, status: value}
+                        }, function() {
+                            Layer.close(index);
+                            getDetail();
+                        });
+                    });
+                });
+
+                $('#change-parent').click(function() {
+                    Fast.api.open('commission/agent/select?id=' + agentId, '更换上级分销商', {
+                        callback: function() {
+                            getDetail();
+                        }
+                    });
+                });
+
+                $('#upgrade-lock').change(function() {
+                    var value = $(this).is(':checked') ? 0 : 1;
+                    Fast.api.ajax({
+                        url: 'commission/agent/edit',
+                        data: {ids: agentId, upgrade_lock: value}
+                    }, function() {
+                        getDetail();
+                    });
+                });
+
+                $('#approve-level').click(function() {
+                    Fast.api.ajax({
+                        url: 'commission/agent/edit',
+                        data: {ids: agentId, level_status: agentData.level_status}
+                    }, function() {
+                        getDetail();
+                    });
+                });
+
+                $('#reject-level').click(function() {
+                    Fast.api.ajax({
+                        url: 'commission/agent/edit',
+                        data: {ids: agentId, level_status: 0}
+                    }, function() {
+                        getDetail();
+                    });
+                });
+
+                // 初始化
+                if (agentId) {
+                    getDetail();
+                }
+            });
+
             Controller.api.bindevent();
         },
         select: function () {
-            // 初始化表格参数
-            Table.api.init({
-                extend: {
-                    index_url: 'commission/agent/select' + location.search,
+            var userId = Fast.api.query('id');
+            var selectedParentId = null;
+            var currentPage = 1;
+            var pageSize = 10;
+
+            // 获取当前用户信息
+            function getCurrentUserInfo() {
+                Fast.api.ajax({
+                    url: 'commission/agent/detail',
+                    data: {id: userId}
+                }, function(data) {
+                    var html = '<label>当前推荐人:</label>';
+                    if (data.user && data.user.parent_user) {
+                        html += '<img src="' + (data.user.parent_user.avatar || '/assets/img/avatar.png') + '" ';
+                        html += 'style="width: 20px; height: 20px; border-radius: 50%; margin-right: 5px;">';
+                        html += (data.user.parent_user.nickname || '用户' + data.user.parent_user_id);
+                        selectedParentId = data.user.parent_user_id;
+                    } else {
+                        html += '无';
+                        selectedParentId = 0;
+                    }
+                    $('#current-parent').html(html);
+                });
+            }
+
+            // 获取分销商列表
+            function getAgentList() {
+                var searchType = $('#search-type').val();
+                var searchValue = $('#search-value').val();
+                var searchData = {
+                    page: currentPage,
+                    limit: pageSize
+                };
+
+                if (searchValue) {
+                    searchData[searchType] = searchValue;
                 }
-            });
 
-            var table = $("#table");
+                Fast.api.ajax({
+                    url: 'commission/agent/select',
+                    data: searchData
+                }, function(ret) {
+                    var html = '';
+                    if (ret.data.rows && ret.data.rows.length > 0) {
+                        ret.data.rows.forEach(function(item) {
+                            var statusClass = '';
+                            var statusText = '';
+                            switch(item.status) {
+                                case 'normal':
+                                    statusClass = 'label-success';
+                                    statusText = '正常';
+                                    break;
+                                case 'pending':
+                                    statusClass = 'label-warning';
+                                    statusText = '审核中';
+                                    break;
+                                case 'freeze':
+                                    statusClass = 'label-info';
+                                    statusText = '冻结';
+                                    break;
+                                case 'forbidden':
+                                    statusClass = 'label-danger';
+                                    statusText = '禁用';
+                                    break;
+                                case 'reject':
+                                    statusClass = 'label-danger';
+                                    statusText = '拒绝';
+                                    break;
+                                default:
+                                    statusClass = 'label-default';
+                                    statusText = item.status;
+                            }
 
-            // 初始化表格
-            table.bootstrapTable({
-                url: $.fn.bootstrapTable.defaults.extend.index_url,
-                pk: 'user_id',
-                sortName: 'user_id',
-                columns: [
-                    [
-                        {checkbox: true},
-                        {field: 'user_id', title: __('ID'), width: 60},
-                        {field: 'user.nickname', title: __('用户昵称'), operate: 'LIKE'},
-                        {field: 'user.mobile', title: __('手机号'), operate: 'LIKE'},
-                        {field: 'level_info.name', title: __('分销等级')},
-                        {field: 'status', title: __('状态'), searchList: {
-                            "normal": __('正常'),
-                            "pending": __('审核中'),
-                            "freeze": __('冻结'),
-                            "forbidden": __('禁用'),
-                            "reject": __('拒绝')
-                        }, formatter: Table.api.formatter.status},
-                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, 
-                         buttons: [
-                             {
-                                 name: 'choose',
-                                 text: __('选择'),
-                                 title: __('选择'),
-                                 classname: 'btn btn-xs btn-primary btn-choose',
-                                 icon: 'fa fa-check',
-                                 click: function (data) {
-                                     var multiple = Backend.api.query('multiple');
-                                     multiple = multiple == 'true' ? true : false;
-                                     Fast.api.close(data);
-                                 }
-                             }
-                         ], 
-                         formatter: Table.api.formatter.operate}
-                    ]
-                ]
-            });
+                            html += '<tr' + (selectedParentId == item.user_id ? ' class="warning"' : '') + '>';
+                            html += '<td><input type="radio" name="parent_agent" value="' + item.user_id + '"' + (selectedParentId == item.user_id ? ' checked' : '') + '></td>';
+                            html += '<td>' + item.user_id + '</td>';
+                            html += '<td>';
+                            html += '<img src="' + (item.user.avatar || '/assets/img/avatar.png') + '" style="width: 32px; height: 32px; border-radius: 50%; margin-right: 5px;">';
+                            html += (item.user.nickname || '用户' + item.user_id);
+                            html += '</td>';
+                            html += '<td>';
+                            if (item.level_info) {
+                                html += item.level_info.name + '<br><small>等级' + item.level_info.level + '</small>';
+                            } else {
+                                html += '等级' + item.level;
+                            }
+                            html += '</td>';
+                            html += '<td>' + (item.user.mobile || '-') + '</td>';
+                            html += '<td><span class="label ' + statusClass + '">' + statusText + '</span></td>';
+                            html += '<td>';
+                            if (selectedParentId == item.user_id) {
+                                html += '<span class="text-success">已选择</span>';
+                            } else {
+                                html += '<button type="button" class="btn btn-xs btn-primary" onclick="selectAgent(' + item.user_id + ')">选择</button>';
+                            }
+                            html += '</td>';
+                            html += '</tr>';
+                        });
+                    } else {
+                        html = '<tr><td colspan="7" class="text-center">暂无数据</td></tr>';
+                    }
+                    $('#agent-list').html(html);
 
-            // 为表格绑定事件
-            Table.api.bindevent(table);
+                    // 更新分页
+                    updatePagination(ret.data.total);
+                });
+            }
+
+            // 更新分页
+            function updatePagination(total) {
+                var totalPages = Math.ceil(total / pageSize);
+                var html = '<ul class="pagination">';
+                
+                // 上一页
+                if (currentPage > 1) {
+                    html += '<li><a href="javascript:;" onclick="changePage(' + (currentPage - 1) + ')">上一页</a></li>';
+                }
+                
+                // 页码
+                for (var i = 1; i <= totalPages; i++) {
+                    if (i == currentPage) {
+                        html += '<li class="active"><a href="javascript:;">' + i + '</a></li>';
+                    } else {
+                        html += '<li><a href="javascript:;" onclick="changePage(' + i + ')">' + i + '</a></li>';
+                    }
+                }
+                
+                // 下一页
+                if (currentPage < totalPages) {
+                    html += '<li><a href="javascript:;" onclick="changePage(' + (currentPage + 1) + ')">下一页</a></li>';
+                }
+                
+                html += '</ul>';
+                $('#pagination').html(html);
+            }
+
+            // 选择页面特有的全局函数
+            window.searchAgent = function() {
+                currentPage = 1;
+                getAgentList();
+            };
+
+            window.selectAgent = function(agentId) {
+                selectedParentId = agentId;
+                $('input[name="parent_agent"]').prop('checked', false);
+                $('input[value="' + agentId + '"]').prop('checked', true);
+                $('#agent-table tbody tr').removeClass('warning');
+                $('input[value="' + agentId + '"]').closest('tr').addClass('warning');
+                $('#set-platform').prop('checked', false);
+            };
+
+            window.changePage = function(page) {
+                currentPage = page;
+                getAgentList();
+            };
+
+            window.confirmChange = function() {
+                if (selectedParentId === null) {
+                    Toastr.error('请选择上级分销商');
+                    return;
+                }
+
+                Fast.api.ajax({
+                    url: 'commission/agent/changeParentUser',
+                    data: {
+                        id: userId,
+                        parent_user_id: selectedParentId
+                    }
+                }, function() {
+                    Toastr.success('更换成功');
+                    Fast.api.close();
+                });
+            };
+
+            // 事件绑定
+            $(document).ready(function() {
+                // 设为平台直推
+                $('#set-platform').change(function() {
+                    if ($(this).is(':checked')) {
+                        selectedParentId = 0;
+                        $('input[name="parent_agent"]').prop('checked', false);
+                        $('#agent-table tbody tr').removeClass('warning');
+                    }
+                });
+
+                // 搜索框回车事件
+                $('#search-value').keypress(function(e) {
+                    if (e.which == 13) {
+                        searchAgent();
+                    }
+                });
+
+                // 初始化
+                getCurrentUserInfo();
+                getAgentList();
+            });
         },
         team: function () {
+            // 团队页面特有的全局函数
+            window.viewTeam = function(userId) {
+                Fast.api.open('commission/agent/team?id=' + userId, '查看团队');
+            };
+
+            window.viewDetail = function(userId) {
+                Fast.api.open('commission/agent/detail?id=' + userId, '分销商详情');
+            };
+
             Controller.api.bindevent();
         },
         api: {

+ 19 - 1
public/assets/js/backend/commission/apply.js

@@ -50,6 +50,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         {field: 'province_name', title: __('Area'), operate: false, formatter: function(value, row, index) {
                             return (row.province_name || '') + '-' + (row.city_name || '') + '-' + (row.district_name || '');
                         }},
+                        {field: 'is_reaudit_text', title: __('Audit Type'), searchList: {"首次申请": "首次申请", "重新审核": "重新审核"}, formatter: function(value, row, index) {
+                            if (row.is_reaudit) {
+                                return '<span class="label label-info">' + value + '</span>';
+                            } else {
+                                return '<span class="label label-success">' + value + '</span>';
+                            }
+                        }},
                         {field: 'status_text', title: __('Status'), searchList: {"pending": "待审核", "approved": "已通过", "rejected": "已拒绝"}, formatter: function(value, row, index) {
                             var colorMap = {
                                 'pending': 'warning',
@@ -109,7 +116,18 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             // 单个审核通过
             $(document).on('click', '.btn-approve-one', function () {
                 var id = $(this).data('id');
-                Layer.confirm('确定要通过该申请吗?', {title: '提示'}, function(index) {
+                // 获取当前行数据
+                var rowIndex = $(this).closest('tr').data('index');
+                var rowData = table.bootstrapTable('getData')[rowIndex];
+                
+                var confirmText = '确定要通过该申请吗?';
+                if (rowData && rowData.is_reaudit) {
+                    confirmText = '这是一个重新审核申请,确定要通过吗?通过后将更新代理商资料。';
+                } else {
+                    confirmText = '确定要通过该申请吗?通过后将创建新的代理商。';
+                }
+                
+                Layer.confirm(confirmText, {title: '审核确认'}, function(index) {
                     Fast.api.ajax({
                         url: 'commission/apply/approve',
                         data: {ids: id}