PDA移位管理批次属性查询修改,库存查询修改

This commit is contained in:
秦鸿展
2026-03-13 16:57:48 +08:00
parent f7fea55e23
commit d7dd8a4567
8 changed files with 447 additions and 36 deletions
@@ -16,6 +16,12 @@ import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService;
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
import com.mhd.wms.domain.inventoryStandingDetail.repository.facade.IInventoryStandingDetailService;
import com.mhd.wms.domain.inventoryStandingDetail.repository.todo.InventoryStandingDetailDO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.domain.BatchDetailFeignPO;
import com.mhd.wms.domain.materialInventory.entity.MaterialInventory;
import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService;
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO;
@@ -68,6 +74,8 @@ public class ShiftManageDomainService {
private IInventoryStandingDetailService inventoryStandingDetailService;
@Autowired
private IDeliveTaskService deliveTaskService;
@Autowired
private SystemServiceFeign systemServiceFeign;
/**
@@ -95,6 +103,10 @@ public class ShiftManageDomainService {
Map<Long, List<OutMaterialDetailSerialNumberPO>> inMaterialDetailSerialNumberMap = outMaterialDetailSerialNumberPOList.stream()
.collect(Collectors.groupingBy(OutMaterialDetailSerialNumberPO::getMaterialDetailUniqueId));
shiftMaterialDetailPOList.forEach(shiftMaterialDetailPO -> {
// PDA移位页面:父级也填充批次属性、净重、毛重、面积、体积,保证顶层结构有值
fillMaterialMoreDetailForShiftDetail(shiftMaterialDetailPO);
// 填充 totalNetWeight 等,供 PDA 表单区(移入数量、移入库位、容器旁)显示
fillTotalWeightVolumeArea(shiftMaterialDetailPO);
List<ShiftMaterialDetailPO> shiftMaterialDetailPOChildrenNowList = new ArrayList<>();
ShiftMaterialDetailPO shiftMaterialDetailPOChildrenNow = new ShiftMaterialDetailPO();
BeanUtils.copyProperties(shiftMaterialDetailPO, shiftMaterialDetailPOChildrenNow, "children");
@@ -104,10 +116,15 @@ public class ShiftManageDomainService {
}else {
shiftMaterialDetailPOChildrenNow.setMaterialDetailSerialNumberList(new ArrayList<>());
}
// 子项副本同步批次属性
shiftMaterialDetailPOChildrenNow.setMaterialMoreDetailList(shiftMaterialDetailPO.getMaterialMoreDetailList());
fillTotalWeightVolumeArea(shiftMaterialDetailPOChildrenNow);
shiftMaterialDetailPOChildrenNowList.add(shiftMaterialDetailPOChildrenNow);
//子集
List<ShiftMaterialDetailPO> shiftMaterialDetailPOChildrenList = shiftMaterialDetailPO.getChildren();
shiftMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> {
fillMaterialMoreDetailForShiftDetail(receiptMaterialDetailPOChildren);
fillTotalWeightVolumeArea(receiptMaterialDetailPOChildren);
List<OutMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(shiftMaterialDetailPO.getUniqueId());
if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)){
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(materialDetailSerialNumberChildrenList);
@@ -122,7 +139,202 @@ public class ShiftManageDomainService {
return shiftManagePO;
}
/**
* PDA移位页面:根据物料批次属性动态填充 materialMoreDetailList,有值显示
* 净重、毛重、体积、面积不在此展示,由 totalNetWeight 等在底部表单区显示
*/
private void fillMaterialMoreDetailForShiftDetail(ShiftMaterialDetailPO shiftMaterialDetailPO) {
if (shiftMaterialDetailPO == null || shiftMaterialDetailPO.getMaterialBaseInfoId() == null) {
shiftMaterialDetailPO.setMaterialMoreDetailList(new ArrayList<>());
return;
}
List<MaterialMoreDetailPO> materialMoreDetailList = new ArrayList<>();
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(shiftMaterialDetailPO.getMaterialBaseInfoId());
if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
List<BatchDetailFeignPO> batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList);
}
// 上面区域不展示净重、毛重、体积、面积,排除这些批次属性
materialMoreDetailList = excludeWeightVolumeAreaFromList(materialMoreDetailList);
fillAttributeValueFromShiftMaterialDetail(shiftMaterialDetailPO, materialMoreDetailList);
// 有值显示:仅保留 attributeValue 非空的批次属性
List<MaterialMoreDetailPO> filtered = materialMoreDetailList.stream()
.filter(m -> m.getAttributeValue() != null && !m.getAttributeValue().trim().isEmpty())
.collect(Collectors.toList());
shiftMaterialDetailPO.setMaterialMoreDetailList(filtered);
}
/**
* 填充 totalNetWeight、totalGrossWeight、totalVolume、totalArea,供 PDA 表单区(移入数量、移入库位、容器旁)显示
* 优先用移位明细,无则用库存
*/
private void fillTotalWeightVolumeArea(ShiftMaterialDetailPO shiftMaterialDetailPO) {
if (shiftMaterialDetailPO == null) {
return;
}
if (shiftMaterialDetailPO.getTotalNetWeight() == null) {
if (shiftMaterialDetailPO.getNetWeight() != null) {
shiftMaterialDetailPO.setTotalNetWeight(shiftMaterialDetailPO.getNetWeight());
} else if (shiftMaterialDetailPO.getMaterialInventoryId() != null) {
MaterialInventory mi = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId());
if (mi != null && mi.getNetWeight() != null) {
shiftMaterialDetailPO.setTotalNetWeight(mi.getNetWeight());
}
}
}
if (shiftMaterialDetailPO.getTotalGrossWeight() == null) {
if (shiftMaterialDetailPO.getGrossWeight() != null) {
shiftMaterialDetailPO.setTotalGrossWeight(shiftMaterialDetailPO.getGrossWeight());
} else if (shiftMaterialDetailPO.getMaterialInventoryId() != null) {
MaterialInventory mi = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId());
if (mi != null && mi.getGrossWeight() != null) {
shiftMaterialDetailPO.setTotalGrossWeight(mi.getGrossWeight());
}
}
}
if (shiftMaterialDetailPO.getTotalVolume() == null) {
if (shiftMaterialDetailPO.getVolume() != null) {
shiftMaterialDetailPO.setTotalVolume(shiftMaterialDetailPO.getVolume());
} else if (shiftMaterialDetailPO.getMaterialInventoryId() != null) {
MaterialInventory mi = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId());
if (mi != null && mi.getVolume() != null) {
shiftMaterialDetailPO.setTotalVolume(mi.getVolume());
}
}
}
if (shiftMaterialDetailPO.getTotalArea() == null) {
if (shiftMaterialDetailPO.getArea() != null) {
shiftMaterialDetailPO.setTotalArea(shiftMaterialDetailPO.getArea());
} else if (shiftMaterialDetailPO.getMaterialInventoryId() != null) {
MaterialInventory mi = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId());
if (mi != null && mi.getArea() != null) {
shiftMaterialDetailPO.setTotalArea(mi.getArea());
}
}
}
}
/** 净重、毛重、体积、面积在移位上面区域不展示,从 materialMoreDetailList 中排除 */
private static final String[] WEIGHT_VOLUME_AREA_LABELS = {
"净重(KG)", "净重", "总净重",
"毛重(KG)", "毛重", "总毛重",
"体积(CBM)", "体积", "总体积",
"面积(SQM)", "面积", "总面积"
};
private List<MaterialMoreDetailPO> excludeWeightVolumeAreaFromList(List<MaterialMoreDetailPO> list) {
if (CollectionUtils.isEmpty(list)) {
return list;
}
return list.stream()
.filter(m -> {
String label = m.getBatchLabels();
if (label == null) return true;
for (String exclude : WEIGHT_VOLUME_AREA_LABELS) {
if (exclude.equals(label.trim())) return false;
}
return true;
})
.collect(Collectors.toList());
}
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;
}
private void fillAttributeValueFromShiftMaterialDetail(ShiftMaterialDetailPO shiftMaterialDetailPO, List<MaterialMoreDetailPO> materialMoreDetailList) {
if (CollectionUtils.isEmpty(materialMoreDetailList)) {
return;
}
MaterialInventory materialInventory = null;
if (shiftMaterialDetailPO.getMaterialInventoryId() != null) {
materialInventory = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId());
}
for (MaterialMoreDetailPO materialMoreDetail : materialMoreDetailList) {
if (materialMoreDetail.getAttributeValue() != null && !materialMoreDetail.getAttributeValue().trim().isEmpty()) {
continue;
}
String batchLabels = materialMoreDetail.getBatchLabels();
String attributeOption = materialMoreDetail.getAttributeOption();
String refVal = null;
// 净重、毛重、面积、体积:优先从移位明细,其次从库存
if (StringUtils.isNotBlank(batchLabels)) {
switch (batchLabels.trim()) {
case "总净重":
case "净重(KG)":
case "净重":
refVal = shiftMaterialDetailPO.getNetWeight() != null ? shiftMaterialDetailPO.getNetWeight().toString()
: (materialInventory != null && materialInventory.getNetWeight() != null ? materialInventory.getNetWeight().toString() : null);
break;
case "总毛重":
case "毛重(KG)":
case "毛重":
refVal = shiftMaterialDetailPO.getGrossWeight() != null ? shiftMaterialDetailPO.getGrossWeight().toString()
: (materialInventory != null && materialInventory.getGrossWeight() != null ? materialInventory.getGrossWeight().toString() : null);
break;
case "总体积":
case "体积(CBM)":
case "体积":
refVal = shiftMaterialDetailPO.getVolume() != null ? shiftMaterialDetailPO.getVolume().toString()
: (materialInventory != null && materialInventory.getVolume() != null ? materialInventory.getVolume().toString() : null);
break;
case "总面积":
case "面积(SQM)":
case "面积":
refVal = shiftMaterialDetailPO.getArea() != null ? shiftMaterialDetailPO.getArea().toString()
: (materialInventory != null && materialInventory.getArea() != null ? materialInventory.getArea().toString() : null);
break;
default:
break;
}
}
if (refVal == null && materialInventory != null) {
if ("InvoiceNo".equalsIgnoreCase(attributeOption) || "Invoice No".equalsIgnoreCase(batchLabels) || "发票号".equals(batchLabels)) {
refVal = materialInventory.getExtAttr1();
} else if ("扩展字段1".equals(batchLabels) || "扩展属性1".equals(batchLabels)) {
refVal = materialInventory.getExtAttr1();
} else if ("扩展字段2".equals(batchLabels) || "扩展属性2".equals(batchLabels)) {
refVal = materialInventory.getExtAttr2();
} else if ("BatchRefNo".equalsIgnoreCase(attributeOption) || "Batch Ref NO's".equalsIgnoreCase(batchLabels) || "批次参考号".equals(batchLabels)) {
refVal = materialInventory.getBatchRefNo();
} else if ("SheetRefNo".equalsIgnoreCase(attributeOption) || "Sheet Ref NO's".equalsIgnoreCase(batchLabels) || "单据参考号".equals(batchLabels)) {
refVal = materialInventory.getSheetRefNo();
} else if ("BoxPalletNo".equalsIgnoreCase(attributeOption) || "Box No./Pallet No.".equalsIgnoreCase(batchLabels) || "箱号/卡板号".equals(batchLabels)) {
refVal = materialInventory.getBoxPalletNo();
} else if (materialInventory.getProductionDate() != null && ("生产日期".equals(batchLabels) || "ProductionDate".equalsIgnoreCase(attributeOption))) {
refVal = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(materialInventory.getProductionDate());
} else if (materialInventory.getExpiryDate() != null && ("过期日期".equals(batchLabels) || "ExpiryDate".equalsIgnoreCase(attributeOption))) {
refVal = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(materialInventory.getExpiryDate());
} else if (materialInventory.getInventoryDate() != null && ("存货日期".equals(batchLabels) || "InventoryDate".equalsIgnoreCase(attributeOption))) {
refVal = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(materialInventory.getInventoryDate());
} else if (materialInventory.getExtAttr3() != null && ("扩展字段3".equals(batchLabels) || "扩展属性3".equals(batchLabels))) {
refVal = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(materialInventory.getExtAttr3());
} else if (materialInventory.getExtAttr4() != null && ("扩展字段4".equals(batchLabels) || "扩展属性4".equals(batchLabels))) {
refVal = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(materialInventory.getExtAttr4());
}
}
if (refVal != null) {
materialMoreDetail.setAttributeValue(refVal);
}
}
}
/**
* 新增移位管理
@@ -259,6 +259,21 @@ public class ShiftMaterialDetailPO extends BaseVOEntity {
@Excel(name = "面积")
private BigDecimal area;
@ApiModelProperty("总净重(KG)PDA 表单区显示")
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
@ApiModelProperty("总毛重(KG)PDA 表单区显示")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("总体积(CBM)PDA 表单区显示")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
@ApiModelProperty("总面积(SQM)PDA 表单区显示")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
@ApiModelProperty("移位详情")
@TableField(exist = false)
@@ -264,6 +264,15 @@ public class ShiftMaterialDetailDO extends BaseVOEntity {
@Excel(name = "面积")
private BigDecimal area;
@ApiModelProperty("总净重(KG),PDA 表单区修改后回传")
private BigDecimal totalNetWeight;
@ApiModelProperty("总毛重(KG),PDA 表单区修改后回传")
private BigDecimal totalGrossWeight;
@ApiModelProperty("总体积(CBM),PDA 表单区修改后回传")
private BigDecimal totalVolume;
@ApiModelProperty("总面积(SQM),PDA 表单区修改后回传")
private BigDecimal totalArea;
@ApiModelProperty("移位详情")
@TableField(exist = false)
private List<ShiftMaterialDetailDO> children;