日期:2026-06-13
状态:已实现
关联:docs/superpowers/specs/2026-06-12-qc-work-order-fee-summary-design.md(质检工单费用摘要,已实现)
生产部门在处理 生产工单 时需要快速了解关联来源单据的 用户缴费状态,以便安排生产任务前判断客户是否已缴费、是否存在待确认收款等情况。
客户提出:在 web-admin → 生产工单 三个 Tab(入库 / 出库 / 临时)中展示缴费信息,规则与业务来源对齐。
| Tab | 来源 | 系统标识 | 是否展示缴费 |
|---|---|---|---|
| 入库生产工单 | 细胞存储(采集协议) | receptionSource = cell_storage |
是 — 协议缴费 |
| 入库生产工单 | 科研捐赠 | receptionSource = research_donation |
否 — 无用户缴费 |
| 出库生产工单 | 中试服务 | bizType = pilot_service |
否 — 渠道商扣费 |
| 出库生产工单 | 临床应用 | bizType = clinical_application |
是 — 输注计划缴费 |
| 出库生产工单 | 基础实验 | bizType = basic_experiment |
是 — 输注计划缴费 |
| 临时生产工单 | — | workOrderType = temporary |
否 |
| 项 | 现状 |
|---|---|
| 入口 | web-admin/src/views/production/production-work-order/index.vue |
| 列表 | ProductionWorkOrderCardList.vue — 卡片内联 markup,无独立 SingleCard |
| 详情 | SystemViewDialog + viewSections,出库复用 buildOutboundPilotContextSections |
| API 类型 | web-admin/src/api/production-work-order.ts — ProductionWorkOrderItem 无 paymentSummary / feeSummary |
| 费用 UI | 无 |
与质检工单差异:入库 无样本组聚合,每条工单独立一张卡片(费用按工单展示即可,无需组内去重)。
| 项 | 现状 |
|---|---|
| 列表/详情 CRUD | backend/app/crud/production_work_order.py |
| 列表 enrich | 已复用 QC 的 _enrich_work_order_list_items(协议状态、接收时间等) |
| 费用 enrich | 未调用 enrich_work_order_fee_summaries |
工单 dict 已含费用 enrichment 所需字段:collectionProtocolId、receptionId、protocolNo、receptionSource、infusionScheduleId、bizType、workOrderType。
| 层级 | 路径 | 说明 |
|---|---|---|
| 后端服务 | backend/app/services/qc_work_order_fee_summary.py |
build_protocol_payment_summaries、build_basic_experiment_fee_summaries、enrich_work_order_fee_summaries |
| 入库 UI | QcWorkOrderProtocolPaymentPanel.vue |
协议费用;列表 compact 模式(横向 chip 明细) |
| 出库 UI | QcWorkOrderFeeSummaryBar.vue |
单行摘要:售卖 / 应缴 / 实收 / 状态 Tag |
| API 类型 | web-admin/src/api/qc-work-order.ts |
QcProtocolPaymentSummary、QcBasicExperimentFeeSummary |
质检工单设计(2026-06-12)出库 仅 basic_experiment 展示 feeSummary,临床应用本期不做。
客户本次需求明确要求 临床应用也要展示,数据源同为:
biz_pilot_infusion_schedule.amount(售卖/计划金额)biz_pilot_payment(按 infusion_schedule_id 关联,biz_type 区分 clinical / basic_experiment)build_basic_experiment_fee_summary() 逻辑与业务类型无关,扩展 enrich 规则即可复用,无需新表或新计算口径。
做法
enrich_work_order_fee_summariesschedule_ids 收集条件从仅 basic_experiment 扩展为 basic_experiment | clinical_applicationProductionWorkOrderCardList 嵌入已有 QC 费用组件;详情弹窗补充只读区块paymentSummary?、feeSummary?(类型 import 自 qc-work-order 或抽到共享 types)优点:改动小、与质检数据口径一致、上线快
缺点:组件命名仍带 Qc 前缀(可后续抽公共,非阻塞)
做法:生产页单独调协议/缴费 API 按 id 拉取
缺点:N+1 查询、与列表 enrich 模式不一致、重复逻辑 — 不推荐
做法:work_order_fee_summary 服务重命名 + WorkOrderFeeSummaryBar 公共组件 + 生产/质检同时改
优点:命名清晰、长期维护好
缺点:范围大、交付慢 — 适合作为 A 的后续 refactor,不建议首版
推荐:方案 A,临床应用扩展写入 enrich 服务(生产与质检共用同一函数,避免口径分叉)。
接口:GET /web/admin/production-work-orders(list_production_work_orders)
在 _enrich_wo_items / _enrich_outbound_items 之后:
from app.services.qc_work_order_fee_summary import enrich_work_order_fee_summaries
items = enrich_work_order_fee_summaries(db, items, tenant_no)
接口:GET /web/admin/production-work-orders/{id}(_wo_to_response_dict)
对单条 [out_dict] 同样调用 enrich_work_order_fee_summaries,合并 paymentSummary / feeSummary。
文件:backend/app/services/qc_work_order_fee_summary.py
出库 schedule_ids 收集条件由:
(x.get("bizType") or "") == "basic_experiment"
改为:
(x.get("bizType") or "") in ("basic_experiment", "clinical_application")
分配 feeSummary 时同步扩展。函数名 build_basic_experiment_fee_summaries 可保留(实现通用),文档注明适用于出库输注计划缴费。
无需 DDL。只读 join 现有表(与质检工单 §3.3 相同)。
文件:web-admin/src/api/production-work-order.ts
import type {
QcProtocolPaymentSummary,
QcBasicExperimentFeeSummary
} from '@/api/qc-work-order'
export interface ProductionWorkOrderItem {
// ...existing
paymentSummary?: QcProtocolPaymentSummary | null
feeSummary?: QcBasicExperimentFeeSummary | null
}
feeSummary 字段名保持不变(结构与基础实验相同);临床应用复用同一 shape。
文件:ProductionWorkOrderCardList.vue
在 .production-work-order-card__head 内、meta 下方(对齐质检 QcWorkOrderSingleCard):
| 条件 | 组件 | 说明 |
|---|---|---|
activeTypeTab === 'inbound' 且 receptionSource === 'cell_storage' |
QcWorkOrderProtocolPaymentPanel compact |
协议费用 + 横向 chip 明细 |
activeTypeTab === 'outbound' 且 bizType === 'basic_experiment' |
QcWorkOrderFeeSummaryBar variant="basic-experiment" |
单行摘要 |
activeTypeTab === 'outbound' 且 bizType === 'clinical_application' |
QcWorkOrderFeeSummaryBar variant="basic-experiment" |
同上(数据来自 feeSummary) |
| 科研捐赠 / 中试 / 临时 | 不渲染 | — |
样式:复用 .qc-work-order-card__fee-in-head 类名或等效 scoped 规则(负边距撑满卡片宽)。
文件:production-work-order/index.vue
| 场景 | 做法 |
|---|---|
| 入库 cell_storage | viewSections 增加 slot #protocol-payment-details,嵌入 QcWorkOrderProtocolPaymentPanel embedded(完整表格明细) |
| 出库 basic_experiment / clinical_application | 在 buildOutboundPilotContextSections 之后追加「缴费信息」section,字段:售卖、应缴、实收、缴费状态 Tag(与 OutboundQcViewDialog 基础实验段一致) |
只读,无操作按钮。
| 情况 | 展示 |
|---|---|
| 科研捐赠入库 | 不渲染费用区 |
| 中试出库 | 不渲染 |
| 临时工单 | 不渲染 |
| 细胞存储无 payment 主表 | 「暂无缴费信息」 |
| 临床/基础实验无 payment 记录 | 摘要「暂无缴费记录」;仍可展示售卖金额(若有 schedule.amount) |
| # | 问题 | 选项 | 建议 |
|---|---|---|---|
| D1 | 临床应用费用是否 同步 展示在质检工单出库 Tab? | A. 仅生产工单 / B. 生产 + 质检同步 | B — enrich 已共用,不同步会造成两模块口径不一致 |
| D2 | 首版交付范围 | A. 仅列表 / B. 列表 + 查看弹窗 | B — 与质检工单交付一致,生产人员查看详情时也需要 |
| D3 | 组件命名 | A. 直接 import Qc 前缀组件 / B. 本期抽 WorkOrderFee* 公共组件 |
A 首版,B 作后续 refactor |
客户确认(2026-06-13):D1 = B(生产 + 质检同步临床应用缴费展示)。
feeSummary 单行摘要feeSummary(扩展后)| 层级 | 文件 |
|---|---|
| 后端服务 | backend/app/services/qc_work_order_fee_summary.py(扩展 bizType 规则) |
| 后端 CRUD | backend/app/crud/production_work_order.py |
| 前端 API | web-admin/src/api/production-work-order.ts |
| 前端列表 | ProductionWorkOrderCardList.vue |
| 前端详情 | production-work-order/index.vue |
| 可选同步 | QcWorkOrderSingleCard.vue(临床 outbound 展示 feeSummary) |
| 复用 | QcWorkOrderProtocolPaymentPanel.vue、QcWorkOrderFeeSummaryBar.vue |
| 任务 | 复杂度 | 说明 |
|---|---|---|
| 后端 enrich 接线 | 低 | 2 处调用 + 1 处 bizType 条件扩展 |
| 前端类型 + 列表 UI | 低 | 复用 QC 组件,条件判断 ~30 行 |
| 详情弹窗 | 中 | 入库 slot + 出库 section |
| 质检临床同步(若选 D1=B) | 低 | SingleCard 增加 clinical_application 条件 |
| 合计 | 小~中 | 预计 0.5~1 人日 |
| 日期 | 决策 |
|---|---|
| 2026-06-13 | 需求来源:客户希望在生产工单三 Tab 中展示缴费快照 |
| 2026-06-13 | 入库仅细胞存储;出库中试不展示;临床 + 基础实验展示 |
| 2026-06-13 | 推荐方案 A:复用 QC fee enrich + UI 组件,扩展 clinical_application |
| 2026-06-13 | 已确认 D1=B:质检工单出库 Tab 同步展示临床应用 feeSummary |