feat(fsgx): 更新用户列表直推/伞下统计并同步测试文档

补充用户列表中的直推人数与伞下订单数统计逻辑,便于验证分销链路数据;同时更新验收与问题文档,记录当前手测结论和检查项。

Made-with: Cursor
This commit is contained in:
apple
2026-03-24 19:05:53 +08:00
parent b5cd96f92b
commit c2420e7393
4 changed files with 57 additions and 8 deletions

View File

@@ -103,11 +103,10 @@
- 同设备/同账号异常刷单需支持风控拦截 - 同设备/同账号异常刷单需支持风控拦截
- 后台人工取消订单时,需同步返现逆操作并记录审计日志 - 后台人工取消订单时,需同步返现逆操作并记录审计日志
### 3.2 会员等级体系 ### 3.2 分销等级体系
| 等级 | 升级条件 | 直推积分奖励 | 伞下积分奖励 | 说明 | | 等级 | 升级条件 | 直推积分奖励 | 伞下积分奖励 | 说明 |
|---|---|---:|---:|---| |---|---|---:|---:|---|
| 普通会员 | 注册即得 | 0 | 0 | 可参与推荐返现 |
| 创客 | 直推满3单 | 500 | 0 | 阈值可配置 | | 创客 | 直推满3单 | 500 | 0 | 阈值可配置 |
| 云店 | 伞下满30单至少3直推 | 800 | 300 | 级差计算 | | 云店 | 伞下满30单至少3直推 | 800 | 300 | 级差计算 |
| 服务商 | 伞下满100单至少3直推 | 1000 | 200 | 级差计算 | | 服务商 | 伞下满100单至少3直推 | 1000 | 200 | 级差计算 |
@@ -132,6 +131,8 @@
- 日释放比例默认 0.4%(千分之四),后台可调 - 日释放比例默认 0.4%(千分之四),后台可调
- 积分不可转赠,不可直接提现 - 积分不可转赠,不可直接提现
- 报单商品不允许积分支付 - 报单商品不允许积分支付
- 更新相关推荐会员(直推积分奖励、伞下积分奖励获得者)的待释放积分(`frozen_points`
- 同时记录报单商品订单产生的待释放积分明细记录eb_user_bill表中status=0type=integraltitle=直推积分奖励 | 伞下积分奖励
### 3.4 多单购买与升级联动 ### 3.4 多单购买与升级联动

View File

@@ -96,7 +96,7 @@ mysql -u root -p fsgx-shop < pro_v3.5.1/help/migrations/fsgx_v1.sql
- [ ] 用户B 购买报单商品并支付成功 - [ ] 用户B 购买报单商品并支付成功
- [ ] 验证用户A 获得第1周期佣金应为商品价格的 **20%** - [ ] 验证用户A 获得第1周期佣金应为商品价格的 **20%**
- [ ] 验证用户A 的 `frozen_points` 增加100积分/元) - [ ] 验证用户A 的 `frozen_points` 增加
- [ ] 小程序"推荐佣金"页:`cycle_current = 1/3` - [ ] 小程序"推荐佣金"页:`cycle_current = 1/3`
#### Step 3购买报单商品第2人 #### Step 3购买报单商品第2人

View File

@@ -20,7 +20,10 @@
## 定时任务页面,路径:/admin/system/crontab ## 定时任务页面,路径:/admin/system/crontab
1. **已修复**增加“手动触发”功能按钮,可以手动触发即执行任务立, 1. 增加“手动触发”功能按钮,可以手动触发即执行任务立,
## 用户列表页面,路径:/admin/user/list
1. **已修复**“直推人数满、伞下订单数”没有显示数据,参考分销员管理页面实现逻辑(/admin/agent/agent_manage/index实现数据显示。
--- ---
@@ -28,7 +31,7 @@
# uniapp移动端 # uniapp移动端
## 修改密码页面 ## 修改密码页面
1. 点击获取验证,去除安全验证,直接发送验证码 1. **已修复**点击获取验证,去除安全验证,直接发送验证码
--- ---
@@ -36,7 +39,16 @@
## 测试数据: ## 测试数据:
1. 测试账号UID1 手机号18621813282 UID2 手机号15821676725 UID3 手机号17887996868 1. 测试账号UID1 手机号1860001111 UID2 手机号18621813282 UID3 手机号17887996868
UID4 手机号15324401259 UID4 手机号15324401259;UID5 手机号17887996868; UID6 手机号15821676725; 测试账号密码默认A123456
2. 推荐关系: uid=1推荐uid=2推荐uid=3推荐uid=4 2. 推荐关系: uid=2推荐uid=4uid=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`

View File

@@ -819,6 +819,38 @@ class UserServices extends BaseServices
$agentLevelServices = app()->make(AgentLevelServices::class); $agentLevelServices = app()->make(AgentLevelServices::class);
$hjfLevelMaps = $agentLevelServices->loadHjfUserListLevelMaps(); $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', []); $extendInfo = SystemConfigService::get('user_extend_info', []);
$is_extend_info = false; $is_extend_info = false;
@@ -906,6 +938,10 @@ class UserServices extends BaseServices
$item['available_points'] = (int)($item['available_points'] ?? 0); $item['available_points'] = (int)($item['available_points'] ?? 0);
$item['frozen_points'] = (int)($item['frozen_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']] ?? ''; $item['labels'] = $userlabel[$item['uid']] ?? '';