/** * CC 客户留言 / 工单写入 * 管理端对齐 ccnew SRCustomerMessage/Form → POST /CustomerMessage/SaveForm */ import { logger } from "@/lib/logger"; import { ccAuth } from "@/services/cc/auth"; import { CcHttpClient } from "@/services/cc/http"; import { normalizeCcCode } from "@/services/cc/code"; import { resolveWriteMode } from "@/services/cc/write-capability"; import { formatCcApiFailure, formatCcCause } from "@/constants/error-copy"; import type { CustomerMessageEntity } from "@/services/cc/customer-message-entity"; import { normalizeExternalId } from "@/services/import/import-log-meta"; export type { CustomerMessageEntity } from "@/services/cc/customer-message-entity"; export { toCcCustomerMessageEntity } from "@/services/cc/customer-message-entity"; const SAVE_PATH = "/CustomerMessage/SaveForm"; const ccHttp = new CcHttpClient(ccAuth); export type SaveCustomerMessageResult = { ok: boolean; mode: "live" | "mock" | "off"; externalId?: string | null; request: unknown; response: unknown; error?: string; }; export async function saveCustomerMessage( entity: CustomerMessageEntity, opts?: { mailId?: string }, ): Promise { const mode = await resolveWriteMode("customer_message"); const request = { keyValue: "", entity, mail_id: opts?.mailId, }; if (mode === "off") { return { ok: false, mode, request, response: null, error: formatCcCause("CC_WRITE_OFF"), }; } if (mode === "mock") { const externalId = `mock-wo-${Date.now()}`; logger.info({ mailId: opts?.mailId }, "cc.customer_message_mock"); return { ok: true, mode: "mock", externalId, request, response: { code: 200, data: externalId, mock: true }, }; } try { const res = await ccHttp.request(SAVE_PATH, { keyValue: null, entity, }); const code = normalizeCcCode(res.code); const ok = code === 200; return { ok, mode: "live", externalId: ok ? normalizeExternalId(res.data) : null, request, response: res, error: ok ? undefined : formatCcApiFailure({ api: "SaveForm", code, info: String( (res as { info?: string; message?: string }).info || (res as { message?: string }).message || "", ), fallback: "CC_WO_FAILED", }), }; } catch (err) { return { ok: false, mode: "live", request, response: null, error: formatCcCause( err instanceof Error ? err.message : "CC_WO_ERROR", ), }; } }