From 135dd550b606fd5dbff88f46586ada2ade475878 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Sun, 17 May 2026 12:36:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/utils/protocol-payment-labels.ts | 31 +++++++++++++++++++ .../views/cell-storage/payment-info/index.vue | 17 ++++++++++ 2 files changed, 48 insertions(+) diff --git a/web-admin/src/utils/protocol-payment-labels.ts b/web-admin/src/utils/protocol-payment-labels.ts index 35795aa49..4528fa330 100644 --- a/web-admin/src/utils/protocol-payment-labels.ts +++ b/web-admin/src/utils/protocol-payment-labels.ts @@ -43,6 +43,37 @@ export function formatPaymentDueDate(d: unknown) { return s } +/** 分期应缴预警天数(与分期预警规则一致:应缴日在当天起未来 N 天内,含逾期) */ +export const PAYMENT_DUE_WARN_DAYS = 15 + +function parsePaymentDueYmd(ymd: unknown): Date | null { + const raw = String(ymd || '').replace(/\D/g, '') + if (raw.length !== 8) return null + const y = Number(raw.slice(0, 4)) + const m = Number(raw.slice(4, 6)) - 1 + const d = Number(raw.slice(6, 8)) + const dt = new Date(y, m, d) + if (dt.getFullYear() !== y || dt.getMonth() !== m || dt.getDate() !== d) return null + return dt +} + +function startOfLocalDay(d: Date) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()) +} + +/** 应缴日是否不晚于「今天 + warnDays」(含当天与已逾期) */ +export function isPaymentDueWithinWarnWindow( + installmentDueDate: unknown, + warnDays = PAYMENT_DUE_WARN_DAYS +) { + const due = parsePaymentDueYmd(installmentDueDate) + if (!due) return false + const today = startOfLocalDay(new Date()) + const limit = new Date(today) + limit.setDate(limit.getDate() + warnDays) + return due.getTime() <= limit.getTime() +} + export function formatPaymentAmount(v: unknown) { if (v == null || v === '') return '-' const n = Number(v) diff --git a/web-admin/src/views/cell-storage/payment-info/index.vue b/web-admin/src/views/cell-storage/payment-info/index.vue index 2e54879e7..c641907c6 100644 --- a/web-admin/src/views/cell-storage/payment-info/index.vue +++ b/web-admin/src/views/cell-storage/payment-info/index.vue @@ -89,6 +89,7 @@ v-loading="loading" stripe row-key="id" + :row-class-name="paymentRowClassName" @selection-change="handleSelectionChange" > }) { + if (activeTab.value !== 'dfj') return '' + if (String(row.payStatus || '') !== 'dfj') return '' + return isPaymentDueWithinWarnWindow(row.installmentDueDate) ? 'row-due-soon' : '' + } + function formatAmount(v: unknown) { if (v == null || v === '') return '-' const n = Number(v) @@ -885,4 +893,13 @@ color: #ef4444; } } + + .list-table :deep(tr.row-due-soon > td.el-table__cell) { + background-color: #fca5a5 !important; + color: #7f1d1d; + } + + .list-table :deep(tr.row-due-soon:hover > td.el-table__cell) { + background-color: #f87171 !important; + }