# 商城订单流程图
说明:
- 本文档基于当前系统代码。
- 商城主订单状态、订单明细退款状态、平台供应商履约状态是三套不同状态机,不能混为一张“单线流程图”理解。
- 主订单状态以
OrderInfoEnum为准,退款状态以OrderRefundsEnum和OrderItemEnum为准。
关联代码:
- OrderInfoEnum.java
- OrderRefundsEnum.java
- OrderItemEnum.java
- OrderInfoServiceImpl.java
- OrderRefundsServiceImpl.java
1. 商城主订单状态流
主订单状态只有以下几种:
- 待付款
- 待发货
- 待收货
- 已完成
- 已取消
- 退款中
- 待成团
注意:
- 用户确认收货后,主订单直接进入“已完成”。
- “退款中”是主订单聚合状态,不代表整单所有明细都在同一退款阶段。
- 系统存在评价附加字段
appraises_status,用于标记“未评 / 已评 / 已追评”,但它与主订单status是两套字段,不单独作为主订单流转节点。
flowchart TD
A["用户下单"] --> B["待付款"]
B --> C{"30 分钟内支付?"}
C -->|否| D["已取消"]
C -->|是| E["待发货"]
E --> F{"是否全部进入已发货或退款中?"}
F -->|是| G["待收货"]
F -->|否| E
G --> H["用户确认收货 / 自动确认收货"]
H --> I["已完成"]
E --> J["部分明细申请退款"]
J --> K["主订单可能变为退款中"]
K --> E
K --> G
K --> D
2. 订单关闭与自动收货
2.1 未支付订单关闭
- 普通订单创建后进入待付款。
- 30 分钟未支付,消息队列触发自动取消。
- 用户也可以在待付款阶段主动取消。
- 取消后会回滚商城库存。
- 如果是平台供应商商品,还会释放供应商侧锁库。
2.2 已发货订单自动收货
- 主订单进入待收货后,会写入 Redis 自动收货倒计时。
- 到期后走自动确认收货逻辑。
- 自动确认收货和用户手动确认收货,最终都进入“已完成”。
2.3 评价状态字段说明
当前系统中,订单评价状态由 order_info.appraises_status 表示:
0未评1已评2已追评
说明:
appraises_status是订单评价附加状态,不替代主订单status。- 订单确认收货后,主订单
status直接进入“已完成”。 - 订单是否已评价,需要结合
appraises_status判断,不能把“已完成”等同于“已评价”。
3. 订单明细退款状态流
退款是按订单明细处理,不是按整单处理。
退款申请状态:
1退款申请中11同意退款12拒绝退款2退货退款申请中21退货中22拒绝退货退款211收到退货同意退款212收到退货拒绝退款
退款完成后的订单明细状态:
3完成退款4完成退货退款
flowchart TD
A["订单明细正常"] --> B{"用户申请哪种售后?"}
B -->|仅退款| C["退款申请中"]
B -->|退货退款| D["退货退款申请中"]
C --> E{"后台审核"}
E -->|同意退款| F["退款执行"]
E -->|拒绝退款| G["拒绝退款"]
D --> H{"后台审核"}
H -->|拒绝退货退款| I["拒绝退货退款"]
H -->|同意退货| J["退货中"]
J --> K{"后台收到退货后审核"}
K -->|同意退款| L["退款执行"]
K -->|拒绝退款| M["收到退货拒绝退款"]
F --> N["完成退款 / 完成退货退款"]
4. 退款成功后的主订单状态变化
退款成功后,不一定直接整单关闭,系统会按“剩余未退款明细”重新判断主订单状态。
规则:
- 如果订单下所有明细都已退款成功,则主订单改为“已取消”。
- 如果还有未退款明细,但这些未退款明细都已经发货,则主订单改为“待收货”。
- 如果还有未退款且未发货明细,则主订单仍可能保持“待发货”或“退款中”。
flowchart TD
A["退款成功"] --> B{"是否所有明细都已退款?"}
B -->|是| C["主订单改为已取消"]
B -->|否| D{"剩余未退款明细是否都已发货?"}
D -->|是| E["主订单改为待收货"]
D -->|否| F["主订单保持待发货 / 退款中"]
5. 平台供应商履约回写链路
当前系统已支持平台供应商履约,这一部分是旧版流程图没有体现的。
规则:
- 商城支付成功后,会按供应商拆分生成平台供应商履约单。
- 平台供应商发货后,会回写商城订单明细发货信息。
- 当商城订单下所有“正常明细”都已发货或已进入退款中,主订单进入待收货。
- 平台供应商拒单后,会自动为对应商城订单明细生成退款申请。
- 如果正常明细全部转成退款申请中,主订单会改为退款中。
flowchart TD
A["商城订单支付成功"] --> B["按供应商拆分创建履约单"]
B --> C{"供应商履约结果"}
C -->|发货| D["回写商城订单明细发货信息"]
D --> E{"全部正常明细已发货或退款中?"}
E -->|是| F["主订单进入待收货"]
E -->|否| G["主订单保持待发货"]
C -->|拒单| H["生成商城退款申请"]
H --> I{"正常明细是否全部转退款申请?"}
I -->|是| J["主订单进入退款中"]
I -->|否| K["主订单保留原状态并等待其他明细处理"]
6. 排查建议
如果线上订单状态与预期不符,建议按下面顺序排查:
- 先看主订单状态
order_info.status - 再看订单明细状态
order_item.status和is_refund - 再看退款单状态
order_refunds.status - 如果是平台供应商商品,再看平台供应商履约单与发货单状态
- 如果是待收货自动流转,再看 Redis 自动收货倒计时键是否存在
7. 结论
当前系统的正确理解方式是:
- 主订单状态负责展示整单所在阶段。
- 退款状态以订单明细和退款单为准。
- 平台供应商履约状态会反向影响商城主订单状态。
- 不建议继续使用旧版静态订单流程图作为开发和测试依据。