2026-05-19-production-work-order-design.md 26 KB

入库生产工单 + 生产任务 + 细胞产品库 设计文档

日期: 2026-05-19 状态: 已确认 关联模块: 样本接收、工艺路线管理、库位管理


1. 业务背景

当前系统中,样本接收(accept_conclusion="js")后会自动触发一个入库质检工单。现在需要在此基础上,同时触发生成一个入库生产工单。生产工单可以创建多个生产任务单,生产任务单用于记录完整的工艺过程执行数据。

业务流程

样本接收(accept_conclusion="js")
  ├→ 自动创建 入库质检工单 (已有)
  └→ 自动创建 入库生产工单 (新增, 状态=dpz待配置)
       └→ 用户在工单中手动创建 生产任务单(1:N)
            ├→ 选择一个工艺路线 → 克隆全部步骤(含试剂/耗材/产出/采集项)
            ├→ 可新增/删除工艺步骤
            ├→ 可录入输入(样本或细胞产品)
            ├→ 执行过程中填写实际用量、采集值
            └→ 录入输出(细胞产品 → 存入细胞产品库 → 关联储物格)

2. 需求共识

  1. 触发机制: 样本接收后自动创建入库生产工单(状态为"待配置"),与质检工单在同一个事务中
  2. 工单→任务关系: 1对多,用户在工单中自由创建多个生产任务单
  3. 生产任务单三部分(全部用子表):
    • 输入子表: 可选关联样本或细胞产品
    • 工艺过程: 必选一个工艺路线,克隆其所有步骤(含试剂、耗材、产出物、数据采集项),可修改
    • 输出子表: 记录产出的细胞产品,关联储物格位置
  4. 细胞产品库: 新建 biz_cell_product 表(产品编码、类型、规格、储物格、状态等)
  5. 菜单位置: 在【生产管理】下新增"入库生产工单"、"生产任务"、"细胞产品库"三个二级菜单
  6. 数据采集填写: 克隆数据采集项后,用户在生产执行过程中填写采集值
  7. 工艺过程可编辑: 选了工艺路线后可以新增/删除工艺步骤;执行中仍可继续增删
  8. 实际用量录入: 用户可录入耗材实际使用量、试剂实际使用量、数据采集值等

3. 数据库设计

3.1 新增表概览(10 张)

# 表名 说明
1 biz_cell_product 细胞产品库
2 biz_production_work_order 入库生产工单
3 biz_production_task 生产任务
4 biz_production_task_input 任务输入子表
5 biz_production_task_step 任务工艺步骤(克隆自路线)
6 biz_production_task_step_reagent 步骤试剂 + 实际用量
7 biz_production_task_step_consumable 步骤耗材 + 实际用量
8 biz_production_task_step_output 步骤产出物 + 实际条码
9 biz_production_task_step_data_collection 步骤数据采集项 + 填写值
10 biz_production_task_output 任务输出子表(细胞产品+储物格)

3.2 表关系图

biz_sample_reception ──→ biz_production_work_order ──→ biz_production_task
        │                                                   │
        └──→ biz_qc_work_order (已有)                       ├── biz_production_task_input
                                                         ├── biz_production_task_step (克隆自)
                                                         │       └── biz_process_route_step
                                                         │               ├── ..._reagent
                                                         │               ├── ..._consumable
                                                         │               ├── ..._output
                                                         │               └── ..._data_collection
                                                         ├── biz_production_task_output
                                                         └── biz_cell_product ← 细胞产品库
                                                                 └── biz_storage_facility_slot (库位)

3.3 详细字段设计

3.3.1 biz_cell_product — 细胞产品库

CREATE TABLE `biz_cell_product` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `product_code` varchar(64) NOT NULL COMMENT '产品编码',
  `product_name` varchar(200) NOT NULL COMMENT '产品名称',
  `product_type_id` varchar(64) DEFAULT NULL COMMENT '细胞产品类型ID',
  `spec_id` varchar(64) DEFAULT NULL COMMENT '规格ID',
  `batch_no` varchar(64) DEFAULT NULL COMMENT '批次号',
  `storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
  `product_status` varchar(16) NOT NULL DEFAULT 'zk' COMMENT '状态(zk在库/yc已出库/ysy已使用)',
  `source_type` varchar(20) DEFAULT 'production' COMMENT '来源类型(production生产/manual手动录入)',
  `production_task_id` varchar(64) DEFAULT NULL COMMENT '来源生产任务ID',
  `quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
  `unit` varchar(64) DEFAULT NULL COMMENT '单位',
  `expiry_date` datetime DEFAULT NULL COMMENT '有效期',
  `product_images` varchar(4000) DEFAULT NULL COMMENT '产品图片URL(逗号分隔)',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_cp_tenant_status` (`tenant_no`,`product_status`,`del_flag`),
  KEY `idx_cp_type` (`product_type_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='细胞产品库';

