日期:2026-06-14
状态:已实现
用户确认:卡片字段采用 方案 B(主字段 + 展开)
关联页面:
web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vueweb-admin/src/views/cell-storage/protocol-audit/index.vue参考实现:
web-admin/src/views/pilot-service/cell-product-type/index.vue + cell-product-kanban.scssweb-admin/src/views/cell-storage/protocol-audit/ProtocolAuditTab.vue(勾选、双击查看、KV 网格)web-admin/demo-payment-confirm-layouts.html 方案 BPaymentInfoTab.vue(筛选、批量、单条确认、退费弹窗)UI 模式:P08 变体(状态分视图)→ 五列看板 + 卡片;实现后建议在 docs/web-admin-ui-pattern-index.md P08 节补充看板子模式说明。
「采集协议单管理 → 缴费信息」当前为 5 个 Pill Tab + 表格列表,每次仅展示单一缴费状态的数据。财务/业务人员需在 Tab 间切换才能对比各阶段进度。
目标:
| 列 key | 列标题 | payStatus | 列内可操作 |
|---|---|---|---|
dfj |
待缴费 | dfj |
勾选、批量/单条「缴费确认」、查看 |
jfqrz |
缴费确认中 | jfqrz |
查看 |
yjf |
已缴费 | yjf |
勾选、批量/单条「退费确认」、查看 |
tfqrz |
退费确认中 | tfqrz |
查看 |
ytf |
已退费 | ytf |
查看 |
状态流转与现实现一致,不在本次改动范围。
page-container / panel(父页已有)
└─ PaymentInfoTab
├─ filter-block(全局筛选,保留现有 3 项 + 防抖搜索)
├─ list-toolbar(全局批量区,保留待缴费/已缴费批量按钮)
└─ kanban-board(5 列 grid)
└─ kanban-col × 5
├─ kanban-col-hd(列名 + 数量 badge)
├─ kanban-list(卡片区,列内纵向滚动)
│ └─ payment-card × N
└─ kanban-col-footer(列内 mini 分页)
| 视口宽度 | 布局 |
|---|---|
| ≥ 1400px | grid-template-columns: repeat(5, 1fr),五列同屏 |
| 1024–1399px | 五列保留,容器 overflow-x: auto,最小列宽约 260px |
| < 1024px | 单列纵向堆叠五列(每列仍独立标题 + 卡片 + 分页) |
列容器样式对齐细胞产品看板:border-radius: 10px、列内 max-height: calc(100vh - 320px)、.kanban-list 独立滚动。
el-tabs(panel-pill-tabs)删除;状态由列标题表达。el-table 及表格专属样式(如 row-due-soon 行级样式)替换为卡片级样式。| 标签 | 字段 | 展示规则 |
|---|---|---|
| 客户姓名 | motherName |
卡片头部主标题 |
| 协议状态 | protocolStatus |
el-tag,头部右侧 |
| 缴费方式 | payMode |
文本 + 期数合并为一行,如「分期 · 第 2 期」 |
| 应缴费时间 | installmentDueDate |
YYYY-MM-DD |
| 应缴金额(元) | dueAmount |
formatAmount,加粗 |
| 实缴金额(元) | transferAmount |
无值显示 — |
| 转账方式 | transferType |
枚举 label |
不展示:卡片内 不重复 展示 payStatus Tag(列标题已表达当前状态)。
点击卡片底部「展开详情 / 收起」切换,展示:
| 标签 | 字段 | 展示规则 |
|---|---|---|
| 序号 | 列内分页序号 | 展开区首行 |
| 身份证号 | motherIdCard |
maskIdCard |
| 新生儿姓名 | newbornName |
|
| 新生儿身份证号 | newbornIdCard |
maskIdCard |
| 转账时间 | transferTime |
|
| 创建时间 | createTime |
展开状态 按卡片 id 独立记忆(Set<string> 或 Record<id, boolean>),刷新数据后若 id 仍存在则保持展开。
┌─────────────────────────────┐
│ ☐ 张三 [生效中]│ ← 勾选(仅 dfj/yjf 列) + 姓名 + 协议状态 Tag
├─────────────────────────────┤
│ 缴费方式 分期 · 第 2 期 │
│ 应缴费时间 2026-03-15 │
│ 应缴金额 ¥5,000.00 │
│ 实缴金额 ¥5,000.00 │
│ 转账方式 微信转账 │
├─ 展开详情 ───────────────────│ ← 可折叠
│ 序号 / 身份证 / 新生儿… │
├─────────────────────────────┤
│ [查看] [缴费确认] │ ← 操作区;双击卡片 → 查看
└─────────────────────────────┘
「待缴费」列中,payStatus === 'dfj' 且 isPaymentDueWithinWarnWindow(installmentDueDate) 为 true 的卡片:
3px solid #ef4444 或背景 #fee2e2(与现 row-due-soon 语义一致,改为卡片级 class payment-card--due-soon)。| 能力 | 行为 |
|---|---|
| 筛选 | 关键词、转账方式、应缴费时间;变更后 五列并行刷新,页码重置为 1 |
| 防抖搜索 | 保留 watchDebounced 300ms |
| 批量缴费确认 | 工具栏按钮;仅统计 待缴费列 已勾选卡片 |
| 批量退费确认 | 工具栏按钮;仅统计 已缴费列 已勾选卡片 |
| 单条缴费确认 | 待缴费列卡片操作;确认框文案不变 |
| 单条退费确认 | 已缴费列卡片操作;退费弹窗不变 |
| 查看协议 | 所有列;打开 ProtocolViewDialog |
| 双击 | 卡片双击等同「查看」 |
勾选 不可跨列;每列独立 selectedIds 或全局 selectedRows 带 payStatus 校验。
沿用 fetchPaymentDetailList:
GET /web/admin/protocol-payment-details
?payStatus=dfj|jfqrz|yjf|tfqrz|ytf
&page=&pageSize=
&keyword=&transferType=
&installmentDueDateStart=&installmentDueDateEnd=
不新增后端接口。
每列独立:
interface KanbanColumnState {
key: PayStatusKey
label: string
list: Record<string, unknown>[]
total: number
page: number
pageSize: number // 默认 10
loading: boolean
selectable?: boolean
}
loadAllColumns():Promise.all 五列 loadColumn(key)。loadAllColumns(),各列 page = 1。loadAllColumns()(或仅刷新受影响列,实现时取简单方案:全量刷新)。@current-change / @size-change 仅刷新该列。列标题旁 badge 展示该列 total(来自 API res.total)。
| 文件 | 变更 |
|---|---|
PaymentInfoTab.vue |
主改造:Tab+Table → Kanban+Card |
payment-info-kanban.scss(新建,同目录) |
看板列、卡片、展开区、预警样式;@import 复用 cell-product-kanban.scss 中 .entity-card 基础可选 |
docs/web-admin-ui-pattern-index.md |
P08 节补充看板子模式(实现时一并更新) |
不新建独立 Vue 子组件(除非单文件超 400 行时再抽 PaymentKanbanCard.vue);首版以内联模板 + scoped SCSS 为主,与 ProtocolAuditTab 一致。
--primary #10b981、--primary-bg #ecfdf5;列头背景 --table-head #f8fafc。border-radius: 10px,hover 浅绿边框(对齐 .entity-card)。#fffbeb;已缴费列浅绿 #ecfdf5;其余列中性。btn-op-item;工具栏「已选 N 项」仍在最前。ProtocolViewDialog 不变。| 项 | 估时 |
|---|---|
| 看板布局 + 五列数据层 | 0.5d |
| 卡片主字段 + 展开区 | 0.5d |
| 勾选 / 批量 / 操作迁移 | 0.25d |
| 样式 + 响应式 | 0.25d |
| 自测 | 0.25d |
| 合计 | ~1.5 人日 |
ClinicalPaymentTab.vue)同步改造