# MEMORY.md - 长期记忆

## 项目概况
- 后端：/Users/gxwebsoft/JAVA/java-10584（Spring 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() 不为空，否则整个任务跳过
