import { formatCurrency, validatePrice } from "@/utils/format"; import { useEffect, useState } from "react"; import { Button, Input, Popup, SafeArea, Table } from "@nutui/nutui-react-taro"; import { Icon } from "@/components"; import { View } from "@tarojs/components"; export default function PurchaseCostInfoSection(props: { purchaseOrderVO: BusinessAPI.PurchaseOrderVO; onChange?: (purchaseOrderVO: BusinessAPI.PurchaseOrderVO) => void; readOnly?: boolean; }) { const { purchaseOrderVO, onChange, readOnly } = props; // 弹窗可见状态 const [visiblePopup, setVisiblePopup] = useState<{ [key: string]: boolean }>( {}, ); // 编辑值的状态 const [editValues, setEditValues] = useState<{ [key: string]: { purchasePrice?: number; }; }>({}); // 临时编辑值的状态(用于在保存前暂存编辑的值) const [tempEditValues, setTempEditValues] = useState<{ [key: string]: { purchasePrice?: number; }; }>({}); // 初始化编辑值 const initEditValues = (supplierId: string, purchasePrice?: number) => { const updates: { editValuesUpdate?: { purchasePrice?: number; }; tempEditValuesUpdate?: { purchasePrice?: number; }; } = {}; if (!editValues[supplierId]) { updates.editValuesUpdate = { purchasePrice, }; } // 同时初始化临时编辑值 if (!tempEditValues[supplierId]) { updates.tempEditValuesUpdate = { purchasePrice, }; } return updates; }; // 初始化所有供应商的编辑值 useEffect(() => { const newEditValues = { ...editValues }; const newTempEditValues = { ...tempEditValues }; let hasEditValuesChanged = false; let hasTempEditValuesChanged = false; purchaseOrderVO.orderSupplierList?.forEach((supplier) => { const supplierId = supplier.orderSupplierId || ""; const updates = initEditValues(supplierId, supplier.purchasePrice); if (updates.editValuesUpdate) { newEditValues[supplierId] = updates.editValuesUpdate; hasEditValuesChanged = true; } if (updates.tempEditValuesUpdate) { newTempEditValues[supplierId] = updates.tempEditValuesUpdate; hasTempEditValuesChanged = true; } }); if (hasEditValuesChanged) { setEditValues(newEditValues); } if (hasTempEditValuesChanged) { setTempEditValues(newTempEditValues); } }, [purchaseOrderVO.orderSupplierList]); // 当editValues发生变化时,更新purchaseOrderVO useEffect(() => { // 只有当onChange存在时才更新 if (onChange) { // 创建新的purchaseOrderVO对象 const newPurchaseOrderVO = { ...purchaseOrderVO }; // 更新供应商列表中的采购单价信息 if (newPurchaseOrderVO.orderSupplierList) { newPurchaseOrderVO.orderSupplierList = newPurchaseOrderVO.orderSupplierList.map((supplier) => { const editValue = editValues[supplier.orderSupplierId || ""]; if (editValue) { return { ...supplier, purchasePrice: editValue.purchasePrice !== undefined ? editValue.purchasePrice : supplier.purchasePrice, }; } return supplier; }); } // 调用onChange回调 onChange(newPurchaseOrderVO); } }, [editValues]); // 计算箱重 const calculateBoxWeight = (supplier: BusinessAPI.OrderSupplier) => { return ( supplier.orderPackageList?.reduce( (sum, orderPackage) => sum + orderPackage.boxCount * orderPackage.boxProductWeight || 0, 0, ) || 0 ); }; // 计算净重 const calculateNetWeight = (supplier: BusinessAPI.OrderSupplier) => { const grossWeight = supplier.grossWeight || 0; const boxWeight = calculateBoxWeight(supplier); return grossWeight - boxWeight; }; // 计算合计金额 const calculateTotalAmount = (supplier: BusinessAPI.OrderSupplier) => { const netWeight = calculateNetWeight(supplier); const purchasePrice = editValues[supplier.orderSupplierId || ""]?.purchasePrice !== undefined ? editValues[supplier.orderSupplierId || ""].purchasePrice : supplier.purchasePrice; return netWeight * (purchasePrice || 0); }; return ( <> 0 ? purchaseOrderVO?.orderSupplierList.map((item) => { return { title: item.name, key: item.orderSupplierId, render: (record: any) => { // 只在单价(元/斤)行显示编辑按钮 if (record.project === "单价(元/斤)") { return readOnly ? ( formatCurrency(record[item.orderSupplierId]) ) : ( { setVisiblePopup((prev) => ({ ...prev, [record.project]: true, })); }} > {formatCurrency(record[item.orderSupplierId])} ); } return formatCurrency(record[item.orderSupplierId]); }, }; }) : []), { title: "合计", key: "total", }, ]} data={[ { project: "毛重(斤)", ...(purchaseOrderVO?.orderSupplierList.length > 0 ? purchaseOrderVO?.orderSupplierList.reduce((acc, item) => { acc[item.orderSupplierId] = item.grossWeight; return acc; }, {}) : {}), total: formatCurrency( purchaseOrderVO?.orderSupplierList.reduce( (sum, supplier) => sum + (supplier.grossWeight || 0), 0, ), ), }, { project: "箱重(斤)", ...(purchaseOrderVO?.orderSupplierList.length > 0 ? purchaseOrderVO?.orderSupplierList.reduce((acc, item) => { acc[item.orderSupplierId] = calculateBoxWeight(item); return acc; }, {}) : {}), total: formatCurrency( purchaseOrderVO?.orderSupplierList.reduce( (sum, supplier) => sum + calculateBoxWeight(supplier), 0, ), ), }, { project: "净重(斤)", ...(purchaseOrderVO?.orderSupplierList.length > 0 ? purchaseOrderVO?.orderSupplierList.reduce((acc, item) => { acc[item.orderSupplierId] = calculateNetWeight(item); return acc; }, {}) : {}), total: formatCurrency( purchaseOrderVO?.orderSupplierList.reduce( (sum, supplier) => sum + calculateNetWeight(supplier), 0, ), ), }, { project: "单价(元/斤)", ...(purchaseOrderVO?.orderSupplierList.length > 0 ? purchaseOrderVO?.orderSupplierList.reduce((acc, item) => { const purchasePrice = editValues[item.orderSupplierId || ""]?.purchasePrice !== undefined ? editValues[item.orderSupplierId || ""].purchasePrice : item.purchasePrice; acc[item.orderSupplierId] = formatCurrency( Number(purchasePrice), ); return acc; }, {}) : {}), total: formatCurrency( purchaseOrderVO?.orderSupplierList.reduce((sum, supplier) => { const purchasePrice = editValues[supplier.orderSupplierId || ""]?.purchasePrice !== undefined ? editValues[supplier.orderSupplierId || ""].purchasePrice : supplier.purchasePrice; return sum + (purchasePrice || 0); }, 0), ), }, { project: "合计(元)", ...(purchaseOrderVO?.orderSupplierList.length > 0 ? purchaseOrderVO?.orderSupplierList.reduce((acc, item) => { acc[item.orderSupplierId] = formatCurrency( calculateTotalAmount(item), ); return acc; }, {}) : {}), total: formatCurrency( purchaseOrderVO?.orderSupplierList.reduce( (sum, supplier) => sum + calculateTotalAmount(supplier), 0, ), ), }, ]} /> {/* 采购单价编辑弹窗 */} setVisiblePopup((prev) => ({ ...prev, ["单价(元/斤)"]: false, })) } onOverlayClick={() => setVisiblePopup((prev) => ({ ...prev, ["单价(元/斤)"]: false, })) } lockScroll > {purchaseOrderVO.orderSupplierList?.map((supplier) => ( {supplier.name} { const numValue = validatePrice(value); if (numValue !== undefined) { setTempEditValues((prev) => ({ ...prev, [supplier.orderSupplierId || ""]: { ...prev[supplier.orderSupplierId || ""], purchasePrice: numValue as number, }, })); } }} /> 元/斤 ))} ); }