import { useMemo, useState } from "react"; import { Link, useLocation, useSearchParams } from "react-router-dom"; import { useQuery } from "@tanstack/react-query"; import { fetchPurchaseRequests, type PurchaseRequestStatus, type PurchaseRequestSummary, } from "../api/purchaseRequests"; import { PageHeader } from "../components/common/PageHeader"; import { StatusBadge } from "../components/common/StatusBadge"; import { PageScaffold } from "../components/patterns/PageScaffold"; import { Input } from "../components/ui/input"; import { Tabs, TabsList, TabsTrigger } from "../components/ui/tabs"; import { resolvePurchaseDisplayCode } from "../lib/approvalDisplay"; import { joinBusinessMeta } from "../lib/businessDisplay"; import { resolveErrorMessage } from "../lib/resolveErrorMessage"; const STATUS_TABS: Array<{ value: PurchaseRequestStatus; label: string }> = [ { value: "draft", label: "草稿" }, { value: "reviewing", label: "审批中" }, { value: "approved", label: "已通过" }, { value: "rejected", label: "已驳回" }, { value: "cancelled", label: "已取消" }, ]; function isPurchaseStatus(value: string | null): value is PurchaseRequestStatus { return ["draft", "reviewing", "approved", "rejected", "cancelled"].includes(value ?? ""); } function formatCurrency(value: string | null | undefined, currencyCode = "CNY") { const amount = Number(value ?? 0); if (!Number.isFinite(amount)) { return "-"; } return new Intl.NumberFormat("zh-CN", { style: "currency", currency: currencyCode }).format(amount); } function formatDate(value: string | null | undefined) { return value ? value.slice(0, 10) : "-"; } function resolvePurchaseListNextStep(status: PurchaseRequestStatus) { if (status === "draft") return "继续完善采购材料"; if (status === "reviewing") return "查看审批进度"; if (status === "rejected") return "按意见补材料"; if (status === "approved") return "核对到货 / 归档"; return "查看取消记录"; } function resolvePurchaseListEvidence(item: PurchaseRequestSummary) { if (!item.supplierId) return "待补供应商"; if (!item.legalEntityId || !item.costCenterId) return "待补公司 / 成本中心"; if (!item.documentCategoryId) return "待补单据分类"; if (!item.budgetPoolId) return "预算池未匹配"; if (!item.projectId) return "未关联项目"; return "基础依据已齐"; } function resolveMobileEmptyState(status: PurchaseRequestStatus) { if (status === "draft") return "暂无采购草稿"; if (status === "reviewing") return "暂无审批中的采购"; if (status === "rejected") return "暂无需要补材料的采购"; if (status === "approved") return "暂无已通过采购"; return "暂无已取消采购"; } function normalizeSearchValue(value: string | null | undefined) { return String(value ?? "").trim().toLowerCase(); } function matchesPurchaseSearch(item: PurchaseRequestSummary, keyword: string) { const searchValue = normalizeSearchValue(keyword); if (!searchValue) { return true; } const haystack = [ resolvePurchaseDisplayCode(item), item.title, item.reason, item.totalAmount, item.applicant?.name, item.supplier?.name, item.project?.name, ].map(normalizeSearchValue).join(" "); return haystack.includes(searchValue); } function PurchaseRequestCard({ item, currentMobileSource, }: { item: PurchaseRequestSummary; currentMobileSource: string; }) { const displayCode = resolvePurchaseDisplayCode(item); return (