diff --git a/application/admin/controller/shopro/split/Receiver.php b/application/admin/controller/shopro/split/Receiver.php index a7589ed..0898474 100644 --- a/application/admin/controller/shopro/split/Receiver.php +++ b/application/admin/controller/shopro/split/Receiver.php @@ -5,6 +5,8 @@ namespace app\admin\controller\shopro\split; use app\admin\controller\shopro\Base; use addons\shopro\library\split\Config as SplitConfig; use addons\shopro\library\split\ProfitSharingService; +use app\admin\model\shopro\user\User as ShopUser; +use think\Db; class Receiver extends Base { @@ -23,6 +25,7 @@ class Receiver extends Base list($where, $sort, $order, $offset, $limit) = $this->custombuildparams(); $total = $this->model->where($where)->count(); $list = $this->model->where($where)->order($sort, $order)->limit($offset, $limit)->select(); + $list = $this->formatReceiverList($list); return $this->success('操作成功', null, ['total' => $total, 'rows' => $list]); } $this->assignconfig('splitHuifuOnly', (new SplitConfig())->isHuifuMode()); @@ -67,6 +70,142 @@ class Receiver extends Base $this->success('操作成功'); } + protected function formatReceiverList($list) + { + $rows = []; + $userIds = []; + foreach ($list as $item) { + $data = is_array($item) ? $item : $item->toArray(); + $roleId = intval($data['role_id'] ?? 0); + if ($roleId > 0) { + $userIds[] = $roleId; + } + } + $userIds = array_values(array_unique($userIds)); + $users = []; + if ($userIds) { + $userRows = ShopUser::where('id', 'in', $userIds)->field('id,nickname,mobile')->select(); + foreach ($userRows as $user) { + $u = is_array($user) ? $user : $user->toArray(); + $users[intval($u['id'])] = $u; + } + } + + $onboardMap = []; + if ($userIds) { + try { + $onboardRows = Db::name('shopro_huifu_onboard') + ->where('user_id', 'in', $userIds) + ->order('id desc') + ->select(); + foreach ($onboardRows as $ob) { + $uid = intval($ob['user_id']); + if (!isset($onboardMap[$uid])) { + $onboardMap[$uid] = $ob; + } + } + } catch (\Throwable $e) { + $onboardMap = []; + } + } + + foreach ($list as $item) { + $data = is_array($item) ? $item : $item->toArray(); + $roleId = intval($data['role_id'] ?? 0); + $user = $roleId > 0 && isset($users[$roleId]) ? $users[$roleId] : null; + $onboard = $roleId > 0 && isset($onboardMap[$roleId]) ? $onboardMap[$roleId] : null; + + $data['user_id'] = $roleId; + $data['user_nickname'] = is_array($user) ? trim((string) ($user['nickname'] ?? '')) : ''; + $data['user_mobile'] = is_array($user) ? trim((string) ($user['mobile'] ?? '')) : ''; + $data['user_display'] = $this->formatUserDisplay($roleId, $user); + $data['role_id_text'] = $roleId > 0 ? (string) $roleId : '0(通用)'; + + $onboardHuifuId = trim((string) ($onboard['huifu_id'] ?? '')); + $receiverAccount = trim((string) ($data['receiver_account'] ?? '')); + $data['onboard_huifu_id'] = $onboardHuifuId; + $data['onboard_status'] = $onboard['onboard_status'] ?? ''; + $data['onboard_status_text'] = $this->formatOnboardStatus($onboard['onboard_status'] ?? ''); + $data['account_match'] = ($onboardHuifuId !== '' && $receiverAccount !== '' && $onboardHuifuId === $receiverAccount) ? 1 : 0; + $data['account_match_text'] = $this->formatAccountMatch($roleId, $onboardHuifuId, $receiverAccount); + + $data['channel_text'] = ($data['channel'] ?? '') === 'huifu' ? '汇付' : '微信'; + $data['role_type_text'] = $this->roleTypeLabel($data['role_type'] ?? ''); + $data['status_text'] = ($data['status'] ?? '') === 'forbidden' ? '禁用' : '正常'; + $data['createtime_text'] = !empty($data['createtime']) + ? date('Y-m-d H:i:s', $data['createtime']) + : '-'; + + $rows[] = $data; + } + + return $rows; + } + + protected function formatUserDisplay($roleId, $user) + { + if ($roleId <= 0) { + return '—(规则模式通用接收方)'; + } + if (!is_array($user)) { + return '用户#' . $roleId . '(未找到)'; + } + $nickname = trim((string) ($user['nickname'] ?? '')); + $mobile = trim((string) ($user['mobile'] ?? '')); + if ($nickname !== '' && $mobile !== '') { + return $nickname . '(' . $mobile . ')'; + } + if ($nickname !== '') { + return $nickname; + } + if ($mobile !== '') { + return $mobile; + } + return '用户#' . $roleId; + } + + protected function formatOnboardStatus($status) + { + $map = [ + 'draft' => '草稿', + 'submitting' => '提交中', + 'basic_ok' => '基础进件完成', + 'busi_pending' => '业务开通中', + 'approved' => '已通过', + 'rejected' => '已驳回', + 'failed' => '失败', + ]; + $status = trim((string) $status); + return $status !== '' ? ($map[$status] ?? $status) : '—'; + } + + protected function formatAccountMatch($roleId, $onboardHuifuId, $receiverAccount) + { + if ($roleId <= 0) { + return '—'; + } + if ($onboardHuifuId === '' && $receiverAccount === '') { + return '未配置'; + } + if ($onboardHuifuId === '') { + return '未进件'; + } + if ($receiverAccount === '') { + return '未填账号'; + } + return $onboardHuifuId === $receiverAccount ? '与进件一致' : '与进件不一致'; + } + + protected function roleTypeLabel($type) + { + $map = [ + 'platform' => '平台', + 'promoter' => '推广员', + 'regional_agent' => '区域公司', + ]; + return $map[$type] ?? ($type ?: '-'); + } + public function syncWx($ids = null) { $row = $this->model->get($ids); diff --git a/application/admin/view/shopro/split/receiver/add.html b/application/admin/view/shopro/split/receiver/add.html index c2641e5..9de063a 100644 --- a/application/admin/view/shopro/split/receiver/add.html +++ b/application/admin/view/shopro/split/receiver/add.html @@ -2,7 +2,7 @@
-
+

按佣金分账时必填具体 user_id,且 huifu_id 须与进件一致

diff --git a/application/admin/view/shopro/split/receiver/index.html b/application/admin/view/shopro/split/receiver/index.html index 8c7cab1..50bf2e1 100644 --- a/application/admin/view/shopro/split/receiver/index.html +++ b/application/admin/view/shopro/split/receiver/index.html @@ -1,25 +1,168 @@ -
- 添加接收方 - - - - - - - - - - - - - - - - + + +
+
+

+ 分账接收方用于网关分账时指定资金接收账户。 + 推广员/区域公司请填写对应商城 用户 ID(role_id),并与汇付进件 huifu_id 保持一致; + role_id=0 表示规则模式下的通用接收方(不按具体用户分账)。 +

+
+
+ 添加接收方 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+ 长账号字段鼠标悬浮可左右滑动查看完整内容。按佣金分账时,订单推广员的 user_id 必须在此有对应接收方。 +

+
diff --git a/public/assets/js/backend/shopro/split/receiver.js b/public/assets/js/backend/shopro/split/receiver.js index b1f0fb5..493f228 100644 --- a/public/assets/js/backend/shopro/split/receiver.js +++ b/public/assets/js/backend/shopro/split/receiver.js @@ -29,6 +29,20 @@ define(['jquery', 'bootstrap', 'backend', 'form'], function ($, undefined, Backe regional_agent: '区域公司', }; return map[type] || type; + }, + matchTagClass(text) { + if (!text || text === '—') return 'match-tag neutral'; + if (text === '与进件一致') return 'match-tag ok'; + if (text === '未进件' || text === '未填账号' || text === '未配置') return 'match-tag warn'; + return 'match-tag err'; + }, + scrollCellWheel(e) { + var el = e.currentTarget; + if (!el || el.scrollWidth <= el.clientWidth) return; + if (Math.abs(e.deltaY) >= Math.abs(e.deltaX)) { + e.preventDefault(); + el.scrollLeft += e.deltaY; + } } } });