diff --git a/docs/PRD_fsgx_V1.0.md b/docs/PRD_fsgx_V1.0.md index 705686c2..7af2ac13 100644 --- a/docs/PRD_fsgx_V1.0.md +++ b/docs/PRD_fsgx_V1.0.md @@ -103,11 +103,10 @@ - 同设备/同账号异常刷单需支持风控拦截 - 后台人工取消订单时,需同步返现逆操作并记录审计日志 -### 3.2 会员等级体系 +### 3.2 分销等级体系 | 等级 | 升级条件 | 直推积分奖励 | 伞下积分奖励 | 说明 | |---|---|---:|---:|---| -| 普通会员 | 注册即得 | 0 | 0 | 可参与推荐返现 | | 创客 | 直推满3单 | 500 | 0 | 阈值可配置 | | 云店 | 伞下满30单(至少3直推) | 800 | 300 | 级差计算 | | 服务商 | 伞下满100单(至少3直推) | 1000 | 200 | 级差计算 | @@ -132,6 +131,8 @@ - 日释放比例默认 0.4%(千分之四),后台可调 - 积分不可转赠,不可直接提现 - 报单商品不允许积分支付 +- 更新相关推荐会员(直推积分奖励、伞下积分奖励获得者)的待释放积分(`frozen_points`) +- 同时记录报单商品订单产生的待释放积分明细记录:eb_user_bill表中status=0,type=integral,title=直推积分奖励 | 伞下积分奖励 ### 3.4 多单购买与升级联动 diff --git a/docs/fsgx-phase7-config-checklist.md b/docs/fsgx-phase7-config-checklist.md index 94f1f84a..72f96b75 100644 --- a/docs/fsgx-phase7-config-checklist.md +++ b/docs/fsgx-phase7-config-checklist.md @@ -96,7 +96,7 @@ mysql -u root -p fsgx-shop < pro_v3.5.1/help/migrations/fsgx_v1.sql - [ ] 用户B 购买报单商品并支付成功 - [ ] 验证用户A 获得第1周期佣金(应为商品价格的 **20%**) -- [ ] 验证用户A 的 `frozen_points` 增加(100积分/元) +- [ ] 验证用户A 的 `frozen_points` 增加 - [ ] 小程序"推荐佣金"页:`cycle_current = 1/3` #### Step 3:购买报单商品(第2人) diff --git a/docs/issues-0323-1.md b/docs/issues-0323-1.md index f620e965..db69c400 100644 --- a/docs/issues-0323-1.md +++ b/docs/issues-0323-1.md @@ -20,7 +20,10 @@ ## 定时任务页面,路径:/admin/system/crontab -1. **已修复**增加“手动触发”功能按钮,可以手动触发即执行任务立, +1. 增加“手动触发”功能按钮,可以手动触发即执行任务立, + +## 用户列表页面,路径:/admin/user/list +1. **已修复**“直推人数满、伞下订单数”没有显示数据,参考分销员管理页面实现逻辑(/admin/agent/agent_manage/index)实现数据显示。 --- @@ -28,7 +31,7 @@ # uniapp移动端 ## 修改密码页面 -1. 点击获取验证,去除安全验证,直接发送验证码 +1. **已修复**点击获取验证,去除安全验证,直接发送验证码 --- @@ -36,7 +39,16 @@ ## 测试数据: -1. 测试账号:UID:1, 手机号:18621813282; UID:2, 手机号:15821676725 ;UID:3, 手机号:17887996868 ; - UID:4, 手机号:15324401259。 -2. 推荐关系: uid=1推荐uid=2推荐uid=3推荐uid=4 +1. 测试账号:UID:1, 手机号:1860001111; UID:2, 手机号:18621813282 ;UID:3, 手机号:17887996868 ; + UID:4, 手机号:15324401259;UID:5, 手机号:17887996868; UID:6, 手机号:15821676725; 测试账号密码默认:A123456 +2. 推荐关系: uid=2推荐uid=4,uid=5, uid=6 +3. uid=4,5,6购买报单商品后推荐人uid=2没有佣金/返现产生, +4. 分销会员uid=2的积分奖励“待释放(冻结)积分”没有 + +## 手动测试问题 + +1. 排查原因:eb_store_order中id=11在管理后台中的2个页面看不到返现佣金明细和奖励积分明细, +2. 积分日志页面/admin/marketing/user_point/index看不到奖励积分明细, +3. 佣金记录页面/admin/finance/finance/commission中用户返现佣金记录详情中看不到返现佣金明细 +4. **相关文件**:`docs/PRD_fsgx_V1.0.md` `docs/page-dev-specs-fsgx.md`, diff --git a/pro_v3.5.1/app/services/user/UserServices.php b/pro_v3.5.1/app/services/user/UserServices.php index e49e67f9..f0f3817d 100644 --- a/pro_v3.5.1/app/services/user/UserServices.php +++ b/pro_v3.5.1/app/services/user/UserServices.php @@ -819,6 +819,38 @@ class UserServices extends BaseServices $agentLevelServices = app()->make(AgentLevelServices::class); $hjfLevelMaps = $agentLevelServices->loadHjfUserListLevelMaps(); + // 直推人数:统计 spread_uid 在 $uids 中的用户数 + $directCountRaw = $this->dao->search(['spread_uid' => $uids]) + ->group('spread_uid') + ->field('spread_uid, count(*) as cnt') + ->select()->toArray(); + $directCountMap = array_column($directCountRaw, 'cnt', 'spread_uid'); + + // 伞下订单数:先取 spread_uid 在 $uids 中的下级用户 uid → spread_uid 映射,再统计订单 + $subUsersRaw = $this->dao->search(['spread_uid' => $uids]) + ->field('uid, spread_uid') + ->select()->toArray(); + // subUidToSpread: [sub_uid => spread_uid] + $subUidToSpread = array_column($subUsersRaw, 'spread_uid', 'uid'); + $subUids = array_keys($subUidToSpread); + $umbrellaMap = []; + if ($subUids) { + $umbrellaOrdersRaw = \think\facade\Db::name('store_order') + ->whereIn('uid', $subUids) + ->where('paid', 1) + ->where('pid', 0) + ->whereIn('refund_status', [0, 3]) + ->field('uid, count(*) as cnt') + ->group('uid') + ->select()->toArray(); + foreach ($umbrellaOrdersRaw as $row) { + $spreadUid = $subUidToSpread[$row['uid']] ?? null; + if ($spreadUid !== null) { + $umbrellaMap[$spreadUid] = ($umbrellaMap[$spreadUid] ?? 0) + (int)$row['cnt']; + } + } + } + // 补充信息 $extendInfo = SystemConfigService::get('user_extend_info', []); $is_extend_info = false; @@ -906,6 +938,10 @@ class UserServices extends BaseServices $item['available_points'] = (int)($item['available_points'] ?? 0); $item['frozen_points'] = (int)($item['frozen_points'] ?? 0); + // 直推人数 & 伞下订单数 + $item['direct_count'] = (int)($directCountMap[$item['uid']] ?? 0); + $item['umbrella_orders'] = (int)($umbrellaMap[$item['uid']] ?? 0); + // 标签 $item['labels'] = $userlabel[$item['uid']] ?? '';