R73-A3 优化轻交互 OCR 前端处理

这个提交包含在:
2026-04-28 21:14:00 +08:00
父节点 b7c018922c
当前提交 03f384fdfe
共修改 8 个文件,包含 227 行新增和 12 行删除
+40 -2
查看文件
@@ -1,4 +1,4 @@
import { useEffect, useState } from "react";
import { useEffect, useRef, useState } from "react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { isApiError } from "../api/types";
import { mapApiErrorMessage } from "../api/errorMessages";
@@ -26,6 +26,7 @@ import { useAuth } from "../auth/AuthContext";
import { hasPermission } from "../auth/permissions";
import { toast } from "sonner";
import { downloadBlob } from "../lib/download";
import { formatInvoiceOcrErrorMessage } from "../lib/invoiceOcr";
import { PageHeader } from "../components/common/PageHeader";
import { Button } from "../components/ui/button";
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../components/ui/dropdown-menu";
@@ -64,9 +65,14 @@ export function InvoicePoolPage() {
const [editInvoiceCode, setEditInvoiceCode] = useState("");
const [editInvoiceNumber, setEditInvoiceNumber] = useState("");
const [editInvoiceDate, setEditInvoiceDate] = useState("");
const [editSellerName, setEditSellerName] = useState("");
const [editBuyerName, setEditBuyerName] = useState("");
const [editAmount, setEditAmount] = useState("");
const [editTaxAmount, setEditTaxAmount] = useState("");
const [editTotalAmount, setEditTotalAmount] = useState("");
const [error, setError] = useState("");
const [confirmAction, setConfirmAction] = useState<{ type: string; invoiceId: string } | null>(null);
const previousDetailStatusRef = useRef<InvoicePoolStatus | null>(null);
// --- Queries ---
@@ -140,9 +146,29 @@ export function InvoicePoolPage() {
setEditInvoiceCode(detailQuery.data.invoiceCode ?? "");
setEditInvoiceNumber(detailQuery.data.invoiceNumber ?? "");
setEditInvoiceDate(detailQuery.data.invoiceDate ?? "");
setEditSellerName(detailQuery.data.sellerName ?? "");
setEditBuyerName(detailQuery.data.buyerName ?? "");
setEditAmount(detailQuery.data.amount ?? "");
setEditTaxAmount(detailQuery.data.taxAmount ?? "");
setEditTotalAmount(detailQuery.data.totalAmount ?? "");
}, [detailQuery.data, editOpen]);
useEffect(() => {
const currentStatus = detailQuery.data?.status ?? null;
const previousStatus = previousDetailStatusRef.current;
if (previousStatus === "pending_ocr" && currentStatus && currentStatus !== "pending_ocr") {
void queryClient.invalidateQueries({ queryKey: ["invoice-pool"] });
if (currentStatus === "available") {
toast.success("票据 OCR 已完成,可继续绑定或验真");
} else if (currentStatus === "ocr_failed") {
toast.error(`票据 OCR 未完成:${formatInvoiceOcrErrorMessage(detailQuery.data?.ocrLastError)}`);
}
}
previousDetailStatusRef.current = currentStatus;
}, [detailQuery.data?.ocrLastError, detailQuery.data?.status, queryClient]);
useEffect(() => {
if (!canManageInvoice && ownerScope === "all") {
setOwnerScope("own");
@@ -188,7 +214,7 @@ export function InvoicePoolPage() {
setDetailInvoiceId(data.invoicePoolId);
setSelectedFile(null);
setError("");
toast.success("上传成功");
toast.success(data.status === "pending_ocr" ? "上传成功,OCR 识别中" : "上传成功,可直接处理");
},
onError: (err) => handleError(err, "上传失败,请稍后重试"),
});
@@ -246,6 +272,10 @@ export function InvoicePoolPage() {
invoiceCode: editInvoiceCode.trim() ? editInvoiceCode.trim() : null,
invoiceNumber: editInvoiceNumber.trim() ? editInvoiceNumber.trim() : null,
invoiceDate: editInvoiceDate ? editInvoiceDate : null,
sellerName: editSellerName.trim() ? editSellerName.trim() : null,
buyerName: editBuyerName.trim() ? editBuyerName.trim() : null,
amount: editAmount.trim() ? editAmount.trim() : null,
taxAmount: editTaxAmount.trim() ? editTaxAmount.trim() : null,
totalAmount: editTotalAmount.trim() ? editTotalAmount.trim() : null,
});
},
@@ -461,6 +491,14 @@ export function InvoicePoolPage() {
setEditInvoiceNumber={setEditInvoiceNumber}
editInvoiceDate={editInvoiceDate}
setEditInvoiceDate={setEditInvoiceDate}
editSellerName={editSellerName}
setEditSellerName={setEditSellerName}
editBuyerName={editBuyerName}
setEditBuyerName={setEditBuyerName}
editAmount={editAmount}
setEditAmount={setEditAmount}
editTaxAmount={editTaxAmount}
setEditTaxAmount={setEditTaxAmount}
editTotalAmount={editTotalAmount}
setEditTotalAmount={setEditTotalAmount}
confirmAction={confirmAction}