3.3.2 biz_production_work_order — 入库生产工单

CREATE TABLE `biz_production_work_order` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `work_order_no` varchar(32) NOT NULL COMMENT '工单号(前缀SC)',
  `reception_id` varchar(64) NOT NULL COMMENT '样本接收记录ID',
  `protocol_sample_id` varchar(64) NOT NULL COMMENT '协议样本ID',
  `collection_protocol_id` varchar(64) NOT NULL COMMENT '协议单ID',
  `protocol_no` varchar(64) DEFAULT NULL COMMENT '协议号快照',
  `sample_code` varchar(32) DEFAULT NULL COMMENT '样本编码快照',
  `reception_source` varchar(20) NOT NULL DEFAULT 'cell_storage' COMMENT '来源(cell_storage/research_donation)',
  `work_order_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/ywc已完成)',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_pwo_reception` (`reception_id`,`del_flag`),
  KEY `idx_pwo_tenant_status` (`tenant_no`,`work_order_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库生产工单';

3.3.3 biz_production_task — 生产任务

CREATE TABLE `biz_production_task` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `task_no` varchar(32) NOT NULL COMMENT '任务号(前缀RW)',
  `work_order_id` varchar(64) NOT NULL COMMENT '所属工单ID',
  `task_name` varchar(200) DEFAULT NULL COMMENT '任务名称',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `route_id` varchar(64) DEFAULT NULL COMMENT '所选工艺路线ID(仅记录来源)',
  `task_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/jxz进行中/ywc已完成)',
  `started_time` datetime DEFAULT NULL COMMENT '开始时间',
  `completed_time` datetime DEFAULT NULL COMMENT '完成时间',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `attachments` varchar(4000) DEFAULT NULL COMMENT '附件/图片URL(逗号分隔)',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_pt_wo` (`work_order_id`,`del_flag`),
  KEY `idx_pt_tenant_status` (`tenant_no`,`task_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务';

3.3.4 biz_production_task_input — 任务输入子表

CREATE TABLE `biz_production_task_input` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `task_id` varchar(64) NOT NULL COMMENT '任务ID',
  `input_type` varchar(20) NOT NULL COMMENT '类型(sample样本/cell_product细胞产品)',
  `input_id` varchar(64) DEFAULT NULL COMMENT '关联ID(样本ID或细胞产品ID)',
  `input_code` varchar(64) DEFAULT NULL COMMENT '编码快照',
  `input_name` varchar(200) DEFAULT NULL COMMENT '名称快照',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_pti_task` (`task_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输入';

3.3.5 biz_production_task_step — 任务工艺步骤

