123 lines
5.1 KiB
Markdown
123 lines
5.1 KiB
Markdown
---
|
||
name: 直推积分奖励问题3排查
|
||
overview: 通过数据库排查发现:UID=55 和 UID=56 的 4 笔报单商品订单完全没有生成积分奖励记录,需要部署最新代码后使用补发命令修复。
|
||
todos:
|
||
- id: deploy-code
|
||
content: 将最新 queue 分支代码部署到生产服务器 47.94.76.64
|
||
status: pending
|
||
- id: patch-rewards
|
||
content: 在服务器执行 php think hjf:patch-rewards 补发缺失的积分奖励
|
||
status: pending
|
||
- id: verify-results
|
||
content: 查询 points_release_log 确认 4 笔订单的奖励记录已正确生成
|
||
status: pending
|
||
isProject: 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 (非分销员) 购买后:
|
||
|
||
```mermaid
|
||
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 => 仅伞下奖励,如果开关开着的话)。
|
||
|
||
## 根因分析
|
||
|
||
1. **服务器代码未更新**:生产服务器(47.94.76.64)上运行的代码很可能不是最新版本。UID=54 的订单(#143)成功产生奖励,但 UID=55/56 的订单(#142/#144/#145/#146)完全没有记录,说明支付回调 [Pay.php](pro_v3.5.1/app/listener/order/Pay.php) 中的积分奖励逻辑未正确触发。
|
||
2. `**hjf_queue_pool_enable=0`**(公排关闭):走的是同步分支(Pay.php L164-216),应直接调用 `reward()`。但实际未生成记录,说明该服务器的 Pay.php 可能还是旧版本。
|
||
3. **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](pro_v3.5.1/app/listener/order/Pay.php) — 支付回调中的积分奖励同步逻辑
|
||
- [app/services/hjf/PointsRewardServices.php](pro_v3.5.1/app/services/hjf/PointsRewardServices.php) — 级差+直推链校验
|
||
- [app/command/HjfPatchMissingRewards.php](pro_v3.5.1/app/command/HjfPatchMissingRewards.php) — 补发命令
|
||
|
||
### 步骤 2:使用补发命令修复缺失的积分奖励
|
||
|
||
代码部署后,在服务器上依次执行:
|
||
|
||
```bash
|
||
# 先 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:验证补发结果
|
||
|
||
补发后查询确认:
|
||
|
||
```sql
|
||
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 非分销员,直推链中断,仅在伞下开关开启时产生伞下奖励。 |