export type ForecastStatusCode = '1' | '2' | '3' | '4' | '5' | '6' export type ForecastStatusOption = { label: string className: string } export const businessTypeMap: Record = { '1': '对公/个人客户收付', '2': '本票签发/兑付', '3': '三省一市汇票签发/兑付', '4': '分行资金调拨', '5': '同业业务', '6': '资金业务', '7': '理财业务', '8': '债券承销业务', '9': '司库业务', '10': '现金出入库', '11': '财政准备金退缴', '12': '同业清算款项收付', '13': '财政零余额业务', '14': '银行承兑汇票', '15': '托管业务', '16': '票据业务', } export const clientTypeMap: Record = { '1': '对公客户', '2': '个人客户', } export const payDirectionMap: Record = { '1': '收入', '2': '支出', } export const payChannelMap: Record = { '1': '大额支付', '2': '小额支付', '3': '票据交换', '4': '同城支付', '7': '网联支付', } export const verifyStatusMap: Record = { '1': '未核销', '2': '已核销', '3': '部分核销', } export const forecastStatusMap: Record = { '1': { label: '正常预报', className: 'status-tag-normal' }, '2': { label: '延迟预报', className: 'status-tag-delayed' }, '3': { label: '正常预报正常删除', className: 'status-tag-normal-delete' }, '4': { label: '正常预报延迟删除', className: 'status-tag-normal-delay-delete' }, '5': { label: '延迟预报延时删除', className: 'status-tag-delayed-late-delete' }, '6': { label: '延时预报延迟删除', className: 'status-tag-late-delay-delete' }, } export const unknownForecastStatus: ForecastStatusOption = { label: '未知状态', className: 'status-tag-unknown', } export function resolveBusinessType(value?: string) { return value ? businessTypeMap[value] || `业务类型${value}` : '业务类型-' } export function resolveClientType(value?: string) { return value ? clientTypeMap[value] || '-' : '-' } export function resolvePayDirection(value?: string) { return resolveEnumText(payDirectionMap, value) } export function resolvePayChannel(value?: string) { return resolveEnumText(payChannelMap, value) } export function resolveVerifyStatus(value?: string) { return resolveEnumText(verifyStatusMap, value) } export function resolveForecastStatus(value?: string): ForecastStatusOption { if (value && value in forecastStatusMap) { return forecastStatusMap[value as ForecastStatusCode] } return unknownForecastStatus } export function formatRmbForecastDate(value?: string) { if (value && /^\d{8}$/.test(value)) { return `${value.slice(0, 4)}-${value.slice(4, 6)}-${value.slice(6, 8)}` } return value || '-' } export function toBillionYuan(value?: string) { const amount = Number(value?.replaceAll(',', '') || 0) return Number.isFinite(amount) ? amount / 100000000 : 0 } export function formatForecastAmount(value: number) { const sign = value >= 0 ? '+' : '-' return `${sign}${Math.abs(value).toFixed(2)}` } export function formatForecastAmountText(value?: string) { if (!value?.trim()) return '-' return `${formatForecastAmount(toBillionYuan(value))} 亿元` } export function formatForecastAmountYuanText(value?: string, fixedFractionDigits?: number) { const text = value?.trim() if (!text) return '-' const normalizedText = text.replaceAll(',', '') if (!/^[-+]?\d+(\.\d+)?$/.test(normalizedText)) { return `${text} 元` } const sign = normalizedText.startsWith('-') || normalizedText.startsWith('+') ? normalizedText.slice(0, 1) : '' const unsignedText = sign ? normalizedText.slice(1) : normalizedText if (fixedFractionDigits !== undefined) { const amount = Number(unsignedText) if (!Number.isFinite(amount)) return `${text} 元` return `${sign}${amount.toLocaleString('zh-CN', { minimumFractionDigits: fixedFractionDigits, maximumFractionDigits: fixedFractionDigits, })} 元` } const [integerPart = '0', decimalPart] = unsignedText.split('.') const normalizedInteger = integerPart.replace(/^0+(?=\d)/, '') || '0' const groupedInteger = normalizedInteger.replace(/\B(?=(\d{3})+(?!\d))/g, ',') const amountText = decimalPart === undefined ? groupedInteger : `${groupedInteger}.${decimalPart}` return `${sign}${amountText} 元` } function resolveEnumText(options: Record, value?: string) { const code = value?.trim() return code ? options[code] || code : '-' }