|
|
/**
|
|
|
* 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<void> {
|
|
|
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<FlockPricingOptionsPayload | null> {
|
|
|
const raw = await withBoundedRedis((redis) => redis.get(key(quoteId)));
|
|
|
if (!raw) return null;
|
|
|
try {
|
|
|
return JSON.parse(raw) as FlockPricingOptionsPayload;
|
|
|
} catch {
|
|
|
return null;
|
|
|
}
|
|
|
}
|