import { z } from "zod"; /** 结账地点字段(对象本身必填时可为空对象) */ const flockLocationDetailsSchema = z .object({ company_name: z.string().max(128).optional(), address1: z.string().max(200).optional(), address2: z.string().max(128).optional(), city: z.string().max(64).optional(), state: z.string().max(32).optional(), zip: z.string().max(16).optional(), contact_name: z.string().max(128).optional(), contact_email: z.string().max(128).optional(), contact_phone: z.string().max(64).optional(), opens_at: z.string().max(32).optional(), closes_at: z.string().max(32).optional(), po_number: z.string().max(128).optional(), bol_remarks: z.string().max(1000).optional(), notes: z.string().max(1000).optional(), weekend_delivery: z.boolean().optional(), }) .strict(); const flockCheckoutDetailsSchema = z .object({ pickup: flockLocationDetailsSchema.default({}), delivery: flockLocationDetailsSchema.default({}), role: z.enum(["shipper", "receiver", "other"]).optional(), nmfc: z.string().max(64).optional(), po_number: z.string().max(128).optional(), bol_remarks: z.string().max(1000).optional(), declaration_statement: z.string().max(2000).optional(), notes: z.string().max(1000).optional(), documentation_required: z.boolean().optional(), use_billing_for_pickup: z.boolean().optional(), use_billing_for_delivery: z.boolean().optional(), }) .strict() .optional(); export const flockCheckoutSchema = z .object({ customer_id: z.string().min(1, "请填写客户标识"), quote_id: z.string().min(1, "请填写报价单号").max(64), preferred_tier: z.enum(["flock_direct", "standard"], { errorMap: () => ({ message: "请选择 FlockDirect® 或 Standard 报价档" }), }), preferred_flexibility: z .enum(["2_day", "1_day", "none"], { errorMap: () => ({ message: "请选择灵活性报价档(2 天 / 1 天 / 无灵活性)", }), }) .optional(), preferred_carrier: z.string().trim().min(1).max(128).optional(), flock_details: flockCheckoutDetailsSchema, }) .superRefine((val, ctx) => { const carrier = val.preferred_carrier?.trim() || ""; const hasFlex = Boolean(val.preferred_flexibility); if (carrier && hasFlex) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "灵活性档与承运商不能同时选择", path: ["preferred_carrier"], }); return; } if (!carrier && !hasFlex) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "请选择灵活性报价档或承运商", path: ["preferred_flexibility"], }); } }); export type FlockCheckoutDetails = NonNullable< z.infer["flock_details"] >;