/** * Flock 选档后三档灵活性价 / Standard 承运商列表(Redis) */ import { withBoundedRedis } from "@/lib/redis"; import type { FlockCarrierOption, FlockCheckoutTier, FlockFlexibilityOption, FlockPricingOptionsType, } from "@/lib/flock/flock-checkout-selection"; export type FlockPricingOptionsStatus = "processing" | "done" | "failed"; export type FlockPricingOptionsPayload = { quote_id: string; status: FlockPricingOptionsStatus; preferred_tier: FlockCheckoutTier; options: FlockFlexibilityOption[]; /** 默认 flexibility(向后兼容) */ options_type?: FlockPricingOptionsType; carrier_options?: FlockCarrierOption[]; message?: string | null; reference?: string | null; updated_at_ms: number; }; export type FlockPricingOptionsPublic = { status: FlockPricingOptionsStatus; preferred_tier: FlockCheckoutTier; options: FlockFlexibilityOption[]; options_type: FlockPricingOptionsType; carrier_options: FlockCarrierOption[]; message?: string | null; }; const PREFIX = "flock_pricing_options:"; const TTL_SEC = 30 * 60; function key(quoteId: string): string { return `${PREFIX}${quoteId}`; } export function toFlockPricingOptionsPublic( payload: FlockPricingOptionsPayload, ): FlockPricingOptionsPublic { const optionsType = payload.options_type ?? "flexibility"; const carriers = payload.carrier_options ?? []; const doneMsg = optionsType === "carriers" ? `已拉取 ${carriers.length} 个承运商报价` : payload.message ?? null; return { status: payload.status, preferred_tier: payload.preferred_tier, options: payload.options ?? [], options_type: optionsType, carrier_options: carriers, message: payload.status === "failed" ? "拉取档内报价失败,请重试" : payload.status === "processing" ? optionsType === "carriers" ? "正在官网拉取承运商报价…" : "正在官网拉取灵活性报价…" : doneMsg, }; } export async function saveFlockPricingOptions( payload: FlockPricingOptionsPayload, ): Promise { const ok = await withBoundedRedis((redis) => redis.setex(key(payload.quote_id), TTL_SEC, JSON.stringify(payload)), ); if (ok === null) { console.warn("[flock-pricing-options] save skipped: Redis 不可达"); } } export async function readFlockPricingOptions( quoteId: string, ): Promise { const raw = await withBoundedRedis((redis) => redis.get(key(quoteId))); if (!raw) return null; try { return JSON.parse(raw) as FlockPricingOptionsPayload; } catch { return null; } }