You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chajia/lib/flock/flock-pricing-options-store.ts

91 lines
2.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 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;
}
}