2026-09-02-qc-all-third-party-one-card-design.md 7.2 KB

第三方质检 · 全公司合并为一卡 — 设计

日期:2026-09-02
状态:已实现
完成日期:2026-09-02
范围:web-admin 质检工单、我的质检任务(批次内任务列表)
前置:docs/superpowers/specs/2026-08-28-qc-third-party-company-card-design.md(按公司分卡,已实现)
关联:docs/superpowers/specs/2026-09-02-qc-company-hide-params-design.md(公司弹窗隐藏检测参数,已实现)
交互 Demo:docs/mockups/qc-all-third-party-one-card-demo.html
方案:A(前端聚合维度从「同公司」改为「批次内全部第三方」;复用现有保存接口)

1. 背景与目标

现状:同批次第三方任务按 companyId 聚合成多张公司卡;每张卡打开弹窗只含该公司项目。

问题:公司多时卡片碎、需多次打开弹窗才能填完本批次第三方结果。

目标:

  • 列表:同批次全部第三方任务(taskType = dsfjc)合成 一张 卡,主标题固定为 「第三方质检项目」。
  • 弹窗:展示该卡全部项目;项目名后标注公司名;按公司分组排序。
  • 实验室自检:不合并,行为不变。
  • 检测参数:公司/总卡弹窗继续隐藏;保存仍回传已加载 results(沿用前置设计)。
  • 备注与检测材料:整弹窗一份,同步到本次弹窗内全部可写第三方任务(跨公司共用)。

2. 已确认决策

决策点 结论
列表主标题 固定文案「第三方质检项目」
聚合维度 同工单、同批次、全部第三方任务(不再按 companyId 分卡)
无 companyId 的第三方 并入总卡;展示名后公司文案为「未归属公司」
弹窗项目排序 先按公司首次出现顺序分组,组内保持原任务顺序;「未归属公司」组放最后
备注 / 检测材料 整弹窗一份,保存同步到本弹窗全部可写任务
质检工单 / 我的质检任务 共用组件;我的任务仍只聚合/保存当前用户负责的第三方任务
后端 不改表、不新增批量 API;继续循环 complete-with-result
本期不做 配置检测 UI 改造;工单系统查看详情里第三方区块重排(可后续对齐)

3. 列表展示

3.1 卡片种类

任务区内:

  1. 自检卡(sysz):现有紧凑卡,一项目一卡。
  2. 第三方总卡(新增 kind: 'all-third',替代原多张 kind: 'company'):0 个第三方任务时不渲染。
  3. 不再渲染 orphan-third 单卡(无公司任务并入总卡)。

排序:全部自检卡(原序)→ 至多一张第三方总卡。

3.2 第三方总卡字段

元素 规则
主标题 第三方质检项目
副文案 第三方 · N 个检测项目 · M 家公司:N = 可见第三方任务数;M = 有非空 companyId 的去重公司数(不含「未归属」)。若 M = 0(仅未归属项),副文案省略「· M 家公司」,仅 第三方 · N 个检测项目
进度 Tag 已完成数/总数;全完成 success,部分 warning,全未完成 info
类型 Tag 第三方检测
负责人 可见任务 assignee 去重拼接
主按钮 有可填权限 →「填写结果」;否则「查看」
点击 / 双击 与主按钮一致,打开总卡弹窗

3.3 我的质检任务

  • 仅当前用户作为负责人的第三方任务进入总卡。
  • 若用户在该批次无任何第三方任务 → 不展示总卡。

4. 弹窗

4.1 结构

  1. 标题:填写检测结果 · 第三方质检项目 / 查看检测结果 · 第三方质检项目
  2. 检测项目块(按 §2 排序后的任务列表)
    • 标题行:{序号}. {项目名} · {公司名};无公司 → · 未归属公司;右侧任务状态 Tag
    • 检测结论:任务状态(待执行 / 已完成)、结论(待结论 / 通过 / 不通过)
    • 不展示检测参数区(加载仍拉 results,保存原样回传有值项)
  3. 备注与检测材料(整弹窗一份)
    • 任一项为「已完成」时检测材料必填

只读模式:控件禁用,底栏仅关闭。

4.2 打开回显

  • 各项目:各自状态、结论、results(内存持有,UI 不展示)。
  • 共享备注 / 材料:在本次弹窗任务集合中,取最近 updateTime 且对应字段非空的值(复用 pickSharedRemarkAndAttachments)。

4.3 保存

对可写集合中每个任务依次调用:

POST /qc-tasks/{id}/complete-with-result

  • 分项:results(已加载有值项)、taskStatus、conclusion
  • 共享:同一份 remark、thirdPartyAttachments
  • 校验:已完成必须结论;任一项已完成则材料必填;不校验参数必填
  • 失败策略:逐任务提交;部分失败提示失败项;不做跨任务事务

保存成功后刷新任务列表 / tasks-changed。

5. 前端改动面

区域 改动
web-admin/src/utils/qc-company-task-group.ts buildTaskListDisplayItems 改为输出自检卡 + 可选一张 all-third;新增公司分组排序辅助(供弹窗用);更新单测
QcWorkOrderTaskSubList.vue 渲染 all-third 卡文案与副标题;打开弹窗传入全部第三方 tasks;标题固定
QcCompanyTaskResultDialog.vue 项目名后展示公司名;tasks 按公司分组排序后展示;companyName prop 可改为固定标题或忽略公司名、仅用「第三方质检项目」
Demo / 文档 已有 docs/mockups/qc-all-third-party-one-card-demo.html 作对照

API:不新增。

6. 与旧设计关系

  • 取代 2026-08-28 设计中「按 companyId 多公司卡」的列表行为。
  • 保留 弹窗多项目填写、共享备注材料、我的任务子集、隐藏参数并回传 results。
  • 旧 kind: 'company' / orphan-third 类型可删除或保留为内部兼容,实现时以 all-third 为准,避免双路径。

7. 风险与缓解

风险 缓解
跨公司共用一份材料,业务上材料本属某公司报告 产品已确认;若后续要拆回按公司,可再改聚合维度
项目多导致弹窗过长 dialog-form-layout 仅 body 滚动;首版不做折叠
部分保存失败 提示失败项,可再次打开补救
历史多公司备注不一致 打开取「最近非空」;保存后统一为本次值

8. 验收场景(摘要)

  1. 同批次 2 自检 + 公司 A 2 项 + 公司 B 1 项 + 1 项无 companyId → 列表 = 2 张自检卡 + 1 张「第三方质检项目」(N=4,M=2)。
  2. 打开弹窗:按公司分组顺序;无公司项在最后,文案含「未归属公司」;无参数区。
  3. 填写共享备注材料并保存 → 弹窗内全部可写第三方任务备注/附件一致。
  4. 我的质检任务:仅自己负责的第三方进入总卡与保存范围。
  5. 任一项「已完成」无材料 → 保存拦截。
  6. 自检卡行为与改造前一致。
  7. 工单「查看详情」中若有历史参数,仍只读展示(本需求不改该路径)。

9. 非目标

  • 后端 DDL / 新聚合表
  • 配置检测勾选 UI
  • 公司卡批量删除
  • 系统查看弹窗第三方区块按公司重排(可选后续)