diff --git a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java
index 37ed90d4..d689519d 100644
--- a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java
+++ b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java
@@ -264,21 +264,21 @@ public class CoDelExcelServiceImpl implements CoDelExcelService {
String cnativeKey = "cnative_" + cmcInvoice;
String salesAreaKey = "salesArea_" + cmcInvoice;
- // 从请求参数中获取按发票号设置的客户信息
- String customerName = request.getParameter(customerNameKey);
- String localShipAddress = request.getParameter(localShipAddressKey);
- String overseasShipper = request.getParameter(overseasShipperKey);
- String overseasAddress = request.getParameter(overseasAddressKey);
- String cnative = request.getParameter(cnativeKey);
- String salesArea = request.getParameter(salesAreaKey);
+ // 从请求参数中获取按发票号设置的客户信息,并进行 HTML 反转义处理
+ String customerName = unescapeHtml(request.getParameter(customerNameKey));
+ String localShipAddress = unescapeHtml(request.getParameter(localShipAddressKey));
+ String overseasShipper = unescapeHtml(request.getParameter(overseasShipperKey));
+ String overseasAddress = unescapeHtml(request.getParameter(overseasAddressKey));
+ String cnative = unescapeHtml(request.getParameter(cnativeKey));
+ String salesArea = unescapeHtml(request.getParameter(salesAreaKey));
// 如果按发票号的信息不存在,则使用全局信息
- headerList.setCustomerName(customerName != null ? customerName : inData.getCustomerName());
- headerList.setLocalShipAddress(localShipAddress != null ? localShipAddress : inData.getLocalShipAddress());
- headerList.setOverseasShipper(overseasShipper != null ? overseasShipper : inData.getOverseasShipper());
- headerList.setOverseasAddress(overseasAddress != null ? overseasAddress : inData.getOverseasAddress());
- headerList.setCnative(cnative != null ? cnative : inData.getCnative());
- headerList.setSalesArea(salesArea != null ? salesArea : inData.getSalesArea());
+ headerList.setCustomerName(customerName != null ? customerName : unescapeHtml(inData.getCustomerName()));
+ headerList.setLocalShipAddress(localShipAddress != null ? localShipAddress : unescapeHtml(inData.getLocalShipAddress()));
+ headerList.setOverseasShipper(overseasShipper != null ? overseasShipper : unescapeHtml(inData.getOverseasShipper()));
+ headerList.setOverseasAddress(overseasAddress != null ? overseasAddress : unescapeHtml(inData.getOverseasAddress()));
+ headerList.setCnative(cnative != null ? cnative : unescapeHtml(inData.getCnative()));
+ headerList.setSalesArea(salesArea != null ? salesArea : unescapeHtml(inData.getSalesArea()));
headerList.setCmcInvoice(cmcInvoice);
headerList.setCreateBy(inData.getUsername());
coDelMapper.saveEcssCoDelNotifyHeader(headerList);
@@ -3446,40 +3446,77 @@ public class CoDelExcelServiceImpl implements CoDelExcelService {
}
/**
- * 根据装箱明细的物料计算体积
- * 每种物料(每个pn是一种物料)维护的箱子的长*宽*高*箱数
+ * 根据装箱明细计算总体积
*
- * @return 总体积
+ *
计算逻辑:
+ *
+ * - 1. 查询所有装箱明细(不按pn分组,避免箱数统计错误)
+ * - 2. 按箱子(seq_no)分组,每个箱子只计算一次体积
+ * - 3. 根据箱子里的主要物料获取包装信息(长宽高)
+ * - 4. 单箱体积 = 长 * 宽 * 高,总体积 = Σ(单箱体积)
+ *
+ *
+ * 修复说明:
+ * 原方法使用 SQL 的 GROUP BY pn + SUM(DISTINCT box_qty),
+ * 导致10个相同pn的箱子被统计为1个箱子(DISTINCT去重)。
+ * 现改为按箱号遍历,确保每个箱子都被正确计算。
+ *
+ * @param notifyHeader 发货通知单头信息
+ * @return 总体积(立方米,保留2位小数)
*/
private BigDecimal calculateVolumeByMaterials(EcssCoDelNotifyHeaderData notifyHeader) {
- List