日期:2026-05-17
依据:用户确认的业务规则;docs/中科兴皖需求V0.3.md 签收后触发样本检测流程;既有 biz_sample_reception、样本接收 Web 页。
范围:web-admin + backend(FastAPI);租户隔离、软删除、公共字段与工程规范一致。
| 项 | 规则 |
|---|---|
| 样本类型 | 不考虑;主数据维护全部检测项目,由人员自选 |
| 样本接收 UI | 保持现状,不在接收弹窗勾选检测项目 |
| 触发时机 | 接收结论为 接收(js) 时,自动生成 1 条质检工单(与 biz_sample_reception 1:1);拒收(bj) 不建单 |
| 项目配置 | 在 质检工单 界面配置:检测方式(实验室自检 / 第三方检测,可多选)及具体项目 |
| 任务生成 | 实验室 + 第三方 所选项目 各生成 1 条质检任务;处理逻辑按任务类型区分 |
| 任务差异 | 实验室自检:本实验室处理(一期仅状态/骨架);第三方:需 上传第三方检测材料 |
| 样本类型映射 | 不做 |
create_sample_reception 提交事务内(或同事务)创建工单,保证幂等(同一 reception_id 仅一条工单)。sample_status / 作废 / 入库)— 留二期。| 方案 | 说明 | 结论 |
|---|---|---|
| A. 工单头 + 明细行 + 任务表 | 工单存头信息;配置时写入工单明细(快照);确认后按明细生成 biz_qc_task |
采用 — 便于待配置态展示、费用汇总、审计快照 |
| B. 仅工单 + 任务 | 配置直接写任务,无中间明细 | 待配置编辑与历史追溯弱 |
| C. JSON 存配置 | 配置存 JSON 字段 | 不利于列表筛选与报表 |
一级菜单 质量检测(/quality-inspection,已有)下新增:
| 序号 | 菜单名称 | path | 组件 | 权限前缀(建议) |
|---|---|---|---|---|
| 1 | 第三方检测公司 | third-party-company |
views/quality-inspection/third-party-company/index.vue |
biz:qcThirdPartyCompany |
| 2 | 第三方检测项目 | third-party-item |
views/quality-inspection/third-party-item/index.vue |
biz:qcThirdPartyItem |
| 3 | 实验室自检项目 | lab-test-item |
views/quality-inspection/lab-test-item/index.vue |
biz:qcLabTestItem |
| 4 | 质检工单 | qc-work-order |
views/quality-inspection/qc-work-order/index.vue |
biz:qcWorkOrder |
| 5 | 质检任务 | qc-task |
views/quality-inspection/qc-task/index.vue |
biz:qcTask |
保留现有:样本接收、接收检查项配置。
同步:web-admin/src/router/modules/sqxp.ts、backend/app/api/menu.py、docs/sql/sys_menu_quality_inspection.sql(或增量 SQL)。
UI:列表对齐 system/unit/index.vue;弹窗 label-position="top"、.dialog-form-layout;色板 Fresh Mint。
命名空间表前缀:biz_qc_*。均含标准公共字段(id UUID、tenant_no、order_num、remark、create_by、create_dept_id、create_time、update_by、update_time、del_flag)。
biz_qc_third_party_company — 第三方检测公司| 字段 | 类型 | 说明 |
|---|---|---|
| company_code | VARCHAR(64) | 公司编码,租户内唯一 |
| company_name | VARCHAR(200) | 公司名称 |
| contact_name | VARCHAR(100) | 联系人 |
| contact_phone | VARCHAR(32) | 联系电话 |
| address | VARCHAR(500) | 地址 |
| status | CHAR(1) | 1 启用 / 0 停用 |
biz_qc_third_party_item — 第三方检测项目及费用| 字段 | 类型 | 说明 |
|---|---|---|
| company_id | VARCHAR(64) | FK → 第三方公司 |
| item_code | VARCHAR(64) | 项目编码(租户内可与 company 联合唯一) |
| item_name | VARCHAR(200) | 项目名称 |
| fee_amount | DECIMAL(18,2) | 费用(元) |
| status | CHAR(1) | 1 启用 / 0 停用 |
列表页支持按 公司 筛选;新增/编辑必须选择所属公司。
biz_qc_lab_test_item — 实验室自检项目| 字段 | 类型 | 说明 |
|---|---|---|
| item_code | VARCHAR(64) | 项目编码,租户内唯一 |
| item_name | VARCHAR(200) | 项目名称 |
| description | VARCHAR(500) | 描述/方法说明(可选) |
| status | CHAR(1) | 1 启用 / 0 停用 |
biz_qc_work_order — 质检工单| 字段 | 类型 | 说明 |
|---|---|---|
| work_order_no | VARCHAR(32) | 工单号(规则:ZJ + yyyyMMdd + 4 位序,租户内按日序) |
| reception_id | VARCHAR(64) | 接收记录 ID,唯一(未删除) |
| protocol_sample_id | VARCHAR(64) | 协议样本 ID |
| collection_protocol_id | VARCHAR(64) | 协议单 ID |
| protocol_no | VARCHAR(64) | 协议号快照(列表展示) |
| sample_code | VARCHAR(32) | 样本编码快照 |
| work_order_status | VARCHAR(16) | 见 §6.1 |
| has_lab | CHAR(1) | 1/0 是否含实验室自检 |
| has_third_party | CHAR(1) | 1/0 是否含第三方检测 |
| configured_time | DATETIME | 配置确认时间 |
| configured_by | VARCHAR(64) | 配置人用户 ID |
| third_party_fee_total | DECIMAL(18,2) | 第三方项目费用合计(配置时汇总) |
biz_qc_work_order_lab_item — 工单-实验室项目明细(配置快照)| 字段 | 类型 | 说明 |
|---|---|---|
| work_order_id | VARCHAR(64) | 工单 ID |
| lab_test_item_id | VARCHAR(64) | 主数据 ID |
| item_code / item_name | VARCHAR | 快照 |
biz_qc_work_order_third_item — 工单-第三方项目明细(配置快照)| 字段 | 类型 | 说明 |
|---|---|---|
| work_order_id | VARCHAR(64) | 工单 ID |
| third_party_item_id | VARCHAR(64) | 主数据 ID |
| company_id | VARCHAR(64) | 公司 ID |
| company_name | VARCHAR(200) | 公司名快照 |
| item_code / item_name | VARCHAR | 快照 |
| fee_amount | DECIMAL(18,2) | 费用快照 |
biz_qc_task — 质检任务| 字段 | 类型 | 说明 |
|---|---|---|
| work_order_id | VARCHAR(64) | 工单 ID |
| task_no | VARCHAR(32) | 任务号(RW + 日序,或工单号 + - + 序号) |
| task_type | VARCHAR(16) | sysz 实验室自检 / dsfjc 第三方检测 |
| source_line_id | VARCHAR(64) | 对应工单明细行 ID(lab 或 third 明细表) |
| item_code / item_name | VARCHAR | 快照 |
| company_id / company_name | VARCHAR | 第三方任务填公司快照;实验室为空 |
| fee_amount | DECIMAL(18,2) | 第三方费用快照 |
| task_status | VARCHAR(16) | 见 §6.2 |
| third_party_attachments | VARCHAR(4000) | 第三方检测材料 URL,逗号分隔(MinIO) |
| completed_time | DATETIME | 完成时间 |
| completed_by | VARCHAR(64) | 完成人 |
work_order_status| 值 | 标签 | 说明 |
|---|---|---|
dpz |
待配置 | 接收后自动创建 |
ypz |
已配置 | 已确认检测方式与项目,任务已生成 |
ywc |
已完成 | 全部任务已完成(可由任务聚合更新,一期可实现自动推进) |
task_status| 值 | 标签 | 说明 |
|---|---|---|
dzx |
待执行 | 刚生成 |
jxz |
进行中 | 实验室:开始处理;第三方:已上传部分材料可选 |
ywc |
已完成 | 实验室:手动完成;第三方:上传材料后确认完成 |
sys_dict)qc_task_type:sysz / dsfjcqc_work_order_status:dpz / ypz / ywcqc_task_status:dzx / jxz / ywc一期也可前端常量 + 标签函数(与样本接收结论一致)。
sequenceDiagram
participant SR as 样本接收
participant WO as 质检工单
participant TK as 质检任务
SR->>WO: 结论=接收(js) 提交
Note over WO: 创建工单 status=dpz
WO->>WO: 质检专员打开「配置检测」
Note over WO: 勾选 has_lab / has_third_party<br/>多选启用项目
WO->>WO: POST 确认配置
WO->>WO: 写入明细快照 status=ypz
loop 每个实验室项目
WO->>TK: 创建 task_type=sysz
end
loop 每个第三方项目
WO->>TK: 创建 task_type=dsfjc
end
TK->>TK: 实验室:状态流转(一期骨架)
TK->>TK: 第三方:上传材料 → 完成
TK->>WO: 全部 ywc 时工单→ywc
在 create_sample_reception 中,当 accept_conclusion == 'js' 且提交成功后:
reception_id 尚无未删除工单,则插入 biz_qc_work_order(dpz)。reception_id、protocol_sample_id、collection_protocol_id;从协议单/样本补 protocol_no、sample_code。work_order_no。幂等:已存在工单则跳过(防重复接收场景应在前置校验拦截,此处防御性检查)。
work_order_status = dpz 可配置。hasLab: booleanhasThirdParty: booleanlabItemIds: string[](hasLab 时至少 1 项)thirdPartyItemIds: string[](hasThirdParty 时至少 1 项)dpz 态理论上无任务,若有则拒绝)。dzx)。ypz、has_lab、has_third_party、third_party_fee_total、configured_*。| 类型 | 操作 |
|---|---|
sysz |
列表查看;支持「开始」「完成」状态变更(无结果表单) |
dsfjc |
上传第三方检测材料(附件卡片,MinIO);「完成」前至少 1 个附件 |
工单完成:该工单下所有任务 ywc → 工单 ywc(可在任务完成 API 内聚合更新)。
/api/web/admin)GET /qc-third-party-companies — 分页列表,keyword、statusGET /qc-third-party-companies/options — 下拉(启用)POST /qc-third-party-companiesPUT /qc-third-party-companies/{id}DELETE /qc-third-party-companies/{id} — 软删;若存在未删第三方项目则拒绝GET /qc-third-party-items — companyId、keyword、statusGET /qc-third-party-items/options — companyId 可选POST / PUT / DELETE — 标准 CRUDGET /qc-lab-test-items — 分页GET /qc-lab-test-items/options — 启用项,供工单配置多选POST / PUT / DELETEGET /qc-work-orders — keyword(工单号/协议号/样本编码)、workOrderStatusGET /qc-work-orders/{id} — 含接收摘要、明细、任务列表POST /qc-work-orders/{id}/configure — §7.2 配置确认(不提供手工新建:仅接收触发。)
GET /qc-tasks — keyword、taskType、taskStatus、workOrderIdGET /qc-tasks/{id}POST /qc-tasks/{id}/start — sysz:dzx→jxzPOST /qc-tasks/{id}/complete — sysz:jxz→ywc;dsfjc:校验附件后 ywcPUT /qc-tasks/{id}/attachments — dsfjc 更新 third_party_attachments路由注册:app/api/qc_*.py 或合并 quality_inspection.py;__init__.py + main.py。
权限:require_menu_code + apply_data_scope(与 sample_reception 一致)。
el-select(options 接口)。dpz)。el-checkbox-group(实验室自检、第三方检测)el-checkbox-group 或表格多选(仅启用项)taskType 筛选;类型列区分标签。| 阶段 | 交付 |
|---|---|
| P1 | SQL + Models + 主数据 3 模块 API/页面 |
| P2 | 接收触发改单 + 工单列表/配置/查看 + 配置生成任务 |
| P3 | 任务列表 + 分类型操作 + 工单完成聚合 |
| P4(二期) | 检测结果、样本状态联动、配置后追加项目、统计报表 |
实施计划文件:docs/superpowers/plans/2026-05-17-quality-inspection-modules.md(待 writing-plans 生成)。
js → 生成 dpz 工单;bj → 无工单。sysz 任务;仅第三方 → 仅 dsfjc 任务;两者都选 → 两类任务总数 = 所选项目数。ywc。| 日期 | 说明 |
|---|---|
| 2026-05-17 | 初稿:用户确认人工选配、接收触发、工单配置、双类型任务 |