|
|
/**
|
|
|
* Flock Freight 官网硬限(PRD §14.3,2026-07-13 实测)
|
|
|
* 禁止与 MOTHERSHIP / CARGO_LIMITS 混用
|
|
|
*
|
|
|
* 字段上限之外另有拖车线性英尺约束:
|
|
|
* 「Linear feet of shipment is larger than trailer」→ 53' (636 in)
|
|
|
*/
|
|
|
export const FLOCK_LIMITS = {
|
|
|
palletCount: { min: 4, max: 20 },
|
|
|
totalWeightLbMax: 45_000,
|
|
|
dimIn: { lengthMax: 636, widthMax: 102, heightMax: 108, min: 1 },
|
|
|
/** 53' 拖车可用线性英尺(官网实测) */
|
|
|
trailerLinearFeetMax: 53,
|
|
|
/** 调度高级选项(非 FCFS)须整票总重 > 此值才可选用,对齐官网灰色按钮 */
|
|
|
schedulingWeightMinLb: 5000,
|
|
|
zipPattern: /^\d{5}(-\d{4})?$/,
|
|
|
defaultDimsIn: { length: 48, width: 40, height: 48 },
|
|
|
} as const;
|
|
|
|
|
|
export const FLOCK_VALIDATION_MESSAGES = {
|
|
|
palletCount: "托盘件数只能输入 4 到 20",
|
|
|
totalWeight: "整票总重不能超过 45000 lb",
|
|
|
length: "单托长度不能超过 636 in",
|
|
|
width: "单托宽度不能超过 102 in",
|
|
|
height: "单托高度不能超过 108 in",
|
|
|
linearFeet:
|
|
|
"整票占用车长超过可用挂车长度,请下调件数或尺寸。",
|
|
|
pickupZip: "需要提供提货邮编",
|
|
|
deliveryZip: "需要提供派送邮编",
|
|
|
pickupDate: "请选择提货日期",
|
|
|
pickupDateTooEarly: "提货日期不能早于今天",
|
|
|
pickupDateWeekend: "提货日期不能为周六或周日",
|
|
|
zipFormat: "邮编须为 5 位数字(可选 +4)",
|
|
|
} as const;
|
|
|
|
|
|
/**
|
|
|
* 估算占用线性英尺:拖车宽约 102in,托盘宽 ≤51 可双排,否则单排。
|
|
|
* rows × (lengthIn/12) ≤ 53
|
|
|
*/
|
|
|
export function estimateFlockLinearFeet(
|
|
|
palletCount: number,
|
|
|
lengthIn: number,
|
|
|
widthIn: number,
|
|
|
): number {
|
|
|
const across = widthIn <= 51 ? 2 : 1;
|
|
|
const rows = Math.ceil(Math.max(1, palletCount) / across);
|
|
|
return (rows * Math.max(1, lengthIn)) / 12;
|
|
|
}
|
|
|
|
|
|
export function fitsFlockTrailerCargo(input: {
|
|
|
palletCount: number;
|
|
|
lengthIn: number;
|
|
|
widthIn: number;
|
|
|
}): boolean {
|
|
|
return (
|
|
|
estimateFlockLinearFeet(
|
|
|
input.palletCount,
|
|
|
input.lengthIn,
|
|
|
input.widthIn,
|
|
|
) <= FLOCK_LIMITS.trailerLinearFeetMax + 1e-6
|
|
|
);
|
|
|
}
|