|
|
/**
|
|
|
* 二级刷价结果落库(Direct / DOM 共用)
|
|
|
*/
|
|
|
import { Prisma } from "@prisma/client";
|
|
|
import { QUOTE_VALIDITY_MS } from "@/lib/constants/quote";
|
|
|
import { overwriteL1, setL2, setL3 } from "@/modules/cache/redis-cache";
|
|
|
import { prisma } from "@/lib/prisma";
|
|
|
import { applyMarkupToQuotes, getMarkupRule } from "@/modules/pricing/engine";
|
|
|
import { getConfidenceScore } from "@/modules/quote/confidence";
|
|
|
import { prepareMotherShipStorageQuotes } from "@/modules/quote/quote-completeness";
|
|
|
import { quoteItemsToRawTiers } from "@/modules/rpa/quote-mapper";
|
|
|
import {
|
|
|
clearMsRefineHold,
|
|
|
updateMsRefineHoldStatus,
|
|
|
} from "@/lib/mothership/refine-hold-store";
|
|
|
import type { NormalizedCargo } from "@/modules/quote/types";
|
|
|
import type { QuoteItem } from "@/modules/providers/quote-provider";
|
|
|
|
|
|
export async function applyMsRefineQuotes(input: {
|
|
|
quoteId: string;
|
|
|
requestId: string;
|
|
|
customerId: string;
|
|
|
sessionId: string;
|
|
|
cargo: NormalizedCargo;
|
|
|
items: QuoteItem[];
|
|
|
}): Promise<void> {
|
|
|
const uiQuotes = prepareMotherShipStorageQuotes(
|
|
|
quoteItemsToRawTiers(input.items),
|
|
|
);
|
|
|
const markupRule = await getMarkupRule(
|
|
|
input.customerId,
|
|
|
input.cargo.businessCustomerId,
|
|
|
);
|
|
|
const markedQuotes = applyMarkupToQuotes(uiQuotes, markupRule);
|
|
|
const validUntil = new Date(Date.now() + QUOTE_VALIDITY_MS);
|
|
|
|
|
|
await setL2(input.cargo.cargoHash, { quotes: uiQuotes });
|
|
|
await setL3(input.cargo.cargoHash, { quotes: uiQuotes });
|
|
|
|
|
|
await prisma.quoteRecord.update({
|
|
|
where: { quoteId: input.quoteId },
|
|
|
data: {
|
|
|
status: "done",
|
|
|
sourceType: "rpa",
|
|
|
isRealtime: true,
|
|
|
confidenceScore: getConfidenceScore("rpa"),
|
|
|
markupPercent: markupRule.type === "percent" ? markupRule.percent : 0,
|
|
|
quotesJson: markedQuotes as unknown as Prisma.InputJsonValue,
|
|
|
validUntil,
|
|
|
errorCode: null,
|
|
|
errorMessage: null,
|
|
|
},
|
|
|
});
|
|
|
|
|
|
await overwriteL1(input.requestId, {
|
|
|
quoteId: input.quoteId,
|
|
|
response: {
|
|
|
quote_id: input.quoteId,
|
|
|
status: "done",
|
|
|
source_type: "rpa",
|
|
|
is_realtime: true,
|
|
|
},
|
|
|
});
|
|
|
|
|
|
await updateMsRefineHoldStatus(input.sessionId, "refined");
|
|
|
await clearMsRefineHold(input.sessionId);
|
|
|
console.log(
|
|
|
`[ms-refine] ok quote_id=${input.quoteId} tiers=${markedQuotes.length}`,
|
|
|
);
|
|
|
}
|