// 将PurchaseOrderVO转换为ShipOrderVO import { generateShortId } from "@/utils"; import { DecimalUtils } from "@/utils/classes/calculators/core/DecimalUtils"; /** * 将PurchaseOrderVO转换为ShipOrderVO * @param purchaseOrderVO 采购订单对象 * @returns 发货单对象 */ export const convertPurchaseOrderToOrderShip = ( purchaseOrderVO: BusinessAPI.PurchaseOrderVO ): BusinessAPI.OrderShip => { // 添加一个辅助函数用于分组 const groupBy = ( array: T[], keyFn: (item: T) => string, ): Record => { return array.reduce( (groups, item) => { const key = keyFn(item); if (!groups[key]) { groups[key] = []; } groups[key].push(item); return groups; }, {} as Record, ); }; // 转换供应商列表为发货单项列表,根据 purchasePrice 分组 const suppliersByPrice = groupBy( purchaseOrderVO.orderSupplierList || [], (supplier) => String(supplier.purchasePrice) ); const orderShipItemList: BusinessAPI.OrderShipItem[] = Object.entries(suppliersByPrice).map( ([price, suppliers]) => { // 计算该价格下的总毛重、总净重等 const totalGrossWeight = DecimalUtils.toDecimalPlaces(suppliers.reduce( (sum, supplier) => DecimalUtils.add(sum, supplier.grossWeight || 0), 0 )) const totalNetWeight = DecimalUtils.toDecimalPlaces(suppliers.reduce( (sum, supplier) => DecimalUtils.add(sum, supplier.netWeight || 0), 0 )); const totalAmount = DecimalUtils.toDecimalPlaces(suppliers.reduce( (sum, supplier) => DecimalUtils.add(sum, supplier.invoiceAmount || 0), 0 )) return { itemId: generateShortId(), orderShipId: "", // 将在创建发货单时填充 orderId: purchaseOrderVO.orderId, grossWeight: totalGrossWeight, boxWeight: totalGrossWeight - totalNetWeight, netWeight: totalNetWeight, unitPrice: parseFloat(price), totalAmount: totalAmount, watermelonGrade: "", // 需要手动填写 }; } ); // 构建ShipOrder对象,不转换费用信息 return { orderShipId: generateShortId(), orderId: purchaseOrderVO.orderId, orderSn: "", watermelonGrade: "", dealerId: purchaseOrderVO.orderVehicle?.dealerId!, dealerName: purchaseOrderVO.orderVehicle?.dealerName!, companyId: purchaseOrderVO.orderCompany?.companyId, companyName: purchaseOrderVO.orderCompany?.fullName, shippingAddress: purchaseOrderVO.orderVehicle?.origin, receivingAddress: purchaseOrderVO.orderVehicle?.destination, shippingDate: purchaseOrderVO.orderVehicle?.deliveryTime, estimatedArrivalDate: "", document: "", state: 'WAIT_PAYMENT', orderShipItemList }; };