1. 文档目标
状态字典不能只写“数字等于什么”。真正可用于开发和排查的状态机还必须说明:
- 状态属于哪个业务对象和字段;
- 哪个动作、接口、MQ 或定时任务触发迁移;
- 迁移允许的前置状态;
- 迁移后要同步哪些数量、库存、资金和下游系统;
- 哪些状态是终态,哪些允许回退或恢复;
- 相同数值在不同枚举里为什么不能混用;
billStatus、orderType、srcOrderType、transType各自解决什么问题。
本文适用于:
- 判断页面按钮为什么不可用;
- MQ 回调提示“状态错误或者消息重复”;
- 单据状态与库存、付款、配送、活动状态不一致;
- 新增状态、来源、订单类型或交易类型;
- 评估补偿任务是否能安全重跑;
- 排查历史数据中的废弃状态和兼容分支。
状态迁移来自当前代码静态核对。外部订单中心、支付中心、OA、配送中心的真实重试和状态合同需结合环境消息证据确认。
2. 先区分六个维度
| 维度 | 回答的问题 | 采购例子 | 销售例子 |
|---|---|---|---|
billStatus / status | 这张单当前走到哪一步 | 待支付、待出库、配送中 | 待出库、部分出库、完成 |
orderType | 这张单本质是什么业务品类 | 普通采购、退货、秒杀采购 | 常由单据/出库类型表达 |
srcOrderType / sourceType | 它从哪里来 | 预订单、秒杀、轮胎 | E站、机器人、SaaS |
transType | 它造成什么交易方向 | 采购、采退、入库 | 销售、出库、销退 |
| 支付/核销状态 | 钱处理到哪一步 | 待支付、付款确认 | 未收、部分收、全部收 |
| 数量状态 | 商品在哪个履约阶段 | 待发、在途、入库、退货 | 未出、部分出、已出 |
flowchart LR
DOC["一张业务单"] --> S["生命周期状态\nbillStatus"]
DOC --> T["业务类型\norderType"]
DOC --> SRC["来源\nsrcOrderType/sourceType"]
DOC --> TRANS["交易方向\ntransType"]
DOC --> MONEY["支付/核销状态"]
DOC --> QTY["数量过程状态"]
六个维度可以同时存在。例如一张单可以是:
秒杀采购订单(orderType=30-Cxx-77)
+ 来源于秒杀(srcOrderType=13)
+ 采购交易(transType=170401)
+ 当前待支付(billStatus=10)
+ 在线支付(payment=1)
+ 明细待发数量尚未进入履约
3. 枚举入口地图
| 业务 | 入口文件 | 主要字段 |
|---|---|---|
| 采购 | application/KzData/Enums/PoOrderEnums.php | billStatus, orderType, srcOrderType, payment, closeType |
| 预订单 | PreOrderEnums.php | 主单状态、售后状态、退款状态 |
| 销售 | SaOrderEnums.php | 销售状态、出库状态、来源、支付、核销 |
| 销售出库 | SaInvoiceEnums.php | 出库状态、销退类型、来源、出库进度 |
| 秒杀 | FlashActivityEnums.php | 审批、启用、页面、商品、购物车、订单 |
| 渠道 | ChannelOrderEnums.php, ChannelAftersaleEnums.php | 渠道订单和售后字符串状态 |
| 微仓 | MoveMallEnums.php | 补货、退货、场景和支付 |
| 调拨 | TfInvoiceEnums.php, StfApplyEnums.php, StfInvoiceEnums.php | 站内/站间出入库状态 |
| 配送 | TransportEnums.php, ThirdDeliveryEnums.php | 自配送、三方配送、退回 |
| 财务 | PaymentEnums.php, StatementEnums.php | 收付款、对账、收款和发送任务 |
| 交易类型 | TransTypeEnums.php | 库存、账户、报表的业务方向 |
4. 采购主状态字典
4.1 状态值
| 值 | 常量 | 页面含义 | 是否常见终态 | 主要进入方式 |
|---|---|---|---|---|
0 | BILLSTATUS_DRAFT | 草稿 | 否 | 保存草稿、尚未提交 |
1 | BILLSTATUS_SUBMITED | 待处理/待审核 | 否 | 线下单提交、在线支付成功、退款中间恢复 |
2 | BILLSTATUS_AUDITING | 审核中 | 否 | 外部订单中心进入审核 |
3 | BILLSTATUS_AUDIT_PASS | 待出库 | 否 | 审核通过、售后确认仓库 |
4 | BILLSTATUS_DELIVERY | 配送中 | 否 | 采购发货或部分履约 |
5 | BILLSTATUS_FINISHED | 已完成 | 通常是 | 全部入库、退货退款完成等 |
8 | BILLSTATUS_AUDIT_UNPASS | 审核不通过 | 通常是 | 外部审核拒绝 |
9 | BILLSTATUS_CLOSED | 已关闭 | 通常是 | 主动关闭、行关汇总、业务关单 |
10 | BILLSTATUS_WAIT_PAY | 待支付 | 否 | 在线采购创建 |
11 | BILLSTATUS_WAIT_REFUND | 待退款 | 否 | 在线未发货退货审核通过等 |
12 | BILLSTATUS_PAY_OVERTIME | 已过期/支付超时 | 不是绝对终态 | 订单中心超时关闭消息 |
13 | BILLSTATUS_WAIT_STORAGE_IN | 采购退货待仓库入库 | 否 | 已发货/已入库采退进入仓库处理 |
4.2 采购不是单一路径
stateDiagram-v2
[*] --> Draft: 保存草稿
Draft --> Submitted: 提交线下单
[*] --> WaitPay: 创建在线支付单
WaitPay --> Submitted: 支付成功
WaitPay --> PayOvertime: 超时关闭消息
PayOvertime --> Submitted: 迟到的支付成功回调
Submitted --> Auditing: 订单中心受理
Submitted --> AuditPass: 部分回调直接通过
Auditing --> AuditPass: 审核通过
Submitted --> AuditUnpass: 审核拒绝
Auditing --> AuditUnpass: 审核拒绝
AuditPass --> Delivery: 上游发货
Delivery --> Finished: 全部入库/履约完成
AuditPass --> Closed: 未发货关闭
Delivery --> Closed: 部分关闭并完成剩余履约
Submitted --> WaitRefund: 在线未发货退货审核通过
WaitRefund --> Finished: 退款成功
AuditPass --> WaitStorageIn: 已履约采退
WaitStorageIn --> Finished: 退货入库/结算完成
上图是多业务路径并集,不代表任意采购类型都允许所有箭头。
4.3 已观察到的迁移合同
| 动作/事件 | 前置状态 | 后置状态 | 触发方 | 关键副作用 |
|---|---|---|---|---|
| 普通提交 | 草稿 | 已提交 | PC/Service | 创建/同步采购业务 |
| 在线支付成功 | 待支付或支付超时 | 已提交 | paycenter_pay_result | 付款主明细、账户、payinfo、支付时间;秒杀转已支付 |
| 支付超时 | 非关闭/非已过期在线单 | 支付超时 | orderCenterOrderCancel | 释放活动/预订单数量或专属额度,秒杀释放锁量 |
| 订单审核通过 | 已提交/审核中 | 待出库 | 订单中心 | 允许后续配送出库 |
| 订单审核拒绝 | 已提交/审核中 | 审核不通过 | 订单中心 | 退回部分活动/数量,写审核意见 |
| 采购发货 | 待出库/配送中/完成兼容 | 配送中 | 配送/订单/SaaS MQ | 写发货明细,待发转在途,发库存事件 |
| 全部入库 | 配送中 | 已完成 | 采购入库 | 写入库和库存,减少在途 |
| 未发货退货审核 | 已提交 | 待退款 | 售后审核 | 待发转待退 |
| 退款成功 | 待退款 | 已完成 | 支付/订单中心 | 负付款、退款明细、采退完成 |
| 关闭 | 待出库/配送中等 | 已关闭或保持配送中 | 人工/MQ | 关闭数量、活动释放、库存事件 |
4.4 非法或危险迁移
| 尝试 | 当前代码表现 | 风险 |
|---|---|---|
| 已支付状态再次消费支付成功 | 抛“状态错误或者消息重复”,返回 NACK | 重试风暴或死信,需要幂等识别 |
| 支付超时后支付成功 | 允许恢复为已提交 | 专属额度可能变负,代码已有告警说明 |
| 已关闭/已超时再次超时关闭 | 过滤并 ACK | 幂等但需确认秒杀/活动已释放 |
| 非待退款单消费退款成功 | 抛状态非法 | 外部与本地时序不一致会卡住退款 |
| 采购退货审核回调 | 当前部分入口开头直接 ACK,旧代码不可达 | 逻辑已迁移 dgi-purchase-service,DGJ 不再是唯一事实源 |
5. 采购订单类型 orderType
5.1 完整类型字典
| 值 | 常量 | 业务含义 | 备注 |
|---|---|---|---|
00-Cxx-00 | ORDERTYPE_INI | 期初订单 | 历史初始化 |
00-Cxx-01 | ORDERTYPE_ACTIVITY_00 | 老活动订单 | 已弃用,兼容历史 |
30-Cxx-11 | ORDERTYPE_ACTIVITY_30 | 老活动订单 | 已弃用,兼容历史 |
00-Cxx-02 | ORDERTYPE_SETMENU | 老套餐订单 | 已弃用 |
30-Cxx-15 | ORDERTYPE_DIRECT | 云仓直发 | 新类型 |
30-Cxx-02 | ORDERTYPE_DIRECT_OLD | 云仓直发 | 老类型 |
30-Cxx-08 | ORDERTYPE_PRE_ORDER | 服务站预订采购 | 与新 PreOrder 来源要区分 |
30-Cxx-04 | ORDERTYPE_RETURN_LESS | 其他退货 | 采购退货 |
30-Cxx-05 | ORDERTYPE_RETURN_UNSALABLE | 滞销品退货 | 可关单入库类型 |
30-Cxx-06 | ORDERTYPE_RETURN_BADGOODS | 不良品退货 | 轮胎理赔也可能使用 |
30-Cxx-16 | ORDERTYPE_RETURN_DIRECT | 直采退货 | 采购退货 |
30-Cxx-17 | ORDERTYPE_RETURN_UNFILLED | 未发货退货 | 常进入待退款 |
30-Cxx-18 | ORDERTYPE_RETURN_FIRST | 首配退货 | 可关单入库类型 |
30-Cxx-03 | ORDERTYPE_SUPPLEMENT_ORDER | 多发补单 | 补齐上游多发 |
30-Cxx-01 | ORDERTYPE_NORMAL_ORDER | 普通采购 | 主路径 |
30-Cxx-40 | ORDERTYPE_KA_ORDER | KA 订单 | 大客户采购语义 |
30-Cxx-20 | ORDERTYPE_BAD_GOOD | 不良品订单 | 非退货常量 |
30-Cxx-07 | ORDERTYPE_DISPATCH_ORDER | 急件到付 | 配送模式特殊 |
30-Cxx-70 | ORDERTYPE_SELF_PICK_ORDER | 急件自提 | 自提流程 |
30-Cxx-09 | ORDERTYPE_FIRST_ORDER | 首批配货 | 首配 |
30-Cxx-10 | ORDERTYPE_HDMZ_ORDER | 活动满赠 | 活动来源 |
30-Cxx-23 | ORDERTYPE_ZSFL_ORDER | 专属返利 | 额度/返利副作用 |
30-Cxx-50 | ORDERTYPE_BU_ORDER | 多供应商订单 | 可能拆供应商 |
30-Cxx-60 | ORDERTYPE_BU_BT_ORDER | 多供应商授信订单 | 支付/授信特殊 |
30-Cxx-71 | ORDERTYPE_PRE_BT_ORDER | 新预售专属授信 | 预售 + 授信 |
30-Cxx-80 | ORDERTYPE_BUYING_TASK | 采购任务订单 | 经营任务 |
30-Cxx-81 | ORDERTYPE_NEW_TASK | 上新任务订单 | 上新任务 |
30-01 | ORDERTYPE_SELF_ORDER | 自制赠品订单 | 格式与其他类型不同 |
30-Cxx-74 | ORDERTYPE_SPEED_ORDER | 周转仓/半日达 | 物流特殊 |
30-Cxx-24 | ORDERTYPE_PROMOTION_ORDER | 不良品促销 | 产品促销 |
30-Cxx-75 | ORDERTYPE_GIFT_ACTIVITY_ORDER | 赠品活动采购 | 新赠品活动 |
30-Cxx-77 | ORDERTYPE_FLASH_ORDER | 秒杀采购 | ORDER_TYPE_MAP 显示为“折扣订单” |
5.2 类型相关辅助维度
| 字段 | 值 | 含义 |
|---|---|---|
payment | 0 | 线下挂账 |
payment | 1 | 在线支付 |
closeType | 0 | 未关闭 |
closeType | 1 | 部分关闭 |
closeType | 2 | 整单关闭 |
orderCate | 0 | 历史普通 |
orderCate | 1 | 现货 |
orderCate | 2 | 意向 |
orderCate | 3 | 多发补单 |
orderCate | 4 | 活动 |
orderCate | 5 | 专属订单 |
sendMode | -1/0/1 | 默认/普通发货/直发 |
signStatus | 0/1/2 | 未签收/部分签收/全部签收 |
document_type | 0/1 | 普通采购/上新采购 |
6. 采购来源 srcOrderType
| 值 | 常量 | 来源 | 关键关联/副作用 |
|---|---|---|---|
0 | SRC_ORDER_TYPE_NORMAL | 普通 | 无特殊来源 |
1 | SRC_ORDER_TYPE_ACTIVITY | 普通活动 | 关闭/超时可能退活动数量 |
2 | SRC_ORDER_TYPE_PACKAGE | 套餐 | 注释为未使用 |
3 | SRC_ORDER_TYPE_PDM | 撮合平台 | 外部平台关系 |
8 | SRC_ORDER_TYPE_PORETURN | 采购退货 | 关联原采购 |
9 | SRC_ORDER_TYPE_DIFF | 差异订单 | 差异补偿 |
10 | SRC_ORDER_TYPE_ONLINE_REFUND | 在线未发货采购退货 | 退款路径 |
11 | SRC_ORDER_TYPE_TYRE | 轮胎宝退货 | 理赔联动 |
12 | SRC_ORDER_TYPE_PRE_ORDER | 新预订单提货 | 超时退回提货数量 |
13 | SRC_ORDER_TYPE_FLASH_ACTIVITY | 秒杀 | 支付转 used、关闭释放 locked/used |
flowchart TD
PO["采购单状态变化"] --> SRC{"srcOrderType"}
SRC -->|1 活动| ACT["退回活动商品数量"]
SRC -->|11 轮胎| TYRE["更新理赔状态"]
SRC -->|12 预订单| PRE["退回/扣减提货数量"]
SRC -->|13 秒杀| FLASH["locked/used 与秒杀订单联动"]
SRC -->|0 普通| NORMAL["普通采购副作用"]
7. 新预订单状态机
7.1 主单状态
| 值 | 常量 | 含义 | 主要迁移 |
|---|---|---|---|
1 | STATUS_TO_PAY | 待支付 | 创建后等待支付 |
2 | STATUS_TO_PICK | 待提货 | 支付成功 |
3 | STATUS_PICKING | 提货中 | 部分生成采购提货单 |
4 | STATUS_PICK_FINISH | 全部提货 | 可进入售后/退款收尾 |
9 | STATUS_CANCEL | 用户取消 | 未支付主动取消 |
10 | STATUS_AUTO_CANCEL | 超时自动取消 | 定时/订单中心超时 |
11 | STATUS_CLOSED | 已关闭 | 业务关闭 |
12 | STATUS_ORDER_FINISH | 已完成 | 全部提货后退款完成 |
stateDiagram-v2
[*] --> ToPay
ToPay --> ToPick: 支付成功
ToPay --> Cancel: 用户取消
ToPay --> AutoCancel: 超时
ToPick --> Picking: 部分提货
Picking --> PickFinish: 全部提货
PickFinish --> OrderFinish: 退款/售后收尾完成
ToPick --> Closed: 关闭
Picking --> Closed: 关闭
7.2 预订单售后和退款
| 维度 | 值 | 含义 |
|---|---|---|
| 售后 | 1 | 待审核 |
| 售后 | 4 | 审核通过、待退款 |
| 售后 | 8 | 已取消 |
| 售后 | 9 | 退款完成 |
| 退款 | 0 | 无退款 |
| 退款 | 1 | 退款中 |
| 退款 | 2 | 退款完成 |
主单完成、售后完成和退款完成是三个字段事实,不能只查一个状态。
8. 销售主状态机
8.1 状态值
| 值 | 常量 | 含义 | 数量条件 |
|---|---|---|---|
0 | SA_STATUS_WAIT | 待出库 | 有效出库数量为 0,仍可出库 |
1 | SA_STATUS_OUT_FEW | 部分出库 | 0 < 有效出库 + 关闭 < 销售总量 |
2 | SA_STATUS_OUTED | 已完成 | 有效出库/关闭覆盖销售总量 |
3 | SA_STATUS_CLOSE | 已关闭 | 停止后续出库 |
SaInvoiceSer::getOutboundQty() 会过滤已撤销出库,再根据销售总量、有效出库数量和关闭数量重算销售状态。
stateDiagram-v2
[*] --> Wait
Wait --> Partial: 部分出库
Wait --> Finished: 一次全部出库
Partial --> Finished: 剩余全部出库/关闭
Wait --> Closed: 关闭
Partial --> Closed: 关闭剩余行
Finished --> Partial: 撤销部分出库后重算
Finished --> Wait: 全部出库撤销后重算
销售状态可能因撤销出库回退,不是严格单向状态机。
8.2 销售来源
| 值 | 常量 | 展示来源 | 支付/场景 |
|---|---|---|---|
0 | ORDER_SOURCE_TYPE_PT | 销售开单 | PC 普通开单 |
1 | ORDER_SOURCE_TYPE_KW | ERP 订单 | 快维 SaaS |
2 | ORDER_SOURCE_TYPE_MOVE | 微仓订单 | 历史兼容 |
5 | ORDER_SOURCE_TYPE_APP_SALE | 维修厂 APP 普通 | 已废弃兼容 |
6 | ORDER_SOURCE_TYPE_APP_ACTIVITY | 维修厂 APP 活动 | 已废弃兼容 |
7 | ORDER_SOURCE_TYPE_KW_APPLET | 快维 SaaS 小程序 | 历史兼容 |
8 | ORDER_SOURCE_TYPE_APPLET_CHARGE | E站商城 | 挂账 |
9 | ORDER_SOURCE_TYPE_APPLET | E站商城 | 微信 |
10 | ORDER_SOURCE_TYPE_MOVE_SEND | E站维修 | 挂账 |
11 | ORDER_SOURCE_TYPE_MOVE_PICK | 微仓领料 | 挂账 |
12 | ORDER_SOURCE_TYPE_MOVE_SHOP | 微仓铺货 | 微仓 |
13 | ORDER_SOURCE_TYPE_TRANSFER_OFFLINE_ONLINE | 线下转线上铺货 | 微仓 |
14 | ORDER_SOURCE_TYPE_ACT | E站活动 | 小程序活动 |
15 | ORDER_SOURCE_TYPE_MOVE_SEND_WX | E站维修 | 微信 |
16 | ORDER_SOURCE_TYPE_ROBOT | AI 助手订单 | 挂账 |
17 | ORDER_SOURCE_TYPE_APP_IM | E站 APP IM | 挂账 |
18 | ORDER_SOURCE_TYPE_APP_IM_WX | E站 APP IM | 微信 |
19 | ORDER_SOURCE_TYPE_APP_SHOP | E站 APP 商城 | 挂账 |
20 | ORDER_SOURCE_TYPE_APP_SHOP_WX | E站 APP 商城 | 微信 |
21 | ORDER_SOURCE_TYPE_APP_ACT | E站 APP 活动 | 挂账 |
22 | ORDER_SOURCE_TYPE_APP_ACT_WX | E站 APP 活动 | 微信 |
8.3 销售支付和核销
| 字段 | 值 | 含义 |
|---|---|---|
payType | 0 | 挂账 |
payType | 1 | 现金 |
payType | 2 | 微信 |
hxStateCode | 0 | 未收款 |
hxStateCode | 1 | 部分收款 |
hxStateCode | 2 | 全部收款 |
billNo_type | 0 | 销售 |
billNo_type | 1 | 普通铺货 |
billNo_type | 2 | 微仓铺货 |
9. 销售出库状态机
9.1 状态值
| 值 | 常量 | 含义 | 备注 |
|---|---|---|---|
0 | BILL_STATUS_RE_OUTED | 已出库 | 老销退单兼容 |
1 | BILL_STATUS_OUTED | 已出库 | 库存通常已扣减 |
2 | BILL_STATUS_SENDIND | 派送中 | 配送已开始 |
3 | BILL_STATUS_ARRIVE | 已送达 | 可进入对账 |
4 | BILL_STATUS_CHECK | 已对账 | 未完全收款 |
5 | BILL_STATUS_OVER | 已核销 | 金额已覆盖或零金额 |
6 | BILL_STATUS_CANCELED | 已撤销 | 库存应反向恢复 |
stateDiagram-v2
[*] --> Outed
Outed --> Sending: 配送中
Sending --> Arrive: 已送达
Sending --> Outed: 配送取消/退回
Arrive --> Check: 对账但未全部收款
Arrive --> Over: 零金额或已全收
Check --> Over: 后续收款完成
Check --> Arrive: 撤销对账且未收款
Outed --> Canceled: 撤销出库
Sending --> Canceled: 允许的撤销路径
9.2 迁移和副作用
| 动作 | 前置状态 | 后置状态 | 副作用 |
|---|---|---|---|
| 创建销售出库 | 销售待出/部分出 | 已出库 | 扣库存、重算销售状态、同步下游 |
| 自配送开始 | 已出库 | 派送中 | 配送信息和时间 |
| 配送完成 | 派送中 | 已送达 | 签收/送达信息 |
| 配送取消 | 派送中 | 已出库 | 清理或保留配送关系,允许重新配送 |
| 对账 | 已送达或对账前状态 | 已对账/已核销 | 对账单变已核对,按金额决定状态 |
| 撤销对账 | 已对账且未收款 | 已送达 | 有收款记录的行不会回退 |
| 收款完成 | 已对账 | 已核销 | hxStateCode=2 |
| 撤销出库 | 未撤销 | 已撤销 | 反向库存、销售状态回退、同步撤销 |
9.3 出库辅助类型
| 字段 | 值 | 含义 |
|---|---|---|
return_type | 0 | 普通退货 |
return_type | 1 | 不良品退货 |
sourceType | 2 | 移动服务站退货 |
sourceType | 3 | 出库撤销关联原出库 |
sourceType | 4 | 核销式撤销 |
sourceType | 5/6/7 | APP 普通/活动/退货 |
invoice_type | 1/2/3 | 销售/铺货/销退 |
out_status | 0/1/2/3/4 | 未出/全出/撤销/结单停止/关闭销售 |
10. 秒杀多维状态机
秒杀至少有六套状态,任何一套单独满足都不能证明可购买。
10.1 状态字典
| 维度 | 字段 | 值 | 含义 |
|---|---|---|---|
| 申请 | apply_status | 0/1/2/3 | 草稿/审批中/通过/驳回 |
| OA | oa_status | 0/1/2/3 | 草稿/审批中/通过/驳回 |
| 启用 | enable_status | 0/1/2 | 草稿/启用/提前结束 |
| 页面计算 | 运行时 | 1/2/3 | 未开始/进行中/已结束 |
| 商品 | 商品状态 | 0/1/2/3 | 待开始/进行中/已结束/失效 |
| 购物车 | status | 0/1 | 失效/有效 |
| 订单 | order_status | 0/1/2/3/4 | 已创建/待支付/已支付/取消/关闭 |
10.2 活动审批和启用
stateDiagram-v2
[*] --> Draft
Draft --> OaWait: 提交 OA
OaWait --> Passed: OA 通过
OaWait --> Rejected: OA 驳回
Rejected --> Draft: 编辑后重提
Passed --> Enabled: 启用
Enabled --> EndEarly: 提前结束
页面“进行中”还要求当前时间位于活动窗口,不能直接等同于 enable_status=1。
10.3 秒杀订单
stateDiagram-v2
[*] --> Created: 创建快照
Created --> WaitPay: 采购单生成并待支付
WaitPay --> Paid: 支付中心成功
Created --> Cancel: 用户取消
WaitPay --> Cancel: 用户主动取消
WaitPay --> Closed: 采购超时/关闭
Paid --> Closed: 采购行关闭,可能部分释放 used
| 迁移 | 数量副作用 | 关联采购副作用 |
|---|---|---|
| 创建/待支付 | locked_qty += qty | 创建 30-Cxx-77 采购单 |
| 支付成功 | locked_qty -= qty, used_qty += qty | 采购从待支付变已提交 |
| 主动取消 | locked_qty -= qty | 关闭关联采购 |
| 支付超时/采购关闭 | 按未支付释放 locked | 秒杀单变关闭 |
| 已支付采购行关闭 | 按关闭差量减少 used_qty | 明细记录 closed_qty 防重复 |
10.4 可买条件
flowchart TD
A["审批/OA 通过"] --> B["enable_status=1"]
B --> C["当前时间在窗口"]
C --> D["商品状态可售"]
D --> E["服务站命中范围"]
E --> F["物理/指定/预留库存足够"]
F --> G["活动余量 = total-locked-used"]
G --> H["站点/用户限购未超"]
H --> BUY["允许加购/下单"]
11. 渠道订单和售后
11.1 渠道订单
| 值 | 含义 | 主要迁移 |
|---|---|---|
created | 待审核 | 创建后等待人工/自动审核 |
wait_ship | 待发货 | 审核通过;DCD 某些创建路径可直接进入 |
part_ship | 部分发货 | 明细发货数量未覆盖全部 |
finish | 已完成 | 全部发货/签收完成 |
cancel | 已取消 | 审核拒绝或取消 |
stateDiagram-v2
[*] --> Created
[*] --> WaitShip: DCD 特定创建路径
Created --> WaitShip: 审核通过
Created --> Cancel: 审核拒绝
WaitShip --> PartShip: 部分发货
WaitShip --> Finish: 全部发货
PartShip --> Finish: 剩余发货
11.2 渠道售后
| 值 | 含义 | 动作 |
|---|---|---|
created | 退单创建 | 待审核 |
pass | 待收货 | 审核通过 |
reject | 已拒绝 | 审核拒绝 |
finish | 已完成 | 退货入库/退款完成 |
stateDiagram-v2
[*] --> Created
Created --> Pass: action=pass
Created --> Reject: action=reject
Pass --> Finish: 退货处理完成
渠道状态都是字符串;CHS/CHR 是单号前缀;180601/180602 是交易类型。三者不能交叉比较。
12. 微仓补货、退货和调拨
12.1 补货主单
| 值 | 常量 | 含义 | 实际代码说明 |
|---|---|---|---|
0 | MOVE_SUPPLY_STATUS_WAIT_OUT | 待出库 | 枚举存在,当前创建路径直接生成已出库 |
1 | MOVE_SUPPLY_STATUS_OUTED | 待派送 | addMoveSupply() 创建即进入 |
2 | MOVE_SUPPLY_STATUS_DELIVERY | 派送中 | opt_tag=DELIEVER |
3 | MOVE_SUPPLY_STATUS_WAIT_SHELF | 待上架 | opt_tag=CONFIRM |
4 | MOVE_SUPPLY_STATUS_SHELF | 已上架 | 对应调拨全部入库 |
5 | MOVE_SUPPLY_STATUS_CANCEL | 已取消 | 取消路径需专项核对 |
stateDiagram-v2
[*] --> Outed: 创建并完成调出
Outed --> Delivery: DELIEVER
Delivery --> Outed: DEL_CANCEL
Delivery --> WaitShelf: CONFIRM
WaitShelf --> Shelf: 全部扫码上架/调入
updateMsStatus() 对不符合前置状态的请求统一抛“该订单状态已改变”。
12.2 微仓退货
| 值 | 含义 | 迁移条件 |
|---|---|---|
1 | 已退货/已出库 | 创建退货并从微仓移出 |
2 | 部分上架 | 部分商品完成服务站上架 |
3 | 已上架/已入库 | 全部明细 is_shelve=1 |
12.3 站内调拨
| 值 | 常量 | 含义 |
|---|---|---|
1 | TF_BILL_STATUS_DRAFT | 草稿 |
2 | TF_BILL_STATUS_OUTED | 调出未调入 |
3 | TF_BILL_STATUS_IN | 已调出已调入 |
4 | TF_BILL_STATUS_IN_FEW | 已调出部分调入 |
5 | TF_BILL_STATUS_IN_CLOSE | 调入关闭,MAP 未列出 |
12.4 站间调拨申请和实单
| 对象 | 值 | 含义 |
|---|---|---|
| 申请 | 0 | 待出库 |
| 申请 | 1 | 待入库 |
| 申请 | 2 | 已入库 |
| 申请 | 3 | 发货方驳回 |
| 申请 | 4 | 申请方取消 |
| 实单 | 1 | 出库完成 |
| 实单 | 2 | 入库完成 |
补货单、调拨单、库存流水三者状态必须一起检查;补货已上架但调拨未全部调入属于不一致。
13. 配送状态映射
13.1 自配送中心
| TMS 状态 | 含义 | DGJ 出库状态 |
|---|---|---|
10 | 待揽收 | 已出库 1 |
20 | 配送中 | 派送中 2 |
90 | 已送达 | 已送达 3 |
99 | 已取消 | 回退已出库 1 |
13.2 三方配送
| 状态 | 含义 | 常见 DGJ 映射 |
|---|---|---|
10 | 待接单 | 已出库 |
20 | 待取货 | 已出库 |
21 | 骑手到店 | 已出库/派送准备 |
30 | 配送中 | 派送中 |
90 | 已完成 | 已送达 |
98 | 已退回 | 回退已出库并处理退回 |
99 | 已取消 | 回退已出库 |
flowchart LR
EXT["TMS/美团/达达状态"] --> MAP["TransportSer / InvSaService 映射"]
MAP --> INV["销售出库 billStatus"]
INV --> UI["页面配送/送达/对账按钮"]
MAP --> REL["配送关系与退回状态"]
14. 收付款和对账状态
14.1 收付款单
| 值 | 常量 | 含义 | 备注 |
|---|---|---|---|
0 | BILLSTATUS_CONFIRMED | 已确认 | 老状态 |
1 | BILLSTATUS_SUBMITED | 已提交 | 待处理语义需结合入口 |
2 | BILLSTATUS_CONFIRMED1 | 已确认 | V2 兼容 |
6 | BILLSTATUS_CANCELED | 已撤销 | 需反向账户和核销 |
14.2 对账单
| 维度 | 值 | 含义 |
|---|---|---|
| 对账主单 | 0/1 | 草稿/已核对 |
| 收款状态 | 0/1/2 | 未收/部分收/已收 |
| 生成任务 | 0/1/2/3 | 未执行/已执行/成功/失败 |
| 发送状态 | 1/2/3/4/5 | 待处理/处理中/成功/失败/无需发送 |
| 机器人发送 | 0/1/2 | 未发送/已发送/失败 |
stateDiagram-v2
[*] --> Draft
Draft --> Checked: 核对
Checked --> Draft: 取消核对且未发生收款
state Checked {
[*] --> Unreceived
Unreceived --> Partial: 部分收款
Partial --> Received: 全部收款
Unreceived --> Received: 一次全收
}
对账时,来源出库单金额已全收或金额为 0 会直接变已核销 5,否则变已对账 4。取消核对只把“仍为已对账且没有收款”的出库单回退到已送达。
15. transType 交易类型字典
15.1 库存和单据
| 值 | 常量 | 业务语义 | 典型方向 |
|---|---|---|---|
103091 | TRANSTYPE_TRANSFER | 站内调拨 | 一出一入 |
103092 | TRANSTYPE_TRANSFER_S | 站间调拨 | 跨站一出一入 |
150501 | TRANSTYPE_PU_PURCHASE | 采购入库 | 库存增加 |
150502 | TRANSTYPE_PU_SALE_RETURN | 销售退货入库 | 库存增加 |
150601 | TRANSTYPE_SA_INVOICE_SALE | 销售出库 | 库存减少 |
150602 | TRANSTYPE_SA_INVOICE_RETURN | 销售退货 | 按退货实现解释符号 |
150706 | TRANSTYPE_OI_IN | 其他入库 | 增加 |
150806 | TRANSTYPE_OI_OUT | 其他出库 | 减少 |
150701 | TRANSTYPE_OI_PROFIT | 盘盈 | 增加 |
150801 | TRANSTYPE_OI_LOSS | 盘亏 | 减少 |
170401 | TRANSTYPE_PO_PURCHASE | 采购订单 | 采购业务 |
170402 | TRANSTYPE_PO_PURCHASE_RETURN | 采购退货 | 退货业务 |
170403 | TRANSTYPE_PO_RETURN_CLOSE | 采退关闭 | 关闭 |
170410 | TRANSTYPE_PO_OUT | 采购发货/出库 | 在途增加 |
170503 | TRANSTYPE_PO_CLOSE | 采购关闭 | 待发减少 |
170504 | TRANSTYPE_PUO_CLOSE | 订单退货关闭 | 退货关闭 |
170502 | TRANSTYPE_SA_SALE_ORDER | 普通销售单 | 销售业务 |
180001 | TRANSTYPE_INVEN_INI | 期初数量 | 初始化 |
180510 | TRANSTYPE_INVEN_OO | 库存盘点 | 盘点 |
180601 | TRANSTYPE_BIG_SALE | 大客户销售 | 渠道销售 |
180602 | TRANSTYPE_BIG_SALE_RETURN | 大客户销退 | 渠道退货 |
15.2 资金
| 值 | 常量 | 含义 |
|---|---|---|
153001 | TRANSTYPE_PAYMENT_RECEIPT | 销售收款 |
153101 | TRANSTYPE_PATMENT_ADD | 付款 |
153401 | TRANSTYPE_QTSR | 其他收入 |
153402 | TRANSTYPE_QTZC | 其他支出 |
154001 | TRANSTYPE_TRANSFER_IN_PAY | 调拨收款 |
154002 | TRANSTYPE_TRANSFER_OUT_PAY | 调拨付款 |
155001 | TRANSTYPE_PAYMENT_YSK | 预收款 |
155002 | TRANSTYPE_PAYMENT_RETURN | 账户退款 |
155003 | TRANSTYPE_PAYMENT_YEZC | 余额支出 |
155004 | TRANSTYPE_PAYMENT_QCHK | 期初还款 |
155005 | TRANSTYPE_PAYMENT_QCQK | 期初欠款 |
170001 | TRANSTYPE_PREORDER | 预订单 |
170002 | TRANSTYPE_PREORDER_RETURN | 预订单售后 |
15.3 套包和 SaaS 流水
| 值 | 含义 |
|---|---|
191101 | 拆包出库 |
191102 | 拆包入库 |
191201 | 组包出库 |
191202 | 组包入库 |
1001 | SaaS 铺货入库 |
1002 | SaaS 铺货退单出库 |
2001 | SaaS 领用出库 |
2002 | SaaS 撤单入库 |
3001 | 修理厂盘亏/补领 |
4001 | 期初入库 |
5001/5002 | 服务站盘盈/盘亏 |
15.4 已发现的语义冲突
| 冲突 | 当前事实 | 影响 |
|---|---|---|
170502 重用 | 同时定义普通销售单和货位调整入 | 仅凭数值无法区分业务来源 |
150602 MAP 重复键 | MAP 先写“销售退货”,后写“销售退款” | PHP 后项覆盖前项,展示标签变成销售退款 |
150501 注释与 MAP | 常量注释为采购入库,MAP 写采购付款 | 报表/日志名称可能误导 |
170403/170503/170504 | 三种关闭语义并存 | 关闭单、采退关闭、订单退货关闭要按表和来源区分 |
| 数字与字符串并存 | DGJ 主交易多为整数,SaaS 流水为字符串 | 严格比较和序列化可能不一致 |
16. 状态、副作用和事实一致性
flowchart TD
ACTION["业务动作/MQ"] --> GUARD["校验前置状态"]
GUARD --> STATE["更新主单状态"]
STATE --> DETAIL["更新明细/数量过程"]
DETAIL --> INV["库存流水/实时库存"]
DETAIL --> MONEY["付款/账户/核销"]
DETAIL --> EXT["活动/渠道/预订单/理赔"]
STATE --> MQ["发送下游消息"]
MQ --> REPORT["DWD/报表"]
一个状态迁移只有在相关副作用完成后才是业务完整的。排查时按下表判断:
| 状态变化 | 必查副作用 |
|---|---|
| 采购待支付 -> 已提交 | 付款主明细、账户、payinfo、活动/秒杀 |
| 采购待出库 -> 配送中 | 发货明细、数量待发转在途、库存事件 |
| 配送中 -> 完成 | 入库单、在途减少、库存增加、成本 |
| 销售待出 -> 完成 | 出库主明细、库存减少、销售数量重算 |
| 出库已送达 -> 对账/核销 | 对账单、收款金额、核销状态 |
| 秒杀待支付 -> 已支付 | locked 减少、used 增加、采购状态 |
| 微仓待上架 -> 已上架 | 调拨全部入库、明细上架、货位库存 |
17. 状态排查 SQL
17.1 采购
SELECT id, sid, billNo, billStatus, orderType, srcOrderType,
transType, payment, closeType, orderCate, sendMode,
srcOrderId, srcOrderNo, paymentTime, modifyTime, isDelete
FROM t_scm_po_order
WHERE sid = :sid AND billNo = :bill_no;
17.2 销售和出库
-- 替换真实 16 分片
SELECT id, billNo, billStatus, sourceType, payType,
hxStateCode, billNo_type, srcOrderId, srcOrderNo
FROM t_scm_sa_order_{sid_mod_16}
WHERE sid = :sid AND billNo = :sale_no;
-- 替换真实 64 分片
SELECT id, billNo, billStatus, transType, sourceType,
hxStateCode, return_type, srcOrderId, srcOrderNo,
delieverTime, hasTime, cancelTime
FROM t_scm_sa_invoice_0_{sid_mod_64}
WHERE sid = :sid
AND (billNo = :invoice_no OR srcOrderNo = :sale_no);
17.3 秒杀与采购联动
SELECT id, sid, bill_no, activity_id, order_status,
pay_time, cancel_reason, create_time
FROM t_flash_order
WHERE sid = :sid AND bill_no = :flash_no;
SELECT id, activity_id, sku_id, total_qty, locked_qty, used_qty,
status
FROM t_flash_activity_goods
WHERE activity_id = :activity_id;
SELECT id, billNo, billStatus, orderType, srcOrderType,
srcOrderId, srcOrderNo
FROM t_scm_po_order
WHERE sid = :sid
AND srcOrderType = 13
AND (srcOrderId = :flash_order_id OR srcOrderNo = :flash_no);
17.4 状态时间线
SELECT iid, log, operateName, createTime
FROM t_scm_po_log
WHERE iid = :po_order_id
ORDER BY createTime, id;
SELECT iid, log, operateName, createTime
FROM t_scm_sa_log
WHERE iid = :sa_invoice_id
ORDER BY createTime, id;
日志字段以目标环境 DDL 为准;若业务日志缺失,还要查 MQ 和应用日志。
18. 代码检索命令
rg -n "BILLSTATUS_|ORDERTYPE_|SRC_ORDER_TYPE_" application/KzData/Enums/PoOrderEnums.php
rg -n "SA_STATUS_|OUT_BILLSTATUS_|ORDER_SOURCE_TYPE_" application/KzData/Enums/SaOrderEnums.php
rg -n "BILL_STATUS_|INVOICE_TYPE_|OUT_STATUS_" application/KzData/Enums/SaInvoiceEnums.php
rg -n "ORDER_STATUS_|APPLY_STATUS_|ENABLE_STATUS_" application/KzData/Enums/FlashActivityEnums.php
rg -n "MOVE_SUPPLY_STATUS_|MOVE_RE_STATUS_" application/KzData/Enums/MoveMallEnums.php
rg -n "TRANSTYPE_|TRANS_TYPE_" application/KzData/Enums/TransTypeEnums.php
找所有状态写入点:
rg -n "billStatus.*=|bill_status.*=|order_status.*=|setStatus\(" application/Services application/service application/controllers/tasks
找前置状态守卫:
rg -n "状态错误|状态非法|状态已改变|不能取消|不能撤销|in_array.*STATUS" application/Services application/service application/controllers/tasks
19. 常见问题故障树
19.1 回调提示状态错误
flowchart TD
ERR["状态错误/消息重复"] --> OBJ["确认对象和字段"]
OBJ --> CUR["查询当前状态和更新时间"]
CUR --> LOG["查业务日志与 MQ message id"]
LOG --> DUP{"已成功处理过"}
DUP -->|是| IDEM["应识别为幂等成功,检查为何 NACK"]
DUP -->|否| ORDER["检查消息乱序/人工提前操作"]
ORDER --> SIDE["核对库存/资金/活动副作用"]
19.2 页面状态正确但业务不完整
| 页面状态 | 仍需核对 |
|---|---|
| 采购已完成 | 入库主明细、库存流水、实时库存 |
| 销售已完成 | 有效出库单、库存、下游同步 |
| 出库已核销 | 收款明细、账户流水、对账单 |
| 秒杀已支付 | 采购状态、locked/used、支付表 |
| 微仓已上架 | 调拨状态、明细货位和实时库存 |
| 渠道已完成 | 每行发货/签收数量、销售出库 |
20. 新增或修改状态的实施清单
- 在 Enum 中定义值、名称和终态属性;
- 明确允许的前置状态和迁移图;
- Controller/Service 增加统一状态守卫;
- 数据库字段类型能容纳新值;
- 列表筛选、详情、按钮、导出同步;
- MQ 生产者和消费者更新合同;
- 重复消息按业务唯一键幂等;
- 定时补偿知道新状态是否可处理;
- 库存、资金、活动、来源业务副作用齐全;
- 报表/DWD 状态映射更新;
- APP、SaaS、OPS、订单中心、支付和配送完成联调;
- 历史数据和废弃状态仍可读取;
- 日志记录前后状态、动作、操作人和 request/message id;
- 回滚方案不是简单改回旧状态,而是反向处理副作用。
21. 回归清单
21.1 采购和预订单
- 草稿、线下提交、在线待支付两种起点;
- 支付成功、重复成功、超时、超时后迟到支付;
- 审核通过、拒绝、未知结果;
- 待发、部分发、全部发、部分入、全部入;
- 未发货退货、已入库退货、退款、关闭;
- 普通、活动、预订单、秒杀、轮胎、专属授信副作用;
- 预订单部分提货、全部提货、用户取消、自动取消和售后。
21.2 销售和配送
- 待出、部分出、全部出和关闭;
- 部分撤销、全部撤销后状态回退;
- 自配送和三方配送所有外部状态;
- 配送取消/退回后恢复已出库;
- 已送达、对账、部分收款、全收、核销;
- 有收款和无收款两类取消对账;
- 普通、E站、APP、机器人、SaaS 来源。
21.3 活动、渠道和微仓
- 秒杀审批通过/拒绝、启用、提前结束和时间状态;
- 秒杀创建、待支付、支付、取消、关闭和部分采购行关闭;
- 渠道审核通过/拒绝、部分发货、全部发货和售后;
- 微仓派送、取消派送、确认、部分上架、全部上架;
- 调拨主单和补货/退货主单状态一致。
22. 当前代码风险
22.1 状态枚举分散且缺少统一迁移表
大量 Service 直接赋值,状态守卫和副作用散落在 Controller、Service、MQ 任务中。新增状态容易漏列表、报表、消息或补偿。
22.2 支付重复消息以异常 NACK 表达
已成功处理的重复消息会因为采购不再处于待支付/超时而抛错。需要用上游支付单号或消息 ID 建立幂等成功分支。
22.3 支付超时可恢复但额度可能为负
迟到支付把采购恢复为已提交;专属授信代码明确说明重新扣减可能产生负额度,必须建立业务决策和告警。
22.4 迁移服务后保留不可达旧代码
OrderCenterNotify::orderCenterAfterSaleAudit() 开头直接 ACK,后续旧实现不可达。阅读状态机时必须先确认实际责任服务。
22.5 相同状态值跨对象含义完全不同
采购 1 是已提交,销售 1 是部分出库,出库 1 是已出库,付款 1 是已提交,秒杀 1 是待支付。禁止裸数字跨域复用。
22.6 transType 存在冲突和映射覆盖
170502、150501、150602 的定义/标签存在歧义。修改前必须先统计真实表数据和所有调用方。
22.7 终态不是简单按最大值判断
采购状态值不连续,支付超时 12 可恢复;销售完成 2 可因撤销回退;出库已核销 5 后还有撤销状态 6。不能用 status >= N 作为通用终态判断。
23. 代码证据索引
| 结论 | 文件 |
|---|---|
| 采购状态、类型、来源和辅助维度 | application/KzData/Enums/PoOrderEnums.php |
| 支付成功/迟到支付恢复 | application/controllers/tasks/PayCenterNotify.php |
| 审核、退款、超时和采购 MQ 状态 | application/controllers/tasks/OrderCenterNotify.php |
| 采购履约状态重算 | application/service/scm/InvPoService.php |
| 预订单状态 | application/KzData/Enums/PreOrderEnums.php |
| 销售和来源状态 | application/KzData/Enums/SaOrderEnums.php |
| 出库和销退状态 | application/KzData/Enums/SaInvoiceEnums.php |
| 销售出库数量重算 | application/Services/SaOrders/SaInvoiceSer.php |
| 配送状态映射 | application/Services/Transport/TransportSer.php, application/service/scm/InvSaService.php |
| 秒杀状态和副作用 | application/KzData/Enums/FlashActivityEnums.php, application/Services/Activity/FlashSaleSer.php |
| 渠道订单和售后 | ChannelOrderEnums.php, ChannelAftersaleEnums.php, application/Services/Channel/* |
| 微仓补货/退货 | MoveMallEnums.php, MoveSupplySer.php, MoveReOdSer.php |
| 调拨 | TfInvoiceEnums.php, StfApplyEnums.php, StfInvoiceEnums.php |
| 对账 | StatementEnums.php, application/Services/Statement/StatementSer.php |
| 交易类型 | application/KzData/Enums/TransTypeEnums.php |
24. 仍需环境确认
- 生产历史数据中所有未在 Enum MAP 出现的状态值;
- 外部订单中心的审核、关闭、退款状态和乱序保证;
- 支付中心重复回调、迟到支付和退款消息的官方合同;
- 采购售后迁移到
dgi-purchase-service后的真实状态责任边界; - 每个 MQ 消费者对非法状态的 ACK/NACK、重试和死信策略;
- 销售状态重算是否覆盖所有老出库和软删数据;
- 对账单已核对后的撤销和收款回滚业务规则;
- 微仓取消
5的真实入口及其调拨/库存副作用; TF_BILL_STATUS_IN_CLOSE=5的页面名称和可操作动作;transType冲突值在生产各表的真实分布和报表解释;- 废弃来源类型是否仍有外部系统持续发送;
- 是否可建立统一的状态迁移审计表,保存对象、前后状态、动作、请求 ID 和副作用结果。
环境核对结果要回填本文;不能仅以 Enum 注释替代跨系统状态合同。
请求-日志-数据变更追踪卡
多入口请求链路
| 场景 | 调用方与入口 | 请求载荷/上下文 | Controller/Consumer | Service/Provider | 汇合点 | 最终业务事实 |
|---|---|---|---|---|---|---|
| 用户动作迁移 | 保存、提交、审核、关闭、出入库按钮 | 对象 ID、动作、当前版本/状态 | 领域 Controller | Service + Enum 校验 | 对象主表 status | 仅允许白名单中的 old -> new |
| 外部回调迁移 | 支付/OA/配送/订单中心 MQ | 外部状态、业务单号、消息键 | tasks/*Notify.php | 回调 Service | 来源单号映射的本地对象 | 外部状态转换为本地状态,不直接照抄 |
| 定时补偿迁移 | 超时/漏同步任务 | 状态、时间窗、业务 ID | tasks/*Task.php | 补偿 Service | 状态 + 最终业务事实 | 只推进满足事实条件的记录 |
| 报表解释 | 报表/导出/搜索 | 状态码、类型码、transType | 查询 Controller | Enum 映射/Report Service | 同一原始状态字段 | 展示名称不改变存储值 |
日志证据矩阵
| 链路段 | 日志来源 | 可检索锚点 | 成功信号 | 失败信号 | 与下一段关联方式 | | --- | --- | --- | --- | --- | --- | --- | | 动作请求 | Controller 日志 | request_id、业务单号、action、请求状态 | Service 接受动作 | 非法动作、无权限、并发版本冲突 | 业务单号查迁移前后快照 | | 状态校验 | Service/Enum 异常 | Enum 常量、oldStatus、目标状态 | 命中允许分支 | default/unsupported、状态已变化 | 方法分支对应主表更新 SQL | | 回调映射 | Consumer 日志 | 外部状态、消息 ID、来源单号 | 映射后状态推进并 ACK | 未知外部状态、旧消息导致回退 | 来源单号关联本地主表和关系表 | | 补偿 | Task 日志 | task、批次、业务 ID、最终事实 | 影响行数与候选数可对账 | 重复副作用、状态无变化但持续重试 | 批次列表回查状态和关联事实 |
环节数据变更台账
| 步骤 | 代码位置 | 事务 | 读取事实 | 写入表/缓存/MQ | 字段或数量变化 | 回查证据 |
|---|---|---|---|---|---|---|
| 读取定义 | application/KzData/Enums/*Enums.php | 事务外 | 常量值、注释、映射数组 | 无 | 代码常量 -> 存储值 -> 展示名 | Enum 文件与真实行抽样 |
| 校验当前态 | 领域 Service | 事务内并加必要行锁 | 主表 status、类型、来源 | 无 | 不合法时零写入 | 异常码、更新前快照 |
| 执行动作 | 领域 Service/Model | 本地事务 | 当前态和动作前置事实 | 主表、明细/日志 | status: old -> new;相关数量同步变化 | 影响行数、更新时间、数量等式 |
| 发送事件 | MqSer/Provider | commit 后异步边界 | 新状态与业务快照 | MQ/外部系统 | 本地 new -> 外部待同步 | routing key、业务键、ACK |
| 幂等重放 | Consumer/Task | 单消息/单记录事务 | 当前态是否已达到目标 | 主表或无写入 | 已完成则 new -> new 且副作用 0 次 | 重放前后状态、流水条数不变 |
子模块追踪:po-status 采购主状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 主动作 | PC/App 提交、支付、发货、入库、关闭 | sid、采购 billNo、当前 status | application/KzData/Enums/PoOrderEnums.php -> application/service/scm/InvPoService.php | 主单状态及明细已发、已收、已关量 | 领域事务内 status: 0 -> 1/10/13 -> 2/3 -> 4/5;拒绝、关闭分别到 8/9 | request ID + sid + billNo + action | 非法迁移零写入;部分履约按数量账回查后走原关闭/补偿 Service |
| 回调回查 | 支付、订单中心、配送消费者 | 消息 ID、来源采购单号 | application/controllers/tasks/PayCenterNotify.php、application/controllers/tasks/OrderCenterNotify.php | 当前状态是否已达到目标及支付/履约事实 | 单消息事务内仅单向推进;重复消息 new -> new 且不重复记账 | message ID + routing key + billNo | 迟到消息先查支付和履约最终态,不直接回退终态 |
子模块追踪:po-type-source 采购订单类型与来源
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 创建分类 | 普通采购、退货、调拨、赠品、秒杀创建 | orderType、srcOrderType、来源 ID | application/KzData/Enums/PoOrderEnums.php -> application/service/scm/InvPoService.php | 类型白名单、来源唯一性、商品与供应商 | 创建事务 insert 类型和来源;普通 30-Cxx-01,秒杀 30-Cxx-77/srcOrderType=13 | request ID + 来源单号 + billNo | 未知类型拒绝;重复来源返回既有单或按业务规则报错,不再新建 |
| 下游解释 | 入出库、支付、报表按类型分支 | billNo、orderType、srcOrderType | application/KzData/Enums/TransTypeEnums.php、application/service/scm/InvPoService.php | 主单类型、来源关系、交易类型 | 查询/映射阶段不写;履约按类型写对应库存/资金事实 | billNo + transType + source ID | 类型错配先核实来源事实;禁止只改类型码,需领域补偿重建关系 |
子模块追踪:preorder-status 预订单状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 主动作 | 预订单创建、支付、转采购、售后 | 预订单号、sid、当前状态 | application/KzData/Enums/PreOrderEnums.php -> application/controllers/tasks/PayCenterNotify.php | 预订单状态、支付结果、关联采购 | 预订单事务内按枚举单向迁移;转单后写采购关系,金额只落一次 | request ID/message ID + 预订单号 + 支付单号 | 重复支付不重复转单;失败先回查采购关系再决定补偿 |
| 售后退款 | 取消、退款结果回调 | 原预订单号、退款单号 | application/controllers/tasks/OrderCenterNotify.php、application/controllers/tasks/PayCenterNotify.php | 原支付成功额、已退额、售后状态 | 反向事务 售后待处理 -> 完成/失败;退款额 old -> old+n | 售后单号 + 原支付单号 + message ID | 迟到退款不能恢复已终结订单;按原支付关系幂等重放 |
子模块追踪:sale-status 销售订单状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 主动作 | 创建、出库、结单、关闭 | sid、销售单号、billStatus | application/KzData/Enums/SaOrderEnums.php -> application/service/scm/InvSaService.php | 订单量、有效出库量、关闭量、当前状态 | 销售事务内按履约事实 待处理 -> 部分 -> 完成/关闭,状态值以 Enum 为准 | request ID + 销售单号 + action | 状态与数量不符时不直接改状态,先重算有效出库和软删记录 |
| 下游回查 | 出库、退货、收款后重算 | 销售单号、出库/退货/收款单号 | application/Services/SaOrders/SaOrderSer.php、application/service/scm/InvSaService.php | 出库、销退、核销事实 | 查询重算后仅在条件满足时更新;异步 MQ 不在本地事务内 | 销售单号 + 关联业务单 + message ID | 部分成功按缺失环节补偿,禁止重做已完成的库存或资金步骤 |
子模块追踪:invoice-status 销售出库状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 出库动作 | PC/PDA 销售出库、撤销 | sid、销售单、出库 billNo | application/KzData/Enums/SaInvoiceEnums.php -> application/Services/SaOrders/SaInvoiceSer.php | 可出量、库存维度、当前出库状态 | 出库事务 insert 主明细并推进状态;撤销走反向单,不能只改终态 | request ID + 销售/出库单号 + SKU | 超出可出量或库存失败时回滚;若库存已变先按流水事实补偿 |
| 配送回调 | TMS/配送状态更新 | 出库单、配送单、外部状态、消息 ID | application/Services/Transport/TransportSer.php | 本地出库和配送关系、当前状态 | 回调事务按映射单向 old -> new;本地提交后 ACK | message ID + 出库单号 + 配送单号 | 乱序回调不回退;关系缺失先补关系或重放原创建事件 |
子模块追踪:flash-status 秒杀活动、购物车与订单状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 活动购买 | OPS 审批启用;站端加购下单 | 活动 ID、商品 ID、sid、秒杀单号 | application/KzData/Enums/FlashActivityEnums.php -> application/Services/Activity/FlashSaleSer.php | 审批/启用/时间、范围、库存和限购 | 本地事务内按草稿/审批/启用迁移;购物车有效态和订单待支付态写入,locked_qty +n | request ID + activity/order/cart ID | 条件失效零写入;创建采购部分失败按秒杀关系释放锁量 |
| 支付补偿 | 支付回调、超时与关闭任务 | 采购单、秒杀单、支付单 | application/controllers/tasks/PayCenterNotify.php、application/Services/Activity/FlashSaleSer.php | 支付中心结果、采购与秒杀关系、locked/used | 首次成功 locked -n, used +n;取消超时按最终事实释放且重跑零变化 | message/task ID + 三种单号 | 重复、迟到回调先查终态;补偿必须保证数量不为负 |
子模块追踪:channel-status 渠道订单与售后状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 渠道正向 | 渠道创建、发货、签收、取消 | 渠道订单号、sid、event | application/KzData/Enums/ChannelOrderEnums.php -> application/controllers/tasks/OrderCenterNotify.php | 渠道主明细、当前 created/wait_ship/part_ship/finish/cancel | 单消息事务单向推进并记录发货关系 | message ID + channelOrderNo + event | 重复事件零副作用;完成后取消按售后链路处理,不回写正向旧态 |
| 渠道售后 | 退款、退货申请与审核 | 售后单号、原渠道订单号 | application/controllers/tasks/OrderCenterNotify.php | 原单可退量、已退量、售后状态 | 售后事务 申请 -> 审核/完成/取消,资金库存由各自领域处理 | 售后单号 + 原单号 + message ID | 部分退款/退货分别核对;缺回调按原售后键幂等补发 |
子模块追踪:move-status 微仓补货、退货与调拨状态机
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 补退调拨 | 站端补货、退货、站内/站间调拨 | sid、微仓单号、动作 | application/KzData/Enums/MoveMallEnums.php -> application/service/scm/InvPoService.php | 微仓主单状态、关联采购/调拨和库存事实 | 领域事务按枚举推进;生成关系单时写来源键,状态不跨对象照抄 | request ID + 微仓/采购/调拨单号 | 取消前检查已出入库量;已履约部分走关闭或反向业务单 |
| 外部回调 | 配送、订单中心或库存结果 | 来源单号、外部状态、消息 ID | application/controllers/tasks/OrderCenterNotify.php | 关系表与本地当前态 | 回调事务仅推进允许迁移;ACK 在 commit 后 | message ID + 来源/本地单号 | 乱序、重复回调保持终态;关系缺失进入人工核对而非猜测更新 |
子模块追踪:delivery-status 配送状态映射
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 创建配送 | 销售出库或采购配送提交 | 出库/采购单、配送方式、地址 | application/Services/Transport/TransportSer.php | 本地单据状态、配送关系、承运配置 | 本地事务写配送关系;外部创建在 DB 事务外,状态 未创建 -> 待配送 | request ID + 本地单号 + 配送单号 | 外部超时先查是否已创建,禁止直接重复创建 |
| 状态回调 | 自配送/三方配送回调 | 配送单、外部状态、message ID | application/controllers/tasks/DispatchCenterNotify.php | 当前本地配送态和签收事实 | 映射后单向更新;签收可触发业务完结,异步副作用另查 | message ID + 配送/业务单号 | 未知状态标待确认;旧消息不得把签收回退为运输中 |
子模块追踪:finance-status 收付款、对账与交易类型状态
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 资金动作 | 付款、收款、核销、退款、对账 | 财务单号、来源单号、transType | application/KzData/Enums/TransTypeEnums.php -> application/Services/Statement/StatementSer.php | 来源应收应付、当前资金状态、已核金额 | 财务事务 未处理 -> 已处理/失败/撤销;金额和分录同步 old -> new | request ID + 财务/来源单号 + transType | 状态相同但金额不平时以分录为准,走反向分录而非直接改余额 |
| 异步确认 | 支付中心回调、对账任务 | 支付单号、对账批次、消息 ID | application/controllers/tasks/PayCenterNotify.php | 外部终态、本地支付和业务状态 | 首次成功落账;重复消息不新增 Payment/Info;报表查询只读 | message/batch ID + payOrderNo | 迟到支付和退款先核实外部最终态,再按领域补偿且保留审计链 |