import { ScrollView, View } from "@tarojs/components"; import { Button, Image, Input, Popup, SafeArea, Toast, } from "@nutui/nutui-react-taro"; import { Icon } from "@/components"; import classNames from "classnames"; import { convertBoxBrandToOrderPackages } from "@/utils"; import { useEffect, useState } from "react"; import { BoxBrand } from "@/types/typings"; interface IPackageCreateProps { visible: boolean; // 添加编辑模式的支持 editMode?: boolean; onClose: () => void; // 选中的纸箱品牌,编辑的时候使用 boxBrand?: BoxBrand; // 全部纸箱品牌列表 boxBrandList: BoxBrand[]; orderPackageList: BusinessAPI.OrderPackage[]; onSave: (orderPackageList: BusinessAPI.OrderPackage[]) => void; boxType: BusinessAPI.OrderPackage["boxType"]; } export default function PackageCreate(props: IPackageCreateProps) { const { visible, editMode = false, boxBrand, boxBrandList, orderPackageList, onClose, onSave, boxType, } = props; // 批量添加纸箱相关状态 const [selectedBrand, setSelectedBrand] = useState(null); const [productCounts, setProductCounts] = useState>( new Map(), ); // 产品数量映射 // 获取费用列表 useEffect(() => { if (visible) { // 如果是编辑模式并且有初始数据,在获取费用列表后设置初始状态 if (editMode && boxBrand) { console.log("boxBrand", boxBrand); // 查找对应的费用类型 const brand = boxBrandList?.find( (c) => c.boxBrandId === boxBrand.boxBrandId, ); if (brand) { setSelectedBrand(brand); // 初始化费用项目数量 const initialCounts = new Map(); brand.boxSpecList?.forEach((boxSpec) => { boxSpec.boxProductList.forEach((product) => { const count = boxBrand.boxSpecList .find((pkg) => pkg.boxSpecId === product.boxSpecId) ?.boxProductList.find( (pkg) => pkg.boxProductId === product.boxProductId, )?.boxCount; initialCounts.set(product.boxProductId, count || 0); }); }); setProductCounts(initialCounts); } } } }, [visible, editMode, boxBrandList]); // 批量添加包装信息 const addBatchPackageInfo = () => { if (!selectedBrand) { return; } // 使用convertBoxBrandToOrderPackages转换数据 const newOrderPackages = convertBoxBrandToOrderPackages( selectedBrand, boxType, ); // 过滤掉数量为0的项目 const filteredOrderPackages = newOrderPackages.filter((pkg) => { // 从productCounts中获取对应产品的数量 const product = selectedBrand.boxSpecList ?.flatMap((c) => c.boxProductList) .find((p) => p.id === pkg.orderPackageId); const count = product ? productCounts.get(product.boxProductId) || 0 : 0; return count > 0; }); // 更新数量信息 const updatedOrderPackages = filteredOrderPackages.map((pkg) => { // 从productCounts中获取对应产品的数量 const product = selectedBrand.boxSpecList ?.flatMap((c) => c.boxProductList) .find((p) => p.id === pkg.orderPackageId); const count = product ? productCounts.get(product.boxProductId) || 0 : 0; const orderPackage = orderPackageList.find((pkg) => { return ( pkg.boxType === boxType && pkg.boxProductId === product?.boxProductId ); }); return { ...(orderPackage || pkg)!, boxCount: count, }; }); onSave([ ...(orderPackageList.filter( (pkg) => pkg.boxType !== boxType || (pkg.boxType === boxType && pkg.boxBrandId !== selectedBrand?.boxBrandId), ) || []), ...updatedOrderPackages, ]); // 重置选择并关闭弹窗 setSelectedBrand(null); setProductCounts(new Map()); onClose(); }; // 处理批量添加时的品牌选择 const handleBatchBrandSelect = (brand: BoxBrand) => { // 检查当前boxType下是否已存在该品牌 const isBrandAlreadySelected = orderPackageList.some( (pkg) => pkg.boxType === boxType && pkg.boxBrandId === brand.boxBrandId, ); if (isBrandAlreadySelected) { Toast.show("toast", { icon: "fail", title: "提示", content: "该纸箱品牌在此类型下已存在,请选择其他品牌或编辑现有信息", }); return; } setSelectedBrand(brand); // 初始化所有产品的数量为0 const initialCounts = new Map(); brand.boxSpecList?.forEach((boxSpec) => { boxSpec.boxProductList.forEach((product) => { initialCounts.set(product.id, 0); }); }); setProductCounts(initialCounts); }; // 处理产品数量变化 const handleProductCountChange = (productId: string, count: number) => { setProductCounts((prev) => { const newCounts = new Map(prev); newCounts.set(productId, Math.max(0, count)); // 允许为0,表示不使用 return newCounts; }); // 同时更新selectedBrand中的产品数量 if (selectedBrand) { const updatedBrand = { ...selectedBrand }; updatedBrand.boxSpecList = updatedBrand.boxSpecList?.map((boxSpec) => { const updatedProducts = boxSpec.boxProductList.map((product) => { if (product.id === productId) { return { ...product, boxCount: count }; } return product; }); return { ...boxSpec, boxProductList: updatedProducts }; }); setSelectedBrand(updatedBrand); } }; const renderBrandSelection = () => { // 编辑模式下不允许更改费用类型 if (editMode) { return ( 品牌信息 {selectedBrand?.boxBrandImage && ( )} {selectedBrand?.boxBrandName} ); } return ( 选择品牌 {boxBrandList ?.filter((item) => { return ( item.boxBrandType === "THIRD_PARTY_BOX" || item.boxBrandType === "FARMER_BOX" || item.boxBrandType === "OUR_BOX" ); }) ?.map((boxBrand) => ( handleBatchBrandSelect(boxBrand)} > {boxBrand.boxBrandImage} {boxBrand.boxBrandName} ))} ); }; return ( { onClose(); setSelectedBrand(null); setProductCounts(new Map()); }} onOverlayClick={onClose} lockScroll > {renderBrandSelection()} {/* 未选择品牌时的提示 */} {!selectedBrand && !editMode && ( 请先选择一个品牌 )} {/* 产品展示 */} {selectedBrand && ( 纸箱规格(点击 +/- 修改数量,0表示不使用) {selectedBrand.boxSpecList?.map((boxSpec) => ( {boxSpec.boxSpecName} {boxSpec.boxProductList.map((boxProduct) => { const currentCount = productCounts.get(boxProduct.boxProductId) || 0; // 计算总重量 const totalWeight = boxProduct.boxProductWeight ? (boxProduct.boxProductWeight * currentCount).toFixed( 1, ) : 0; return ( 型号 {boxProduct.boxProductName} {boxProduct.boxProductWeight > 0 && ( 单重 {boxProduct.boxProductWeight} 斤 )} {currentCount > 0 && boxProduct.boxProductWeight > 0 && ( 总重 {totalWeight} 斤 )} { handleProductCountChange( boxProduct.boxProductId, Math.max(0, currentCount - 1), ); }} > { const num = Number(value); if (!Number.isNaN(num) && num >= 0) { handleProductCountChange( boxProduct.boxProductId, num, ); } }} /> { handleProductCountChange( boxProduct.boxProductId, currentCount + 1, ); }} > ); })} ))} )} {/* 底部按钮 */} ); }