/** * 按最新人工录制(flock-logged-in-20260715-155553)有头可视化回放: * 登录 → home → New Quote → Quick → 填表 → 提交 → 解析报价 * * npm run visual:flock-logged-in * # 或指定客户 * FLOCK_VISUAL_CUSTOMER_ID=CUST_001 npm run visual:flock-logged-in */ import { loadDevEnv } from "@/lib/dev-env"; loadDevEnv(); process.env.RPA_HEADED = "true"; process.env.RPA_HEADLESS = "false"; if (!process.env.RPA_SLOW_MO_MS?.trim()) { process.env.RPA_SLOW_MO_MS = "250"; } process.env.FLOCK_WORKER_REUSE_SESSION = "false"; import { getCustomerProviderLogin } from "@/modules/customer/provider-credentials"; import { runWithFlockLoginContext } from "@/lib/flock/login-context"; import { runFlockVisualChain } from "@/workers/rpa/flock/visual-chain"; import type { FlockQuoteInput } from "@/workers/rpa/flock/types"; function pickupDateNearRecording(): string { // 录制选了 17 号;取「今天起 ≥2 天」的工作日口径简化用日历日 const d = new Date(); d.setDate(d.getDate() + 2); const mm = String(d.getMonth() + 1).padStart(2, "0"); const dd = String(d.getDate()).padStart(2, "0"); const yyyy = d.getFullYear(); return `${mm}/${dd}/${yyyy}`; } /** 与 155553 录制参数对齐 */ const SAMPLE: FlockQuoteInput = { formMode: "logged_in_quick", pickupDate: pickupDateNearRecording(), pickupZip: "90248", deliveryZip: "15222", palletCount: 2, totalWeightLb: 500, lengthIn: 48, widthIn: 40, heightIn: 48, pickupLocationType: "business_with_dock", deliveryLocationType: "business_with_dock", packagingType: "bags", freightClass: "density", description: "papers", stackable: true, additionalServices: ["unloading"], vehicleTypes: ["box_truck", "dry_van", "refrigerated"], callBeforePickup: false, }; async function main(): Promise { const customerId = process.env.FLOCK_VISUAL_CUSTOMER_ID?.trim() || "CUST_001"; const login = await getCustomerProviderLogin(customerId, "flock"); if (!login) { console.error( `[visual-flock] 客户 ${customerId} 无可用 Flock 账密(解密失败或未配置)`, ); process.exit(1); } console.log("=== Flock 登录态可视化回放(对齐人工录制)==="); console.log(`customer=${customerId} email=${login.email.slice(0, 2)}***`); console.log( `sample ${SAMPLE.pickupZip}→${SAMPLE.deliveryZip} qty=${SAMPLE.palletCount} bags density`, ); console.log(`pickupDate=${SAMPLE.pickupDate} headed=true slowMo=${process.env.RPA_SLOW_MO_MS}`); console.log("请注视弹出的 Chrome 窗口…"); const result = await runWithFlockLoginContext(login, "customer", () => runFlockVisualChain({ input: SAMPLE }), ); if (!result.ok) { console.error(`[visual-flock] FAIL: ${result.errorMessage ?? "unknown"}`); process.exit(1); } console.log( `[visual-flock] OK ref=${result.reference ?? "-"} quotes=${result.quotes .map((q) => `${q.label}:$${q.totalUsd}`) .join(", ")}`, ); process.exit(0); } main().catch((error) => { console.error("[visual-flock] fatal:", error); process.exit(1); });