docs(memory): 补充分销佣金解冻任务分析与排查日志

- 新增 DealerCommissionUnfreeze10584Task 解冻规则详解
- 说明送水套餐与非送水套餐的不同解冻触发条件
- 解析“已送达”与“已完成”状态区别及影响
- 列出常见未解冻原因及排查优先级
- 增加长期记忆文件中分销佣金解冻相关业务规则和状态流转说明
- 添加2026-04-18排查解冻任务未触发的问题及可能原因
- 更新专家历史记录,新增高级开发工程师吴八哥信息
- 新增生产环境 application-test.yml 配置文件示例
This commit is contained in:
2026-04-18 10:58:38 +08:00
parent fa5260d583
commit eadaa8c4dd
5 changed files with 162 additions and 1 deletions
+20
View File
@@ -50,6 +50,26 @@ import com.wechat.pay.java.service.payments.model.Transaction;
---
---
## 分销佣金解冻任务分析(DealerCommissionUnfreeze10584Task
**订单号**2038841514750459904
### 解冻规则
- **送水套餐**shop_order.form_id IN 水票模板的 goods_id):该订单关联的水票第一条送水订单 deliveryStatus=40(已完成)才触发解冻
- **非送水套餐**(form_id 不在水票模板中):shop_order.order_status=1 即触发解冻
### "已送达"≠"已完成"的关键区别
- deliveryStatus=30(送达待确认):配送员拍照确认送达,此时**不触发解冻**
- deliveryStatus=40(已完成):需用户手动确认收货 OR 超时24h自动确认后才到达此状态
### 常见未解冻原因(按排查优先级)
1. 送水订单停在 deliveryStatus=30(送达待确认),未到 40(已完成)
2. shop_order.form_id 在水票模板里,走的是"送水套餐"逻辑,但没有找到对应的 glt_user_ticket 记录
3. glt_user_ticket 记录缺失或 order_no 字段为空
4. 已有 flowType=50 的解冻 marker(说明已解冻)
### 次要原因
`RSAAutoCertificateConfig` 每次回调都重新 `build()`SDK 内部会发一次 `serial=test` 的探测验签,网络问题或并发场景下可能导致首次回调失败。**已优化**:添加 `notifyConfigCache`ConcurrentHashMap)按 mchId 缓存 config,避免重复初始化。
+13
View File
@@ -0,0 +1,13 @@
# 2026-04-18 工作日志
## 排查解冻任务未触发问题
- 用户反馈:GltTicketOrder订单已完成配送,但部分订单未触发解冻(freezeMoney未转到money
- 完整梳理了资金流转链路:结算→冻结→解冻
- 识别出5个可能原因:
1. GltTicketOrder.userTicketId为NULL(解冻任务硬性过滤条件)
2. GltUserTicket.orderNo缺失导致关联断裂
3. isFirstTicketOrderFinished()"第一条"逻辑阻断后续订单解冻
4. loadWaterFormIds()返回空集导致整个解冻任务跳过
5. 配送员提成orderNo格式不匹配(非bug,配送员提成本身不经过冻结)
- 提供了5条排查SQL和修复建议
- 关键文件:DealerCommissionUnfreeze10584Task.java、GltTicketOrderServiceImpl.java
+32
View File
@@ -0,0 +1,32 @@
# MEMORY.md - 长期记忆
## 项目概况
- 后端:/Users/gxwebsoft/JAVA/java-10584Spring Boot + MyBatis-Plus
- 后台管理:/Users/gxwebsoft/VUE/mp-10584
- 小程序端:/Users/gxwebsoft/VUE/template-10584
- 多租户架构(tenantId 隔离),主力租户 10584
## 技术栈
- 后端:Spring Boot + MyBatis-Plus + FastJSON 2.x
- 前端:Nuxt/Vue3 + TypeScript + Ant Design Vue4 + Tailwind
- 小程序:Uni-app/Taro
- 开发环境:Mac + Node.js v22 + JetBrains + Docker + pnpm
## 业务规则备忘
### 分销佣金解冻规则(10584)
- 结算:DealerOrderSettlement10584Task 每10秒,佣金先入 freezeMoney
- 解冻:DealerCommissionUnfreeze10584Task 每20秒,freezeMoney→money
- 送水套餐解冻条件:同一userTicketId下第一条送水订单deliveryStatus=40
- 非送水套餐解冻条件:ShopOrder.orderStatus=1 且 payStatus=true
- 幂等标记:ShopDealerCapital(flowType=50, comments="佣金解冻(capitalId=xxx)")
- 配送员提成:直接入money(不经过冻结),orderNo格式="gltTicketOrder:"+id
### 送水订单状态流转
- 10(待配送)→20(配送中)→30(待客户确认)→40(已完成)
- delivered()配送员确认送达时就会同步ShopOrder.orderStatus=1
- confirmReceive()/autoConfirmTimeout()也会同步
### 已知排查问题
- 解冻任务可能因 userTicketId为空、GltUserTicket.orderNo缺失、"第一条未完成"阻断等原因未触发
- 解冻任务依赖 loadWaterFormIds() 不为空,否则整个任务跳过