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.
101 lines
3.1 KiB
101 lines
3.1 KiB
import { flockPickupIsoFromDisplay } from "@/lib/flock/pickup-date";
|
|
import type { FlockQuoteInput } from "@/workers/rpa/flock/types";
|
|
|
|
/** POST /user/quotes 请求体(抓包契约) */
|
|
export type FlockQuotesApiRequest = {
|
|
shipment: {
|
|
pickupDate: string;
|
|
originPostalCode: string;
|
|
originLocationType: "BUSINESS_DOCK";
|
|
originLiftgateRequired: boolean;
|
|
insidePickupRequired: boolean;
|
|
destinationPostalCode: string;
|
|
destinationLocationType: "BUSINESS_DOCK";
|
|
destinationLiftgateRequired: boolean;
|
|
insideDeliveryRequired: boolean;
|
|
items: Array<{
|
|
packagingType: "PALLET_OTHER";
|
|
hazardous: boolean;
|
|
stackable: boolean;
|
|
turnable: boolean;
|
|
contentsDescription: string;
|
|
freightClass: "CLASS_60";
|
|
quantity: number;
|
|
weightLbs: number;
|
|
lengthIn: number;
|
|
widthIn: number;
|
|
heightIn: number;
|
|
}>;
|
|
deliveryTimeConstraint: "NONE";
|
|
unloadingServicesRequired: boolean;
|
|
blind: boolean;
|
|
loadToRideRequested: boolean;
|
|
dryVanAllowed: boolean;
|
|
reeferAllowed: boolean;
|
|
straightTruckAllowed: boolean;
|
|
sprinterVanAllowed: boolean;
|
|
partOfMultiShipmentMultiStopRoute: boolean;
|
|
automatedTrackingRequired: boolean;
|
|
};
|
|
isEdiRequote: boolean;
|
|
sameDayPricingOverrideRequested: boolean;
|
|
additionalServiceRequest: null;
|
|
};
|
|
|
|
function toApiPickupDate(displayOrIso: string): string {
|
|
const trimmed = displayOrIso.trim();
|
|
if (/^\d{4}-\d{2}-\d{2}$/.test(trimmed)) return trimmed;
|
|
const iso = flockPickupIsoFromDisplay(trimmed);
|
|
if (!iso) {
|
|
throw new Error(`取货日期格式无效: ${displayOrIso}`);
|
|
}
|
|
return iso;
|
|
}
|
|
|
|
/** 由标准化 Flock 入参构造直连接口 payload */
|
|
export function buildFlockQuotesApiRequest(
|
|
input: FlockQuoteInput,
|
|
): FlockQuotesApiRequest {
|
|
return {
|
|
shipment: {
|
|
pickupDate: toApiPickupDate(input.pickupDate),
|
|
originPostalCode: input.pickupZip.slice(0, 5),
|
|
originLocationType: "BUSINESS_DOCK",
|
|
originLiftgateRequired: false,
|
|
insidePickupRequired: false,
|
|
destinationPostalCode: input.deliveryZip.slice(0, 5),
|
|
destinationLocationType: "BUSINESS_DOCK",
|
|
destinationLiftgateRequired: false,
|
|
insideDeliveryRequired: false,
|
|
items: [
|
|
{
|
|
packagingType: "PALLET_OTHER",
|
|
hazardous: false,
|
|
stackable: false,
|
|
turnable: false,
|
|
contentsDescription: "Unknown",
|
|
freightClass: "CLASS_60",
|
|
quantity: input.palletCount,
|
|
weightLbs: input.totalWeightLb,
|
|
lengthIn: input.lengthIn,
|
|
widthIn: input.widthIn,
|
|
heightIn: input.heightIn,
|
|
},
|
|
],
|
|
deliveryTimeConstraint: "NONE",
|
|
unloadingServicesRequired: false,
|
|
blind: false,
|
|
loadToRideRequested: false,
|
|
dryVanAllowed: true,
|
|
reeferAllowed: true,
|
|
straightTruckAllowed: true,
|
|
sprinterVanAllowed: false,
|
|
partOfMultiShipmentMultiStopRoute: false,
|
|
automatedTrackingRequired: false,
|
|
},
|
|
isEdiRequote: false,
|
|
sameDayPricingOverrideRequested: false,
|
|
additionalServiceRequest: null,
|
|
};
|
|
}
|