CREATE TABLE `biz_production_task_step` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `task_id` varchar(64) NOT NULL COMMENT '任务ID',
  `step_order` int(11) DEFAULT NULL COMMENT '步骤顺序',
  `process_code` varchar(64) DEFAULT NULL COMMENT '工序代码',
  `category_id` varchar(64) DEFAULT NULL COMMENT '工序分类ID',
  `process_name` varchar(100) DEFAULT NULL COMMENT '工序名称',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `equipment_name` varchar(200) DEFAULT NULL COMMENT '设备名称',
  `estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时',
  `actual_duration` varchar(100) DEFAULT NULL COMMENT '实际耗时',
  `sop_ids` varchar(1000) DEFAULT NULL COMMENT 'SOP文档ID(逗号分隔)',
  `step_status` varchar(16) NOT NULL DEFAULT 'dzx' COMMENT '状态(dzx待执行/jxz进行中/ywc已完成)',
  `started_time` datetime DEFAULT NULL COMMENT '开始时间',
  `completed_time` datetime DEFAULT NULL COMMENT '完成时间',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_pts_task` (`task_id`,`del_flag`),
  KEY `idx_pts_tenant` (`tenant_no`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务工艺步骤';

3.3.6 biz_production_task_step_reagent — 步骤试剂

CREATE TABLE `biz_production_task_step_reagent` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `step_id` varchar(64) NOT NULL COMMENT '步骤ID',
  `reagent_code` varchar(64) DEFAULT NULL COMMENT '试剂编码',
  `reagent_name` varchar(100) DEFAULT NULL COMMENT '试剂名称',
  `spec` varchar(200) DEFAULT NULL COMMENT '规格',
  `standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
  `actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
  `unit` varchar(64) DEFAULT NULL COMMENT '单位',
  `is_key_material` char(1) DEFAULT '0' COMMENT '是否关键物料(0否 1是)',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_ptsr_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤试剂';

3.3.7 biz_production_task_step_consumable — 步骤耗材

CREATE TABLE `biz_production_task_step_consumable` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `step_id` varchar(64) NOT NULL COMMENT '步骤ID',
  `consumable_code` varchar(64) DEFAULT NULL COMMENT '耗材编码',
  `consumable_name` varchar(100) DEFAULT NULL COMMENT '耗材名称',
  `spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
  `standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
  `actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
  `unit` varchar(64) DEFAULT NULL COMMENT '单位',
  `is_required` char(1) DEFAULT '1' COMMENT '是否必需(1必须 0可选)',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_ptsc_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤耗材';

3.3.8 biz_production_task_step_output — 步骤产出物

CREATE TABLE `biz_production_task_step_output` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `step_id` varchar(64) NOT NULL COMMENT '步骤ID',
  `output_type_id` varchar(64) DEFAULT NULL COMMENT '产出类型ID',
  `output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
  `output_barcode` varchar(200) DEFAULT NULL COMMENT '实际条码',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_ptso_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤产出物';

3.3.9 biz_production_task_step_data_collection — 步骤数据采集

CREATE TABLE `biz_production_task_step_data_collection` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `step_id` varchar(64) NOT NULL COMMENT '步骤ID',
  `collection_name` varchar(100) DEFAULT NULL COMMENT '采集项名称',
  `unit` varchar(64) DEFAULT NULL COMMENT '单位',
  `collection_value` varchar(500) DEFAULT NULL COMMENT '填写值',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_ptsdc_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤数据采集';

3.3.10 biz_production_task_output — 任务输出

CREATE TABLE `biz_production_task_output` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `task_id` varchar(64) NOT NULL COMMENT '任务ID',
  `cell_product_id` varchar(64) DEFAULT NULL COMMENT '关联细胞产品ID',
  `storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
  `output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
  `output_barcode` varchar(200) DEFAULT NULL COMMENT '产出物条码',
  `quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
  `unit` varchar(64) DEFAULT NULL COMMENT '单位',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  `attachments` varchar(4000) DEFAULT NULL COMMENT '图片URL(逗号分隔)',
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_pto_task` (`task_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输出';

4. 后端架构

4.1 触发点

文件: backend/app/crud/sample_reception.py 第 757-766 行

在现有的 if conclusion == "js" 判断中,紧跟质检工单创建之后,添加生产工单创建调用。

if conclusion == "js":
    # 现有:质检工单
    from app.crud import qc_work_order as qc_wo_svc
    qc_wo_svc.create_work_order_from_reception(...)

    # 新增:生产工单
    from app.crud import production_work_order as prod_wo_svc
    prod_wo_svc.create_production_work_order_from_reception(
        db, reception=obj, tenant_no=tenant_no,
        user_id=user_id, create_dept_id=create_dept_id or "",
    )

4.2 新增文件清单

层 文件 说明
Models models.py 新增 10 个 SQLAlchemy 模型 对应 10 张新表
CRUD crud/production_work_order.py 工单 CRUD + create_production_work_order_from_reception()
CRUD crud/production_task.py 任务 CRUD + 克隆工艺路线 + 步骤增删改
CRUD crud/cell_product.py 细胞产品库 CRUD
API api/production.py 扩展 新增工单/任务/产品库路由
Schemas schemas/production_work_order.py 工单 Pydantic 模型
Schemas schemas/production_task.py 任务 Pydantic 模型
Schemas schemas/cell_product.py 产品 Pydantic 模型

4.3 核心业务逻辑

工单号生成

  • 前缀 "SC" + 日期 YYYYMMDD + 4 位序号(如 SC202605190001)
  • 与质检工单 ZJ 前缀对应
  • 同一租户同一天内序号递增

任务号生成

  • 前缀 "RW" + 日期 YYYYMMDD + 4 位序号(如 RW202605190001)

克隆工艺路线到任务步骤

  1. 读取 biz_process_route_step 及其 4 个子表(reagent/consumable/output/data_collection)
  2. 将每个步骤克隆到 biz_production_task_step(task_id 替换 route_id)
  3. 将步骤的试剂/耗材/产出物/数据采集项克隆到对应的 task_step 子表
  4. 数据采集项的 collection_value 初始为空,等待用户执行时填写
  5. 试剂和耗材的 actual_usage 初始为空

执行中增删工艺

  • 新增步骤: 直接在 biz_production_task_step 中插入新记录,重新排序 step_order
  • 删除步骤: 软删除(del_flag=1)步骤及其子表,重新排序
  • 编辑步骤: 直接更新步骤及其子表(整体替换模式)

5. 前端架构

5.1 新增菜单(在【生产管理】下)

菜单名称 路由路径 组件
入库生产工单 /production/work-order views/production/production-work-order/index.vue
生产任务 /production/task views/production/production-task/index.vue
细胞产品库 /production/cell-product views/production/cell-product/index.vue

5.2 新增前端文件

文件 说明
views/production/production-work-order/index.vue 入库生产工单列表+详情
views/production/production-task/index.vue 生产任务列表+执行界面
views/production/cell-product/index.vue 细胞产品库管理
api/production-work-order.ts 工单 API
api/production-task.ts 任务 API
api/cell-product.ts 产品 API

5.3 界面设计要点

  • 入库生产工单: 标准 list 页面,展示工单号、协议号、样本编码、状态、创建时间。支持查看详情(含关联的生产任务列表)
  • 生产任务: list 页面展示任务号、所属工单、状态、工艺路线、开始/完成时间。进入详情可执行工艺步骤、录入数据
  • 细胞产品库: 标准 list 页面,支持新增手动录入或从生产任务产出自动生成

6. API 路由设计

6.1 入库生产工单 API

Method Path 说明
GET /web/admin/production-work-orders 工单列表(分页)
GET /web/admin/production-work-orders/{id} 工单详情
PUT /web/admin/production-work-orders/{id}/complete 完成工单

6.2 生产任务 API

Method Path 说明
POST /web/admin/production-tasks 创建任务(选工艺路线,克隆步骤)
GET /web/admin/production-tasks 任务列表(分页,支持按工单ID筛选)
GET /web/admin/production-tasks/{id} 任务详情(含步骤+子表)
PUT /web/admin/production-tasks/{id} 更新任务基本信息
PUT /web/admin/production-tasks/{id}/status 更新任务状态
POST /web/admin/production-tasks/{id}/steps 新增步骤
PUT /web/admin/production-tasks/{id}/steps/{step_id} 更新步骤
DELETE /web/admin/production-tasks/{id}/steps/{step_id} 删除步骤
PUT /web/admin/production-tasks/{id}/steps/{step_id}/reagents 替换步骤试剂
PUT /web/admin/production-tasks/{id}/steps/{step_id}/consumables 替换步骤耗材
PUT /web/admin/production-tasks/{id}/steps/{step_id}/data-collection 替换步骤数据采集
POST /web/admin/production-tasks/{id}/inputs 设置任务输入
POST /web/admin/production-tasks/{id}/outputs 设置任务输出

6.3 细胞产品库 API

Method Path 说明
GET /web/admin/cell-products 产品列表(分页)
GET /web/admin/cell-products/{id} 产品详情
POST /web/admin/cell-products 新增产品
PUT /web/admin/cell-products/{id} 更新产品
DELETE /web/admin/cell-products/{id} 删除产品(软删除)

7. 状态流转

7.1 入库生产工单

dpz(待配置) ──→ ywc(已完成)
  • 创建时默认 dpz
  • 所有关联任务完成后,可手动标记为 ywc

7.2 生产任务

dpz(待配置) ──→ jxz(进行中) ──→ ywc(已完成)
  • 创建时默认 dpz(已克隆工艺步骤)
  • 用户开始执行时手动标记为 jxz
  • 所有步骤完成后标记为 ywc

7.3 生产任务步骤

dzx(待执行) ──→ jxz(进行中) ──→ ywc(已完成)
  • 克隆时默认 dzx
  • 用户开始该步骤时标记为 jxz,记录 started_time
  • 步骤完成时标记为 ywc,记录 completed_time

8. 约束与注意事项

  1. 租户隔离: 所有查询必须带 tenant_no 过滤
  2. 软删除: 所有删除操作设置 del_flag=1,不物理删除
  3. 工单号唯一: SC 前缀 + 日期 + 序号,同一租户同一天唯一
  4. 任务号唯一: RW 前缀 + 日期 + 序号,同一租户同一天唯一
  5. 克隆独立性: 任务步骤克隆后与原工艺路线完全独立,后续修改互不影响
  6. 细胞产品编码唯一: 产品编码在租户内唯一
  7. 储物格关联: 细胞产品的 storage_slot_id 关联 biz_storage_facility_slot
  8. 触发原子性: 生产工单与质检工单在同一事务中创建,确保要么同时成功要么同时失败