design.md 5.4 KB

Context

生产物料库(biz_production_material*)已对齐质检物料库:试剂/耗材统一目录、批次、领用(manual_out)、工单 step_save(parent_usage_id)、盘点。用户确认 方案 A:配置试剂配制完成后 先入库存,工单使用前 再领用,步骤登记 不二次扣库。

已废弃的 biz_consumable_pack 仅为耗材模板,无配制实例与子物料领用追溯,不可复用。

Goals / Non-Goals

Goals:

  • 第三类物料 material_type=configured_reagent,目录 + BOM(试剂+耗材子项)
  • 配制单:记录每次配制实际消耗的子物料领用行;产出配置试剂批次
  • 配置试剂走完整 批次 → 领用 → 工单 step_save 链路
  • UI 落在【生产物料库】与【生产工单】执行态,风格对齐 Fresh Mint / QC 物料库

Non-Goals:

  • 不合并质检物料库
  • 不恢复耗材包
  • 工艺库/工艺路线步骤引用配置试剂 BOM(二期)
  • 配制现场「直用不入库」模式(方案 B/C)
  • 盘点首版对配置试剂做特殊调账逻辑(沿用现有 Part A/B,不调账)

Decisions

Decision 1: 扩展 material_type,不另建独立库存域

选择:configured_reagent 作为 biz_production_material.material_type 第三值;批次/领用/盘点 复用 现有表与 CRUD 模式。

理由:与用户已接受的试剂/耗材统一库一致;避免第二套 batch/usage API。

替代:独立 biz_configured_reagent* 表系 — 拒绝,重复建设。

Decision 2: 配方与配制分离

实体 表 含义
配方 BOM biz_production_material_formula 主数据:标准子物料与标准用量
配制单 biz_production_material_prep + _prep_line 业务单据:某次实际配制

理由:BOM 可版本化维护;配制单保留历史追溯(哪次用了哪些领用记录)。

配制单头关键字段:configured_material_id、prep_no、prep_time、output_qty、output_unit、batch_no、expire_date、stock_in_no(产出批次)、status(draft/completed/cancelled)。

配制行关键字段:component_material_id、component_material_type、component_material_code、requisition_usage_id(parent 领用记录)、actual_qty、usage_unit。

Decision 3: 库存流水 source_type

环节 change_type source_type 库存影响
子物料配制消耗 use prep_consume 子物料 不扣 batch;stock_before==stock_after;parent_usage_id 指向领用记录
配置试剂配制入库 in prep_in 配置试剂 catalog stock_qty ↑;新建/更新 batch remaining_qty
配置试剂领用 use manual_out 按 batch 扣减(与现网一致)
工单步骤登记 use step_save 不扣库存;parent_usage_id 指向领用记录

理由:与 production-material-requisition Decision 5 一致;子物料已在领用时扣过 batch。

Decision 4: 配制完成事务边界

单次「确认配制」在一个 DB 事务内:

  1. 校验每行 requisition_usage_id 有效、未重复、领用人为当前用户或允许范围
  2. 写入 prep + prep_line
  3. 对每个 prep_line 写 prep_consume usage
  4. 创建配置试剂 stock_batch + prep_in usage
  5. 更新配置试剂 stock_qty

失败则整体回滚。

Decision 5: 生产工单步骤 UI

选择:新增 biz_production_task_step_configured_reagent 子表(或等价命名),工单执行态增加 「配置试剂」Tab;领用下拉 GET /production-material-requisition-options?materialType=configured_reagent。

理由:与保留「试剂」「耗材」分列一致;避免塞入 reagent Tab 造成类型混淆。

保存仍调用统一 register_step_usage_from_requisition;目录内配置试剂 有实际用量时必须选领用记录。

Decision 6: 编码唯一性

沿用 租户 + material_type + material_code;允许配置试剂编码与试剂/耗材编码相同(类型不同)。

Decision 7: 偏离 BOM

配制时允许调整 实际用量;子物料行 必须 选领用记录。标准用量自 BOM 带出,仅作参考。

Risks / Trade-offs

风险 缓解
领用余量与子物料配制量不一致 首版仅记录 prep_consume 关联领用,不强制核销领用余额字段;二期可加「领用已配制量」汇总
配置试剂批次过期日规则不清 配制单必填 expire_date
成本单价 首版 unit_price/amount 可按子物料 prep_consume 金额汇总写入产出 batch
步骤子表增多 配置试剂 Tab 独立;工艺模板引用二期再做
与未完成 production-material-requisition 依赖 tasks 注明前置:统一物料库迁移已执行

Migration Plan

  1. DDL:formula、prep、prep_line;字典项 configured_reagent;step 子表(若新建)
  2. 部署后端 API + 前端
  3. 无历史数据迁移(新能力);旧耗材包保持废弃

回滚:隐藏菜单与 API;新表保留不删(软兼容)。

Open Questions

# 问题 默认
Q1 配制单是否独立菜单 vs 物料库 Tab 物料库第四 Tab「配制单」
Q2 prep_no 生成规则 租户内按日序号,如 PZ-YYYYMMDD-NNN
Q3 取消配制单是否回滚库存 首版仅 draft 可删;completed 不可撤销