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

View File

@@ -33,7 +33,18 @@
"usedAt": 1776000797914,
"industryId": "all"
}
],
"d11a5ebd8e064cc19ff4a85b8d931dac": [
{
"expertId": "SeniorDeveloper",
"name": "吴八哥",
"profession": "高级开发工程师",
"avatarUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/avatars/02-Engineering/SeniorDeveloper/SeniorDeveloper.png",
"promptUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/experts/02-Engineering/SeniorDeveloper/SeniorDeveloper_zh.md",
"usedAt": 1776443595917,
"industryId": "02-Engineering"
}
]
},
"lastUpdated": 1776017699886
"lastUpdated": 1776444657438
}

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避免重复初始化。

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

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() 不为空,否则整个任务跳过