仓库

职责:仓库主数据、结存、流水;仓内加工;调拨 / 盘点;期初 / 报损(精简库存单据;拆合枚举可留但不新开)。
边界:不做库位/波次/WMS。采销出入库由业务单确认驱动,见 14。加工业务见 07;表结构以本文为准。降级走加工单,不设独立降级单。
产品:引用 products(见 03)。仓库与产品无关。重量存/录为斤(列名仍 weight_kg),列表按两/斤/吨展示。

线下报损/调拨低频(见 13),能力保留;盘点与仓内加工常用。

结存口径(先读)

概念 约定
唯一键 (warehouse_id, product_id, purchase_id, spec_name, grade, pack)(不含 unit)。purchase_id 必填 → purchases.id;界面展示 purchase_no。属性空值存 ''(避免 UNIQUE 对 NULL 不互斥)。unit 列可留,固定写 ''
行属性 spec_name / grade / pack(规格名 / 等级 / 包装),进唯一键,不同属性即不同结存堆
件数单价 process_fee_unit_price / pack_fee_unit_price / overhead_unit_price(元/件),毛利预估参考,非存货成本层(规则 16)。各档加工确认后写到对应产出堆
重量 weight_kg 语义为斤;1 斤 = 10 两;1 吨 = 2000 斤

行属性出现在:结存、流水,以及库存单据 / 调拨 / 盘点 / 在途明细;加工单用 from_* / to_*。确认入账写入流水;入库按属性命中或新建堆(product_id 不变,见 07)。

仓库

表:warehouses

字段 说明
id 主键
name 名称
type origin 产地仓 / sales 销地仓
status 启用 / 停用
created_at / updated_at / deleted_at 时间戳;软删除

地址:morphOne addresses(见 02),仅一条。

库存结存

表:stocks

字段 说明
id 主键
warehouse_id / product_id / unit / purchase_id 见上「结存口径」;unit 废弃写空串
spec_name / grade / pack 行属性,可空
quantity / weight_kg 件数 / 实重(斤)
process_fee_unit_price / pack_fee_unit_price / overhead_unit_price 加工费 / 包装费 / 隐形分摊件数单价,可空;各档加工确认后写到对应产出堆
updated_at 最后变动

列表须展示 purchase_no;可展示三费单价及 单价 × 件数 预估。

写入:

  1. 采购确认:可带默认 overhead_unit_price;加工费/包装费一般为空;行属性可从采购明细带入。
  2. 加工确认产出:各档 process_fee / pack_fee 为金额真源(独立);写到对应产出结存堆的 process_fee_unit_price ≈ process_fee / to_quantity、pack_fee_unit_price ≈ pack_fee / to_quantity,及本档 overhead_unit_price。
  3. 调拨 / 加工产出:同批迁移或换键时带出三费单价与行属性。
  4. 人工可改未出清结存的三费单价;已大量出库的批次改单价只影响后续预估。

出库预估:单价 × 出库件数,界面标「参考,非实际成本」。

库存流水

表:stock_ledgers

字段 说明
id 主键
warehouse_id / product_id / unit / purchase_id 与结存键一致(unit 写空串);purchase_id 必填
spec_name / grade / pack 行属性,可空;入账时写入
direction in / out
quantity / weight_kg 变动件数 / 重量(正数)
type 见 14 流水类型全集
stock_document_id 仅来源为 stock_documents 时填
source_type / source_id / source_no 均必填
occurred_at / created_at 业务时间 / 入账时间

流水类型以 14 为准(含 process_out、opening_in;无 in_transit_*)。

库存单据(期初 / 报损)

表:stock_documents
不承载采购、销售、加工、调拨、盘点。后台新建仅暴露 opening / loss;split / merge 枚举可留兼容旧数据,不新开。

字段 说明
id 主键
document_no 唯一
warehouse_id 仓库
type opening / loss(及遗留 split / merge)
status draft / confirmed / cancelled
occurred_at / operator_id / remark 业务时间 / 操作人 / 备注
created_at / updated_at / deleted_at 时间戳;软删除

明细 stock_document_lines

字段 说明
id / stock_document_id 主键 / 单据
product_id / unit / purchase_id 产品 / 单位(空串) / 采购批(必填)
spec_name / grade / pack 行属性,可空
direction in / out
quantity / weight_kg 件数 / 实重(斤)
batch_no 可空(车次等批注,非采购外键)
unit_price / amount 报损等可填
line_role normal / source / target(遗留拆合)
remark 可空

状态机:draft → confirmed(见 14);draft → cancelled。

仓内加工单

对已入库结存做包装 / 分级 / 降级。确认写 process_out + process_in;loss_weight_kg > 0 时另记 loss_out。见 14、07。

一张 process_orders = 一条投入 → 一条产出(无子表)。多产出 = 多张单。

表 process_orders

不设业务单号;流水 source_no 用 (string) id(冲销拼 -R,见 14)。

