PDA入库[收货,上架修改]

This commit is contained in:
秦鸿展
2026-03-14 10:09:23 +08:00
parent 51a7501da6
commit 4aa41a0366
4 changed files with 163 additions and 12 deletions
@@ -3,6 +3,7 @@ package com.mhd.wms.domain.stockOutTaskOrder.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.mhd.common.core.exception.ServiceException;
@@ -37,6 +38,7 @@ import com.mhd.wms.domain.stockOutTaskOrder.repository.po.StockOutTaskOrderPO;
import com.mhd.wms.domain.stockOutTaskOrder.repository.po.TaskMaterialPO;
import com.mhd.wms.domain.stockOutTaskOrder.repository.po.TaskStoragePO;
import com.mhd.wms.domain.stockOutTaskOrder.repository.todo.StockOutTaskOrderDO;
import com.mhd.wms.domain.taskPickingMaterialDetail.entity.TaskPickingMaterialDetail;
import com.mhd.wms.domain.taskPickingMaterialDetail.repository.facade.ITaskPickingMaterialDetailService;
import com.mhd.wms.domain.taskPickingMaterialDetail.repository.po.TaskPickingMaterialDetailPO;
import com.mhd.wms.domain.taskPickingMaterialDetail.repository.todo.TaskPickingMaterialDetailDO;
@@ -96,9 +98,64 @@ public class StockOutTaskOrderDomainService {
/**
* 分页查询拣货作业单列表
* 列表返回前补充拣货进度:materialQuantity=拣货明细种类数,pickingMaterialQuantity=已完成种类数,用于显示 已完成数/总数
*/
public List<StockOutTaskOrderPO> queryList(StockOutTaskOrderDO stockOutTaskOrderDO) {
return stockOutTaskOrderService.queryList(stockOutTaskOrderDO);
List<StockOutTaskOrderPO> list = stockOutTaskOrderService.queryList(stockOutTaskOrderDO);
if (CollectionUtil.isEmpty(list)) {
return list;
}
enrichListWithPickingProgress(list);
return list;
}
/**
* 为拣货作业单列表补充拣货进度(materialQuantity、pickingMaterialQuantity
*/
private void enrichListWithPickingProgress(List<StockOutTaskOrderPO> list) {
List<String> taskNumberList = list.stream()
.map(StockOutTaskOrderPO::getTaskNumber)
.filter(taskNumber -> taskNumber != null && !taskNumber.isEmpty())
.distinct()
.collect(Collectors.toList());
if (CollectionUtil.isEmpty(taskNumberList)) {
return;
}
List<TaskPickingMaterialDetail> detailList = taskPickingMaterialDetailService.list(
new LambdaQueryWrapper<TaskPickingMaterialDetail>()
.in(TaskPickingMaterialDetail::getTaskNumber, taskNumberList));
if (CollectionUtils.isEmpty(detailList)) {
return;
}
// 按 task_number -> material_base_info_id 分组,汇总 quantity、pickingQuantity
Map<String, Map<Long, List<TaskPickingMaterialDetail>>> taskToMaterialMap = detailList.stream()
.collect(Collectors.groupingBy(TaskPickingMaterialDetail::getTaskNumber,
Collectors.groupingBy(TaskPickingMaterialDetail::getMaterialBaseInfoId)));
for (StockOutTaskOrderPO po : list) {
String taskNumber = po.getTaskNumber();
if (taskNumber == null) {
continue;
}
Map<Long, List<TaskPickingMaterialDetail>> materialMap = taskToMaterialMap.get(taskNumber);
if (materialMap == null || materialMap.isEmpty()) {
continue;
}
int totalMaterialQuantity = materialMap.size();
int completedMaterialQuantity = 0;
for (List<TaskPickingMaterialDetail> materialDetails : materialMap.values()) {
BigDecimal quantity = BigDecimal.ZERO;
BigDecimal pickingQuantity = BigDecimal.ZERO;
for (TaskPickingMaterialDetail d : materialDetails) {
quantity = quantity.add(d.getQuantity() != null ? d.getQuantity() : BigDecimal.ZERO);
pickingQuantity = pickingQuantity.add(d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO);
}
if (pickingQuantity.compareTo(quantity) >= 0 && quantity.compareTo(BigDecimal.ZERO) > 0) {
completedMaterialQuantity++;
}
}
po.setMaterialQuantity(totalMaterialQuantity);
po.setPickingMaterialQuantity(completedMaterialQuantity);
}
}
@@ -160,6 +217,8 @@ public class StockOutTaskOrderDomainService {
totalPickingMaterialQuantity += 1;
}
}
// 拣货进度:已完成数/拣货明细总数(按物料分组)
stockOutTaskOrderPO.setMaterialQuantity(taskPickingMaterialDetailPOMap.size());
stockOutTaskOrderPO.setPickingMaterialQuantity(totalPickingMaterialQuantity);
stockOutTaskOrderPO.setMaterialDetailList(taskPickingMaterialDetailPOList);
return stockOutTaskOrderPO;
@@ -180,22 +239,39 @@ public class StockOutTaskOrderDomainService {
// .collect(Collectors.groupingBy(OutMaterialDetailSerialNumberPO::getMaterialDetailUniqueId));
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO);
Map<Long, List<TaskPickingMaterialDetailPO>> taskPickingMaterialDetailPOMap = taskPickingMaterialDetailPOList.stream().collect(Collectors.groupingBy(TaskPickingMaterialDetailPO::getStorageLocationId));
int totalPickingMaterialQuantity = 0;//拣货单按库位分组 统计已拣货进度
int totalPickingMaterialQuantity = 0;//拣货单按库位分组 统计已拣货进度(含已完成的库位)
int totalStorageCount = taskPickingMaterialDetailPOMap.size();
List<TaskStoragePO> taskStoragePOList = new ArrayList<>();
for (Map.Entry<Long, List<TaskPickingMaterialDetailPO>> map : taskPickingMaterialDetailPOMap.entrySet()){
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOListByMaterial = map.getValue();
if (CollectionUtil.isEmpty(taskPickingMaterialDetailPOListByMaterial)){
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOListByStorage = map.getValue();
if (CollectionUtil.isEmpty(taskPickingMaterialDetailPOListByStorage)){
continue;
}
BigDecimal quantityAll = BigDecimal.ZERO;
BigDecimal pickingQuantityAll = BigDecimal.ZERO;
for (TaskPickingMaterialDetailPO d : taskPickingMaterialDetailPOListByStorage) {
quantityAll = quantityAll.add(d.getQuantity() != null ? d.getQuantity() : BigDecimal.ZERO);
pickingQuantityAll = pickingQuantityAll.add(d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO);
}
if (quantityAll.compareTo(BigDecimal.ZERO) > 0 && pickingQuantityAll.compareTo(quantityAll) >= 0){
totalPickingMaterialQuantity += 1;
}
// 过滤掉已拣货完成的明细,只展示待拣货的
List<TaskPickingMaterialDetailPO> incompleteList = taskPickingMaterialDetailPOListByStorage.stream()
.filter(d -> d.getQuantity() != null && (d.getPickingQuantity() == null || d.getPickingQuantity().compareTo(d.getQuantity()) < 0))
.collect(Collectors.toList());
if (CollectionUtil.isEmpty(incompleteList)){
continue;
}
TaskStoragePO taskStoragePO = new TaskStoragePO();
BeanUtils.copyProperties(taskPickingMaterialDetailPOListByMaterial.get(0), taskStoragePO);
BeanUtils.copyProperties(incompleteList.get(0), taskStoragePO);
BigDecimal quantity = BigDecimal.ZERO;
BigDecimal pickingQuantity = BigDecimal.ZERO;
BigDecimal waitPickingQuantity = BigDecimal.ZERO;
for (TaskPickingMaterialDetailPO taskPickingMaterialDetailPO : taskPickingMaterialDetailPOListByMaterial) {
for (TaskPickingMaterialDetailPO taskPickingMaterialDetailPO : incompleteList) {
quantity = quantity.add(taskPickingMaterialDetailPO.getQuantity());
pickingQuantity = pickingQuantity.add(taskPickingMaterialDetailPO.getPickingQuantity());
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity());
pickingQuantity = pickingQuantity.add(taskPickingMaterialDetailPO.getPickingQuantity() != null ? taskPickingMaterialDetailPO.getPickingQuantity() : BigDecimal.ZERO);
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity() != null ? taskPickingMaterialDetailPO.getWaitPickingQuantity() : BigDecimal.ZERO);
}
taskStoragePO.setQuantity(quantity);
taskStoragePO.setPickingQuantity(pickingQuantity);
@@ -203,12 +279,11 @@ public class StockOutTaskOrderDomainService {
//判断拣货数量是否等于计划数量
Integer pickingStatus = judgePickingQuantity(pickingQuantity, quantity);
taskStoragePO.setPickingStatus(pickingStatus);
taskStoragePO.setTaskPickingMaterialDetailList(taskPickingMaterialDetailPOListByMaterial);
taskStoragePO.setTaskPickingMaterialDetailList(incompleteList);
taskStoragePOList.add(taskStoragePO);
if (pickingStatus > 2){
totalPickingMaterialQuantity += 1;
}
}
// 拣货进度:已完成数/拣货明细总数(按库位分组,几种库位就几种明细)
stockOutTaskOrderPO.setMaterialQuantity(totalStorageCount);
stockOutTaskOrderPO.setPickingMaterialQuantity(totalPickingMaterialQuantity);
stockOutTaskOrderPO.setTaskStorageList(taskStoragePOList);
return stockOutTaskOrderPO;
@@ -252,6 +327,8 @@ public class StockOutTaskOrderDomainService {
totalPickingMaterialQuantity += 1;
}
}
// 拣货进度:已完成数/拣货明细总数(按物料分组,几种物料就几种明细)
stockOutTaskOrderPO.setMaterialQuantity(taskMaterialPOList.size());
stockOutTaskOrderPO.setPickingMaterialQuantity(totalPickingMaterialQuantity);
stockOutTaskOrderPO.setTaskMaterialList(taskMaterialPOList);
return stockOutTaskOrderPO;