fix(wms): 修复盘点详情批次属性attributeValue为空的问题
1. 标签映射表改LinkedHashMap固定优先级,补全批次号/入库日期/生产日期/过期日期及英文标签映射 2. fieldName反射取不到值时回退按batchLabels映射再取,修复fieldName配置失效导致值永远为空 3. batchDetailId为空的批次属性配置行不再丢弃,改为batchDetailId+标签双重去重
This commit is contained in:
+42
-28
@@ -236,8 +236,9 @@ public class InvestigationManageApplicationService {
|
||||
|
||||
if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) {
|
||||
List<BatchDetailFeignPO> batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId);
|
||||
// 用于跟踪已添加到列表中的batchDetailId
|
||||
// 用于跟踪已添加到列表中的batchDetailId(batchDetailId为空的配置行改用标签去重,不再丢弃)
|
||||
Set<Long> addedBatchDetailIds = new HashSet<>();
|
||||
Set<String> 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<String, String> labelToFieldNameMap = new HashMap<>();
|
||||
labelToFieldNameMap.put("Invoice No.", "invoiceNo");
|
||||
labelToFieldNameMap.put("Invoice No", "invoiceNo");
|
||||
labelToFieldNameMap.put("发票号", "invoiceNo");
|
||||
// 批次标签到字段名的映射关系(LinkedHashMap保证匹配优先级稳定;长key放前面,避免短标签模糊匹配被抢先误匹配)
|
||||
Map<String, String> 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<String, String> 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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user