字段 说明
id 主键
warehouse_id 作业仓(投出、产出同一仓)
type pack / grading / downgrade / other(筛选用,不参与库存算法)
purchase_id 采购批,必填;投出与产出同一批
from_product_id / from_unit / from_product_name 投入产品、单位(空串)、名称快照
from_spec_name / from_grade / from_pack 投入行属性,可空
from_quantity / from_weight_kg 投入件数、实重(斤)
to_product_id / to_unit / to_product_name 产出;to_product_id 必须 = from_product_id;to_unit 写空串
to_spec_name / to_grade / to_pack 产出行属性,可空(分级/改包装时常填;进结存键)
to_quantity / to_weight_kg 产出件数、实重(斤)
loss_weight_kg 损耗(斤),默认 0;> 0 时记 loss_out
process_fee 本单加工费(元),默认 0;各档独立
pack_fee 本单包装费(元),默认 0;各档独立
overhead_unit_price 本档隐形分摊件数单价,可空(空则确认时继承投入结存)
status draft / confirmed / cancelled
occurred_at / operator_id / remark 业务时间 / 操作人 / 备注(外协等)
created_at / updated_at / deleted_at 时间戳;软删除

不存:业务单号、双批次、独立厂商字段、business_date / confirmed_at。

约定:确认前投入结存充足(命中 (warehouse_id, from_product_id, purchase_id, from_spec_name, from_grade, from_pack));from_product_id = to_product_id;加工改 to_* 行属性或数量投出/产出。选产品时写名称快照;from_weight_kg ≈ to_weight_kg + loss_weight_kg;已确认不可改影响流水的字段,纠错走冲销。

draft → confirmed   # process_out + process_in;损耗则 loss_out
draft → cancelled

库间调拨

表:stock_transfers

字段 说明
id / transfer_no 主键 / 唯一单号
from_warehouse_id / to_warehouse_id 调出 / 调入
status draft / shipped / received / cancelled
shipped_at / received_at / operator_id / remark 发出 / 收货 / 操作人 / 备注
created_at / updated_at / deleted_at 时间戳;软删除

明细 stock_transfer_lines

字段 说明
id / stock_transfer_id 主键 / 调拨单
product_id / unit / purchase_id 产品 / 单位 / 采购批(必填;发出与收货同批)
spec_name / grade / pack 行属性,可空;带到在途与目的仓
quantity / weight_kg 件数 / 实重

状态机:draft → shipped → received;draft → cancelled。副作用见 14。

盘点

表:stock_checks;check_no 唯一。

字段 说明
id / check_no / warehouse_id 主键 / 单号 / 仓库
status draft / confirmed / cancelled
occurred_at / operator_id 盘点时间 / 操作人
created_at / updated_at / deleted_at 时间戳;软删除

明细 stock_check_lines

字段 说明
id / stock_check_id 主键 / 盘点单
product_id / unit / purchase_id 产品 / 单位 / 采购批(必填)
spec_name / grade / pack 行属性,可空
location 库位备注,可空(非 WMS)
book* / actual / diff_ 账面 / 实盘 / 差异(件数与重量)
remark 可空

确认见 14「盘点确认」。

在途

表:stock_in_transits
仅服务调拨;不写在途类流水。

字段 说明
id / stock_transfer_id 主键 / 调拨单
from_warehouse_id / to_warehouse_id 发出 / 目的
product_id / unit / purchase_id 与调拨明细一致
spec_name / grade / pack 行属性,可空;自明细带入
quantity / weight_kg 件数 / 重量
status pending / arrived / cancelled
departed_at / arrived_at 发出 / 到货
created_at / updated_at 时间戳

发出插 pending;收货改 arrived。

日快照

表:stock_snapshots
唯一:(warehouse_id, product_id, snapshot_date)。P0 按产品汇总件数与重量;批明细以当日 stocks 为准。

字段 说明
id 主键
warehouse_id / product_id / snapshot_date 仓 / 产品 / 日期
quantity / weight_kg 合计
created_at 生成时间

维护方式

  1. 上线:建仓 → 先有采购批次 → 期初 stock_documents(opening,行上必填 purchase_id)确认。
  2. 日常:业务确认自动写流水;手工补录加工、调拨、盘点、报损、拆合。
  3. 日终:生成 stock_snapshots。

验收标准

  • [ ] 结存唯一键 (warehouse_id, product_id, unit, purchase_id, spec_name, grade, pack);流水含完整 source_*;库存行 purchase_id 均对应已有采购。
  • [ ] 结存 / 流水 / 相关明细含行属性 spec_name / grade / pack(进结存唯一键)。
  • [ ] 结存含可空三费件数单价(预估参考)。
  • [ ] 精简 process_orders(无业务单号);确认产生 process_out/process_in(损耗可有 loss_out)。
  • [ ] stock_documents 仅 opening/loss/split/merge。
  • [ ] 调拨与在途一致,无 in_transit_* 流水。
  • [ ] 拆合重量守恒;盘点确认产生 check_adjust;无独立降级单。
  • [ ] 行为与 14 矩阵一致。

P0 / 延后

P0 延后
上表能力(含加工单、三费件数单价、行属性) 销售在途、按单位快照行、存货成本入账层、WMS、加工 BOM