Files
zkxw/docs/superpowers/specs/2026-05-28-clinical-payment-tabs-design.md
T
2026-05-28 13:05:46 +08:00

10 KiB
Raw Blame History

临床应用缴退费 Tab 与提交信息展示 — 设计说明

日期:2026-05-28
状态:已实现
关联页面:

  • web-admin/src/views/pilot-service/clinical-payment-info/index.vue(缴费信息)
  • web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue(缴退费财务确认)
  • web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue

参考实现:

  • 5 Tab 结构:web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue
  • 财务确认只读区:web-admin/src/components/business/protocol-payment-detail-readonly/index.vue
  • 细胞存储财务确认弹窗:web-admin/src/views/cell-storage/payment-confirm/index.vue

1. 背景与目标

临床应用菜单下「缴费信息」当前仅 2 个 Tab(待缴费 / 已缴费),提交缴费确认无表单;「缴退费财务确认」在确认收款/退款时无法完整看到业务侧提交的备注与附件。

目标:

  1. 缴费信息改为 5 个状态 Tab,每个 Tab 只展示对应状态数据。
  2. 提交缴费确认、提交退费确认均支持填写备注、上传附件;金额规则见 §3.2。
  3. 缴退费财务确认在确认收款/确认退款及查看弹窗中,展示业务侧提交的金额、备注、附件。

2. 状态流转(不变)

状态码 含义 触发动作
dfj 待缴费 输注计划创建时自动生成
jfqrz 缴费确认中 缴费信息 · 提交缴费确认
yjf 已缴费 缴退费财务确认 · 确认收款
tfqrz 退费确认中 缴费信息 · 提交退费确认
ytf 已退费 缴退费财务确认 · 确认退费

3. 业务规则

3.1 金额语义(已确认)

提交缴费确认时的金额:必须等于计划金额,仅确认不可改。

  • 计划金额来源:输注计划创建缴费记录时写入的 biz_pilot_payment.amount。
  • 弹窗中 只读展示计划金额,不提供输入控件。
  • 提交时后端 校验(若传入 transferAmount 则须与 amount 相等;推荐前端不传、后端自动 transfer_amount = amount)。
  • 不允许通过提交缴费确认修改 amount 字段。

提交退费确认时的金额(已有逻辑,保持不变):

  • 用户 必填 refund_amount,默认带出计划/实缴金额供参考,允许填写(≤ 已缴金额的业务校验若后续需要可单独补充,本次不扩大范围)。

3.2 提交缴费确认 — 表单字段

展示标签 可编辑 存储字段 说明
缴费金额(元) 否(只读) amount 展示计划金额
备注 是 remark 选填
附件 是 transfer_attachments 选填,逗号分隔 MinIO URL

提交成功后:pay_status dfj → jfqrz;写入 transfer_amount = amount、remark、transfer_attachments、update_by/time。

3.3 提交退费确认 — 表单字段(已有,微调联动)

展示标签 可编辑 存储字段
退费金额(元) 是(必填) refund_amount
退费备注 是 refund_remark
退费附件 是 refund_attachments

3.4 批量操作

  • 批量缴费确认:打开同一弹窗;金额按 每条记录各自的计划金额 只读(弹窗文案说明「共 N 条,每条按各自计划金额提交」),共用一组备注与附件。
  • 批量退费确认:保持现有逻辑,共用退费金额/备注/附件(与现实现一致)。

4. 缴费信息页(5 Tab)

4.1 Tab 定义

对齐 PaymentInfoTab.vue,使用 el-tabs + work-order-type-tabs:

Tab name 标签 payStatus 参数
dfj 待缴费 dfj
jfqrz 缴费确认中 jfqrz
yjf 已缴费 yjf
tfqrz 退费确认中 tfqrz
ytf 已退费 ytf

4.2 筛选区

  • 保留「关键词」(申请单号)。
  • 移除「缴费状态」下拉(与 Tab 职责重复,避免冲突)。

4.3 工具栏与操作列

Tab 勾选列 工具栏 操作列
dfj 有 批量缴费确认 查看 + 缴费确认
jfqrz 无 — 查看
yjf 有 批量退费确认 查看 + 退费确认
tfqrz 无 — 查看
ytf 无 — 查看

4.4 新增弹窗

缴费确认弹窗(替代现有 ElMessageBox.confirm):

  • 只读:申请单号、患者姓名、计划缴费金额(元)。
  • 可编辑:备注(textarea)、附件(卡片上传,folder=clinical-payment-receipt)。
  • 批量时展示选中条数 + 说明文案。

退费确认弹窗:保持现有实现,仅适配 5 Tab 与查看能力。

查看弹窗(全 Tab 可用):

  • 基础信息:申请单号、患者、渠道、细胞类型/规格、输注时间、缴费状态。
  • 按状态展示已提交信息:
    • 曾提交缴费:amount(计划/实缴一致)、remark、transfer_attachments
    • 曾提交退费:refund_amount、refund_remark、refund_attachments
    • 已财务确认:追加 finance_* / refund_finance_* 字段

