diff --git a/web/pages/purchase/order.tsx b/web/pages/purchase/order.tsx index 7852f48..e05cbc6 100644 --- a/web/pages/purchase/order.tsx +++ b/web/pages/purchase/order.tsx @@ -17,9 +17,10 @@ import { Table, Tabs, Tag, + Tooltip, Typography, } from 'antd'; -import {AccountBookOutlined, DeleteOutlined, DownloadOutlined, EditOutlined, PlusOutlined, UnorderedListOutlined} from '@ant-design/icons'; +import {AccountBookOutlined, CheckOutlined, DeleteOutlined, DownloadOutlined, EditOutlined, PlusOutlined, UnorderedListOutlined} from '@ant-design/icons'; import type { TableProps } from 'antd'; import XinTable from '@/components/XinTable'; import type { @@ -98,6 +99,9 @@ const PurchaseOrderPage: React.FC = () => { const [detailLoading, setDetailLoading] = useState(false); const [completing, setCompleting] = useState(false); + // 商品明细:单品「已对账」勾选标记(前端本地控制不入库,按采购单持久化到 localStorage) + const [checkedItems, setCheckedItems] = useState>(new Set()); + // 行内编辑:供应商选项(品名/供应商/包规/单位/成本与各门店订货量直接在表格中编辑) const [suppliers, setSuppliers] = useState([]); @@ -246,6 +250,37 @@ const PurchaseOrderPage: React.FC = () => { } }, [detailOpen, detailTab, storeId, detail?.purchase.id]); + // 切换采购单时从 localStorage 恢复单品「已对账」标记 + useEffect(() => { + if (!detail) { + setCheckedItems(new Set()); + return; + } + try { + const raw = localStorage.getItem(`purchase-checked-items:${detail.purchase.id}`); + setCheckedItems(new Set(raw ? (JSON.parse(raw) as number[]) : [])); + } catch { + setCheckedItems(new Set()); + } + }, [detail]); + + /** 切换单品「已对账」标记(前端本地控制,不入库) */ + const toggleItemChecked = (productId: number) => { + if (!detail) { + return; + } + setCheckedItems((prev) => { + const next = new Set(prev); + if (next.has(productId)) { + next.delete(productId); + } else { + next.add(productId); + } + localStorage.setItem(`purchase-checked-items:${detail.purchase.id}`, JSON.stringify([...next])); + return next; + }); + }; + const loadDetail = async (id: number) => { setDetailLoading(true); try { @@ -566,17 +601,36 @@ const PurchaseOrderPage: React.FC = () => { title: '市场', fixed: 'left', dataIndex: 'market', - width: 110, + width: 90, align: 'center', filters: itemMarketOptions.map((m) => ({ text: m, value: m })), filteredValue: itemColumnFilters.market ?? null, onFilter: (value, row) => (row.market ?? '') === value, - render: (v) => v || '-', + render: (v, row) => { + // ✔ 按钮标记本单品已对账(前端本地标记,不入库) + const checked = checkedItems.has(row.product_id); + return ( + + {v || '-'} + +