5.1 KiB
5.1 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 直推积分奖励问题3排查 | 通过数据库排查发现:UID=55 和 UID=56 的 4 笔报单商品订单完全没有生成积分奖励记录,需要部署最新代码后使用补发命令修复。 |
|
false |
直推积分奖励问题3 排查结果与修复计划
数据库排查结果
推荐链与分销等级
| UID | 昵称 | spread_uid | agent_level | 等级名(grade) | direct_reward_points |
|---|
- UID=1 (初始账号): spread_uid=0, agent_level=3 (服务中心, grade=3), direct=1000, frozen_points=1983
- UID=2 (潘186): spread_uid=1, agent_level=2 (云店, grade=2), direct=800, frozen_points=9296
- UID=54 (金25): spread_uid=2, agent_level=1 (创客, grade=1), direct=500, frozen_points=0
- UID=55 (金68): spread_uid=54, agent_level=0 (非分销员), frozen_points=0
- UID=56 (wx363053): spread_uid=55, agent_level=0 (非分销员), frozen_points=0
推荐链确认: uid=1 -> uid=2 -> uid=54 -> uid=55 -> uid=56
UID=55 和 UID=56 的已付款订单(全部 is_queue_goods=1)
- #142 wx770632864445235200 | UID=55 | 范氏国香中式轻养生灸3条套装
- #144 wx770679631480094720 | UID=55 | 城市休闲折叠单车6速+2条养生灸
- #145 wx770680112881336320 | UID=55 | 紫兰国香粉嫩套装多部位可选
- #146 wx770680790747971584 | UID=56 | 城市休闲折叠单车6速+2条养生灸
积分奖励记录
这 4 笔订单在 eb_points_release_log 中完全没有任何 reward_direct / reward_umbrella 记录。
对比同时期 UID=54 自己的订单 (#143 wx770633621278031872) 则正常生成了奖励(UID=1 获得 1000 直推奖励)。
预期应产生的奖励(以 UID=55 的一笔订单为例)
按当前代码 propagateReward 级差算法,UID=55 (非分销员) 购买后:
flowchart TD
buyer["UID=55 买家 (agent_level=0, direct=0)"]
uid54["UID=54 创客 (depth=0, direct=500)"]
uid2["UID=2 云店 (depth=1, direct=800)"]
uid1["UID=1 服务中心 (depth=2, direct=1000)"]
buyer -->|"spread_uid=54"| uid54
uid54 -->|"actual=500-0=500"| uid54
uid54 -->|"nextLower=500"| uid2
uid2 -->|"actual=800-500=300"| uid2
uid2 -->|"nextLower=800"| uid1
uid1 -->|"actual=1000-800=200"| uid1
- UID=54 应获得 500 直推奖励(级差)
- UID=2 应获得 300 直推奖励(级差)
- UID=1 应获得 200 直推奖励(级差)
UID=56 的订单类似(UID=55 非分销员 depth=0 => directCascadeActive 变 false => 仅伞下奖励,如果开关开着的话)。
根因分析
- 服务器代码未更新:生产服务器(47.94.76.64)上运行的代码很可能不是最新版本。UID=54 的订单(#143)成功产生奖励,但 UID=55/56 的订单(#142/#144/#145/#146)完全没有记录,说明支付回调 Pay.php 中的积分奖励逻辑未正确触发。
**hjf_queue_pool_enable=0**(公排关闭):走的是同步分支(Pay.php L164-216),应直接调用reward()。但实际未生成记录,说明该服务器的 Pay.php 可能还是旧版本。- UID=54 订单的异常数据:订单 #143 的
order.spread_uid=1但user.spread_uid=2(不一致),且 UID=1 拿到 1000 而非级差 200,进一步证实服务器运行的是更早的非级差版本。
修复方案
步骤 1:部署最新代码到生产服务器
确保以下文件已同步到 47.94.76.64:
- app/listener/order/Pay.php — 支付回调中的积分奖励同步逻辑
- app/services/hjf/PointsRewardServices.php — 级差+直推链校验
- app/command/HjfPatchMissingRewards.php — 补发命令
步骤 2:使用补发命令修复缺失的积分奖励
代码部署后,在服务器上依次执行:
# 先 dry-run 确认哪些订单需要补发
php think hjf:patch-rewards --dry-run
# 也可针对单笔订单验证
php think hjf:patch-rewards --order-id=142 --dry-run
# 确认无误后执行实际补发
php think hjf:patch-rewards
该命令已内置幂等检查(跳过已有 reward 记录的订单),安全执行。
步骤 3:验证补发结果
补发后查询确认:
SELECT uid, points, type, mark, order_id
FROM eb_points_release_log
WHERE order_id IN (
'wx770632864445235200','wx770679631480094720',
'wx770680112881336320','wx770680790747971584'
)
ORDER BY order_id, uid;
预期:每笔 UID=55 的订单应产生 UID=54(500) + UID=2(300) + UID=1(200) 的记录;UID=56 的订单因 depth=0 非分销员,直推链中断,仅在伞下开关开启时产生伞下奖励。