4.5 列表列(建议)

  • 公共列不变。
  • jfqrz / yjf / ytf:可增加「实缴金额」列(读 amount 或 transfer_amount,二者提交后一致)。
  • tfqrz / ytf:可增加「退费金额」列(refund_amount)。

5. 缴退费财务确认页

5.1 确认收款(jfqrz)

弹窗结构(参照细胞存储 payment-confirm/index.vue):

┌─ 缴费申请信息(只读) ─────────────────────┐
│ 申请单号、患者、渠道、细胞规格、输注时间      │
│ 缴费金额(元):amount(只读)                 │
│ 备注:remark                                 │
│ 附件:transfer_attachments                   │
└────────────────────────────────────────────┘
        ─── 分隔线 ───
┌─ 财务确认(可编辑) ───────────────────────┐
│ 财务确认收款备注、财务确认附件               │
└────────────────────────────────────────────┘

查看确认信息弹窗:上述两段均只读(含财务确认字段)。

5.2 确认退费(tfqrz)

在现有「退费申请信息」区块补全:

  • 退费金额、退费备注(已有)
  • 退费附件(refund_attachments,只读卡片列表,当前缺失)

查看弹窗同步补全退费附件;财务确认段保持不变。

5.3 组件策略

新建 ClinicalPaymentSubmitReadonly.vue(或等价命名):

  • Props:detail(缴费记录 dict)、mode: 'receipt' | 'refund' | 'full'
  • 复用 ProtocolAttachmentReadonly 展示附件
  • 缴费侧金额 只读展示 amount,不展示可编辑控件

6. 后端 API 变更

文件:backend/app/api/clinical_payment.py、backend/app/crud/clinical_payment.py

6.1 扩展提交缴费确认

POST /clinical-payments/{payment_id}/submit-receipt

Request body(新增,均可选除校验外):

{
  "remark": "备注",
  "transferAttachments": "url1,url2"
}
  • 不接受与计划金额不一致的 transferAmount;若传入则须 == amount,否则 400。
  • 未传 transferAmount 时 CRUD 自动 transfer_amount = amount。

POST /clinical-payments/submit-receipt-batch

Body 增加同上 remark、transferAttachments,批量共用。

6.2 _row_to_dict 字段补齐

在 _row_to_dict / _enrich_payment 中补充前端已用别名,避免列表空白:

别名 来源
paymentAmount amount
cellTypeSpec cellType + specText 拼接(/ 或 ·,与列表现有展示习惯一致)

已有字段保持:amount、transferAmount、transferAttachments、remark、refundAmount、refundRemark、refundAttachments、financeRemark、financeConfirmAttachments、refundFinanceRemark、refundFinanceConfirmAttachments。

6.3 数据库

无需 schema 变更。复用现有列:

  • 缴费提交:amount(只读源)、transfer_amount(提交时设为等于 amount)、remark、transfer_attachments
  • 退费提交:refund_amount、refund_remark、refund_attachments

7. 前端 API 变更

文件:web-admin/src/api/business.ts

  • submitClinicalReceipt(id, data?) — POST body 传 remark、transferAttachments
  • batchSubmitClinicalReceipt(ids, data?) — 同上

8. 不在本次范围

  • 修改计划金额 amount 的业务流程
  • 退费金额与已缴金额的大小校验(除非现网已有,不新增)
  • 转账方式 transfer_type、转账时间 transfer_time 字段(用户未要求)
  • 菜单结构调整

9. 验收标准

  1. 缴费信息 5 Tab 切换后,列表仅展示对应 pay_status 数据。
  2. dfj Tab 单条/批量「缴费确认」弹出表单:金额只读等于计划金额,可填备注与附件,提交后状态变为 jfqrz。
  3. yjf Tab 退费确认仍支持金额/备注/附件(行为与改前一致)。
  4. 缴退费财务确认 · 确认收款弹窗顶部可见业务提交的备注与附件;金额只读等于计划金额。
  5. 缴退费财务确认 · 确认退费弹窗可见退费附件。
  6. 两页「查看」弹窗均可看到完整的业务提交信息与财务确认信息(若已确认)。
  7. 列表「缴费金额」列正常显示(paymentAmount 别名生效)。

10. 实现顺序建议

  1. 后端:_row_to_dict 别名 + submit_receipt / batch_submit_receipt 扩展
  2. 前端 API 层
  3. 缴费信息:5 Tab + 缴费确认弹窗 + 查看弹窗
  4. 新建 ClinicalPaymentSubmitReadonly 组件
  5. 缴退费财务确认:接入只读区 + 退费附件展示
  6. 字段一致性脚本(如有需要):python scripts/check_field_consistency.py