/** * MotherShip fill-only 结账 job:选卡 + 保障 + Details,不支付 */ import { getCustomerProviderLogin } from "@/modules/customer/provider-credentials"; import { runWithMothershipLoginContext } from "@/lib/rpa/mothership-login-context"; import { cargoToQuoteRequest } from "@/modules/rpa/quote-mapper"; import { RpaError } from "@/modules/rpa/errors"; import { saveMsCheckoutStatus } from "@/lib/mothership/ms-checkout-store"; import type { MsCheckoutFillJobData } from "@/modules/mothership/checkout-queue"; import { runMothershipLoggedInCheckoutToAgree } from "@/workers/rpa/mothership-logged-in-quote"; export async function processMsCheckoutFillJob( data: MsCheckoutFillJobData, ): Promise { const customerLogin = await getCustomerProviderLogin( data.customerId, "mothership", ); const email = customerLogin?.email?.trim() || process.env.MOTHERSHIP_EMAIL?.trim() || ""; const password = customerLogin?.password?.trim() || process.env.MOTHERSHIP_PASSWORD?.trim() || ""; try { const req = cargoToQuoteRequest(data.cargo); req.preferredCarrier = data.preferredCarrier; req.coverage = data.coverage; req.cargoValueUsd = data.cargoValueUsd; const result = await runWithMothershipLoginContext( { email, password: password || "x" }, customerLogin ? "customer" : "env", () => runMothershipLoggedInCheckoutToAgree(req, { fillOnly: true }), ); await saveMsCheckoutStatus({ quote_id: data.quoteId, status: "done", stage: result.stage, selected_carrier: result.selectedCarrier, selected_total: result.selectedTotal, coverage: data.coverage, cargo_value_usd: data.cargoValueUsd ?? null, screenshot_path: result.screenshotPath ?? null, message: "已在官网填齐详情(未支付)", updated_at_ms: Date.now(), }); console.log( `[ms-checkout] ok quote_id=${data.quoteId} stage=${result.stage} carrier=${result.selectedCarrier}` + (result.screenshotPath ? ` shot=${result.screenshotPath}` : ""), ); } catch (err) { const msg = err instanceof Error ? err.message : String(err); const code = err instanceof RpaError ? err.code : "RPA_DATA_INVALID"; console.error(`[ms-checkout] FAIL quote_id=${data.quoteId} ${msg}`); // 已是中文业务原因时回传客户;否则统一兜底(避免堆栈/英文直出) const userMessage = /[\u4e00-\u9fff]/.test(msg) && !/at\s+\w+|Error:|Timeout \d+ms/i.test(msg) ? msg.replace(/\s*shot=\S+/g, "").slice(0, 180) : "官网同步失败,请稍后重试"; await saveMsCheckoutStatus({ quote_id: data.quoteId, status: "failed", coverage: data.coverage, cargo_value_usd: data.cargoValueUsd ?? null, message: userMessage, updated_at_ms: Date.now(), }); console.warn(`[ms-checkout] 已记录失败 code=${code}`); } }