59 lines
1.7 KiB
JavaScript
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,
|
|
};
|
|
}
|