const INTERNAL_ID_FIELD_PATTERN = /(?:taskId|inboundId|orderId|loadingPlanId|containerBookingId|cartonId|palletId|warehouseId|任务ID|入库单ID|订单ID|装柜计划ID|柜次ID|箱明细ID|托盘ID|仓库ID)\s*[:=:]?\s*[A-Za-z0-9_-]*/gi const LONG_INTERNAL_NUMBER_PATTERN = /(^|[^A-Za-z0-9])\d{18,20}(?=$|[^A-Za-z0-9])/g export function displayBusinessValue(value, missing = '—') { const text = String(value ?? '').trim() return text || missing } export function containerReference(source = {}) { const containerNo = [source?.currentContainerNo, source?.containerNo, source?.boxNo] .map((value) => String(value ?? '').trim()) .find((value) => value && value !== '同步中') || '' if (containerNo) return `集装箱号 ${containerNo}` const cabinetNo = String(source?.cabinetNo ?? '').trim() return cabinetNo ? `柜次号 ${cabinetNo}` : '集装箱号 —' } export function sanitizeUserMessage(message, fallback = '操作失败') { const raw = String(message ?? '').trim() if (!raw) return fallback if (/^internal server error$/i.test(raw)) return '服务端处理异常,请联系管理员' const sanitized = raw .replace(INTERNAL_ID_FIELD_PATTERN, '内部标识已隐藏') .replace(LONG_INTERNAL_NUMBER_PATTERN, '$1内部标识已隐藏') return sanitized || fallback } export function formatApiError(error, fallback = '操作失败') { const message = sanitizeUserMessage(error?.message, fallback) const code = String(error?.code ?? '').trim() const requestId = String(error?.requestId ?? '').trim() const traceId = String(error?.traceId ?? '').trim() const evidence = [ code ? `错误码:${code}` : '', requestId ? `requestId:${requestId}` : '', traceId ? `traceId:${traceId}` : '' ].filter(Boolean) return evidence.length ? `${message}(${evidence.join(';')})` : message }