PDA收货修改批次属性

This commit is contained in:
秦鸿展
2026-03-11 10:52:51 +08:00
parent 51fe38dfde
commit 0242a5416d
5 changed files with 581 additions and 182 deletions
@@ -1,6 +1,7 @@
package com.mhd.wms.domain.inventoryStandingReport.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
@@ -55,6 +56,7 @@ public class InventoryStandingReport extends BaseVOEntity {
@ApiModelProperty("货主编码")
@Excel(name = "货主名称编码")
@TableField(exist = false)
private String shipperCode;
@ApiModelProperty("货主名称")
@@ -113,19 +113,29 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
if (CollectionUtils.isEmpty(materialMoreDetailList)) {
ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(receiptMaterialDetailPO.getMaterialBaseInfoId());
if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
materialMoreDetailList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), MaterialMoreDetailPO.class);
List<BatchDetailFeignPO> batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList);
}
}
// 从入库单明细表中获取InvoiceNo、BatchRefNo、SheetRefNo、BoxPalletNo字段的值
fillAttributeValueFromInMaterialDetail(receiptMaterialDetailPO, materialMoreDetailList);
receiptMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList);
});
// 获取查询的层级
// 获取查询的层级level 1 为顶级;level 2 且 parent_unique_id 为 null/0 的为孤儿项;level 2 且 parent_unique_id 在收货明细中无对应父项的也为孤儿(如 PDA 只收子项、父项在 in_material_detail 中),均作为顶级展示
java.util.Set<Long> receiptParentIds = receiptMaterialDetailPOList.stream()
.flatMap(po -> java.util.stream.Stream.of(po.getUniqueId(), po.getInUniqueId()))
.filter(id -> id != null)
.collect(Collectors.toSet());
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOParentList = receiptMaterialDetailPOList
.stream().filter(e -> 1 == e.getLevel()).collect(Collectors.toList());
// 递归查询子集
.stream().filter(e -> e.getLevel() != null && (
1 == e.getLevel()
|| (2 == e.getLevel() && (e.getParentUniqueId() == null || Long.valueOf(0).equals(e.getParentUniqueId())))
|| (2 == e.getLevel() && e.getParentUniqueId() != null && !receiptParentIds.contains(e.getParentUniqueId()))
)).collect(Collectors.toList());
// 递归查询子集:parent_unique_id 可能指向 receipt.unique_idPDA 收货创建的子项)或 in_material_detail.unique_id(从入库单复制),
// 需同时用 unique_id 和 in_unique_id 查找子项
for(ReceiptMaterialDetailPO materialDetailPO :receiptMaterialDetailPOParentList){
List<ReceiptMaterialDetailPO> children = getChildren(materialDetailPO.getUniqueId(), receiptMaterialDetailPOList, 2);
List<ReceiptMaterialDetailPO> children = getChildren(materialDetailPO.getUniqueId(), materialDetailPO.getInUniqueId(), receiptMaterialDetailPOList, 2);
children.forEach(childrenDetailPO -> {
MaterialMoreDetailDO materialMoreDetailDO = new MaterialMoreDetailDO();
materialMoreDetailDO.setMaterialDetailUniqueId(childrenDetailPO.getUniqueId());
@@ -135,7 +145,8 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
if (CollectionUtils.isEmpty(materialMoreDetailList)) {
ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(childrenDetailPO.getMaterialBaseInfoId());
if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
materialMoreDetailList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), MaterialMoreDetailPO.class);
List<BatchDetailFeignPO> batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList);
}
}
// 从入库单明细表中获取InvoiceNo、BatchRefNo、SheetRefNo、BoxPalletNo字段的值
@@ -146,15 +157,70 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
materialDetailPO.setChildren(children);
}
// 兜底:若有 level 2 既不在顶级列表、也不在任何父项的 children 中,则提升为顶级(避免 PDA 收货后 PC 端漏显)
java.util.Set<Long> displayedUniqueIds = new java.util.HashSet<>();
receiptMaterialDetailPOParentList.forEach(p -> collectUniqueIdsRecursively(p, displayedUniqueIds));
for (ReceiptMaterialDetailPO po : receiptMaterialDetailPOList) {
if (po.getLevel() != null && 2 == po.getLevel() && po.getUniqueId() != null && !displayedUniqueIds.contains(po.getUniqueId())) {
receiptMaterialDetailPOParentList.add(po);
}
}
return receiptMaterialDetailPOParentList;
}
private List<ReceiptMaterialDetailPO> getChildren(Long parentUniqueId, List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList, Integer maxLevel){
List<ReceiptMaterialDetailPO> childrenCityList = receiptMaterialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList());
private void collectUniqueIdsRecursively(ReceiptMaterialDetailPO po, java.util.Set<Long> set) {
if (po == null || po.getUniqueId() == null) return;
set.add(po.getUniqueId());
if (!CollectionUtils.isEmpty(po.getChildren())) {
po.getChildren().forEach(c -> collectUniqueIdsRecursively(c, set));
}
}
/**
* 过滤 isDisplay=1 的批次属性并转换为 MaterialMoreDetailPO,与 PC 端 getInfo 一致
*/
private List<MaterialMoreDetailPO> filterAndConvertToMaterialMoreDetail(List<BatchDetailFeignPO> batchList) {
List<MaterialMoreDetailPO> result = new ArrayList<>();
if (CollectionUtils.isEmpty(batchList)) {
return result;
}
for (BatchDetailFeignPO po : batchList) {
if (po.getIsDisplay() == null || po.getIsDisplay() != 1) {
continue;
}
MaterialMoreDetailPO mpo = new MaterialMoreDetailPO();
mpo.setBatchId(po.getBatchId());
mpo.setBatchDetailId(po.getBatchDetailId());
mpo.setBatchLabels(po.getBatchLabels());
mpo.setInputControl(po.getInputControl());
mpo.setAttributeFormat(po.getAttributeFormat());
mpo.setAttributeOption(po.getAttributeOption());
result.add(mpo);
}
return result;
}
/**
* 查找子项:parent_unique_id 可能指向 receipt.unique_idPDA 收货)或 in_material_detail.unique_id(从入库单复制)
*/
private List<ReceiptMaterialDetailPO> getChildren(Long parentUniqueId, Long parentInUniqueId,
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList, Integer maxLevel){
if (parentUniqueId == null && parentInUniqueId == null) {
return new ArrayList<>();
}
final Long pid = parentUniqueId;
final Long inPid = parentInUniqueId;
List<ReceiptMaterialDetailPO> childrenCityList = receiptMaterialDetailPOList.stream()
.filter(materialDetailPO -> {
Long p = materialDetailPO.getParentUniqueId();
if (p == null) return false;
return (pid != null && p.equals(pid)) || (inPid != null && p.equals(inPid));
})
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(childrenCityList)){
childrenCityList.forEach(childrenCity -> {
if (childrenCity.getLevel() < maxLevel){
childrenCity.setChildren(getChildren(childrenCity.getUniqueId(), receiptMaterialDetailPOList, maxLevel));
if (childrenCity.getLevel() != null && childrenCity.getLevel() < maxLevel){
childrenCity.setChildren(getChildren(childrenCity.getUniqueId(), childrenCity.getInUniqueId(), receiptMaterialDetailPOList, maxLevel));
}
});
}
@@ -244,73 +310,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
List<MaterialMoreDetail> materialMoreDetailList = new ArrayList<>();
List<InMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){
List<MaterialMoreDetailDO> materialMoreDetailList1 = receiptMaterialDetailDO.getMaterialMoreDetailList();
if (CollectionUtils.isEmpty(materialMoreDetailList1)) {
materialMoreDetailList1 = new ArrayList<>();
}
for (MaterialMoreDetailDO materialMoreDetailDO : materialMoreDetailList1) {
String batchLabels = materialMoreDetailDO.getBatchLabels();
String attributeValue = materialMoreDetailDO.getAttributeValue();
if (attributeValue != null && !attributeValue.isEmpty() && attributeValue != "" && attributeValue.length() > 0 ) {
attributeValue = attributeValue.trim();
switch (batchLabels) {
case "扩展字段4":
receiptMaterialDetailDO.setExtAttr4(attributeValue);
break;
case "扩展字段3":
receiptMaterialDetailDO.setExtAttr3(attributeValue);
break;
case "扩展字段2":
receiptMaterialDetailDO.setExtAttr2(attributeValue);
break;
case "扩展字段1":
receiptMaterialDetailDO.setExtAttr1(attributeValue);
break;
case "箱号/卡板号":
receiptMaterialDetailDO.setBoxPalletNo(attributeValue);
break;
case "Sheet Ref NO's":
receiptMaterialDetailDO.setSheetRefNo(attributeValue);
break;
case "Batch Ref NO's":
receiptMaterialDetailDO.setBatchRefNo(attributeValue);
break;
case "存货日期":
// 判断是否是日期格式再赋值避免报错
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setInventoryDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
//receiptMaterialDetailDO.setInventoryDate(DateUtils.parseDate(attributeValue));
break;
case "过期日期":
// 判断是否是日期格式再赋值避免报错
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setExpiryDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
//receiptMaterialDetailDO.setExpiryDate(DateUtils.parseDate(attributeValue));
break;
case "生产日期":
// 判断是否是日期格式再赋值避免报错
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setProductionDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
//receiptMaterialDetailDO.setProductionDate(DateUtils.parseDate(attributeValue));
break;
}
}
}
extractBatchAttributesToReceiptDetail(receiptMaterialDetailDO);
// 自动生成批次号并校验唯一性(包括子项)
generateAndValidateBatchNumber(receiptMaterialDetailDO, shipperId);
// 当 materialMoreDetailList 为空时(如 PDA 未传),从 receiptMaterialDetailDO 的 batch_number、material_status_code 等字段构建,确保更多属性能保存并回显
@@ -331,6 +331,8 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
List<ReceiptMaterialDetail> receiptMaterialDetailChildList = new ArrayList<>();
if (!CollectionUtils.isEmpty(receiptMaterialDetailDOChildList)){
for (ReceiptMaterialDetailDO receiptMaterialDetailDOChild : receiptMaterialDetailDOChildList){
// 子项也需从批次属性提取净重、毛重、体积、面积等字段
extractBatchAttributesToReceiptDetail(receiptMaterialDetailDOChild);
ReceiptMaterialDetail receiptMaterialDetailChild = new ReceiptMaterialDetail();
BeanUtils.copyProperties(receiptMaterialDetailDOChild, receiptMaterialDetailChild);
receiptMaterialDetailChild.setCreateBy(loginUser.getUserid());
@@ -361,8 +363,21 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
//保存物料明细信息
saveOrUpdateBatch(receiptMaterialDetailList);
//批量新增物料信息
//批量新增/更新物料更多属性:先删除该收货单下所有明细的旧批次属性,再插入新值,避免重复插入导致更新失效
if (!CollectionUtils.isEmpty(materialMoreDetailList)){
String receiptOrderNumber = stockReceiptOrderDO.getReceiptOrderNumber();
if (StringUtils.isBlank(receiptOrderNumber) && !CollectionUtils.isEmpty(receiptMaterialDetailDOList)) {
receiptOrderNumber = receiptMaterialDetailDOList.get(0).getReceiptOrderNumber();
}
if (StringUtils.isNotBlank(receiptOrderNumber)) {
java.util.Set<Long> uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList);
if (!uniqueIds.isEmpty()) {
IMaterialMoreDetailService.remove(new QueryWrapper<MaterialMoreDetail>()
.eq("order_number", receiptOrderNumber)
.in("material_detail_unique_id", uniqueIds)
.eq("del_flag", 1));
}
}
IMaterialMoreDetailService.saveBatch(materialMoreDetailList);
}
//批量新增序列号
@@ -603,22 +618,57 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
return;
}
// 根据attributeOption从入库单明细中获取对应的值并填充到attributeValue
// 根据attributeOption或batchLabels从入库单/收货单明细中获取对应的值并填充到attributeValue
for (MaterialMoreDetailPO materialMoreDetail : materialMoreDetailList) {
String attributeOption = materialMoreDetail.getAttributeOption();
String batchLabels = materialMoreDetail.getBatchLabels();
// 如果attributeValue已经有值,跳过
if (materialMoreDetail.getAttributeValue() != null && !materialMoreDetail.getAttributeValue().trim().isEmpty()) {
continue;
}
// 根据attributeOption映射到入库单明细表的字段
if ("InvoiceNo".equalsIgnoreCase(attributeOption)) {
materialMoreDetail.setAttributeValue(inMaterialDetail.getInvoiceNo());
} else if ("BatchRefNo".equalsIgnoreCase(attributeOption)) {
materialMoreDetail.setAttributeValue(inMaterialDetail.getBatchRefNo());
} else if ("SheetRefNo".equalsIgnoreCase(attributeOption)) {
materialMoreDetail.setAttributeValue(inMaterialDetail.getSheetRefNo());
} else if ("BoxPalletNo".equalsIgnoreCase(attributeOption)) {
materialMoreDetail.setAttributeValue(inMaterialDetail.getBoxPalletNo());
// 根据attributeOption映射到入库单明细表的字段(兼容 batchLabels 兜底,如 "Batch Ref NO's"、"Sheet Ref NO's"、"箱号/卡板号"
String refVal = null;
if ("InvoiceNo".equalsIgnoreCase(attributeOption) || "Invoice No".equalsIgnoreCase(batchLabels) || "发票号".equals(batchLabels)) {
refVal = inMaterialDetail.getInvoiceNo();
} else if ("BatchRefNo".equalsIgnoreCase(attributeOption) || "Batch Ref NO's".equalsIgnoreCase(batchLabels) || "批次参考号".equals(batchLabels)) {
refVal = inMaterialDetail.getBatchRefNo();
} else if ("SheetRefNo".equalsIgnoreCase(attributeOption) || "Sheet Ref NO's".equalsIgnoreCase(batchLabels) || "单据参考号".equals(batchLabels)) {
refVal = inMaterialDetail.getSheetRefNo();
} else if ("BoxPalletNo".equalsIgnoreCase(attributeOption) || "Box No./Pallet No.".equalsIgnoreCase(batchLabels) || "箱号/卡板号".equals(batchLabels)) {
refVal = inMaterialDetail.getBoxPalletNo();
}
if (refVal != null) {
materialMoreDetail.setAttributeValue(refVal);
} else if (StringUtils.isNotBlank(batchLabels)) {
// 根据batchLabels填充净重、毛重、体积、面积(优先用收货明细,无则用入库明细)
String val = null;
switch (batchLabels.trim()) {
case "总净重":
case "净重(KG)":
case "净重":
val = receiptMaterialDetailPO.getTotalNetWeight() != null ? receiptMaterialDetailPO.getTotalNetWeight().toString() : (inMaterialDetail.getTotalNetWeight() != null ? inMaterialDetail.getTotalNetWeight().toString() : null);
break;
case "总毛重":
case "毛重(KG)":
case "毛重":
val = receiptMaterialDetailPO.getTotalGrossWeight() != null ? receiptMaterialDetailPO.getTotalGrossWeight().toString() : (inMaterialDetail.getTotalGrossWeight() != null ? inMaterialDetail.getTotalGrossWeight().toString() : null);
break;
case "总体积":
case "体积(CBM)":
case "体积":
val = receiptMaterialDetailPO.getTotalVolume() != null ? receiptMaterialDetailPO.getTotalVolume().toString() : (inMaterialDetail.getTotalVolume() != null ? inMaterialDetail.getTotalVolume().toString() : null);
break;
case "总面积":
case "面积(SQM)":
case "面积":
val = receiptMaterialDetailPO.getTotalArea() != null ? receiptMaterialDetailPO.getTotalArea().toString() : (inMaterialDetail.getTotalArea() != null ? inMaterialDetail.getTotalArea().toString() : null);
break;
default:
break;
}
if (val != null) {
materialMoreDetail.setAttributeValue(val);
}
}
}
}
@@ -710,6 +760,145 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
/**
* 从批次属性 materialMoreDetailList 提取值到收货明细字段(扩展字段、净重、毛重、体积、面积等)
*/
private void extractBatchAttributesToReceiptDetail(ReceiptMaterialDetailDO receiptMaterialDetailDO) {
List<MaterialMoreDetailDO> list = receiptMaterialDetailDO.getMaterialMoreDetailList();
if (CollectionUtils.isEmpty(list)) {
return;
}
for (MaterialMoreDetailDO materialMoreDetailDO : list) {
String batchLabels = materialMoreDetailDO.getBatchLabels();
String attributeValue = materialMoreDetailDO.getAttributeValue();
if (StringUtils.isBlank(batchLabels) || StringUtils.isBlank(attributeValue)) {
continue;
}
attributeValue = attributeValue.trim();
switch (batchLabels) {
case "扩展字段4":
receiptMaterialDetailDO.setExtAttr4(attributeValue);
break;
case "扩展字段3":
receiptMaterialDetailDO.setExtAttr3(attributeValue);
break;
case "扩展字段2":
receiptMaterialDetailDO.setExtAttr2(attributeValue);
break;
case "扩展字段1":
receiptMaterialDetailDO.setExtAttr1(attributeValue);
break;
case "箱号/卡板号":
receiptMaterialDetailDO.setBoxPalletNo(attributeValue);
break;
case "Sheet Ref NO's":
receiptMaterialDetailDO.setSheetRefNo(attributeValue);
break;
case "Batch Ref NO's":
receiptMaterialDetailDO.setBatchRefNo(attributeValue);
break;
case "存货日期":
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setInventoryDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
break;
case "过期日期":
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setExpiryDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
break;
case "生产日期":
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setProductionDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
break;
case "总净重":
case "净重(KG)":
case "净重":
setReceiptDetailBigDecimalField(receiptMaterialDetailDO, attributeValue, "totalNetWeight");
break;
case "总毛重":
case "毛重(KG)":
case "毛重":
setReceiptDetailBigDecimalField(receiptMaterialDetailDO, attributeValue, "totalGrossWeight");
break;
case "总体积":
case "体积(CBM)":
case "体积":
setReceiptDetailBigDecimalField(receiptMaterialDetailDO, attributeValue, "totalVolume");
break;
case "总面积":
case "面积(SQM)":
case "面积":
setReceiptDetailBigDecimalField(receiptMaterialDetailDO, attributeValue, "totalArea");
break;
default:
break;
}
}
}
/**
* 递归收集收货明细及其子项的所有 uniqueId(用于删除旧批次属性)
*/
private java.util.Set<Long> collectReceiptDetailUniqueIds(List<ReceiptMaterialDetailDO> list) {
java.util.Set<Long> set = new java.util.HashSet<>();
if (CollectionUtils.isEmpty(list)) {
return set;
}
for (ReceiptMaterialDetailDO d : list) {
if (d.getUniqueId() != null) {
set.add(d.getUniqueId());
}
if (!CollectionUtils.isEmpty(d.getChildren())) {
set.addAll(collectReceiptDetailUniqueIds(d.getChildren()));
}
}
return set;
}
/**
* 从批次属性 attributeValue 解析 BigDecimal 并设置到收货明细对应字段(净重、毛重、体积、面积等)
*/
private void setReceiptDetailBigDecimalField(ReceiptMaterialDetailDO receiptMaterialDetailDO, String attributeValue, String fieldName) {
if (StringUtils.isBlank(attributeValue)) {
return;
}
try {
BigDecimal val = new BigDecimal(attributeValue.trim());
switch (fieldName) {
case "totalNetWeight":
receiptMaterialDetailDO.setTotalNetWeight(val);
break;
case "totalGrossWeight":
receiptMaterialDetailDO.setTotalGrossWeight(val);
break;
case "totalVolume":
receiptMaterialDetailDO.setTotalVolume(val);
break;
case "totalArea":
receiptMaterialDetailDO.setTotalArea(val);
break;
default:
break;
}
} catch (Exception e) {
log.warn("批次属性数值解析失败,物料:{},字段:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), fieldName, attributeValue);
}
}
/**
* 当 PDA 未传 materialMoreDetailList 时,从 receiptMaterialDetailDO 的 batch_number、batch_ref_no、material_status_code 等字段构建,
* 确保更多属性能保存到 material_more_detail 表并正确回显
@@ -729,6 +918,12 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
if (CollectionUtils.isEmpty(list)) {
return result;
}
// 优先使用 attributeOption(如 BatchRefNo、SheetRefNo),其次 fieldName,最后 batchLabels 兜底映射
Map<String, String> attributeOptionToField = new HashMap<>();
attributeOptionToField.put("InvoiceNo", "invoiceNo");
attributeOptionToField.put("BatchRefNo", "batchRefNo");
attributeOptionToField.put("SheetRefNo", "sheetRefNo");
attributeOptionToField.put("BoxPalletNo", "boxPalletNo");
Map<String, String> labelToField = new HashMap<>();
labelToField.put("Batch Ref NO's", "batchRefNo");
labelToField.put("Batch Ref NO", "batchRefNo");
@@ -745,6 +940,9 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
continue;
}
String fieldName = po.getFieldName();
if (StringUtils.isBlank(fieldName) && StringUtils.isNotBlank(po.getAttributeOption())) {
fieldName = attributeOptionToField.get(po.getAttributeOption().trim());
}
if (StringUtils.isBlank(fieldName) && StringUtils.isNotBlank(po.getBatchLabels())) {
fieldName = labelToField.get(po.getBatchLabels().trim());
}
@@ -215,69 +215,62 @@ public class StockReceiptOrderDomainService {
Map<Long, List<MaterialMoreDetailPO>> materialMoreDetailMap = materialMoreDetailPOList.stream()
.collect(Collectors.groupingBy(MaterialMoreDetailPO::getMaterialDetailUniqueId));
receiptMaterialDetailPOList.forEach(receiptMaterialDetailPO -> {
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOChildrenNowList = new ArrayList<>();
//子集(level 2 的真实子项)
//子集(level 2 的真实子项),PDA 端不添加 parent_copy,与 PC 端一致,避免主项重复展示
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOChildrenList = receiptMaterialDetailPO.getChildren();
if (CollectionUtils.isEmpty(receiptMaterialDetailPOChildrenList)) {
//无 level 2 子项时,不添加父级拷贝,避免 PC 端显示重复
receiptMaterialDetailPO.setChildren(receiptMaterialDetailPOChildrenNowList);
return;
}
//有 level 2 子项时,添加父级拷贝(level 1)供 PDA 收货使用
ReceiptMaterialDetailPO receiptMaterialDetailPOChildrenNow = new ReceiptMaterialDetailPO();
BeanUtils.copyProperties(receiptMaterialDetailPO, receiptMaterialDetailPOChildrenNow, "children");
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPO.getUniqueId());
if (!CollectionUtils.isEmpty(materialDetailSerialNumberList)) {
receiptMaterialDetailPOChildrenNow.setMaterialDetailSerialNumberList(materialDetailSerialNumberList);
if (!CollectionUtils.isEmpty(receiptMaterialDetailPOChildrenList)) {
receiptMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> {
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPOChildren.getUniqueId());
if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)) {
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(materialDetailSerialNumberChildrenList);
} else {
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(new ArrayList<>());
}
List<MaterialMoreDetailPO> materialMoreDetailChildrenList = materialMoreDetailMap.get(receiptMaterialDetailPOChildren.getUniqueId());
if (!CollectionUtils.isEmpty(materialMoreDetailChildrenList)) {
receiptMaterialDetailPOChildren.setMaterialMoreDetailList(materialMoreDetailChildrenList);
} else if (CollectionUtils.isEmpty(receiptMaterialDetailPOChildren.getMaterialMoreDetailList())) {
// material_more_detail 表无记录时,queryListChildren 已填充 attributeValue;仅当子项本身无批次属性时才从物料获取
receiptMaterialDetailPOChildren.setMaterialMoreDetailList(getMaterialMoreDetail(receiptMaterialDetailPOChildren));
}
// 否则保留 queryListChildren 已填充的 materialMoreDetailList(含 BatchRefNo、SheetRefNo、BoxPalletNo 等 attributeValue
});
} else {
receiptMaterialDetailPOChildrenNow.setMaterialDetailSerialNumberList(new ArrayList<>());
}
List<MaterialMoreDetailPO> materialMoreDetailList = materialMoreDetailMap.get(receiptMaterialDetailPO.getUniqueId());
if (!CollectionUtils.isEmpty(materialMoreDetailList)) {
receiptMaterialDetailPOChildrenNow.setMaterialMoreDetailList(materialMoreDetailList);
} else {
receiptMaterialDetailPOChildrenNow.setMaterialMoreDetailList(getMaterialMoreDetail(receiptMaterialDetailPO));
}
receiptMaterialDetailPOChildrenNowList.add(receiptMaterialDetailPOChildrenNow);
receiptMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> {
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPOChildren.getUniqueId());
if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)) {
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(materialDetailSerialNumberChildrenList);
} else {
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(new ArrayList<>());
// 主项无子项时(点击分批收货前):确保主项也有批次属性,否则 PDA 不显示
if (CollectionUtils.isEmpty(receiptMaterialDetailPO.getMaterialMoreDetailList())) {
receiptMaterialDetailPO.setMaterialMoreDetailList(getMaterialMoreDetail(receiptMaterialDetailPO));
}
List<MaterialMoreDetailPO> materialMoreDetailChildrenList = materialMoreDetailMap.get(receiptMaterialDetailPOChildren.getUniqueId());
if (!CollectionUtils.isEmpty(materialMoreDetailChildrenList)) {
receiptMaterialDetailPOChildren.setMaterialMoreDetailList(materialMoreDetailChildrenList);
} else {
receiptMaterialDetailPOChildren.setMaterialMoreDetailList(getMaterialMoreDetail(receiptMaterialDetailPO));
}
});
receiptMaterialDetailPOChildrenNowList.addAll(receiptMaterialDetailPOChildrenList);
receiptMaterialDetailPO.setChildren(receiptMaterialDetailPOChildrenNowList);
}
receiptMaterialDetailPO.setChildren(receiptMaterialDetailPOChildrenList != null ? receiptMaterialDetailPOChildrenList : new ArrayList<>());
});
stockReceiptOrderPO.setMaterialDetailList(receiptMaterialDetailPOList);
return stockReceiptOrderPO;
}
/**
* @param receiptMaterialDetailPO
* @return List<MaterialMoreDetail>
* @description 获取物料更多属性
* @author ZhouGY
* @date 2024/7/3 13:46
* 根据物料绑定的批次属性动态获取更多属性(按 materialBaseInfoId,不再使用 MaterialGoodsRule.batchId
* @param receiptMaterialDetailPO 收货明细
* @return List<MaterialMoreDetailPO>
*/
public List<MaterialMoreDetailPO> getMaterialMoreDetail(ReceiptMaterialDetailPO receiptMaterialDetailPO) {
MaterialGoodsRule materialGoodsRule = materialGoodsRuleService.getOne(new QueryWrapper<MaterialGoodsRule>().lambda()
.eq(MaterialGoodsRule::getMaterialBaseInfoId, receiptMaterialDetailPO.getMaterialBaseInfoId()));
List<MaterialMoreDetailPO> materialMoreDetailPOList = new ArrayList<>();
if (materialGoodsRule != null) {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByBatchId(materialGoodsRule.getBatchId());
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取批次信息失败");
Long materialBaseInfoId = receiptMaterialDetailPO != null ? receiptMaterialDetailPO.getMaterialBaseInfoId() : null;
if (materialBaseInfoId == null) {
return materialMoreDetailPOList;
}
try {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
return materialMoreDetailPOList;
}
List<BatchDetailFeignPO> batchDetailFeignPOList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
batchDetailFeignPOList.forEach(batchDetailFeignPO -> {
if (CollectionUtils.isEmpty(batchDetailFeignPOList)) {
return materialMoreDetailPOList;
}
// 只保留 isDisplay=1 的批次属性,与 PC 端 getInfo 一致
for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) {
if (batchDetailFeignPO.getIsDisplay() == null || batchDetailFeignPO.getIsDisplay() != 1) {
continue;
}
MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO();
materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId());
materialMoreDetailPO.setBatchDetailId(batchDetailFeignPO.getBatchDetailId());
@@ -286,7 +279,9 @@ public class StockReceiptOrderDomainService {
materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat());
materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
materialMoreDetailPOList.add(materialMoreDetailPO);
});
}
} catch (Exception e) {
log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage());
}
return materialMoreDetailPOList;
}