10 KiB
临床应用缴退费 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(待缴费 / 已缴费),提交缴费确认无表单;「缴退费财务确认」在确认收款/退款时无法完整看到业务侧提交的备注与附件。
目标:
- 缴费信息改为 5 个状态 Tab,每个 Tab 只展示对应状态数据。
- 提交缴费确认、提交退费确认均支持填写备注、上传附件;金额规则见 §3.2。
- 缴退费财务确认在确认收款/确认退款及查看弹窗中,展示业务侧提交的金额、备注、附件。
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、transferAttachmentsbatchSubmitClinicalReceipt(ids, data?)— 同上
8. 不在本次范围
- 修改计划金额
amount的业务流程 - 退费金额与已缴金额的大小校验(除非现网已有,不新增)
- 转账方式
transfer_type、转账时间transfer_time字段(用户未要求) - 菜单结构调整
9. 验收标准
- 缴费信息 5 Tab 切换后,列表仅展示对应
pay_status数据。 dfjTab 单条/批量「缴费确认」弹出表单:金额只读等于计划金额,可填备注与附件,提交后状态变为jfqrz。yjfTab 退费确认仍支持金额/备注/附件(行为与改前一致)。- 缴退费财务确认 · 确认收款弹窗顶部可见业务提交的备注与附件;金额只读等于计划金额。
- 缴退费财务确认 · 确认退费弹窗可见退费附件。
- 两页「查看」弹窗均可看到完整的业务提交信息与财务确认信息(若已确认)。
- 列表「缴费金额」列正常显示(
paymentAmount别名生效)。
10. 实现顺序建议
- 后端:
_row_to_dict别名 +submit_receipt/batch_submit_receipt扩展 - 前端 API 层
- 缴费信息:5 Tab + 缴费确认弹窗 + 查看弹窗
- 新建
ClinicalPaymentSubmitReadonly组件 - 缴退费财务确认:接入只读区 + 退费附件展示
- 字段一致性脚本(如有需要):
python scripts/check_field_consistency.py