import { formatCurrency } from "@/utils";
import { useEffect, useState } from "react";
import { Table } from "@nutui/nutui-react-taro";
import { Icon } from "@/components";
import { View } from "@tarojs/components";
import { Decimal } from "decimal.js";
export default function PackageInfoSection(props: {
orderVO: BusinessAPI.OrderVO;
onChange?: (orderVO: BusinessAPI.OrderVO) => void;
readOnly?: boolean;
}) {
const { orderVO, readOnly } = props;
const defaultColumns = [
{
title: "纸箱型号",
key: "boxProductName",
fixed: "left",
},
{
title: "个数",
key: "boxProductCount",
},
...(orderVO.type === "PRODUCTION_PURCHASE"
? [
{
title: "销售单价(元/斤)",
key: "boxSalePrice",
render: (
value: BusinessAPI.OrderPackage & {
orderPackageId?: string;
isTotalRow?: boolean;
},
) => {
// 合计行不显示编辑按钮
if (value.isTotalRow) {
return formatCurrency(value.boxSalePrice as number);
}
return (
{
if (!readOnly) {
e.stopPropagation();
}
}}
>
{formatCurrency(value.boxSalePrice as number)}
{!readOnly && (
)}
);
},
},
{
title: "销售金额(元)",
key: "boxSalePayment",
},
]
: []),
{
title: "箱重(斤)",
key: "boxProductWeight",
render: (
value: BusinessAPI.OrderPackage & {
orderPackageId?: string;
isTotalRow?: boolean;
},
) => formatCurrency(value.boxProductWeight),
},
{
title: "品牌",
key: "boxBrandName",
},
];
const [columns, setColumns] = useState(defaultColumns);
useEffect(() => {
if (!readOnly) {
setColumns([...defaultColumns]);
}
}, [readOnly]);
// 将所有包装信息合并并按品牌、型号、规格分组
const groupedPackageData = orderVO.orderSupplierList?.reduce(
(acc, supplier) => {
supplier.orderPackageList
?.filter((pkg) => pkg.boxType === "USED")
?.forEach((pkg) => {
// 生成分组键
const key = `${pkg.boxBrandName}-${pkg.boxProductName}-${pkg.boxSpecId}`;
// 转换规格字段
const boxSpecId = pkg.boxSpecId;
const boxSpecName = pkg.boxSpecName;
if (!acc[key]) {
acc[key] = {
...pkg,
boxSpecId,
boxSpecName,
boxProductCount: 0,
};
}
// 累加数量
acc[key].boxProductCount += pkg.boxCount || 0;
});
return acc;
},
{} as Record,
);
// 转换为数组格式
const packageData = Object.values(groupedPackageData || {});
// 计算合计数据
const calculateTotals = () => {
if (!packageData || packageData.length === 0) {
return {};
}
// 计算各项合计
let totalBoxProductCount = new Decimal(0);
let totalBoxSalePayment = new Decimal(0);
let totalBoxProductWeight = new Decimal(0);
packageData.forEach((pkg: any) => {
totalBoxProductCount = totalBoxProductCount.add(pkg.boxProductCount || 0);
totalBoxSalePayment = totalBoxSalePayment.add(
new Decimal(pkg?.boxSalePrice || 0)
.mul(pkg.boxProductCount || 0)
.toDecimalPlaces(0, Decimal.ROUND_HALF_UP),
);
totalBoxProductWeight = totalBoxProductWeight.add(
new Decimal(pkg?.boxProductWeight || 0)
.mul(pkg.boxProductCount || 0)
.toDecimalPlaces(0, Decimal.ROUND_HALF_UP),
);
});
return {
boxProductName: "合计",
boxProductCount: totalBoxProductCount.toNumber(),
boxSalePayment: totalBoxSalePayment.toNumber(),
boxProductWeight: totalBoxProductWeight.toNumber(),
isTotalRow: true, // 标记这是合计行
};
};
const totalsData = calculateTotals();
// 创建包含合计行的数据
const dataWithTotals = [...packageData];
if (Object.keys(totalsData).length > 0) {
dataWithTotals.push(totalsData);
}
// 自定义列配置,对合计行特殊处理
const columnsWithTotalsRender = columns.map((column) => {
if (column.key === "boxProductName") {
// 品牌列显示"合计"
return {
...column,
render: (rowData: any) => {
if (rowData.isTotalRow) {
return (
{rowData.boxProductName}
);
}
return rowData.boxProductName;
},
};
} else if (column.key === "boxProductCount") {
// 个数列显示合计
return {
...column,
render: (rowData: any) => {
if (rowData.isTotalRow) {
return (
{rowData.boxProductCount}
);
}
return rowData.boxProductCount;
},
};
} else if (column.key === "boxSalePrice") {
// 销售单价列合计行处理
return {
...column,
render: (rowData: any) => {
if (rowData.isTotalRow) {
return (
{formatCurrency(rowData.boxSalePrice as number)}
);
}
return column.render(rowData, rowData);
},
};
} else if (column.key === "boxSalePayment") {
// 销售金额列显示合计
return {
...column,
render: (rowData: any) => {
if (rowData.isTotalRow) {
return (
{formatCurrency(rowData.boxSalePayment)}
);
}
return new Decimal(rowData?.boxSalePrice || 0)
.mul(rowData.boxProductCount)
.toDecimalPlaces(0, Decimal.ROUND_HALF_UP)
.toNumber();
},
};
} else if (column.key === "boxProductWeight") {
// 重量列合计行处理
return {
...column,
render: (rowData: any) => {
if (rowData.isTotalRow) {
return (
{formatCurrency(rowData.boxProductWeight)}
);
}
return column.render(rowData, rowData);
},
};
}
// 其他列保持原有render函数或者默认显示
return column;
});
return (
);
}