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; } /**