/** * 自动结算倒计时展示(只信服务端字段,不自行用配置小时推算) * 有 auto_settle_eligible + auto_expire_at 才展示。 */ export function formatRemainText(remainSeconds) { const s = Math.max(0, Number(remainSeconds) || 0); const h = Math.floor(s / 3600); const m = Math.floor((s % 3600) / 60); if (h >= 24) { const d = Math.floor(h / 24); const rh = h % 24; return `${d}天${rh}小时`; } if (h > 0) return `${h}小时${m}分`; if (m > 0) return `${m}分钟`; return s > 0 ? `${s}秒` : '即将结算'; } /** * 把接口字段整理成前端展示用;不可展示时返回 null。 */ export function buildAutoSettleDisplay(item, nowMs) { if (!item || !item.auto_settle_eligible) return null; if (!item.auto_expire_at) return null; if (Number(item.zhuangtai) !== 8) return null; let remain = item.auto_settle_remain_seconds; if (remain == null || remain === '') { const t = Date.parse(String(item.auto_expire_at).replace(/-/g, '/')); if (!Number.isFinite(t)) return null; remain = Math.floor((t - (nowMs || Date.now())) / 1000); } else { remain = Number(remain); } if (!Number.isFinite(remain)) return null; return { eligible: true, expireAt: item.auto_expire_at, remainSeconds: Math.max(0, remain), remainText: formatRemainText(remain), tip: remain <= 0 ? '即将自动结算' : `预计自动结算 ${formatRemainText(remain)}`, }; } export function attachAutoSettleFields(item) { const disp = buildAutoSettleDisplay(item); if (!disp) { return { ...item, autoSettleTip: '', autoSettleExpireAt: '' }; } return { ...item, autoSettleTip: disp.tip, autoSettleExpireAt: disp.expireAt, autoSettleRemainText: disp.remainText, }; }