12 KiB
工单表合并重构实施计划
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 将入库+临时工单表合并为单表(work_order_type 字段区分类型),彻底消除多表 JOIN 复杂度。
Architecture: 质检工单合并为 biz_qc_work_order(加 work_order_type),生产工单合并为 biz_production_work_order(加 work_order_type)。任务表保持不变(biz_qc_task / biz_production_task 的 order_source 保留)。前端每个工单类型一个页面,根据 work_order_type 条件展示不同字段。
Tech Stack: MySQL 5.7 DDL / Python 3.9 FastAPI SQLAlchemy / Vue 3 TypeScript Element Plus
影响文件清单
删除(合并后不再需要)
backend/app/models/models.py中BizTempQcWorkOrder、BizTempProductionWorkOrder两个 classbackend/app/schemas/temp_qc_work_order.pybackend/app/schemas/temp_production_work_order.pybackend/app/crud/temp_qc_work_order.pybackend/app/crud/temp_production_work_order.pyweb-admin/src/api/temp-qc-work-order.tsweb-admin/src/api/temp-production-work-order.tsweb-admin/src/views/quality-inspection/temp-qc-work-order/index.vueweb-admin/src/views/production/temp-production-work-order/index.vueweb-admin/src/router/modules/sqxp.ts中临时工单路由条目
修改
docs/sql/— 新建迁移 SQLbackend/app/models/models.py— 加work_order_type,reception 字段改 nullable,删 temp modelbackend/app/crud/qc_work_order.py— 合并临时工单的创建/配置/完成逻辑backend/app/crud/production_work_order.py— 合并临时工单的创建/配置/完成逻辑backend/app/crud/qc_task.py— 恢复 INNER JOIN(不再需要 LEFT JOIN + 子查询 hack)backend/app/crud/production_task.py— 同上,简化批量查询backend/app/api/qc.py— 合并临时工单 API 端点,删除 temp importbackend/app/api/production.py— 同上backend/app/schemas/qc_work_order.py— 新增work_order_type字段web-admin/src/api/qc-work-order.ts或business.ts— 新增临时工单 APIweb-admin/src/views/quality-inspection/qc-work-order/index.vue— 支持临时工单创建/筛选web-admin/src/views/production/production-work-order/index.vue— 同上
Task 1: DDL 迁移 SQL
Files:
-
Create:
docs/sql/merge_work_order_tables.sql -
Step 1: 编写迁移 SQL
-- ============================================================
-- 工单表合并迁移:入库+临时 → 单表 + work_order_type
-- Date: 2026-05-24
-- 执行顺序:必须先执行,再部署后端代码
-- ============================================================
-- 1. biz_qc_work_order: 加 work_order_type,现有数据全部设 inbound
ALTER TABLE biz_qc_work_order
ADD COLUMN work_order_type VARCHAR(20) NOT NULL DEFAULT 'inbound'
COMMENT '工单类型: inbound=入库, temporary=临时' AFTER work_order_no;
-- 2. biz_qc_work_order: reception 关联字段改为可空(临时工单不需要)
ALTER TABLE biz_qc_work_order
MODIFY COLUMN reception_id VARCHAR(64) NULL COMMENT '样本接收ID',
MODIFY COLUMN protocol_sample_id VARCHAR(64) NULL COMMENT '协议样本ID',
MODIFY COLUMN collection_protocol_id VARCHAR(64) NULL COMMENT '采集协议ID',
MODIFY COLUMN reception_source VARCHAR(20) NULL DEFAULT 'cell_storage' COMMENT '来源: cell_storage/research_donation';
-- 3. 迁移临时质检工单数据到主表
INSERT INTO biz_qc_work_order (
id, work_order_no, work_order_type, work_order_status,
has_lab, has_third_party, third_party_fee_total,
configured_time, configured_by,
tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
id, work_order_no, 'temporary', work_order_status,
has_lab, has_third_party, third_party_fee_total,
configured_time, configured_by,
tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
FROM biz_temp_qc_work_order;
-- 4. biz_production_work_order: 加 work_order_type
ALTER TABLE biz_production_work_order
ADD COLUMN work_order_type VARCHAR(20) NOT NULL DEFAULT 'inbound'
COMMENT '工单类型: inbound=入库, temporary=临时' AFTER work_order_no;
-- 5. biz_production_work_order: 加 configured_time/configured_by(临时工单需要)
ALTER TABLE biz_production_work_order
ADD COLUMN configured_time DATETIME NULL COMMENT '配置时间' AFTER work_order_status,
ADD COLUMN configured_by VARCHAR(64) NULL COMMENT '配置人' AFTER configured_time;
-- 6. biz_production_work_order: reception 关联字段改为可空
ALTER TABLE biz_production_work_order
MODIFY COLUMN reception_id VARCHAR(64) NULL COMMENT '样本接收ID',
MODIFY COLUMN protocol_sample_id VARCHAR(64) NULL COMMENT '协议样本ID',
MODIFY COLUMN collection_protocol_id VARCHAR(64) NULL COMMENT '采集协议ID',
MODIFY COLUMN reception_source VARCHAR(20) NULL DEFAULT 'cell_storage' COMMENT '来源';
-- 7. 迁移临时生产工单数据到主表
INSERT INTO biz_production_work_order (
id, work_order_no, work_order_type, work_order_status,
configured_time, configured_by,
tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
id, work_order_no, 'temporary', work_order_status,
configured_time, configured_by,
tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
FROM biz_temp_production_work_order;
-- 8. 删除临时表(确认数据迁移成功后执行)
DROP TABLE IF EXISTS biz_temp_qc_work_order;
DROP TABLE IF EXISTS biz_temp_production_work_order;
- Step 2: 手动执行前备份
mysqldump -u root -p zkxw biz_qc_work_order biz_temp_qc_work_order biz_production_work_order biz_temp_production_work_order > /tmp/work_order_backup_$(date +%Y%m%d).sql
Task 2: 后端 Model 更新
Files:
-
Modify:
backend/app/models/models.py -
Step 1: 更新 BizQcWorkOrder 模型
- 在
work_order_no后加work_order_type = Column(String(20), nullable=False, default="inbound") - 将
reception_id、protocol_sample_id、collection_protocol_id改为nullable=True - 将
reception_source改为nullable=True
- 在
-
Step 2: 更新 BizProductionWorkOrder 模型
- 加
work_order_type = Column(String(20), nullable=False, default="inbound") - 加
configured_time = Column(DateTime, nullable=True) - 加
configured_by = Column(String(64), nullable=True) - 将
reception_id、protocol_sample_id、collection_protocol_id改为nullable=True - 将
reception_source改为nullable=True
- 加
-
Step 3: 删除 BizTempQcWorkOrder 和 BizTempProductionWorkOrder 类
-
Step 4: 验证 import
cd backend && source venv/bin/activate && python -c "from app.main import app; print('OK')"
Task 3: 后端 CRUD 合并 — 质检工单
Files:
-
Modify:
backend/app/crud/qc_work_order.py -
Delete:
backend/app/crud/temp_qc_work_order.py -
Step 1: 在 qc_work_order.py 中新增临时工单函数
- 将
temp_qc_work_order.py中的create_temp_qc_work_order、configure_temp_qc_work_order、list_temp_qc_work_orders、get_temp_qc_work_order_detail、try_complete_temp_qc_work_order、delete_temp_qc_work_order合并进qc_work_order.py - 修改工单号生成逻辑:根据
work_order_type选择前缀(inbound=ZJ,temporary=LSZJ) - 修改 list 查询:加
work_order_type过滤 - 修改 configure 逻辑:使用同一个
BizQcWorkOrder模型 - 修改 task 生成:保持
order_source逻辑不变
- 将
-
Step 2: 删除 temp_qc_work_order.py
Task 4: 后端 CRUD 合并 — 生产工单
Files:
-
Modify:
backend/app/crud/production_work_order.py -
Delete:
backend/app/crud/temp_production_work_order.py -
Step 1: 合并临时生产工单函数
- 同 Task 3 思路:将 temp 函数合并进主文件
- 工单号前缀:inbound=SC,temporary=LSSC
- 保留工艺路线克隆逻辑
- 保留
order_source逻辑
-
Step 2: 删除 temp_production_work_order.py
Task 5: 后端 API + Schema 更新
Files:
-
Modify:
backend/app/api/qc.py -
Modify:
backend/app/api/production.py -
Modify:
backend/app/schemas/qc_work_order.py -
Delete:
backend/app/schemas/temp_qc_work_order.py -
Delete:
backend/app/schemas/temp_production_work_order.py -
Step 1: 更新 qc_work_order schema
- 在
QcWorkOrderCreateBody中加work_order_type: str = "inbound" - 新增
TempQcWorkOrderCreateBody(remark only)或复用现有 schema - 新增
QcWorkOrderConfigureBody(合并临时工单配置的 schema)
- 在
-
Step 2: 合并 qc.py API 端点
- 将临时质检工单的 5 个端点合并到现有工单端点
- 新增
POST /web/admin/qc-work-orders支持work_order_type参数 - 新增
GET /web/admin/qc-work-orders支持work_order_type过滤 - 新增
POST /web/admin/qc-work-orders/{id}/configure端点(从 temp 端点移过来) - 删除 temp 相关 import 和端点
-
Step 3: 合并 production.py API 端点
- 同上思路
-
Step 4: 删除 temp schema 文件
-
Step 5: 验证 import
Task 6: 恢复 qc_task.py 的简单 INNER JOIN
Files:
-
Modify:
backend/app/crud/qc_task.py -
Step 1: 恢复 list_tasks 为 INNER JOIN
- 将
outerjoin(BizQcWorkOrder, ...)恢复为join(BizQcWorkOrder, ...) - 删除
BizTempQcWorkOrderimport - 删除临时工单子查询(
temp_wo_sq) - 删除临时工单后处理(
temp_wo_ids、temp_wo_map、if/elif 分支) - 恢复原来的 ORDER BY 子句(含
BizQcWorkOrder.work_order_no.desc())
- 将
-
Step 2: 验证
cd backend && source venv/bin/activate && python -c "from app.crud.qc_task import list_tasks; print('OK')"
Task 7: 简化 production_task.py
Files:
-
Modify:
backend/app/crud/production_task.py -
Step 1: 简化 list_tasks 批量查询
- 删除
BizTempProductionWorkOrderimport - 删除临时工单子查询和批量补充逻辑
- 恢复为只查
BizProductionWorkOrder的简单模式
- 删除
Task 8: 前端 API + 页面合并
Files:
-
Modify:
web-admin/src/api/qc-work-order.ts或business.ts -
Modify:
web-admin/src/api/production-work-order.ts或business.ts -
Modify:
web-admin/src/views/quality-inspection/qc-work-order/index.vue -
Modify:
web-admin/src/views/production/production-work-order/index.vue -
Delete:
web-admin/src/api/temp-qc-work-order.ts -
Delete:
web-admin/src/api/temp-production-work-order.ts -
Delete:
web-admin/src/views/quality-inspection/temp-qc-work-order/index.vue -
Delete:
web-admin/src/views/production/temp-production-work-order/index.vue -
Modify:
web-admin/src/router/modules/sqxp.ts -
Step 1: 将临时工单 API 合并到主 API 模块
- 在 qc-work-order API 中新增 configure 端点调用
- 新增 work_order_type 参数支持
- 删除 temp API 文件
-
Step 2: 更新 qc-work-order/index.vue
- 新增"工单类型"筛选(入库/临时)
- 新增创建时选择类型(入库走接收流程,临时直接创建)
- 新增配置检测弹窗(从 temp 页面移植)
- 条件显示 reception 相关列(仅入库类型显示样本编码、协议号等)
-
Step 3: 更新 production-work-order/index.vue
- 同上思路
-
Step 4: 更新路由 sqxp.ts
- 删除临时工单路由条目
- 主工单路由保持不变
-
Step 5: 删除临时工单页面和 API 文件
-
Step 6: 前端构建验证
cd web-admin && pnpm build
Task 9: 全局验证
- Step 1: 后端 import 验证
cd backend && source venv/bin/activate && python -c "from app.main import app; print('OK')"
- Step 2: 前端构建验证
cd web-admin && pnpm build
- Step 3: 手动测试流程
- 创建入库质检工单 → 配置 → 生成任务 ✓
- 创建临时质检工单 → 配置 → 生成任务 ✓
- 质检任务列表显示两种来源 ✓
- 创建入库生产工单 → 配置 → 生成任务 ✓
- 创建临时生产工单 → 配置 → 生成任务 ✓