14 KiB
14 KiB
临时工单模块设计文档
日期: 2026-05-24 状态: 待审核 模块: 临时质检工单 + 临时生产工单
1. 背景与目标
现状
系统已有 4 个模块:
| 模块 | 表名 | 说明 |
|---|---|---|
| 入库质检工单 | biz_qc_work_order |
关联样本接收记录和协议 |
| 质检任务 | biz_qc_task |
由入库质检工单配置检测项目后自动生成 |
| 入库生产工单 | biz_production_work_order |
关联样本接收记录和协议 |
| 生产任务 | biz_production_task |
由入库生产工单手动派发创建 |
目标
新增 2 个临时工单模块,复用现有任务生成机制,在任务表中记录工单来源:
- 临时质检工单 — 独立工单(不关联样本/协议),配置检测项目后自动生成质检任务
- 临时生产工单 — 独立工单(不关联样本/协议),选择工艺路线后创建生产任务(自动克隆路线步骤+子表,流程与入库生产工单一致)
设计决策记录
| 决策项 | 选择 | 原因 |
|---|---|---|
| 关联关系 | 完全不关联 reception/protocol | 临时工单独立于入库流程 |
| 来源追踪 | 任务表新增 order_source 字段 |
最小侵入,清晰区分来源 |
| 任务生成方式 | 配置→自动批量生成 | 和入库模式一致 |
| 工单字段 | 极简(工单号+状态+备注) | 用户要求简单 |
| 工单号前缀 | LSZJ(临时质检)、LSSC(临时生产) | 区分于入库前缀 |
| 实现方案 | 新建独立临时工单表 | 和入库完全解耦,避免混合复杂度 |
2. 数据库设计
2.1 新建 biz_temp_qc_work_order(临时质检工单)
DROP TABLE IF EXISTS biz_temp_qc_work_order;
CREATE TABLE biz_temp_qc_work_order (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
work_order_no VARCHAR(64) NOT NULL COMMENT '工单号(LSZJ+日期+序号)',
work_order_status VARCHAR(20) NOT NULL DEFAULT 'dpz' COMMENT '状态: dpz=待配置, ypz=已配置, ywc=已完成',
configured_time DATETIME DEFAULT NULL COMMENT '配置时间',
configured_by VARCHAR(64) DEFAULT NULL COMMENT '配置人',
has_lab TINYINT DEFAULT 0 COMMENT '是否含实验室自检: 0=否, 1=是',
has_third_party TINYINT DEFAULT 0 COMMENT '是否含第三方检测: 0=否, 1=是',
third_party_fee_total DECIMAL(12,2) DEFAULT NULL COMMENT '第三方费用合计',
tenant_no VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户编号',
order_num INT 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 NOT NULL DEFAULT 0 COMMENT '删除标记: 0=正常, 1=已删除',
PRIMARY KEY (id),
KEY idx_temp_qc_wo_tenant (tenant_no, del_flag),
KEY idx_temp_qc_wo_no (work_order_no, tenant_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='临时质检工单';
2.2 新建 biz_temp_production_work_order(临时生产工单)
DROP TABLE IF EXISTS biz_temp_production_work_order;
CREATE TABLE biz_temp_production_work_order (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
work_order_no VARCHAR(64) NOT NULL COMMENT '工单号(LSSC+日期+序号)',
work_order_status VARCHAR(20) NOT NULL DEFAULT 'dpz' COMMENT '状态: dpz=待配置, jxz=进行中, ywc=已完成',
configured_time DATETIME DEFAULT NULL COMMENT '配置时间',
configured_by VARCHAR(64) DEFAULT NULL COMMENT '配置人',
tenant_no VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户编号',
order_num INT 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 NOT NULL DEFAULT 0 COMMENT '删除标记: 0=正常, 1=已删除',
PRIMARY KEY (id),
KEY idx_temp_prod_wo_tenant (tenant_no, del_flag),
KEY idx_temp_prod_wo_no (work_order_no, tenant_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='临时生产工单';
2.3 任务表新增 order_source 字段
-- 质检任务表新增来源字段
ALTER TABLE biz_qc_task
ADD COLUMN order_source VARCHAR(20) NOT NULL DEFAULT 'inbound'
COMMENT '工单来源: inbound=入库, temporary=临时' AFTER work_order_id;
-- 生产任务表新增来源字段
ALTER TABLE biz_production_task
ADD COLUMN order_source VARCHAR(20) NOT NULL DEFAULT 'inbound'
COMMENT '工单来源: inbound=入库, temporary=临时' AFTER work_order_id;
2.4 明细表处理(复用现有表)
临时质检工单复用现有 biz_qc_work_order_lab_item 和 biz_qc_work_order_third_item 表,通过 order_source 字段区分来源。
-- 实验室项目明细表新增来源字段
ALTER TABLE biz_qc_work_order_lab_item
ADD COLUMN order_source VARCHAR(20) NOT NULL DEFAULT 'inbound'
COMMENT '工单来源: inbound=入库, temporary=临时' AFTER work_order_id;
-- 第三方项目明细表新增来源字段
ALTER TABLE biz_qc_work_order_third_item
ADD COLUMN order_source VARCHAR(20) NOT NULL DEFAULT 'inbound'
COMMENT '工单来源: inbound=入库, temporary=临时' AFTER work_order_id;
2.5 关联关系
biz_temp_qc_work_order
├─(work_order_id + order_source='temporary')→ biz_qc_work_order_lab_item
├─(work_order_id + order_source='temporary')→ biz_qc_work_order_third_item
└─(work_order_id + order_source='temporary')→ biz_qc_task
→ biz_qc_task_result
biz_temp_production_work_order
└─(work_order_id + order_source='temporary')→ biz_production_task
→ biz_production_task_step + 子表
3. 后端架构
3.1 新增文件清单
| 层 | 临时质检工单 | 临时生产工单 |
|---|---|---|
| Model | models.py 新增 BizTempQcWorkOrder |
models.py 新增 BizTempProductionWorkOrder |
| Schema | 新建 schemas/temp_qc_work_order.py |
新建 schemas/temp_production_work_order.py |
| CRUD | 新建 crud/temp_qc_work_order.py |
新建 crud/temp_production_work_order.py |
| API | api/qc.py 新增路由组 |
api/production.py 新增路由组 |
3.2 API 路由设计
临时质检工单:
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/admin/temp-qc-work-orders |
创建 |
| GET | /api/admin/temp-qc-work-orders |
列表 |
| GET | /api/admin/temp-qc-work-orders/{id} |
详情 |
| DELETE | /api/admin/temp-qc-work-orders/{id} |
删除(软删除) |
| POST | /api/admin/temp-qc-work-orders/{id}/configure |
配置检测项目(→自动生成任务) |
临时生产工单:
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/admin/temp-production-work-orders |
创建 |
| GET | /api/admin/temp-production-work-orders |
列表 |
| GET | /api/admin/temp-production-work-orders/{id} |
详情 |
| DELETE | /api/admin/temp-production-work-orders/{id} |
删除(软删除) |
| POST | /api/admin/temp-production-work-orders/{id}/configure |
配置→自动生成任务 |
3.3 核心业务逻辑
3.3.1 工单号生成
- 临时质检:
LSZJ+YYYYMMDD+ 4位序号(如LSZJ202605240001) - 临时生产:
LSSC+YYYYMMDD+ 4位序号(如LSSC202605240001) - 生成逻辑:参照现有
_gen_qc_work_order_no()模式,按日期+租户查询当日最大序号+1
3.3.2 创建工单
极简创建:仅需 remark(可选),自动生成工单号,状态默认 dpz(待配置)。
3.3.3 配置检测项目(临时质检工单)
流程与入库质检工单的 configure_work_order() 一致:
用户选择检测项目 (lab_item_ids, third_party_ids)
├─ 校验工单状态 (dpz/ypz)
├─ 清除旧的待执行任务(order_source='temporary')
├─ 遍历 lab_item_ids:
│ ├─ 创建 BizQcWorkOrderLabItem (order_source='temporary')
│ └─ 调用 qc_task.create_task_for_line(order_source='temporary')
├─ 遍历 third_party_ids:
│ ├─ 创建 BizQcWorkOrderThirdItem (order_source='temporary')
│ └─ 调用 qc_task.create_task_for_line(order_source='temporary')
└─ 更新工单状态为 'ypz'
3.3.4 配置→生成任务(临时生产工单)
与入库生产工单完全一致,选择工艺路线后创建生产任务(自动克隆路线步骤+4类子表):
用户配置任务信息 (task_name, task_type, route_id 工艺路线, description 可选)
├─ 创建 BizProductionTask (order_source='temporary', task_status='dpz')
├─ 如果选择了工艺路线: _clone_route_to_task() — 深拷贝路线步骤 + 子表
├─ 工单状态更新为 'jxz'
└─ 流程与入库生产工单的 create_production_task() 完全一致
后需复用 production_task.create_production_task() + _clone_route_to_task() 机制。
3.3.5 状态同步
- 质检:任务完成时检查同工单下所有任务(order_source='temporary')是否都已完成,若是则工单标记
ywc - 生产:任务完成时同步工单状态(复用
sync_production_work_order_status_from_tasks()逻辑)
3.3.6 删除
软删除(del_flag=1),级联删除关联的任务(仅 order_source='temporary')和明细行。
4. 前端架构
4.1 新增文件清单
| 类型 | 临时质检工单 | 临时生产工单 |
|---|---|---|
| API | 新建 api/temp-qc-work-order.ts |
新建 api/temp-production-work-order.ts |
| 视图 | 新建 views/quality-inspection/temp-qc-work-order/index.vue |
新建 views/production/temp-production-work-order/index.vue |
4.2 页面设计
临时质检工单页
参照模板页 views/system/unit/index.vue(标准列表页),功能简化:
- 列表列:工单号、状态(Tag)、是否含实验室自检、是否含第三方、配置时间、创建时间、操作
- 创建弹窗:仅备注字段
- 配置弹窗:复用现有配置检测项目组件(选择实验室自检项目/第三方检测项目+公司+费用)
- 详情弹窗:工单基本信息 + 关联任务列表
- 状态 Tag:dpz→待配置(info)、ypz→已配置(warning)、ywc→已完成(success)
临时生产工单页
同样参照标准列表页:
- 列表列:工单号、状态(Tag)、配置时间、创建时间、操作
- 创建弹窗:仅备注字段
- 配置弹窗:简单表单(任务名称、任务类型 cell_storage/outbound、描述)
- 详情弹窗:工单基本信息 + 关联任务列表
- 状态 Tag:dpz→待配置(info)、jxz→进行中(primary)、ywc→已完成(success)
4.3 任务来源展示
在现有质检任务和生产任务列表页中:
- 新增"来源"列,使用 Tag 展示:
inbound→ Tag<el-tag type="success" size="small">入库</el-tag>temporary→ Tag<el-tag type="warning" size="small">临时</el-tag>
4.4 路由配置
在 src/router/modules/ 中对应的质量检验和生产管理路由组下新增子路由:
// 质量检验路由组下
{ path: 'temp-qc-work-order', name: 'TempQcWorkOrder', component: () => import('@views/quality-inspection/temp-qc-work-order/index.vue') }
// 生产管理路由组下
{ path: 'temp-production-work-order', name: 'TempProductionWorkOrder', component: () => import('@views/production/temp-production-work-order/index.vue') }
4.5 菜单配置
需要在系统菜单管理中添加对应菜单项(数据库 sys_menu 表插入)。
5. 修改现有代码清单
以下列出需要修改的现有文件(非新增文件):
| 文件 | 修改内容 |
|---|---|
backend/app/models/models.py |
新增 BizTempQcWorkOrder、BizTempProductionWorkOrder 模型;BizQcTask、BizProductionTask 新增 order_source 列;BizQcWorkOrderLabItem、BizQcWorkOrderThirdItem 新增 order_source 列 |
backend/app/crud/qc_task.py |
create_task_for_line() 接受 order_source 参数;list_tasks() 展示 order_source;_task_to_dict() 序列化 order_source |
backend/app/crud/production_task.py |
create_production_task() 接受 order_source 参数;list_production_tasks() 展示 order_source;序列化 order_source |
backend/app/api/qc.py |
新增临时质检工单路由组 |
backend/app/api/production.py |
新增临时生产工单路由组 |
backend/app/api/__init__.py |
如有新路由文件则注册 |
web-admin/src/api/qc-task.ts |
类型定义新增 orderSource 字段 |
web-admin/src/api/production-task.ts |
类型定义新增 orderSource 字段 |
web-admin/src/views/quality-inspection/qc-task/index.vue |
列表新增"来源"Tag 列 |
web-admin/src/views/production/production-task/index.vue |
列表新增"来源"Tag 列 |
docs/sql/zkxw.sql |
同步新增表和 ALTER 语句 |
6. 风险与注意事项
- order_source 默认值:所有现有数据默认为
inbound,无需数据迁移 - 现有查询兼容:所有现有查询
work_order_id关联时,默认只查order_source='inbound'或不加过滤(因为现有数据的 work_order_id 不会和临时工单冲突——指向不同表的主键) - 工单号唯一性:LSZJ/LSSC 前缀确保不与 ZJ/SC 冲突
- 权限:临时工单菜单需要在系统中配置,遵循现有 RBAC 权限体系
- 软删除级联:删除临时工单时,仅删除
order_source='temporary'的任务,不影响入库任务 - 工艺路线克隆:临时生产工单复用
_clone_route_to_task()机制,与入库生产工单完全一致(步骤+试剂+耗材+产出物+数据采集项全部深拷贝)