日期:2026-09-01
状态:已实现(待库执行 SQL 与浏览器验证)
范围:工艺库管理 · 工艺路线 Tab;biz_process_route字段;写接口守卫;SQL 深拷贝脚本
不改:派发任务选路线逻辑(内置路线仍可选);原 4 条源路线权限不变
将下列 4 条工艺路线各复制一份作为「内置模版」:
| 源路线名称 | 源路线编码 |
|---|---|
| 造血干样本处理 | CC样本处理 |
| 干细胞培养 | MSC培养 |
| UBMC冻存 | UBMC冻存 |
| PBMC冻存 | PBMC冻存 |
复制结果:
| 目标名称 | 目标编码 |
|---|---|
| 造血干样本处理(内置模版) | CC样本处理-BUILTIN |
| 干细胞培养(内置模版) | MSC培养-BUILTIN |
| UBMC冻存(内置模版) | UBMC冻存-BUILTIN |
| PBMC冻存(内置模版) | PBMC冻存-BUILTIN |
约束:
super_admin 可编辑/删除/维护步骤is_current 与对应源路线一致| 项 | 决策 |
|---|---|
| 命名 | 名称加「(内置模版)」;编码加 -BUILTIN |
| 限制范围 | 禁改头信息 + 全部步骤维护 + 禁删;派发可选 |
| 识别 | 字段 is_builtin='1' + 备注「内置模版」 |
| 当前版本 | 与源 is_current 一致 |
| 可修改角色 | 仅 super_admin(admin 不可改内置) |
biz_process_route 增加:
| 列 | 类型 | 默认 | 说明 |
|---|---|---|---|
is_builtin |
CHAR(1) NOT NULL | '0' |
1=内置模版,0=普通 |
位置:业务字段区(建议在 remark 之前或之后,与现有列顺序风格一致)。
配套:
BizProcessRoute.is_builtin_route_row_to_dict 增加 isBuiltin: "0"|"1"docs/sql/2026-09-01-process-route-add-is-builtin.sql:
ALTER TABLE biz_process_route
ADD COLUMN is_builtin CHAR(1) NOT NULL DEFAULT '0'
COMMENT '是否内置模版(0-否 1-是)' AFTER remark;
(若环境 MySQL 对 AFTER 敏感,可省略 AFTER。)
对每个源路线(按 tenant_no + route_code + del_flag=0 定位;若同编码多版本,取 is_current='1',若无则取 update_time 最新一条):
route_code = 源编码 + '-BUILTIN' 且未删除 → 跳过该条。biz_process_route:
route_name / route_code 按上表product_type_id、version、equipment_ids、equipment_name、order_num 同源is_current 同源remark = '内置模版'is_builtin = '1'create_time/update_time/del_flag=0 等del_flag=0 的 biz_process_route_step(含 sop_content 等全文)biz_process_route_step_reagentbiz_process_route_step_consumablebiz_process_route_step_outputbiz_process_route_step_data_collectionroute_id/step_id 指向新记录脚本:docs/sql/2026-09-01-process-route-builtin-templates.sql
实现方式:推荐存储过程或分步 INSERT…SELECT + 临时映射表(旧 id → 新 id),保证可在 MySQL 5.7 执行。脚本头部注释说明:先执行 add-is-builtin,再执行本复制脚本。
is_super_admin(user) := user.role == "super_admin"
与现有 menu_guard.SUPER_ADMIN_ROLE / 前端 isSuperAdmin 一致。
新增辅助(建议放在 process_route CRUD 或小工具模块):
assert_route_writable(db, route_id, user)
→ 若路线 is_builtin=='1' 且非 super_admin → raise ValueError("内置模版仅超级管理员可修改")
按 step_id 写操作时:先解析步骤所属 route_id,再调用同上。
| 接口 | 说明 |
|---|---|
PUT /process-routes/{id} |
更新路线头 |
PUT /process-routes/set-current |
设当前版本 |
DELETE /process-routes/{id} |
删除路线 |
POST .../step/add |
加步骤 |
POST .../step/copy |
复制步骤 |
PUT .../step/update |
更新步骤 |
PUT .../step/reorder |
重排 |
DELETE .../step/{id} |
删步骤 |
| `PUT .../step/reagent | consumable |
列表/详情/派发侧拉启用路线:不拦截。
批量删除若存在:对选中项中含内置的,整批拒绝或逐条跳过——推荐整批拒绝并提示含内置模版。
普通用户不能通过更新接口把 is_builtin 改为 0(字段不开放给 UpdateBody;仅 SQL/超管运维脚本维护)。
isBuiltin === '1'userStore.isSuperAdmin === false 时:
备注列展示「内置模版」即可(SQL 已写入)。
| 场景 | 行为 |
|---|---|
| 非超管改内置 | 400,文案明确 |
| 源路线不存在 | SQL 跳过并记录(或脚本注释人工检查) |
| 目标编码已存在 | 幂等跳过 |
| 派发选内置路线 | 允许,克隆任务步骤逻辑不变 |
| # | 项 |
|---|---|
| 1 | ALTER + Model + isBuiltin 序列化 |
| 2 | 写接口 assert_route_writable |
| 3 | ProcessRouteTab 按钮/入口禁用 |
| 4 | 幂等深拷贝 SQL |
| 5 | 字段一致性(若 UpdateBody 曾暴露字段则排除 isBuiltin) |
admin 视为可改内置tenant_no 匹配源数据执行)