实现腾讯通用票据OCR安全适配(07-28-travel-reimbursement-guide)
这个提交包含在:
@@ -14,9 +14,15 @@ const OCR_FIELD_LABELS = {
|
||||
invoiceDate: "开票日期",
|
||||
totalAmount: "总金额",
|
||||
sellerName: "销售方",
|
||||
buyerName: "购买方",
|
||||
};
|
||||
|
||||
function buildInvoiceDedupFilters({ fileSha256 = null, invoiceCode = null, invoiceNumber = null }) {
|
||||
function buildInvoiceDedupFilters({
|
||||
fileSha256 = null,
|
||||
invoiceCode = null,
|
||||
invoiceNumber = null,
|
||||
deduplicateByInvoiceNumberOnly = false,
|
||||
}) {
|
||||
const filters = [];
|
||||
if (fileSha256) {
|
||||
filters.push({ file_sha256: fileSha256 });
|
||||
@@ -26,6 +32,11 @@ function buildInvoiceDedupFilters({ fileSha256 = null, invoiceCode = null, invoi
|
||||
invoice_code: invoiceCode,
|
||||
invoice_number: invoiceNumber,
|
||||
});
|
||||
} else if (deduplicateByInvoiceNumberOnly && invoiceNumber) {
|
||||
filters.push({
|
||||
invoice_code: null,
|
||||
invoice_number: invoiceNumber,
|
||||
});
|
||||
}
|
||||
return filters;
|
||||
}
|
||||
@@ -217,6 +228,39 @@ function formatInvoiceOcrFailureMessage(rawError) {
|
||||
return "票据识别失败,请重试或人工补齐关键信息。";
|
||||
}
|
||||
|
||||
if (rawError === "invoice_not_detected") {
|
||||
return "未识别到支持的发票,请确认 PDF 第一页只有一张有效票据。";
|
||||
}
|
||||
|
||||
if (rawError === "multiple_invoices_not_supported") {
|
||||
return "一个 PDF 第一页只能包含一张发票,请拆分后重新上传。";
|
||||
}
|
||||
|
||||
if (rawError === "unsupported_invoice_subtype") {
|
||||
return "当前仅支持住宿增值税发票和铁路电子客票。";
|
||||
}
|
||||
|
||||
if (rawError === "invoice_recognition_failed") {
|
||||
return "腾讯 OCR 未能识别该发票,请检查 PDF 清晰度后重试。";
|
||||
}
|
||||
|
||||
if (
|
||||
rawError.includes("ResourceUnavailable.ResourcePackageRunOut") ||
|
||||
rawError.includes("ResourceUnavailable.InArrears") ||
|
||||
rawError.includes("ResourcesSoldOut.ChargeStatusException")
|
||||
) {
|
||||
return "票据识别额度或计费状态暂不可用,请联系管理员。";
|
||||
}
|
||||
|
||||
if (
|
||||
rawError.includes("ocr_credentials_missing") ||
|
||||
rawError.includes("AuthFailure") ||
|
||||
rawError.includes("UnauthorizedOperation") ||
|
||||
rawError.includes("FailedOperation.UnOpenError")
|
||||
) {
|
||||
return "票据识别服务配置暂不可用,请联系管理员。";
|
||||
}
|
||||
|
||||
if (!rawError) {
|
||||
return "票据识别失败,请稍后重试。";
|
||||
}
|
||||
|
||||
在新工单中引用
屏蔽一个用户