Files
Wechat/utils/auto-settle-display.js

59 lines
1.7 KiB
JavaScript

/**
* 自动结算倒计时展示(只信服务端字段,不自行用配置小时推算)
* 有 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,
};
}