Browse Source

docs: 新增核心业务流程说明文档

覆盖订单→库存→采购→到货→入库全链路,包含数据模型、状态机、校验规则等详细说明。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Jax Docker 3 weeks ago
parent
commit
0a63fdef12
1 changed files with 626 additions and 0 deletions
  1. 626 0
      docs/core-flow.md

+ 626 - 0
docs/core-flow.md

@@ -0,0 +1,626 @@
+# 核心业务流程说明:订单 → 库存 → 采购 → 到货 → 入库
+
+---
+
+## 一、全局概览
+
+系统的核心是一条**履约闭环**,通过**库存**这个中枢连接两条链路:
+
+- **正向链路(消耗库存)**:买家下单 → 支付 → 锁定库存 → 发货扣减库存 → 签收 → 完成
+- **反向链路(补充库存)**:库存低于安全线 → 生成补货建议 → 创建采购单 → 审批 → 下单给供应商 → 到货 → 质检 → 合格品入库 → 库存恢复
+
+两条链路的交汇点是库存:订单侧不断消耗可用库存,采购侧不断补充可用库存。当可用库存低于安全库存时,系统自动触发补货建议,形成自循环。
+
+---
+
+## 二、数据模型说明
+
+### 2.1 订单(Orders)
+
+一张订单记录一笔买家交易的完整信息,核心字段分为以下几组:
+
+**订单标识**:订单号(系统自动生成,格式为「渠道编码-日期-5位流水号」,例如 SHOPIFY-20260601-00001)、渠道订单号(来自外部平台的原始订单号)
+
+**状态字段**(四个独立维度):
+- 订单状态:待支付 → 已支付 → 已分配 → 已发货 → 已签收 → 已完成(另有已取消、已退款两个终态)
+- 支付状态:待支付 → 待确认 → 部分支付 → 已支付
+- 发货状态:未发货 → 待拣货 → 待发货 → 已发货 → 已签收
+- 退款状态:未退款 → 待退款 → 已退货待入库 / 已退款 / 已补发 → 已完成
+
+**买家信息**:买家ID、姓名、邮箱、电话、国家、会员等级、历史订单数、累计消费金额
+
+**收货信息**:收件人姓名、电话、国家、州/省、城市、区县、邮编、详细地址、经纬度
+
+**金额信息**:商品金额、税金、运费、折扣、优惠券抵扣、实付金额(= 商品金额 + 税金 + 运费 - 折扣 - 优惠券抵扣)、退款金额、币种、汇率
+
+**物流信息**:发货方式、承运商名称、运单号、物流追踪链接
+
+**归属信息**:销售渠道ID、发货仓库ID、处理人ID/姓名
+
+**关联信息**:父订单ID(拆单场景)、合并目标订单ID(合单场景)、原始订单ID(补发场景)
+
+### 2.2 订单明细(OrderItem)
+
+每张订单包含一条或多条订单明细,每条明细对应一个SKU:
+
+- SKU信息:SKU ID、SKU编码、商品标题、商品图片、分类、规格、条码
+- 数量与价格:购买数量、单价、小计(= 单价 × 数量)、成本价、利润、利润率
+- 库存追踪:可用数量、锁定数量、在途数量、已预留数量、已发货数量、已退货数量
+- 标记:是否赠品
+
+### 2.3 库存(Inventory)
+
+每条库存记录对应一个「SKU + 仓库」的唯一组合:
+
+- **可用数量**:当前可以被新订单使用的库存。订单分配时减少,取消时恢复,采购入库时增加
+- **锁定数量**:已被订单占用但尚未发货的库存。订单分配时增加,发货时清零,取消时减少
+- **在途数量**:已下采购单但尚未到货入库的数量(当前仅做记录,不参与可用库存计算)
+- **安全库存**:低于此值时触发预警和补货建议
+- **预警状态**:正常 / 低于安全库存(系统自动计算,不可手动修改)
+
+三者关系:**物理库存 = 可用数量 + 锁定数量**。在途数量是独立的参考值。
+
+### 2.4 库存变动日志(InventoryLog)
+
+每一次库存变动都会生成一条日志,记录:
+
+- 变动来源:ORDER_ALLOCATION(订单分配)、ORDER_SHIPMENT(订单发货)、PURCHASE_ARRIVAL(采购入库)、STOCKTAKE(盘点)、TRANSFER(调拨)
+- 变动类型:LOCK(锁定)、UNLOCK(解锁)、INCREMENT(增加)、SHIP(发货扣减)、STOCKTAKE_GAIN(盘盈)、STOCKTAKE_LOSS(盘亏)、TRANSFER_OUT(调出)、TRANSFER_IN(调入)
+- 变动前后数量、操作人、关联订单ID/单号
+
+### 2.5 采购单(PurchaseOrder)
+
+采购单用于向供应商采购商品以补充库存,核心字段:
+
+**单据信息**:采购单号(格式为 PO-日期-5位流水号)、供应商ID、目标仓库ID、SKU种类数、总金额、币种(默认CNY)、税金、运费、预计到货日期
+
+**状态**:草稿 → 已提交 → 已审批 → 已下单 → 部分到货 → 全部到货 → 已关闭 / 已完成(另有已拒绝、已取消两个终态)
+
+**到货进度**:待到货 → 部分到货 → 全部到货(系统根据采购项的累计到货数量自动更新)
+
+### 2.6 采购项(PurchaseOrderItem)
+
+每张采购单包含一条或多条采购项,每条对应一个SKU:
+
+- SKU信息:SKU ID、SKU编码、商品标题
+- 采购信息:采购数量、单价、小计
+- 到货追踪:累计到货数量、累计合格数量(到货和质检时自动累加)
+
+### 2.7 到货单(PurchaseArrival)
+
+到货单记录供应商的一次发货到达,关联到对应的采购单:
+
+- 到货单号、关联采购单ID、到货仓库、到货时间、操作人
+- 状态:已到货
+
+同一张采购单可以产生多张到货单(分批到货场景)。
+
+### 2.8 到货项(PurchaseArrivalItem)
+
+每张到货单包含一条或多条到货项:
+
+- 关联采购项ID(追溯到采购单中的具体SKU)
+- SKU ID、预期数量(从采购项同步)、实际到货数量
+- 质检结果:合格数量、不合格数量、质检状态(待质检 / 合格 / 不合格)
+
+### 2.9 售后单(AfterSale)
+
+售后单记录买家的退款/退货/补发请求:
+
+- 售后单号、关联订单ID/单号、买家信息
+- 售后类型、退款金额、退款原因、责任归属
+- 审核状态:待审核 → 已审批 / 已拒绝
+- 退款状态:未退款 → 待退款 → 已退货待入库 / 已退款 / 已补发 → 已完成
+- 退货物流:退货承运商、退货单号
+- 补发信息:补发仓库ID、补发SKU ID、补发订单ID
+
+### 2.10 发货单(ShippingOrder)
+
+发货单记录一次发货操作,关联到对应的订单:
+
+- 发货单号(格式 SHP-时间戳)、关联订单ID/单号、发货仓库
+- SKU种类数、应发数量、实发数量
+- 物流信息:承运商名称、运单号
+- 状态:待拣货 → 待发货 → 已发货 → 已签收
+- 退货状态:未退货 / 已退货
+
+---
+
+## 三、订单履约链路(正向)
+
+### 3.1 创建订单
+
+**触发方式**:手动创建、外部渠道同步
+
+**系统自动处理**:
+1. 校验销售渠道是否存在(如指定了渠道)
+2. 校验发货仓库是否存在(如指定了仓库)
+3. 自动生成订单号(格式:渠道编码-日期-5位流水号,例如 SHOPIFY-20260601-00001)
+4. 初始化所有状态字段:订单状态=待支付,支付状态=待支付,发货状态=未发货,退款状态=未退款
+5. 默认币种 USD,汇率 1.00
+6. 记录创建时间
+
+**订单号生成规则**:取渠道编码(如无渠道则用 OMS)+ 当天日期 + 自增序号(5位补零)。序号基于时间戳生成,同一天内保证不重复。
+
+**创建后的订单状态**:订单已录入系统,等待买家支付。此时不影响任何库存。
+
+### 3.2 确认支付
+
+**触发方式**:操作人员确认买家已付款
+
+**前置条件**:订单状态必须为「待支付」
+
+**系统自动处理**:
+
+场景一 — 简单确认(不传支付金额):
+1. 校验订单状态为「待支付」,否则报错
+2. 将订单状态更新为「已支付」
+3. 将支付状态更新为「已支付」
+4. 记录支付时间
+5. 写入操作日志(类型:ORDER,内容:支付确认,备注含金额)
+6. 写入状态事件时间线
+7. **自动触发库存分配**(见 3.3 节)
+
+场景二 — 带金额确认(传入实际支付金额和交易流水号):
+1. 校验订单状态为「待支付」
+2. 比对实际支付金额与订单应付金额:
+   - 实际金额 >= 应付金额 → 支付状态 = 已支付
+   - 实际金额 < 应付金额 → 支付状态 = 部分支付
+3. 记录交易流水号
+4. 记录支付时间
+5. 写入操作日志和状态事件
+6. 仅当支付状态为「已支付」(非部分支付)时,才自动触发库存分配
+
+**业务说明**:部分支付的订单不会自动分配库存,需要等待全额到账后手动触发分配。
+
+### 3.3 库存分配(锁定库存)
+
+**触发方式**:支付确认后自动触发,也可手动触发
+
+**前置条件**:订单状态必须为「已支付」
+
+**系统自动处理**:
+1. 校验订单状态为「已支付」
+2. 获取订单下所有明细项(SKU列表)
+3. **逐一校验每个 SKU 的可用库存是否 >= 购买数量**
+4. 如果任何一个 SKU 库存不足,**整体失败**,已锁定的 SKU 自动回滚(事务机制)
+5. 全部校验通过后,对每个 SKU 执行锁定操作:
+   - 该 SKU 对应库存记录的「可用数量」减少购买数量
+   - 该 SKU 对应库存记录的「锁定数量」增加购买数量
+   - 写入库存变动日志(来源:ORDER_ALLOCATION,类型:LOCK,记录变动前后数量)
+   - 自动重新计算该库存记录的预警状态(可用 < 安全库存 → 标记为「低于安全库存」)
+6. 将订单状态更新为「已分配」
+7. 写入状态事件(内容:库存锁定完成,备注含 SKU 数量)
+
+**分配失败的场景**:
+- 某 SKU 无库存记录(该 SKU 从未入库)
+- 某 SKU 可用库存 < 购买数量
+- 失败后所有已锁定的库存自动释放,订单状态保持「已支付」不变
+
+**业务说明**:分配是一个原子操作,不存在「部分锁定」的情况。要么全部 SKU 锁定成功,要么全部不锁定。
+
+### 3.4 发货
+
+发货分两步完成。
+
+**第一步:录入物流信息**
+
+**触发方式**:操作人员填写承运商和运单号
+
+**前置条件**:发货单状态为「待拣货」
+
+**系统自动处理**:
+1. 校验发货单存在
+2. 校验发货单状态为「待拣货」,否则报错
+3. 记录承运商名称和运单号
+4. 将发货单状态更新为「待发货」
+5. 写入订单状态事件(内容:运单号已录入,备注含承运商+单号)
+
+**第二步:确认发货**
+
+**触发方式**:操作人员确认货物已交由承运商
+
+**前置条件**:发货单状态为「待发货」,且运单号不能为空
+
+**系统自动处理**:
+1. 校验发货单存在
+2. 校验运单号非空
+3. 校验发货单状态为「待发货」
+4. 对订单中每个 SKU 执行库存扣减:
+   - 该 SKU 对应库存记录的「锁定数量」减少购买数量(归零)
+   - 写入库存变动日志(来源:ORDER_SHIPMENT,类型:SHIP)
+5. 将发货单状态更新为「已发货」,记录发货时间
+6. 同步更新关联订单:订单状态→已发货,发货状态→已发货,记录运单号、承运商、发货时间
+7. 写入状态事件
+
+**业务说明**:发货时只扣减锁定数量,不扣减可用数量(因为可用数量在分配时已经扣减过了)。发货后锁定数量归零,意味着这部分库存已经物理离开仓库。
+
+### 3.5 签收
+
+**触发方式**:确认买家已收到货物
+
+**前置条件**:订单状态为「已发货」
+
+**系统自动处理**:
+1. 校验订单状态为「已发货」
+2. 将订单状态更新为「已签收」
+3. 记录签收时间
+4. 写入状态事件(内容:已签收,备注:买家已确认收货)
+
+同步更新发货单状态为「已签收」。
+
+### 3.6 完成
+
+**触发方式**:订单进入终态
+
+**前置条件**:订单状态为「已签收」
+
+**系统自动处理**:
+1. 校验订单状态为「已签收」
+2. 将订单状态更新为「已完成」
+3. 写入状态事件
+
+**业务说明**:完成后的订单可以进入售后流程(退款/补发)。
+
+### 3.7 取消订单
+
+**触发方式**:操作人员主动取消
+
+**前置条件**:订单未完成(已完成和已取消的订单不能取消)
+
+**系统自动处理**:
+1. 校验订单不是「已取消」状态
+2. 如果订单当前是「已分配」状态(已锁定库存),则**自动释放所有已锁定的库存**:
+   - 对每个明细 SKU:锁定数量减少,可用数量恢复
+   - 写入库存变动日志(来源:ORDER_ALLOCATION,类型:UNLOCK)
+   - 自动重新计算预警状态
+3. 将订单状态更新为「已取消」
+4. 写入状态事件和操作日志(含取消原因)
+
+**业务说明**:取消操作会自动释放库存,确保不会出现「幽灵锁定」。已支付但未分配的订单取消时不需要释放库存。
+
+### 3.8 拆单
+
+**触发方式**:操作人员将一张订单拆分为两张
+
+**前置条件**:
+- 原订单状态为「已支付」或「已分配」
+- 拆出的每个 SKU 数量 > 0 且 < 原订单中该 SKU 的数量
+- 拆出的 SKU 库存充足(如果原订单已分配,需要额外校验)
+
+**系统自动处理**:
+1. 校验原订单状态
+2. 校验拆分数量合法(不为0,不超过原数量)
+3. 校验每个拆出 SKU 的可用库存 >= 拆出数量
+4. 创建子订单:
+   - 订单号 = 原订单号 + "-S"
+   - 继承原订单的渠道、买家、收货地址等全部信息
+   - 订单状态 = 待支付
+   - 记录父订单ID
+5. 将拆出的 SKU 从原订单移到子订单:
+   - 子订单创建新的明细项(复制 SKU 信息,数量为拆出数量)
+   - 原订单明细项数量减少(数量和小计同步更新)
+6. 子订单金额计算:
+   - 商品金额 = 各明细小计之和
+   - 运费和税金按金额比例从原订单分摊
+   - 实付金额 = 商品金额 + 运费 + 税金
+7. 原订单金额自动重新计算
+8. 写入状态事件(原订单记录拆单完成,备注含子订单号)
+
+**业务说明**:拆单后产生两张独立的订单,各自走后续的发货流程。子订单继承原订单的支付状态(已支付),不需要重新支付。
+
+### 3.9 合单
+
+**触发方式**:操作人员将两张订单合并为一张
+
+**前置条件**:
+- 两张订单均为「待创建」或「已支付」状态
+- 同一仓库(或其中一方未指定仓库)
+- 同一币种
+
+**系统自动处理**:
+1. 校验两张订单状态
+2. 校验仓库和币种一致
+3. 将来源订单的所有明细项复制到目标订单(创建新的明细项)
+4. 来源订单状态更新为「已取消」,记录合并目标订单ID
+5. 目标订单的金额重新计算(商品金额 = 所有明细小计之和)
+6. 运费取两者较大值
+7. 目标订单实付金额重新计算
+8. 写入状态事件(目标订单记录合单完成,备注含来源订单号)
+
+**业务说明**:合单后来源订单作废,目标订单包含两个订单的所有商品。运费取较大值而非累加,因为合并发货通常比分开发货更经济。
+
+---
+
+## 四、库存管理
+
+### 4.1 库存盘点
+
+**触发方式**:操作人员输入实际盘点数量
+
+**系统自动处理**:
+1. 校验库存记录存在
+2. 校验盘点数量 >= 0
+3. 计算差异 = 实际盘点数量 - 当前可用数量
+4. 将可用数量更新为实际盘点数量
+5. 写入库存变动日志:
+   - 差异 > 0:变动类型 = STOCKTAKE_GAIN(盘盈)
+   - 差异 < 0:变动类型 = STOCKTAKE_LOSS(盘亏)
+   - 差异 = 0:变动类型 = STOCKTAKE(平账)
+6. 自动重新计算预警状态
+
+**业务说明**:盘点会直接覆盖可用数量,而非增量调整。盘盈说明实际库存比系统记录多(可能有未记录的入库),盘亏说明实际库存比系统记录少(可能有丢失或未记录的出库)。
+
+### 4.2 库存调拨
+
+**触发方式**:操作人员发起仓库间调拨
+
+**系统自动处理**:
+1. 校验源仓库和目标仓库不同
+2. 校验调拨数量 > 0
+3. 校验源仓库有该 SKU 的库存记录,且可用数量 >= 调拨数量
+4. 从源仓库扣减可用数量,写入日志(类型:TRANSFER_OUT)
+5. 在目标仓库增加可用数量,写入日志(类型:TRANSFER_IN)
+6. 如果目标仓库没有该 SKU 的库存记录,系统自动创建一条(初始可用数量为0,然后加上调拨数量)
+7. 两端都自动重新计算预警状态
+
+**业务说明**:调拨是原子操作,源仓库扣减和目标仓库增加要么同时成功,要么同时失败。
+
+### 4.3 安全库存预警
+
+**触发方式**:每次库存变动后自动检查
+
+**判断逻辑**:
+- 可用数量 < 安全库存 → 预警状态 = 「低于安全库存」
+- 可用数量 >= 安全库存 → 预警状态 = 「正常」
+
+**影响范围**:预警状态为「低于安全库存」的 SKU 会被补货建议扫描到。
+
+---
+
+## 五、采购链路(反向)
+
+### 5.1 补货建议生成
+
+**触发方式**:手动触发
+
+**系统自动处理**:
+1. 扫描所有可用数量 < 安全库存的库存记录
+2. 对每个低库存 SKU:
+   - 跳过已有待处理建议的 SKU(避免重复建议)
+   - 计算建议数量 = 安全库存 - 可用数量 + 锁定数量 - 在途数量
+   - 如果结果 <= 0,跳过(在途库存已足够补货)
+   - 查询该 SKU 的默认供应商(从供货能力表获取)
+   - 如果默认供应商有最小起订量(MOQ)且建议数量 < MOQ,则将建议数量上调至 MOQ
+   - 创建补货建议记录,状态为「待处理」
+3. 返回生成的建议数量
+
+**建议记录包含**:SKU ID、商品标题、仓库ID、安全库存、当前库存、在途数量、建议采购数量、建议供应商ID
+
+**业务说明**:补货建议不是采购单,只是一种建议。需要操作人员审核后才能转为采购单。
+
+### 5.2 从补货建议生成采购单
+
+**触发方式**:操作人员选择多条建议,一键生成
+
+**系统自动处理**:
+1. 校验所有选中的建议存在且状态为「待处理」
+2. 校验每条建议都有指定供应商
+3. **按供应商分组**:同一供应商的建议合并为一张采购单
+4. 对每个供应商分组:
+   - 创建采购单(状态=草稿,到货进度=待到货,币种=CNY)
+   - 为每条建议创建采购项:
+     - 从供货能力表获取该 SKU 的阶梯价格
+     - 采购数量 = 建议数量
+     - 小计 = 单价 × 数量
+   - 汇总采购单总金额和 SKU 种类数
+   - 更新补货建议状态为「已生效」(表示已生成采购单)
+5. 返回所有生成的采购单ID
+
+**业务说明**:多条建议可以合并为一张采购单(只要供应商相同),减少采购单数量。
+
+### 5.3 采购单审批流程
+
+**状态流转**:草稿 → 已提交 → 已审批 → 已下单
+
+**提交**:
+- 前置条件:采购单状态为「草稿」
+- 将状态更新为「已提交」,等待审批人审批
+
+**审批通过**:
+- 前置条件:采购单状态为「已提交」
+- 将状态更新为「已审批」
+- 审批通过后,操作人员可以向供应商正式下单
+
+**审批拒绝**:
+- 前置条件:采购单状态为「已提交」
+- 将状态更新为「已拒绝」,记录拒绝原因
+- 被拒绝的采购单不能再次提交,需要新建
+
+**下单给供应商**:
+- 前置条件:采购单状态为「已审批」
+- 将状态更新为「已下单」
+- 此后进入等待到货阶段
+
+**取消采购单**:
+- 前置条件:采购单不是「已关闭」或「已完成」状态
+- 将状态更新为「已取消」,记录取消原因
+- 已下单后仍可取消(例如供应商无法供货)
+
+### 5.4 到货确认
+
+**触发方式**:仓库人员确认供应商货物到达
+
+**前置条件**:采购单状态为「已下单」或「部分到货」
+
+**系统自动处理**:
+1. 创建到货单,关联采购单ID,记录到货仓库和到货时间
+2. 校验到货单未被重复确认(已确认的到货单不能再次确认)
+3. 对每个到货项:
+   - 校验该 SKU 的累计到货数量(已有到货 + 本次到货)不超过采购数量
+   - 如果超过,报错并提示剩余可到货数量
+   - 从采购项同步预期数量
+   - 创建到货项记录(实际到货数量、质检状态=待质检)
+4. 更新采购单的到货进度:
+   - 遍历所有采购项,比较累计到货数量与采购数量
+   - 所有 SKU 累计到货 >= 采购数量 → 到货进度 = 全部到货,采购单状态 = 全部到货
+   - 有部分 SKU 到货但未全部到齐 → 到货进度 = 部分到货,采购单状态 = 部分到货
+   - 同步更新采购项的累计到货数量
+
+**业务说明**:
+- 同一采购单支持多次到货(分批送货场景)。每次到货创建一张新的到货单。
+- 到货数量校验是基于累计值的,例如采购100个,第一次到60个,第二次最多再到40个。
+- 到货确认后,货物进入「待质检」状态,尚未入库。
+
+### 5.5 质检
+
+**触发方式**:质检人员对到货商品进行检验
+
+**质检通过**:
+1. 将到货项的质检状态更新为「合格」
+2. 合格数量 = 实际到货数量,不合格数量 = 0
+3. 更新采购项的累计合格数量(累加本次合格数量)
+4. **自动执行入库**(见 5.6 节)
+5. 更新采购单到货进度
+
+**质检不合格**:
+1. 将到货项的质检状态更新为「不合格」
+2. 合格数量 = 0,不合格数量 = 实际到货数量
+3. 更新采购项(合格数量为0,但到货数量已计入)
+4. 更新采购单到货进度
+5. **不执行入库**(不合格品不进入可用库存)
+
+**业务说明**:质检结果直接决定货物是否入库。质检不合格的货物不进入可用库存,需要后续处理(退货给供应商或让步接收)。
+
+### 5.6 入库
+
+**触发方式**:质检通过后自动执行,无需手动操作
+
+**系统自动处理**:
+1. 查找该 SKU + 到货仓库对应的库存记录
+2. 如果库存记录存在:
+   - 可用数量 += 合格数量
+   - 写入库存变动日志(来源:PURCHASE_ARRIVAL,类型:INCREMENT,关联采购单ID和到货单号)
+   - 自动重新计算预警状态(如果可用数量恢复到安全库存以上,预警自动解除)
+3. 如果库存记录不存在(该仓库首次有此 SKU),当前逻辑不做处理(需要先手动创建库存记录)
+
+**业务说明**:入库是采购链路的终点,也是库存恢复的起点。入库后,之前因订单消耗而降低的可用库存得到补充,如果已触发过补货建议,预警状态会自动解除。
+
+### 5.7 关闭采购单
+
+**触发方式**:操作人员手动关闭
+
+**前置条件**:
+- 采购单状态为「部分到货」或「全部到货」
+- 所有已到货的 SKU 必须已完成质检(不能有到货数量 > 0 但合格数量 = 0 且未标记为不合格的项目)
+
+**系统自动处理**:
+1. 校验所有采购项:如果有到货但未质检完成的项,报错
+2. 将采购单状态更新为「已关闭」
+
+**业务说明**:关闭是一个管理动作,表示这张采购单的业务已终结。部分到货的采购单也可以关闭(例如剩余部分不再采购)。
+
+---
+
+## 六、售后链路
+
+### 6.1 售后审核
+
+**审核状态**:待审核 → 已审批 / 已拒绝
+
+**审批通过**:售后单进入退款流程,操作人员可以选择退款、退货退款或补发
+
+**审批拒绝**:售后单终结,记录拒绝原因
+
+### 6.2 退款状态流转
+
+退款状态独立于审核状态,经历以下路径:
+
+**路径一 — 直接退款(无需退货)**:
+- 未退款 → 待退款 → 已退款 → 已完成
+- 适用场景:小额退款、质量问题协商退款
+
+**路径二 — 退货退款**:
+- 未退款 → 待退款 → 已退货待入库 → 已退款 → 已完成
+- 买家填写退货物流单号后进入「已退货待入库」
+- 仓库确认收到退货后执行退款,进入「已退款」
+
+**路径三 — 补发**:
+- 未退款 → 待退款 → 已补发
+- 不退款,而是重新发一件商品给买家
+- 系统自动创建一张新的补发订单(继承原订单的渠道、买家、收货地址等信息)
+- 原售后单记录补发订单的关联关系
+
+### 6.3 退款与订单状态联动
+
+当售后退款完成(退款状态变为「已退款」)时,同步更新关联订单的退款状态为「已退款」。
+
+### 6.4 补发订单
+
+补发订单是一张独立的新订单,系统自动完成以下处理:
+1. 继承原订单的渠道ID、买家信息(姓名、ID)、收货信息(姓名、电话、地址)
+2. 币种继承原订单
+3. 内部备注标记为「售后补发单,原售后单: XXX」
+4. 原售后单记录补发订单ID
+
+---
+
+## 七、状态机汇总
+
+### 7.1 订单状态
+
+```
+待支付 ──→ 已支付 ──→ 已分配 ──→ 已发货 ──→ 已签收 ──→ 已完成
+  │          │          │                              │
+  └──→ 已取消 ←┘          └──→ 已取消                    └──→ 已退款
+```
+
+任何未完成的状态都可以直接取消(已分配状态取消时会释放库存)。
+
+### 7.2 发货单状态
+
+```
+待拣货 ──→ 待发货 ──→ 已发货 ──→ 已签收
+```
+
+单向流转,不可回退。
+
+### 7.3 采购单状态
+
+```
+草稿 ──→ 已提交 ──→ 已审批 ──→ 已下单 ──→ 部分到货 ──→ 全部到货 ──→ 已关闭/已完成
+  │                  │          │
+  └──→ 已取消         └──→ 已拒绝  └──→ 已取消
+```
+
+### 7.4 退款状态
+
+```
+未退款 ──→ 待退款 ──→ 已退款 ──→ 已完成
+                │
+                ├──→ 已退货待入库 ──→ 已退款
+                │
+                └──→ 已补发
+```
+
+---
+
+## 八、关键业务规则
+
+| 序号 | 规则 | 详细说明 |
+|-----|------|---------|
+| 1 | 订单分配原子性 | 任一 SKU 库存不足则整体失败,已锁定的自动回滚,不存在部分锁定 |
+| 2 | 到货数量不可超采 | 每个 SKU 的累计到货数量不能超过采购单中该 SKU 的采购数量,系统按累计值校验 |
+| 3 | 质检与入库联动 | 质检通过 → 自动入库(可用数量增加);质检不合格 → 不入库 |
+| 4 | 安全库存自动预警 | 任何库存变动(锁定/解锁/增减/盘点/调拨)后自动检查,无需手动操作 |
+| 5 | 取消自动释放库存 | 已分配的订单取消时,系统自动释放所有已锁定的库存 |
+| 6 | 拆单库存校验 | 拆单前校验拆出的每个 SKU 可用库存是否充足 |
+| 7 | 合单条件严格 | 必须同仓库、同币种、均为未发货状态 |
+| 8 | 采购单关闭前置条件 | 所有已到货的 SKU 必须已完成质检(不能有到货但未质检的项) |
+| 9 | 补发创建新订单 | 售后补发会创建一张全新的独立订单,而非修改原订单 |
+| 10 | 每次操作留痕 | 所有状态变更记录操作日志和事件时间线,包含操作人、时间、变更内容 |
+| 11 | 分批到货支持 | 同一采购单可多次到货,每次创建独立到货单,累计数量达标后自动更新采购单状态 |
+| 12 | 补货建议去重 | 同一 SKU + 仓库已有待处理建议时,不会重复生成 |
+| 13 | 补货建议满足MOQ | 建议数量如果低于供应商最小起订量,自动上调至MOQ |
+| 14 | 调拨自动建记录 | 目标仓库无该SKU库存记录时,调拨自动创建 |
+| 15 | 盘点直接覆盖 | 盘点输入的是绝对数量而非增量,直接覆盖可用数量 |