import type { UseMutationResult, UseQueryResult } from "@tanstack/react-query"; import type { InvoicePoolListResponse, InvoicePoolStatus } from "../../api/invoicePool"; import { StatusBadge } from "../../components/common/StatusBadge"; import { TableSkeleton } from "../../components/common/TableSkeleton"; import { Pagination } from "../../components/common/Pagination"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../../components/ui/dropdown-menu"; import { Button } from "../../components/ui/button"; import { formatInvoiceOcrErrorMessage } from "../../lib/invoiceOcr"; export type InvoiceListCardProps = { listQuery: UseQueryResult; status: InvoicePoolStatus | ""; setStatus: (status: InvoicePoolStatus | "") => void; ownerScope: "own" | "all"; setOwnerScope: (scope: "own" | "all") => void; page: number; setPage: (page: number) => void; totalPages: number; detailInvoiceId: string; setDetailInvoiceId: (id: string) => void; signedUrlMutation: UseMutationResult<{ signedUrl: string; expiresAt: string }, Error, string>; }; export function InvoiceListCard({ listQuery, status, setStatus, ownerScope, setOwnerScope, page, setPage, totalPages, setDetailInvoiceId, signedUrlMutation, }: InvoiceListCardProps) { return (

筛选与列表

{listQuery.isLoading ? : null} {!listQuery.isLoading ? ( <>
{(listQuery.data?.items ?? []).length ? ( listQuery.data?.items.map((item) => (
{item.originalName || item.id}
{item.id.slice(0, 8)}
发票号码
{item.invoiceCode || "-"}-{item.invoiceNumber || "-"}
金额
{item.totalAmount ?? "-"}
{item.status === "pending_ocr" ? `OCR 识别中,重试 ${item.ocrAttempts} 次` : item.status === "ocr_failed" ? `OCR 失败:${formatInvoiceOcrErrorMessage(item.ocrLastError)}` : "OCR 已完成或无需处理"}
)) ) : (
暂无票据数据
)}
{(listQuery.data?.items ?? []).length ? ( listQuery.data?.items.map((item) => ( )) ) : ( )}
票据流水号 状态 发票号码 识别情况 (OCR) 操作
{item.id}
{item.invoiceCode || "-"}-{item.invoiceNumber || "-"} {item.status === "pending_ocr" ? ( 识别中 (重试: {item.ocrAttempts}) ) : item.status === "ocr_failed" ? ( 识别失败 ({formatInvoiceOcrErrorMessage(item.ocrLastError)}) ) : ( 解析成功 )} more_horiz setDetailInvoiceId(item.id)}> 查看详情 signedUrlMutation.mutate(item.id)}> 下载 / 预览
暂无票据数据
) : null}
); }