fix(wms): 修复盘点详情批次属性attributeValue为空的问题

1. 标签映射表改LinkedHashMap固定优先级,补全批次号/入库日期/生产日期/过期日期及英文标签映射
2. fieldName反射取不到值时回退按batchLabels映射再取,修复fieldName配置失效导致值永远为空
3. batchDetailId为空的批次属性配置行不再丢弃,改为batchDetailId+标签双重去重
This commit is contained in:
rcx
2026-09-09 09:14:01 +08:00
parent fd3a9afddf
commit 7511d211c6
@@ -236,8 +236,9 @@ public class InvestigationManageApplicationService {
if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) {
List<BatchDetailFeignPO> batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId); List<BatchDetailFeignPO> batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId);
// 用于跟踪已添加到列表中的batchDetailId // 用于跟踪已添加到列表中的batchDetailIdbatchDetailId为空的配置行改用标签去重,不再丢弃)
Set<Long> addedBatchDetailIds = new HashSet<>(); Set<Long> addedBatchDetailIds = new HashSet<>();
Set<String> addedLabelKeys = new HashSet<>();
for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) { for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) {
MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO(); MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO();
@@ -249,33 +250,37 @@ public class InvestigationManageApplicationService {
materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption()); materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark()); materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark());
// 确保添加到列表中(使用batchDetailId来避免重复 // 确保添加到列表中(batchDetailId+标签双重去重,batchDetailId为空的配置行也保留
Long batchDetailId = batchDetailFeignPO.getBatchDetailId(); 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); materialMoreDetailList.add(materialMoreDetailPO);
addedLabelKeys.add(labelKey);
if (batchDetailId != null) {
addedBatchDetailIds.add(batchDetailId); addedBatchDetailIds.add(batchDetailId);
} }
}
// 根据fieldName或batchLabels从库存表中获取对应的字段值 // 根据fieldName或batchLabels从库存表中获取对应的字段值
if (materialInventoryPO != null) { if (materialInventoryPO != null) {
String fieldValue = null; String fieldValue = null;
String usedFieldName = null;
// 优先使用fieldName(如果存在) // 优先使用fieldName(如果存在)
if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) {
usedFieldName = batchDetailFeignPO.getFieldName(); String usedFieldName = batchDetailFeignPO.getFieldName();
fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName); fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName);
log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}",
batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue); batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue);
} }
// 如果fieldName为空,尝试根据batchLabels映射字段名 // fieldName没取到值时,回退按batchLabels映射字段名再取一次(修复fieldName配置失效导致值永远为空)
else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { if (fieldValue == null && StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) {
String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels()); String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels());
if (StringUtils.isNotBlank(fieldNameByLabel)) { if (StringUtils.isNotBlank(fieldNameByLabel)) {
usedFieldName = fieldNameByLabel; fieldValue = getFieldValueByFieldName(materialInventoryPO, fieldNameByLabel);
fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName);
log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}",
batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(),
usedFieldName, fieldValue); fieldNameByLabel, fieldValue);
} }
} }
// 只有当获取到值时才更新attributeValue // 只有当获取到值时才更新attributeValue
@@ -306,22 +311,29 @@ public class InvestigationManageApplicationService {
return null; return null;
} }
// 批次标签到字段名的映射关系 // 批次标签到字段名的映射关系LinkedHashMap保证匹配优先级稳定;长key放前面,避免短标签模糊匹配被抢先误匹配)
Map<String, String> labelToFieldNameMap = new HashMap<>(); Map<String, String> labelToFieldNameMap = new LinkedHashMap<>();
labelToFieldNameMap.put("Invoice No.", "invoiceNo");
labelToFieldNameMap.put("Invoice No", "invoiceNo");
labelToFieldNameMap.put("发票号", "invoiceNo");
labelToFieldNameMap.put("Batch Ref NO's", "batchRefNo"); 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("Batch Ref NO", "batchRefNo");
labelToFieldNameMap.put("批次参考号", "batchRefNo"); labelToFieldNameMap.put("批次参考号", "batchRefNo");
labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo");
labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo"); labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo");
labelToFieldNameMap.put("单据参考号", "sheetRefNo"); labelToFieldNameMap.put("单据参考号", "sheetRefNo");
labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo");
labelToFieldNameMap.put("箱号", "boxPalletNo"); labelToFieldNameMap.put("箱号", "boxPalletNo");
labelToFieldNameMap.put("卡板号", "boxPalletNo"); labelToFieldNameMap.put("卡板号", "boxPalletNo");
labelToFieldNameMap.put("Batch Number", "batchNumber");
labelToFieldNameMap.put("Production Date", "productionDate");
labelToFieldNameMap.put("生产日期", "productionDate"); labelToFieldNameMap.put("生产日期", "productionDate");
labelToFieldNameMap.put("Expiry Date", "expiryDate");
labelToFieldNameMap.put("EXP Date", "expiryDate");
labelToFieldNameMap.put("过期日期", "expiryDate"); labelToFieldNameMap.put("过期日期", "expiryDate");
labelToFieldNameMap.put("Batch No", "batchNumber");
labelToFieldNameMap.put("批次号", "batchNumber");
labelToFieldNameMap.put("入库日期", "createTime");
labelToFieldNameMap.put("入库时间", "createTime");
labelToFieldNameMap.put("存货日期", "inventoryDate"); labelToFieldNameMap.put("存货日期", "inventoryDate");
labelToFieldNameMap.put("扩展字段1", "extAttr1"); labelToFieldNameMap.put("扩展字段1", "extAttr1");
labelToFieldNameMap.put("扩展字段2", "extAttr2"); labelToFieldNameMap.put("扩展字段2", "extAttr2");
@@ -334,14 +346,16 @@ public class InvestigationManageApplicationService {
return fieldName; return fieldName;
} }
// 模糊匹配(包含关系) // 模糊匹配(包含关系):多个key命中时取最长的key,保证同一标签映射结果稳定
String bestMatchKey = null;
for (Map.Entry<String, String> entry : labelToFieldNameMap.entrySet()) { for (Map.Entry<String, String> entry : labelToFieldNameMap.entrySet()) {
if (batchLabel.contains(entry.getKey()) || entry.getKey().contains(batchLabel)) { 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;
} }
/** /**