职责:客户;对外销售与退货/拒收;人审通过后出库扣结存;可验收差异;整单退拒回库;财务侧开票与收款。
约定:一张销售单只卖一个产品(头表 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(子单) # 同上;同一原单只能退/拒一次,整单入所选仓
returned(已回库),不重走审批出库。loss_out;件数改实收。sale_out;结存不够则失败。return_in;整单一次。invoice / collect);通过即标记本单已开票 / 已收款,衔接 08 销售发票与回款。不在单据页另做同名按钮。summary;开单明细可空;提交审批前须有明细。purchase_id;出库按行扣结存。warehouse_id / purchase_id;有 product_id。明细有出库仓与采购批次。sale_out;退拒写 return_in;符合 14。type 开单固定 external;退拒只由原单生成。invoice(开票)、collect(收款);通过即标记,无单据页重复按钮。| P0 | 延后 |
|---|---|
| 上表状态机与流水;整单退拒 | 销售在途;按行/多次退货;一张销售单多 customer;order_adjustments 调整行 |