From 7511d211c6741f1e8044ec6a721b013c795c99d6 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 09:14:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(wms):=20=E4=BF=AE=E5=A4=8D=E7=9B=98?= =?UTF-8?q?=E7=82=B9=E8=AF=A6=E6=83=85=E6=89=B9=E6=AC=A1=E5=B1=9E=E6=80=A7?= =?UTF-8?q?attributeValue=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 标签映射表改LinkedHashMap固定优先级,补全批次号/入库日期/生产日期/过期日期及英文标签映射 2. fieldName反射取不到值时回退按batchLabels映射再取,修复fieldName配置失效导致值永远为空 3. batchDetailId为空的批次属性配置行不再丢弃,改为batchDetailId+标签双重去重 --- ...InvestigationManageApplicationService.java | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java index 6cb4ca1d8..728655db5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java @@ -236,8 +236,9 @@ public class InvestigationManageApplicationService { if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { List batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId); - // 用于跟踪已添加到列表中的batchDetailId + // 用于跟踪已添加到列表中的batchDetailId(batchDetailId为空的配置行改用标签去重,不再丢弃) Set addedBatchDetailIds = new HashSet<>(); + Set addedLabelKeys = new HashSet<>(); for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) { MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO(); @@ -249,40 +250,44 @@ public class InvestigationManageApplicationService { materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption()); materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark()); - // 确保添加到列表中(使用batchDetailId来避免重复) + // 确保添加到列表中(按batchDetailId+标签双重去重,batchDetailId为空的配置行也保留) Long batchDetailId = batchDetailFeignPO.getBatchDetailId(); - if (batchDetailId != null && !addedBatchDetailIds.contains(batchDetailId)) { + String labelKey = batchDetailFeignPO.getBatchLabels() == null ? "" : batchDetailFeignPO.getBatchLabels().trim(); + boolean duplicated = addedLabelKeys.contains(labelKey) + || (batchDetailId != null && addedBatchDetailIds.contains(batchDetailId)); + if (!duplicated) { materialMoreDetailList.add(materialMoreDetailPO); - addedBatchDetailIds.add(batchDetailId); + addedLabelKeys.add(labelKey); + if (batchDetailId != null) { + addedBatchDetailIds.add(batchDetailId); + } } // 根据fieldName或batchLabels从库存表中获取对应的字段值 if (materialInventoryPO != null) { String fieldValue = null; - String usedFieldName = null; // 优先使用fieldName(如果存在) if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { - usedFieldName = batchDetailFeignPO.getFieldName(); + String usedFieldName = batchDetailFeignPO.getFieldName(); fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName); - log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", + log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue); - } - // 如果fieldName为空,尝试根据batchLabels映射到字段名 - else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { + } + // fieldName没取到值时,回退按batchLabels映射字段名再取一次(修复fieldName配置失效导致值永远为空) + if (fieldValue == null && StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels()); if (StringUtils.isNotBlank(fieldNameByLabel)) { - usedFieldName = fieldNameByLabel; - fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName); - log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", - batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), - usedFieldName, fieldValue); + fieldValue = getFieldValueByFieldName(materialInventoryPO, fieldNameByLabel); + log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", + batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), + fieldNameByLabel, fieldValue); } } // 只有当获取到值时才更新attributeValue if (fieldValue != null) { materialMoreDetailPO.setAttributeValue(fieldValue); - log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", - materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), + log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", + materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), materialMoreDetailPO.getAttributeValue()); } } @@ -306,22 +311,29 @@ public class InvestigationManageApplicationService { return null; } - // 批次标签到字段名的映射关系 - Map labelToFieldNameMap = new HashMap<>(); - labelToFieldNameMap.put("Invoice No.", "invoiceNo"); - labelToFieldNameMap.put("Invoice No", "invoiceNo"); - labelToFieldNameMap.put("发票号", "invoiceNo"); + // 批次标签到字段名的映射关系(LinkedHashMap保证匹配优先级稳定;长key放前面,避免短标签模糊匹配被抢先误匹配) + Map labelToFieldNameMap = new LinkedHashMap<>(); labelToFieldNameMap.put("Batch Ref NO's", "batchRefNo"); + labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo"); + labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo"); + labelToFieldNameMap.put("Invoice No.", "invoiceNo"); + labelToFieldNameMap.put("发票号", "invoiceNo"); labelToFieldNameMap.put("Batch Ref NO", "batchRefNo"); labelToFieldNameMap.put("批次参考号", "batchRefNo"); - labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo"); labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo"); labelToFieldNameMap.put("单据参考号", "sheetRefNo"); - labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo"); labelToFieldNameMap.put("箱号", "boxPalletNo"); labelToFieldNameMap.put("卡板号", "boxPalletNo"); + labelToFieldNameMap.put("Batch Number", "batchNumber"); + labelToFieldNameMap.put("Production Date", "productionDate"); labelToFieldNameMap.put("生产日期", "productionDate"); + labelToFieldNameMap.put("Expiry Date", "expiryDate"); + labelToFieldNameMap.put("EXP Date", "expiryDate"); labelToFieldNameMap.put("过期日期", "expiryDate"); + labelToFieldNameMap.put("Batch No", "batchNumber"); + labelToFieldNameMap.put("批次号", "batchNumber"); + labelToFieldNameMap.put("入库日期", "createTime"); + labelToFieldNameMap.put("入库时间", "createTime"); labelToFieldNameMap.put("存货日期", "inventoryDate"); labelToFieldNameMap.put("扩展字段1", "extAttr1"); labelToFieldNameMap.put("扩展字段2", "extAttr2"); @@ -334,14 +346,16 @@ public class InvestigationManageApplicationService { return fieldName; } - // 模糊匹配(包含关系) + // 模糊匹配(包含关系):多个key命中时取最长的key,保证同一标签映射结果稳定 + String bestMatchKey = null; for (Map.Entry entry : labelToFieldNameMap.entrySet()) { if (batchLabel.contains(entry.getKey()) || entry.getKey().contains(batchLabel)) { - return entry.getValue(); + if (bestMatchKey == null || entry.getKey().length() > bestMatchKey.length()) { + bestMatchKey = entry.getKey(); + } } } - - return null; + return bestMatchKey != null ? labelToFieldNameMap.get(bestMatchKey) : null; } /**