PDA收货修改批次属性
This commit is contained in:
+2
@@ -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("货主名称")
|
||||
|
||||
+286
-88
@@ -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_id(PDA 收货创建的子项)或 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_id(PDA 收货)或 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());
|
||||
}
|
||||
|
||||
+45
-50
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user