订单

职责:客户;对外销售与退货/拒收;人审通过后出库扣结存;可验收差异;整单退拒回库;财务侧开票与收款。
约定:一张销售单只卖一个产品(头表 product_id)。开单写订单摘要,明细可后补。明细多行是该产品的不同规格/等级/包装(系统不另建 SKU;例:沃柑单里可以有一级、二级)。履约可多仓拼车:出库仓在明细 warehouse_id,头表不设仓库。采购批次也只在明细。提交审批前必须有明细。财务闭环两个关键审批节点:开票(on_approve=invoice)、收款(on_approve=collect),见 15。
边界:采购见 05-采购.md;账期对账导出在数据分析。出库/退拒写流水见 14-库存确认契约.md;人审见 15-审批工作流.md;开票/回款见 08-财务.md。
对照:13-线下单据映射.md #4–#6、#13、#15。

线下 系统
出库发货单 待出库点「出库」→ sale_out;物流在本单
财务销售单 销售单;先写订单摘要,明细后补
对外销售对账单 同上,不另设结算模板
销售退货单 出库/验收后「退单」/「拒收」→ 子单 return_in
到仓差异 验收:实收少于出库时选报损或补发

订单类型 orders.type:

取值 中文 开单方式
external 对外销售 新建默认;字段保留,业务不选手填其他销售类
return 退货 仅由原单「退单」生成,不手建
reject 拒收 仅由原单「拒收」生成,不手建

仓间移货走调拨,不用销售单做内部买断(见规则 10)。

客户

表:customers

字段 说明
id 主键,从 100000 起
name 渠道名
code 编码,可空,唯一,最长 32
type external 外部客户 / internal 内部客户
settlement_default simple 简易 / full 完整,可空
contact / mobile 可空
status 启用 / 停用
created_at / updated_at / deleted_at 时间戳;软删除

地址:morphMany addresses(见 02-省市区.md),可多条、至多一条默认。

开票资料:morphMany invoice_profiles(见 08-财务.md),不写在本表。

订单

表:orders;order_no 唯一。

字段 说明
id 主键
order_no 全局唯一
type 见上表
summary 订单摘要。开单即可写;可按摘要先采购、发货,再补明细
original_order_id 原始单ID(→ orders.id),必填;首单创建后写为与本单 id 相同;退货/拒收子单指向该原始销售单
customer_id 客户/渠道
product_id 产品(→ products.id),必填;整单同一产品
business_date 发货/业务日;不得晚于当天(可早于当天)
delivery_date 交仓日,可空
status 见状态机
freight_fee 运费
total_amount 明细合计(不含运费)
payable_amount 应收口径(明细合计 + 运费)
driver_name / driver_mobile / plate_no 可空
receiver_name / receiver_mobile / receiver_address 接货人 / 接货电话 / 接货地址,可空
source wecom 企微 / web 网页 / manual 手工
operator_id 操作人
remark 可空
created_at / updated_at / deleted_at 时间戳;软删除

一销多批、多仓拼车:明细可挂不同 purchase_id、不同 warehouse_id。出库按行扣对应仓、对应批的结存。产品只认头表。
头表不设 warehouse_id / purchase_id / related_purchase_id。

明细 order_items

字段 说明
id 主键
order_id 销售单
stock_id 开单所选结存,可空(历史行);UI 从结存添加时写入
warehouse_id 本行出库仓(或退货入库仓),必填;可与同单其他行不同
purchase_id 本行采购批次(→ purchases.id),必填;确认只认本行;展示 purchase_no
spec_name / grade / pack 该产品下的规格/等级/包装,可空;同一产品多行靠这些区分,不另建 SKU
unit 废弃,固定空串
product_name 开单时头表产品名称快照
quantity 件数(出库件数;验收报损后可改成实收)
received_quantity 验收实收件数,可空
variance_action 验收差异:loss 报损 / reship 补发,可空
weight_kg 重量(斤)(出库以此为准;改件数时按结存单重重算)
unit_price / amount 元/件 / 行金额
remark 可空

选产品写在头表,明细保存时抄 product_name。库存按头表 product_id + 本行 warehouse_id + purchase_id + 规格/等级/包装扣/入。同一销售单允许:多仓、多采购批、同产品多行不同等级;不允许把头表做成多产品。

采销对应真源:明细 purchase_id。按批汇总销量/粗利直接扫已出库(及之后)销售明细即可;不另建 purchase_order_links。

状态机

draft 草稿
  → pending 审批中          # 提交人审(须有明细 + 结存够)
  → cancelled 已取消        # 仅草稿可取消

pending
  → to_ship 待出库          # 审批通过(此时仍不出库)
  → draft                   # 审批驳回 / 发起人作废审批 → 回草稿可再改再提

to_ship
  → shipped 已出库          # 出库:按行 sale_out;可改件数/单价

shipped
  → accepted 已验收         # 可选;少收须选报损或补发
  → returned(子单)        # 「退单」「拒收」生成 type=return|reject 子单并 return_in

accepted
  → returned(子单)        # 同上;同一原单只能退/拒一次,整单入所选仓
  • draft:业务可改头表与明细;可提交审批。
  • pending / to_ship / shipped / accepted:业务不可改头表明细(出库/验收弹窗可改当次件数价)。
  • 退/拒子单:状态直接为 returned(已回库),不重走审批出库。

出库 / 验收 / 退拒副作用

  • 出库:见 14「销售出库」。
  • 验收报损:差额冲回销售出再记 loss_out;件数改实收。
  • 验收补发:差额再 sale_out;结存不够则失败。
  • 退单/拒收:子单 return_in;整单一次。
  • 财务驳回已出库单:见 14(冲销后回草稿);与审批驳回(未出库回草稿)不同。

维护方式

  1. 业务开单:客户、产品、订单摘要;明细可空。按摘要采购后再从结存补明细 → 提交审批 → 通过后 出库。
  2. 审批驳回:单子回草稿,改完再提。
  3. 到仓差异:出库后做验收(报损/补发)。
  4. 客户退货/拒收:出库或验收后整单退回所选仓。
  5. 开票 / 收款:画在销售审批流里的关键节点(invoice / collect);通过即标记本单已开票 / 已收款,衔接 08 销售发票与回款。不在单据页另做同名按钮。

验收标准

  • [ ] 仅草稿可改、可取消;审批驳回回草稿可再提交。
  • [ ] 头表有 summary;开单明细可空;提交审批前须有明细。
  • [ ] 一单多批:明细行可挂不同 purchase_id;出库按行扣结存。
  • [ ] 销售单头无 warehouse_id / purchase_id;有 product_id。明细有出库仓与采购批次。
  • [ ] 出库写 sale_out;退拒写 return_in;符合 14。
  • [ ] type 开单固定 external;退拒只由原单生成。
  • [ ] 审批流可配置关键节点 invoice(开票)、collect(收款);通过即标记,无单据页重复按钮。

P0 / 延后

P0 延后
上表状态机与流水;整单退拒 销售在途;按行/多次退货;一张销售单多 customer;order_adjustments 调整行