import { z } from "zod"; /** 地点二级字段(对象本身必填时可为空对象) */ const msLocationDetailsSchema = z .object({ company_name: z.string().max(128).optional(), suite: z.string().max(64).optional(), contact_first: z.string().max(64).optional(), contact_last: z.string().max(64).optional(), contact_email: z.string().max(128).optional(), contact_phone: z.string().max(64).optional(), reference: z.string().max(128).optional(), notes: z.string().max(1000).optional(), opens_at: z.string().max(32).optional(), closes_at: z.string().max(32).optional(), }) .strict(); /** 与 QuoteRequestBody.mothership_details 同构(禁止任意键) */ const msCheckoutMothershipDetailsSchema = z .object({ pickup: msLocationDetailsSchema.default({}), delivery: msLocationDetailsSchema.default({}), request_delivery_appointment: z.boolean().optional(), fba_number: z.string().max(128).optional(), fba_po_number: z.string().max(128).optional(), cargo: z .array( z .object({ piece_count_type: z.string().max(32).optional(), piece_count_qty: z.number().min(0).max(999999).optional(), description: z.string().max(500).optional(), nmfc: z.string().max(64).optional(), hazmat: z.boolean().optional(), alcohol: z.boolean().optional(), tobacco: z.boolean().optional(), }) .strict(), ) .max(20) .optional(), }) .strict() .optional(); export const msCheckoutSchema = z .object({ customer_id: z.string().min(1, "请填写客户标识"), quote_id: z.string().min(1, "请填写报价单号").max(64), preferred_carrier: z .string() .min(1, "请选择承运商") .max(128, "承运商名称过长"), coverage: z.enum(["basic", "freight_protect"], { errorMap: () => ({ message: "保障方案无效" }), }), cargo_value_usd: z.number().finite().positive().max(1_000_000).optional(), mothership_details: msCheckoutMothershipDetailsSchema, pickup_accessorials: z.array(z.string().min(1).max(64)).max(20).optional(), delivery_accessorials: z.array(z.string().min(1).max(64)).max(20).optional(), }) .superRefine((val, ctx) => { if (val.coverage === "freight_protect") { if (val.cargo_value_usd == null || val.cargo_value_usd <= 0) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "选择 FreightProtect 时请填写大于 0 的货物价值(美元)", path: ["cargo_value_usd"], }); } } });