9.6 KiB
生产日结与材料闭环设计
背景
真实生产不是一次领料后必须按参考生产数量一次性全部做完。常见场景是:今天领料生产一部分,下班前把已完成成品入成品库,把剩余原材料还回原材料库,第二天再次领料或继续生产。现有逻辑偏向“参考生产数量未做完则生产出库任务未结束”,会让 DAG 看起来像领料一直悬挂,无法表达阶段性生产和阶段性结算。
本设计目标是把生产出库从“一次性完工工单”改造为“可多次日结的生产任务”,用材料去向闭环替代计划数量闭环。
核心业务原则
- 生产出库代表一次领料任务,不代表必须一次性完成全部参考生产数量。
- 每次生产结束可以做一次“生产日结”,记录本次报工、成品入库、余料归还、废料/报废和差异原因。
- 任务是否结束,不再只看
完工数 >= 参考生产数量,而是看领出的材料是否已经有明确去向。 - 成品入库、生产余料入库、生产废料入库都要能挂到同一次生产日结下。
- DAG 要展示“领料任务 -> 多次生产日结 -> 各类入库/报废 -> 任务结清”的真实链路。
新增概念
生产出库任务
沿用现有生产出库/工单主体,语义调整为“领料任务”。它记录:
- 生产跟踪号
- 产品
- 领用原材料库存批次
- 领用重量
- 参考生产数量
- 当前材料闭环状态
参考生产数量仍保留,但只作为参考值,不再是唯一闭环标准。
生产日结单
新增一个业务对象,建议表名为 pp_production_settlement,用于记录某个生产出库任务的一次阶段性结算。
建议字段:
settlement_no:日结单号work_order_id:生产出库任务 IDsettlement_date:结算日期reported_qty:本次报工数量finished_qty:本次合格成品数量scrap_qty:本次报废数量standard_consumed_weight_kg:标准消耗重量expected_surplus_weight_kg:标准应归还余料重量actual_surplus_weight_kg:实际余料归还重量site_carryover_weight_kg:现场留存重量,用于记录当天不还仓、继续留在生产现场的材料重量scrap_weight_kg:废料或报废折算重量variance_weight_kg:差异重量variance_rate:差异率variance_reason:偏差原因status:草稿、已确认、异常确认、已撤销
标准消耗公式:
标准消耗重量 = 本次报工数量 × 产品毛重
标准应归还余料:
标准应归还余料 = 结算前未闭环现场余额 - 标准消耗重量 - 废料/报废折算重量 - 现场留存重量
偏差率:
偏差率 = abs(实际余料归还重量 - 标准应归还余料) / 标准应归还余料
当标准应归还余料为 0 时,使用差异重量是否为 0 判断;如存在差异,要求填写原因。
状态规则
生产出库任务建议状态:
已领料:已经完成生产出库,还没有日结。生产中:已有小程序报工或工序进度,但尚未结算。部分结算:至少存在一张已确认生产日结单,但材料尚未全部闭环。待结清:理论上仍有未处理材料、未入库成品或未解释差异。已结清:领料重量已经通过成品、余料、废料、允许损耗和差异原因完成闭环。异常结清:偏差超过阈值,用户填写原因后确认结清。
偏差阈值默认使用 10%。超过 10% 时,必须填写偏差原因才能确认日结。
材料闭环判断
一个生产出库任务的材料闭环按重量判断:
领料总重量
= 已结算标准消耗重量
+ 已归还余料重量
+ 已入废料/报废重量
+ 允许损耗重量
+ 已解释差异重量
+ 未结清现场余额
系统展示时要明确区分:
- 已生产消耗
- 已余料归还
- 已报废/废料入库
- 已解释差异
- 未结清现场余额
只有未结清现场余额为 0,且所有超过阈值的差异都有原因时,任务才能进入已结清或异常结清。
如果用户当天不把剩余材料全部还仓,而是留在现场第二天继续生产,则在生产日结中填写“现场留存重量”。这部分重量不会形成余料入库流水,也不会让任务结清;它会作为下一次生产日结的结算前未闭环现场余额。
出入库联动
成品入库
成品入库从生产日结单发起或关联生产日结单。每张生产日结单可以对应一张或多张成品入库记录,但推荐前端默认合并为一次成品入库操作。
成品批次要记录:
- 生产出库任务
- 生产日结单
- 原材料库存批次来源
- 入库数量
- 入库重量
- 入库材料成本
生产余料入库
生产余料入库必须关联生产日结单和来源库存批次。归还逻辑仍然是回到原库存批次,不新建库存批次。
页面展示:
- 来源库存批次号,多选
- 每个来源库存批次的归还重量
- 标准应归还重量
- 实际归还重量
- 现场留存重量
- 偏差率
- 超过 10% 时填写原因
生产废料入库
生产废料入库可以关联生产日结单。用于记录边角料、废料和报废折算进入废料库。
如果废料入库重量来自报废数量折算,系统应显示计算依据;如果用户直接称重录入,则以称重为准。
DAG 展示设计
DAG 从当前“生产出库后直接挂工序、报工、成品入库”调整为分层展示:
flowchart LR
A["原材料库存批次"] --> B["生产出库任务"]
B --> C1["生产日结 2026-06-02"]
B --> C2["生产日结 2026-06-03"]
C1 --> D1["成品入库"]
C1 --> E1["生产余料入库"]
C1 --> F1["生产废料入库"]
C2 --> D2["成品入库"]
C2 --> E2["生产余料入库"]
C2 --> F2["生产废料入库"]
B --> G["任务结清状态"]
节点层级:
- Level 0:原材料库存批次
- Level 1:生产出库任务
- Level 2:生产日结单
- Level 3:工序报工汇总、成品入库、余料入库、废料入库
- Level 4:销售出库或后续追溯节点
DAG 节点指标:
- 生产出库任务节点:领料重量、参考生产数量、累计日结数量、未结清现场余额、状态。
- 生产日结节点:本次报工、合格品、报废、标准消耗、标准余料、实际余料、偏差率。
- 未结清现场余额节点或指标:展示仍留在现场、尚未还仓或尚未解释去向的材料重量。
- 成品入库节点:入库数量、来源库存批次、材料成本。
- 余料入库节点:归还库存批次、归还重量、偏差说明。
- 废料入库节点:废料重量、来源日结、处理状态。
DAG 视觉规则:
- 未结清任务用黄色状态。
- 偏差超过阈值且未写原因用红色状态。
- 已结清任务用绿色状态。
- 生产日结节点按日期从上到下排列。
- 点击生产出库任务时,高亮所有关联日结和出入库链路。
- 点击某个生产日结时,只高亮该日结对应的成品、余料和废料链路。
前端交互
生产出库列表
新增或调整列:
- 生产跟踪号
- 产品
- 领料重量
- 参考生产数量
- 累计报工数量
- 累计成品入库
- 累计余料归还
- 未结清现场余额
- 状态
操作:
- 查看 DAG
- 新增生产日结
- 查看日结记录
- 结清任务
新增生产日结抽屉
用户选择生产出库任务后,系统自动带出:
- 产品
- 产品毛重
- 领料来源库存批次
- 当前未结清重量
- 小程序报工汇总
- 可入库成品数量
用户填写或确认:
- 本次报工数量
- 本次成品入库数量
- 本次报废数量
- 本次余料归还重量
- 本次现场留存重量
- 本次废料入库重量
- 偏差原因
系统实时计算:
- 标准消耗重量
- 标准应归还重量
- 结算后未结清现场余额
- 实际归还偏差
- 偏差率
- 是否必须填写原因
后端接口
建议新增接口:
GET /production/work-orders/{id}/settlement-previewPOST /production/work-orders/{id}/settlementsGET /production/work-orders/{id}/settlementsPOST /production/settlements/{id}/confirmPOST /production/work-orders/{id}/close
现有接口调整:
- 成品入库接口支持传入
settlement_id。 - 生产余料入库接口支持传入
settlement_id。 - 生产废料入库接口支持传入
settlement_id。 - DAG 生命周期接口返回生产日结节点和日结关联的入库/报废节点。
数据迁移
已有历史生产出库可以不强制补日结单。迁移策略:
- 已完工且已有成品入库的生产出库,DAG 可继续按旧链路展示。
- 新增生产日结功能上线后,新生产出库默认走日结链路。
- 对历史未完成生产出库,可允许用户手工创建一张“历史补录日结单”进行结清。
测试要点
后端测试:
- 领料 200kg,报工 200 件,毛重 0.6kg,标准应归还 80kg。
- 偏差不超过 10% 时允许确认日结。
- 偏差超过 10% 且无原因时禁止确认。
- 多次日结累计后,未结清现场余额正确减少。
- 成品入库、余料入库、废料入库均能关联同一日结单。
- 任务结清不再依赖
完工数 >= 参考生产数量。
前端测试:
- 生产日结抽屉实时计算标准余料和偏差率。
- 超过 10% 时偏差原因必填。
- DAG 展示生产日结节点和多条出入库链路。
- 点击生产出库任务和点击日结节点的高亮范围不同。
非目标
本次设计不引入复杂 APS 排产,不管理员工排班,不强制要求每道工序都每日结算。小程序报工仍作为生产数量和报废数量来源,ERP 负责生产日结和库存闭环。