日期:2026-06-11
状态:已实现(2026-06-11)
需求来源:质检部门新增环境检测登记能力
已确认:方案 B — 扁平单表(一次登记对应一个检测项目)
已确认:检测人支持多选,新增时默认选中当前登录用户
质检部门需对实验室/洁净区环境进行定期检测并留存记录,包括检测时间、检测人、检测项目、结果描述及检测附件。
biz_clean_room)关联| 方案 | 说明 | 结论 |
|---|---|---|
| A. 主表 + 明细行 | 一次登记可含多项,每项独立描述与附件 | 未采用 |
| B. 扁平单表 | 每条记录 = 一次检测 = 一个检测项目 | 采用 |
| C. 硬编码项目 | 不做维护菜单 | 未采用 |
方案 B 含义:用户登记「表面微生物检测」与「沉降菌检测」需分别创建两条记录;检测时间、检测人(可多人)、结果描述、附件均挂在单条记录上。
| 菜单 | 父级 | path | 组件 | menuCode |
|---|---|---|---|---|
| 环境检测项维护 | 质检基础信息 QCB…001 |
env-detect-item |
views/quality-inspection/env-detect-item/index.vue |
biz:envDetectItem:list |
| 环境检测管理 | 质检管理 QCM…001 |
env-detect-record |
views/quality-inspection/env-detect-record/index.vue |
biz:envDetectRecord:list |
同步文件:
web-admin/src/router/modules/sqxp.tsbackend/app/api/menu.pydocs/sql/migrations/2026-06-11-env-detect.sqldocs/sql/zkxw.sql(全量基线,实现阶段更新)命名空间:biz_env_detect_*。均含标准公共字段(id UUID、tenant_no、order_num、remark、create_by、create_dept_id、create_time、update_by、update_time、del_flag)。
biz_env_detect_item — 环境检测项(主数据)| 字段 | 类型 | 说明 |
|---|---|---|
| item_code | VARCHAR(64) | 项目编码,租户内唯一(del_flag=0) |
| item_name | VARCHAR(200) | 项目名称 |
| status | CHAR(1) | 1 启用 / 0 停用 |
索引:uk_env_item_tenant_code (tenant_no, item_code, del_flag)
初始种子数据(迁移时按租户 zkxw 插入,其他租户可自行维护):
| item_code | item_name |
|---|---|
| BMWS | 表面微生物检测 |
| SYFS | 实验室风速检测 |
| ZWQD | 紫外灯强度检测 |
| CJJ | 沉降菌检测 |
| JJZY | 洁净区噪音检测 |
| XFZL | 洁净区悬浮粒子检测 |
biz_env_detect_record — 环境检测登记(业务记录)| 字段 | 类型 | 说明 |
|---|---|---|
| record_no | VARCHAR(32) | 登记编号:HJ + yyyyMMdd + 4 位日序,租户内唯一 |
| detect_time | DATETIME | 检测时间(必填) |
| inspector_ids | VARCHAR(500) | 检测人用户 ID,逗号分隔,至少 1 人(必填) |
| inspector_names | VARCHAR(500) | 检测人姓名快照,逗号分隔,顺序与 inspector_ids 一致 |
| env_detect_item_id | VARCHAR(64) | 检测项目主数据 ID(必填) |
| item_code | VARCHAR(64) | 项目编码快照 |
| item_name | VARCHAR(200) | 项目名称快照 |
| result_desc | VARCHAR(2000) | 检测结果描述(必填) |
| attachment_urls | VARCHAR(2000) | 检测附件 URL,逗号分隔(MinIO,可选) |
索引:
uk_env_rec_tenant_no (tenant_no, record_no, del_flag)idx_env_rec_tenant_time (tenant_no, detect_time, del_flag)idx_env_rec_tenant_item (tenant_no, env_detect_item_id, del_flag)快照规则:
biz_env_detect_item 写入 item_code、item_name。inspector_ids 批量查询 sys_user,按提交顺序写入 inspector_names(nick_name 优先,无则 user_name)。存储约定:inspector_ids / inspector_names 与 attachment_urls 相同,采用逗号分隔字符串落库;API 层 _row_to_dict 解析为 inspectorIds: string[]、inspectorNames: string[],并额外输出 inspectorDisplay(姓名以 / 拼接,供列表列展示)。
路由注册于 app/api/env_detect.py(或拆分为 env_detect_item.py + env_detect_record.py),在 app/api/__init__.py 与 app/main.py 注册。
前缀:/web/admin/。租户隔离 + 数据权限 + 软删除,列表默认 create_time DESC。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /env-detect-items |
分页列表(keyword、status) |
| GET | /env-detect-items/active |
启用项全量(登记下拉用,无分页) |
| GET | /env-detect-items/{id} |
详情 |
| POST | /env-detect-items |
新增 |
| PUT | /env-detect-items/{id} |
更新 |
| DELETE | /env-detect-items/{id} |
软删除 |
校验:item_code、item_name 必填;编码租户内唯一;已被登记引用的项允许停用,不允许物理删除(软删除前可选:若存在引用则提示或禁止删除,一期采用允许软删除但登记下拉仅取 status=1 且 del_flag=0)。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /env-detect-records |
分页列表 |
| GET | /env-detect-records/{id} |
详情 |
| POST | /env-detect-records |
新增(服务端生成 record_no) |
| PUT | /env-detect-records/{id} |
更新 |
| DELETE | /env-detect-records/{id} |
软删除 |
列表筛选参数:keyword(编号/检测人姓名/结果描述模糊)、envDetectItemId、inspectorId(命中 inspector_ids 中任一 ID 即返回,MySQL FIND_IN_SET)、detectTimeStart、detectTimeEnd。
创建/更新 Body:
{
"detectTime": "2026-06-11 14:30:00",
"inspectorIds": ["current-user-uuid", "other-user-uuid"],
"envDetectItemId": "item-uuid",
"resultDesc": "检测结果描述",
"attachmentUrls": "url1,url2",
"remark": ""
}
检测人校验:
inspectorIds 必填,去重后至少 1 个有效用户 ID。inspectorIds 数组顺序生成快照,不依赖前端传入姓名。编号生成:HJ + yyyyMMdd + 4 位序,逻辑对齐 pilot_delivery._generate_delivery_no。
| 页面 | 模式 | 参考 |
|---|---|---|
| 环境检测项维护 | P01 | sample-reception-check-item/index.vue |
| 环境检测管理 | P01 + 附件卡片 | sample-reception-check-item + OpenSpec 附件上传卡片 |
筛选:检测时间范围、检测项目(下拉,启用项)、检测人(用户单选下拉,筛「包含该检测人」的记录)、关键词(编号/结果描述)
列表列:序号、登记编号、检测时间、检测人(inspectorDisplay,多人以 / 分隔)、检测项目、结果描述(tooltip 截断)、创建时间、操作
新增/编辑弹窗(dialog-form-layout,宽约 640px,form-grid-2):
| 字段 | 控件 | 必填 |
|---|---|---|
| 检测时间 | el-date-picker type=datetime |
是 |
| 检测人 | el-select multiple + filterable,数据源 fetchUserOptions() |
是(≥1 人) |
| 检测项目 | 下拉,数据源 /env-detect-items/active |
是 |
| 检测结果描述 | el-input textarea,form-col-span-2 |
是 |
| 检测附件 | 附件卡片上传(fetchUploadAttachment),form-col-span-2 |
否 |
| 备注 | el-input textarea,form-col-span-2 |
否 |
检测人默认与交互(对齐 sample-reception 经手人逻辑,扩展为多选):
inspectorIds 默认包含 当前登录用户 ID;若用户列表中尚无当前用户,先 ensureCurrentUserInOptions() 注入选项(参考 sample-reception/index.vue getCurrentUserHandler)。inspectorIds;若历史检测人不在下拉列表中,合并进选项以保证展示。查看:SystemViewDialog 展示 inspectorDisplay(或逐人换行);附件区支持预览/下载。
状态 Tag:本模块无业务状态字段;检测项维护页 status 走 status-tag-registry。
web-admin/src/api/env-detect-item.tsweb-admin/src/api/env-detect-record.ts类型字段与后端 _row_to_dict 保持一致(camelCase)。
-- 环境检测项维护(父:质检基础信息 QCB00000000000000000000000000001)
INSERT INTO sys_menu (...) VALUES (
'71000000000000000000000000000001', '环境检测项维护',
'QCB00000000000000000000000000001', 'C', 'env-detect-item',
'/quality-inspection/env-detect-item/index', 'biz:envDetectItem:list', ...
);
-- 环境检测管理(父:质检管理 QCM00000000000000000000000000001)
INSERT INTO sys_menu (...) VALUES (
'71000000000000000000000000000002', '环境检测管理',
'QCM00000000000000000000000000001', 'C', 'env-detect-record',
'/quality-inspection/env-detect-record/index', 'biz:envDetectRecord:list', ...
);
order_num:项维护置于「质检物料库」之前(建议 7);环境检测管理置于「质检工单」之后(建议 3)。
python scripts/check_field_consistency.py 通过(CRUD ↔ Schema ↔ 前端 formData)./scripts/update-graph.sh backend 与 frontend(新增模块后)App.vue panelTitleBarTextRules 写入「环境检测项列表」「环境检测登记列表」| 层 | 内容 | 估时 |
|---|---|---|
| DB | 2 表 + 菜单 + 种子 | 0.5d |
| Backend | 2 组 CRUD + 编号生成 | 1d |
| Frontend | 2 个 P01 页 + 附件上传 | 1d |
| 联调 | 字段一致性 + 手工测试 | 0.5d |
| 合计 | 约 3 人天 |
| 日期 | 说明 |
|---|---|
| 2026-06-11 | 初稿;用户确认方案 B(扁平单表) |
| 2026-06-11 | 检测人改为多选;新增默认选中当前登录用户;库表 inspector_ids / inspector_names |