187 lines
5.7 KiB
TypeScript
187 lines
5.7 KiB
TypeScript
import { formatDisplayOrDash } from '@/utils/datetime-display'
|
|
|
|
import {
|
|
type PaymentFlowStep,
|
|
type PaymentFlowStepKey,
|
|
type PaymentFlowStepState
|
|
} from '@/utils/clinical-payment-flow-steps'
|
|
import { transferTypeLabel } from '@/utils/protocol-payment-labels'
|
|
|
|
export type { PaymentFlowStep, PaymentFlowStepKey, PaymentFlowStepState }
|
|
|
|
function dash(v: unknown) {
|
|
return formatDisplayOrDash(v)
|
|
}
|
|
|
|
function formatAmount(v: unknown) {
|
|
if (v == null || v === '') return '—'
|
|
const n = Number(v)
|
|
if (Number.isNaN(n)) return '—'
|
|
return `¥${n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`
|
|
}
|
|
|
|
function resolveAttachmentUrls(
|
|
detail: Record<string, unknown>,
|
|
urlField: string,
|
|
filesField: string
|
|
): string {
|
|
const urls = String(detail[urlField] || '')
|
|
if (urls.trim()) return urls
|
|
const files = detail[filesField]
|
|
if (!Array.isArray(files)) return ''
|
|
return files
|
|
.map((f) => String((f as Record<string, unknown>).fileUrl || '').trim())
|
|
.filter(Boolean)
|
|
.join(',')
|
|
}
|
|
|
|
function hasReceiptSubmit(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
return ['jfqrz', 'yjf', 'tfqrz', 'ytf'].includes(status)
|
|
}
|
|
|
|
function hasFinanceReceipt(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
return ['yjf', 'tfqrz', 'ytf'].includes(status)
|
|
}
|
|
|
|
function hasRefundSubmit(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
return ['tfqrz', 'ytf'].includes(status)
|
|
}
|
|
|
|
function hasFinanceRefund(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
return status === 'ytf'
|
|
}
|
|
|
|
function resolveStepState(
|
|
key: PaymentFlowStepKey,
|
|
detail: Record<string, unknown>,
|
|
activeStepKey?: PaymentFlowStepKey
|
|
): PaymentFlowStepState {
|
|
if (activeStepKey === key) return 'current'
|
|
|
|
const doneMap: Record<PaymentFlowStepKey, boolean> = {
|
|
'receipt-submit': hasReceiptSubmit(detail),
|
|
'finance-receipt': hasFinanceReceipt(detail),
|
|
'refund-submit': hasRefundSubmit(detail),
|
|
'finance-refund': hasFinanceRefund(detail)
|
|
}
|
|
|
|
if (doneMap[key]) return 'done'
|
|
return 'pending'
|
|
}
|
|
|
|
function receiptSubmitTime(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
if (status === 'jfqrz') return dash(detail.updateTime)
|
|
if (hasFinanceReceipt(detail) && detail.transferTime) return dash(detail.transferTime)
|
|
return '—'
|
|
}
|
|
|
|
function financeReceiptTime(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
if (status === 'jfqrz' || status === 'dfj') return '—'
|
|
return dash(detail.financeConfirmTime || detail.updateTime)
|
|
}
|
|
|
|
function refundSubmitTime(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
if (!['tfqrz', 'ytf'].includes(status)) return '—'
|
|
if (status === 'tfqrz') return dash(detail.updateTime)
|
|
return dash(detail.refundApplyTime || detail.updateTime)
|
|
}
|
|
|
|
function refundFinanceTime(detail: Record<string, unknown>) {
|
|
const status = String(detail.payStatus || '')
|
|
if (status !== 'ytf') return '—'
|
|
return dash(detail.refundFinanceConfirmTime || detail.updateTime)
|
|
}
|
|
|
|
export function buildProtocolPaymentFlowSteps(
|
|
detail: Record<string, unknown> | null | undefined,
|
|
activeStepKey?: PaymentFlowStepKey
|
|
): PaymentFlowStep[] {
|
|
const d = detail || {}
|
|
const transferUrls = resolveAttachmentUrls(d, 'transferAttachments', 'attachments')
|
|
const financeUrls = resolveAttachmentUrls(
|
|
d,
|
|
'financeConfirmAttachments',
|
|
'financeConfirmAttachmentFiles'
|
|
)
|
|
const refundUrls = resolveAttachmentUrls(d, 'refundAttachments', 'refundAttachmentFiles')
|
|
const refundFinanceUrls = resolveAttachmentUrls(
|
|
d,
|
|
'refundFinanceConfirmAttachments',
|
|
'refundFinanceConfirmAttachmentFiles'
|
|
)
|
|
|
|
return [
|
|
{
|
|
key: 'receipt-submit',
|
|
title: '缴费确认信息',
|
|
state: resolveStepState('receipt-submit', d, activeStepKey),
|
|
time: receiptSubmitTime(d),
|
|
fields: [
|
|
{ label: '转账方式', value: transferTypeLabel(String(d.transferType || '')) || '—' },
|
|
{ label: '实缴金额(元)', value: formatAmount(d.transferAmount) },
|
|
{ label: '转账时间', value: dash(d.transferTime) },
|
|
{ label: '备注', value: dash(d.remark), multiline: true },
|
|
{
|
|
label: '转账凭证',
|
|
value: '',
|
|
slot: 'attachments',
|
|
attachmentUrls: transferUrls
|
|
}
|
|
]
|
|
},
|
|
{
|
|
key: 'finance-receipt',
|
|
title: '缴费财务确认信息',
|
|
state: resolveStepState('finance-receipt', d, activeStepKey),
|
|
time: financeReceiptTime(d),
|
|
fields: [
|
|
{ label: '财务备注', value: dash(d.financeRemark), multiline: true },
|
|
{
|
|
label: '财务确认附件',
|
|
value: '',
|
|
slot: 'attachments',
|
|
attachmentUrls: financeUrls
|
|
}
|
|
]
|
|
},
|
|
{
|
|
key: 'refund-submit',
|
|
title: '退费确认信息',
|
|
state: resolveStepState('refund-submit', d, activeStepKey),
|
|
time: refundSubmitTime(d),
|
|
fields: [
|
|
{ label: '退费金额(元)', value: formatAmount(d.refundAmount) },
|
|
{ label: '退费备注', value: dash(d.refundRemark), multiline: true },
|
|
{
|
|
label: '退费附件',
|
|
value: '',
|
|
slot: 'attachments',
|
|
attachmentUrls: refundUrls
|
|
}
|
|
]
|
|
},
|
|
{
|
|
key: 'finance-refund',
|
|
title: '退费财务确认信息',
|
|
state: resolveStepState('finance-refund', d, activeStepKey),
|
|
time: refundFinanceTime(d),
|
|
fields: [
|
|
{ label: '财务备注', value: dash(d.refundFinanceRemark), multiline: true },
|
|
{
|
|
label: '财务确认附件',
|
|
value: '',
|
|
slot: 'attachments',
|
|
attachmentUrls: refundFinanceUrls
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|