15 KiB
洁净服管理 — 需求分析与设计
日期: 2026-06-17
状态: 已实施
范围: web-admin + backend(生产管理 · 洁净服台账、清洗/灭菌登记、超限提醒)
需求来源: 用户新增(V0.3 需求文档暂无对应章节)
1. 背景与目标
1.1 业务背景
洁净服是 GMP 生产环境中的可重复使用资产,需要:
- 台账登记:编号、名称、入库日期、清洗/灭菌报废次数阈值、废弃日期等;
- 日常登记:批量记录清洗、批量记录灭菌(时间、登记人、备注);
- 合规提醒:累计清洗或灭菌次数达到阈值时给出提醒,不阻断登记(产品决策 A);
- 手动废弃:用户可主动确认废弃;已废弃洁净服不可再清洗、灭菌。
1.2 与现有系统关系
| 维度 | 说明 |
|---|---|
| 菜单位置 | 生产 → 生产管理(PRM00000000000000000000000000001),与生产工单、细胞产品库同级 |
| 类似模块 | 设备管理(P01 主数据)、洁净室管理(主表 + 子记录弹窗)、体检批量登记(多选 + 统一表单) |
| 非关联模块 | 洁净室管理(运营支撑)管理房间与人员进出,与洁净服无强制外键关联 |
1.3 目标
- 支持洁净服 CRUD 与分页筛选;
- 支持列表多选后 批量清洗登记、批量灭菌登记;
- 支持单件洁净服的清洗/灭菌历史查看(行内弹窗);
- 累计次数达限时在列表、批量保存、查看详情处 提醒,仍允许继续登记(未废弃时);
- 支持 手动确认废弃;废弃后禁止清洗/灭菌登记。
2. 产品决策
| # | 问题 | 决策 | 状态 |
|---|---|---|---|
| D1 | 达限后是否禁止继续登记? | 否 — 仅提醒,记录可超过阈值(未废弃时) | ✅ 已确认(选项 A) |
| D2 | 达限是否自动废弃? | 否 — 不自动写废弃日期、不自动改状态 | ✅ 已确认 |
| D3 | 达限提醒 | 任一维度达限即标记对应提醒(清洗达限 / 灭菌达限可并存) | ✅ 默认 |
| D4 | 手动废弃 | 用户通过 「确认废弃」 操作主动废弃;写入 discard_date(默认当天,可改)并设 garment_status=yfq |
✅ 已确认 |
| D5 | 已废弃后清洗/灭菌 | 禁止 — 单条/批量 API 拒绝;前端隐藏/禁用相关按钮 | ✅ 已确认 |
| D6 | 编号生成 | 手工录入,租户内唯一;不做系统自动编号 | ✅ 默认 |
| D7 | 登记人 | 批量/单条登记均可填;默认当前登录用户姓名 | ✅ 默认 |
| D8 | 即将达限预警 | 首版不做;仅「已达限 / 未达限」两档 | ✅ 默认 |
| D9 | 与洁净室关联 | 首版不做外键 | ✅ 默认 |
| D10 | 取消废弃 | 首版不做专用入口;若需纠错,仅管理员通过编辑表单改回 zc 并清空 discard_date |
✅ 默认 |
3. 数据模型
3.1 表结构
biz_cleanroom_garment — 洁净服主表
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | VARCHAR(64) | 是 | UUID 主键 |
| garment_code | VARCHAR(64) | 是 | 编号,租户内唯一 |
| garment_name | VARCHAR(100) | 是 | 名称 |
| wash_discard_limit | INT | 是 | 清洗几次需废弃(阈值,≥1) |
| sterilize_discard_limit | INT | 是 | 灭菌几次需废弃(阈值,≥1) |
| inbound_date | DATE | 是 | 入库日期 |
| discard_date | DATE | 否 | 废弃日期;确认废弃时写入 |
| garment_status | VARCHAR(16) | 是 | zc 正常 / yfq 已废弃;以状态为准判断是否允许清洗/灭菌 |
| tenant_no … del_flag | — | — | 公共字段 |
说明:累计次数 不冗余 在主表,列表/详情通过子表 COUNT 或子查询计算;若性能不足后续再加冗余字段。
biz_cleanroom_garment_wash_log — 清洗记录
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | VARCHAR(64) | 是 | UUID |
| garment_id | VARCHAR(64) | 是 | 洁净服 ID |
| wash_time | DATETIME | 是 | 清洗时间 |
| operator_user_id | VARCHAR(64) | 否 | 登记人用户 ID |
| operator_name | VARCHAR(100) | 否 | 登记人姓名(冗余) |
| tenant_no … del_flag | — | — | 公共字段 |
biz_cleanroom_garment_sterilize_log — 灭菌记录
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | VARCHAR(64) | 是 | UUID |
| garment_id | VARCHAR(64) | 是 | 洁净服 ID |
| sterilize_time | DATETIME | 是 | 灭菌时间 |
| operator_user_id | VARCHAR(64) | 否 | 登记人用户 ID |
| operator_name | VARCHAR(100) | 否 | 登记人姓名(冗余) |
| tenant_no … del_flag | — | — | 公共字段 |
3.2 计算字段(API 返回,非表列)
| 字段 | 计算方式 |
|---|---|
| washCount | COUNT(wash_log WHERE del_flag=0) |
| sterilizeCount | COUNT(sterilize_log WHERE del_flag=0) |
| washLimitReached | washCount >= wash_discard_limit |
| sterilizeLimitReached | sterilizeCount >= sterilize_discard_limit |
| needAttention | washLimitReached OR sterilizeLimitReached |
3.3 ER 关系
biz_cleanroom_garment 1 ── * biz_cleanroom_garment_wash_log
biz_cleanroom_garment 1 ── * biz_cleanroom_garment_sterilize_log
4. 后端 API
路由前缀: /web/admin(production.py 或独立 cleanroom_garment.py,注册于 main.py)
权限: require_menu_code("production:cleanroom-garment:list") + apply_data_scope
4.1 洁净服主数据
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /cleanroom-garments |
分页列表 |
| GET | /cleanroom-garments/{id} |
详情(含累计次数与达限标志) |
| POST | /cleanroom-garments |
新增 |
| PUT | /cleanroom-garments/{id} |
编辑 |
| DELETE | /cleanroom-garments/{id} |
软删 |
| DELETE | /cleanroom-garments/batch |
批量软删 |
| POST | /cleanroom-garments/{id}/discard |
确认废弃(单件) |
| POST | /cleanroom-garments/batch-discard |
批量确认废弃 |
列表查询参数:
| 参数 | 说明 |
|---|---|
| page, pageSize | 分页 |
| keyword | 编号/名称模糊 |
| garmentStatus | zc / yfq |
| needAttention | 1 时仅返回 garment_status=zc 且 wash 或 sterilize 任一侧达限 |
| washLimitReached | 可选,清洗侧达限 |
| sterilizeLimitReached | 可选,灭菌侧达限 |
CreateBody / UpdateBody 字段(与 _row_to_dict 对齐,可写字段):
garmentCode, garmentName, washDiscardLimit, sterilizeDiscardLimit, inboundDate, remark
只读字段(通过废弃接口写入,普通 Update 不可改):
garmentStatus, discardDate
校验:
garment_code租户内唯一;wash_discard_limit、sterilize_discard_limit≥ 1;inbound_date必填;- 新增时
garment_status固定为zc,discard_date为空; - 编辑表单 不直接提供 改状态/废弃日期(避免误操作);废弃走专用接口。
确认废弃 Body(单件 / 批量共用字段):
{
"discardDate": "2026-06-17",
"remark": "可选备注"
}
批量废弃 Body:
{
"garmentIds": ["id1", "id2"],
"discardDate": "2026-06-17",
"remark": "可选"
}
废弃逻辑:
- 仅
garment_status=zc可废弃;已废弃返回 400「该洁净服已废弃」; - 设置
garment_status=yfq、discard_date(缺省为当天)、可选更新remark; - 批量接口跳过已废弃项,返回
{ successCount, skippedCount, skippedItems[] }。
4.2 清洗记录
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /cleanroom-garment-wash-logs |
按 garmentId 分页 |
| POST | /cleanroom-garment-wash-logs |
单条新增 |
| PUT | /cleanroom-garment-wash-logs/{id} |
编辑 |
| DELETE | /cleanroom-garment-wash-logs/{id} |
软删 |
| POST | /cleanroom-garment-wash-logs/batch |
批量清洗登记 |
批量清洗 Body:
{
"garmentIds": ["id1", "id2"],
"washTime": "2026-06-17 14:30:00",
"operatorUserId": "可选",
"operatorName": "张三",
"remark": "备注"
}
批量逻辑:
- 校验
garmentIds非空,均属当前租户且未软删; - 若任一
garment_status=yfq,整批拒绝(400,列出编号),或前端预过滤仅提交正常项(后端仍强校验); - 事务内逐条插入 wash_log;
- 返回
{ successCount, items: [{ garmentId, garmentCode, washCount, washLimitReached, ... }] }供前端提示; - 不因达限拒绝(D1);已废弃必拒绝(D5)。
单条新增/编辑清洗记录时,同样校验所属洁净服 garment_status=zc。
4.3 灭菌记录
与清洗对称,路径前缀 cleanroom-garment-sterilize-logs,字段 sterilizeTime。
同样禁止对已废弃洁净服新增/批量登记。
5. 前端设计
5.1 界面模式
| 部分 | 模式 | 参考 |
|---|---|---|
| 主列表 | P01 | views/production/equipment/index.vue |
| 行内清洗/灭菌历史 | P06 变体 | views/operations/clean-room/index.vue(人员进出 / 紫外线消毒弹窗) |
| 批量登记 | 批量表单弹窗 | views/pilot-service/checkup-management/CheckupRegisterDialog.vue |
Hash: /#/production-group/production/cleanroom-garment
源码: web-admin/src/views/production/cleanroom-garment/index.vue
menuCode: production:cleanroom-garment:list
5.2 页面结构
panel-top: 洁净服管理(panelTitleBarTextRules 注册)
filter-block:
- 关键词(编号/名称)
- 状态(正常/已废弃)
- 需关注(checkbox:任一侧达限)
list-toolbar:
- 已选 N 项
- [新增洁净服] primary
- [批量清洗登记] [批量灭菌登记](仅选中项均为 zc 时可用)
- [批量确认废弃](仅选中项均为 zc 时可用)
- [批量删除]
list-table:
- 编号、名称、入库日期
- 清洗(已洗/阈值,如 48/50)
- 灭菌(已灭/阈值)
- 提醒 Tag(见 §5.4)
- 状态、废弃日期
- 操作:查看 | 清洗记录 | 灭菌记录 | 确认废弃(仅 zc) | 编辑/删除
- 已废弃行:清洗记录/灭菌记录可 **只读查看**;无「新增」按钮
5.3 弹窗
| 弹窗 | 宽度 | 内容 |
|---|---|---|
| 新增/编辑 | 720px | form-grid-2:编号、名称、两阈值、入库日期、备注(不含状态/废弃日期) |
| 确认废弃 | 560px | 废弃日期(默认今天)、备注;二次确认文案 |
| 批量确认废弃 | 560px | 展示将废弃 N 件 + 统一废弃日期 |
| 查看 | SystemViewDialog | 主数据 + 累计次数 + 达限 Tag |
| 清洗记录 | 960px | 该服历史列表 + 单条增删改 |
| 灭菌记录 | 960px | 同上 |
| 批量清洗登记 | 1000px | 上:已选洁净服表;下:清洗时间、登记人、备注 |
| 批量灭菌登记 | 1000px | 同上,灭菌时间 |
5.4 提醒与废弃交互
| 场景 | 行为 |
|---|---|
| 列表 Tag | washLimitReached → <el-tag type="warning"> 清洗达限;sterilizeLimitReached → 灭菌达限;garment_status=yfq → <el-tag type="info"> 已废弃 |
| 达限 + 未废弃 | 批量清洗/灭菌 允许;成功后 ElMessage.warning 提示「N 件已达报废次数,请安排废弃」 |
| 已废弃 | 批量/单条清洗灭菌按钮 禁用;API 返回 400 |
| 确认废弃 | ElMessageBox.confirm → 调用 discard API → 成功提示;行状态刷新为已废弃 |
| 批量登记选中有废弃项 | 打开弹窗前过滤或提示「已自动排除 N 件已废弃洁净服」 |
status-tag-registry.ts 新增:
garmentStatus:zc→ success 正常,yfq→ info 已废弃- 达限 Tag 使用 column template 内联
warning,不必注册为独立枚举
5.5 API 函数(admin.ts 或 production 域)
fetchCleanroomGarmentList, fetchCleanroomGarmentDetail, fetchCreateCleanroomGarment, …
fetchDiscardCleanroomGarment, fetchBatchDiscardCleanroomGarments, …
fetchBatchCreateCleanroomGarmentWashLogs, fetchBatchCreateCleanroomGarmentSterilizeLogs, …
6. 菜单与路由
6.1 sys_menu INSERT
| 字段 | 值 |
|---|---|
| id | 95000000000000000000000000000003 |
| menu_name | 洁净服管理 |
| parent_id | PRM00000000000000000000000000001 |
| menu_type | C |
| path | cleanroom-garment |
| component | /production/cleanroom-garment/index |
| perms | production:cleanroom-garment:list |
| order_num | 8(样本接收信息完善之后,实施时按现有 order 微调) |
6.2 同步文件
docs/sql/migrations/2026-06-17-cleanroom-garment.sqlbackend/app/api/menu.py— 生产管理 childrenweb-admin/src/router/modules/sqxp.ts— 同上
7. 实施清单(概要)
7.1 Backend
docs/sql/migrations/2026-06-17-cleanroom-garment.sql— 3 表 + 菜单app/models/— 3 个 Model(或production_cleanroom_garment.py)app/crud/cleanroom_garment.py—_row_to_dict、列表含 count 子查询、批量事务app/api/production.py(或新模块)— 路由 + 权限app/main.py+app/api/__init__.py注册python scripts/check_field_consistency.py
7.2 Frontend
src/api/admin.ts— API 封装src/views/production/cleanroom-garment/index.vue— 主页面- 可选拆分:
WashLogDialog.vue,SterilizeLogDialog.vue,BatchWashDialog.vue,BatchSterilizeDialog.vue App.vue—panelTitleBarTextRules增加「洁净服管理」./scripts/update-graph.sh backend web-admin
8. 测试要点
| # | 场景 | 期望 |
|---|---|---|
| T1 | 新增洁净服 | 编号唯一,阈值 ≥1 |
| T2 | 批量清洗 3 件 | 3 条 log,列表 washCount +3 |
| T3 | washCount 达到阈值 | 列表出现「清洗达限」Tag,仍可继续批量清洗 |
| T4 | 确认废弃 | 状态变 yfq,写入 discard_date;清洗/灭菌 API 返回 400 |
| T5 | 已废弃洁净服批量清洗 | 前端按钮禁用或后端拒绝 |
| T6 | 批量确认废弃 | 多件 zc → yfq;已废弃项 skipped |
| T7 | 筛选「需关注」 | 仅返回任一侧达限且仍为 zc 的记录(已废弃不出现在需关注) |
| T8 | 软删洁净服 | 列表不可见,日志保留 |
| T9 | 租户隔离 | 跨租户不可见 |
| T10 | 权限 | 无 menuCode 不可访问 API |
9. 不在首版范围
- 与洁净室/人员绑定
- 即将达限(剩余 N 次)预警
- 达限自动废弃
- 取消废弃 / 恢复为正常(专用入口)
- 导出 Excel、消息推送
10. 修订记录
| 日期 | 说明 |
|---|---|
| 2026-06-17 | 初稿;D1 确认选项 A(达限仅提醒,不阻断) |
| 2026-06-17 | 补充 D4/D5:支持手动确认废弃;已废弃禁止清洗/灭菌 |