You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* MotherShip 登录态官网硬约束(与 dashboard Create shipment 对齐)
*/
export const MOTHERSHIP_MAX_WEIGHT_EACH_LB = 5000;
/** YYYY-MM-DD → 本地 noon 解析,避免 UTC 偏移改星期 */
export function parseIsoDateLocal(iso: string): Date | null {
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(iso.trim());
if (!m) return null;
const d = new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]), 12, 0, 0);
return Number.isNaN(d.getTime()) ? null : d;
}
export function toIsoDateLocal(d: Date): string {
const yyyy = d.getFullYear();
const mm = String(d.getMonth() + 1).padStart(2, "0");
const dd = String(d.getDate()).padStart(2, "0");
return `${yyyy}-${mm}-${dd}`;
}
/** 周六=6 / 周日=0 不可选 */
export function isMothershipWeekendIso(iso: string): boolean {
const d = parseIsoDateLocal(iso);
if (!d) return false;
const day = d.getDay();
return day === 0 || day === 6;
}
/** 若落在周末,拨到下一工作日(周一) */
export function snapMothershipReadyDateToWeekday(iso: string): string {
const d = parseIsoDateLocal(iso);
if (!d) return iso;
const day = d.getDay();
if (day === 6) d.setDate(d.getDate() + 2);
else if (day === 0) d.setDate(d.getDate() + 1);
return toIsoDateLocal(d);
}
/** 今天 YYYY-MM-DD本地 */
export function todayIsoDateLocal(): string {
return toIsoDateLocal(new Date());
}
/** 默认可提货日:今天若为周末则拨到周一 */
export function defaultMothershipReadyDateIso(): string {
return snapMothershipReadyDateToWeekday(todayIsoDateLocal());
}
/** date input min与官网一致不可早于最近工作日 */
export function minMothershipReadyDateIso(): string {
return defaultMothershipReadyDateIso();
}
/** 所有 MotherShip 日期字段统一规范化 */
export function normalizeMothershipReadyDateIso(iso: string | undefined): string | undefined {
const trimmed = iso?.trim();
if (!trimmed) return undefined;
return snapMothershipReadyDateToWeekday(trimmed);
}
/** 单件重量Weight each不得超过 5000 lb */
export function isMothershipWeightEachAllowed(weightEachLb: number): boolean {
return (
Number.isFinite(weightEachLb) &&
weightEachLb > 0 &&
weightEachLb <= MOTHERSHIP_MAX_WEIGHT_EACH_LB
);
}