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

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,
};
}