WMS出库查询问题修改

This commit is contained in:
秦鸿展
2026-04-18 11:43:33 +08:00
parent bd2a5915ba
commit e0b3ddff04
10 changed files with 138 additions and 26 deletions
@@ -36,9 +36,11 @@ import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import com.mhd.wms.domain.outMaterialDetail.service.OutMaterialDetailDomainService;
import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
import com.mhd.wms.domain.receiptOrderAccount.entity.ReceiptOrderAccount;
@@ -187,39 +189,61 @@ public class StockOutOrderApplicationService {
}
List<StockOutOrderPO> stockOutOrderPOS = stockOutOrderDomainService.queryList(stockOutOrderDO);
if (CollectionUtils.isEmpty(stockOutOrderPOS)) {
return stockOutOrderPOS;
}
List<String> outOrderNumbers = stockOutOrderPOS.stream()
.map(StockOutOrderPO::getOutOrderNumber)
.filter(Objects::nonNull)
.collect(Collectors.toList());
List<Long> orderIds = stockOutOrderPOS.stream()
.map(StockOutOrderPO::getOutOrderId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
Map<String, OutStockListMaterialAgg> materialAggByNum = outMaterialDetailService.selectAggregatesForStockOutList(outOrderNumbers).stream()
.collect(Collectors.toMap(OutStockListMaterialAgg::getOutOrderNumber, Function.identity(), (a, b) -> a));
Map<String, PickingAggByOutOrderRow> pickingAggByNum = pickingMaterialDetailService.listPickingAggregatesByOutOrderNumbers(outOrderNumbers).stream()
.collect(Collectors.toMap(PickingAggByOutOrderRow::getOutOrderNumber, Function.identity(), (a, b) -> a));
Map<Long, List<ReceiptOrderAccount>> accountByOrderId = Collections.emptyMap();
if (!CollectionUtils.isEmpty(orderIds)) {
List<ReceiptOrderAccount> accounts = receiptOrderAccountService.list(
new LambdaQueryWrapper<ReceiptOrderAccount>().in(ReceiptOrderAccount::getOrderId, orderIds));
accountByOrderId = accounts.stream().collect(Collectors.groupingBy(ReceiptOrderAccount::getOrderId));
}
for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOS) {
StockOutOrderPO stockOutOrderPO1 = stockOutOrderDomainService.getInfoChildren(stockOutOrderPO.getOutOrderId());
List<OutMaterialDetailPO> materialDetailList = stockOutOrderPO1 != null ? stockOutOrderPO1.getMaterialDetailList() : null;
if (materialDetailList == null) {
materialDetailList = Collections.emptyList();
}
BigDecimal reduce = materialDetailList.stream().map(OutMaterialDetailPO::getOutboundQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderPO.setTotalOutboundQuantity(reduce);
stockOutOrderPO.setAllocationQuantity(stockOutOrderPO1 != null ? stockOutOrderPO1.getAllocationQuantity() : null);
String outOrderNumber = stockOutOrderPO.getOutOrderNumber();
// PDA复核物料总数量:使用实际下发时的拣货完成数量(picking_material_detail),拣货多少显示多少
// PDA端物料总数量取quantity字段、复核总数量取checkQuantity字段,需同时设置quantity和pickingQuantity
BigDecimal actualPickingQty = pickingMaterialDetailService.sumPickingQuantityByOutOrderNumber(outOrderNumber);
BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0 ? actualPickingQty : (stockOutOrderPO1 != null ? stockOutOrderPO1.getPickingQuantity() : BigDecimal.ZERO);
OutStockListMaterialAgg mag = materialAggByNum.get(outOrderNumber);
BigDecimal reduce = (mag != null && mag.getTotalOutboundQuantity() != null)
? mag.getTotalOutboundQuantity() : BigDecimal.ZERO;
stockOutOrderPO.setTotalOutboundQuantity(reduce);
// allocation_quantity / picking_quantity(主表)已在 queryList 的 SQL 中带出,无需再 getInfo
PickingAggByOutOrderRow pk = pickingAggByNum.get(outOrderNumber);
BigDecimal actualPickingQty = (pk != null && pk.getSumPickingQty() != null)
? pk.getSumPickingQty() : BigDecimal.ZERO;
BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0
? actualPickingQty
: (stockOutOrderPO.getPickingQuantity() != null ? stockOutOrderPO.getPickingQuantity() : BigDecimal.ZERO);
stockOutOrderPO.setPickingQuantity(displayPickingQty);
stockOutOrderPO.setQuantity(displayPickingQty);
// 物料种类:优先从picking_material_detail统计,为0时从out_material_detail按料号去重
Integer materialTypeCount = pickingMaterialDetailService.countMaterialTypesByOutOrderNumber(outOrderNumber);
Integer materialTypeCount = pk != null ? pk.getMaterialTypeCount() : null;
if (materialTypeCount != null && materialTypeCount > 0) {
stockOutOrderPO.setMaterialQuantity(materialTypeCount);
} else {
long count = materialDetailList.stream()
.map(d -> d.getMaterialBaseInfoId() != null ? String.valueOf(d.getMaterialBaseInfoId()) : d.getMaterialCode())
.filter(Objects::nonNull)
.distinct()
.count();
stockOutOrderPO.setMaterialQuantity((int) count);
int cnt = (mag != null && mag.getMaterialKindCountDistinct() != null)
? mag.getMaterialKindCountDistinct() : 0;
stockOutOrderPO.setMaterialQuantity(cnt);
}
// 复核总数量:从out_material_detail汇总check_quantity
BigDecimal checkSum = materialDetailList.stream().map(OutMaterialDetailPO::getCheckQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal checkSum = (mag != null && mag.getCheckQuantitySum() != null)
? mag.getCheckQuantitySum() : BigDecimal.ZERO;
stockOutOrderPO.setCheckQuantity(checkSum);
List<ReceiptOrderAccount> list = receiptOrderAccountService.list(new LambdaQueryWrapper<ReceiptOrderAccount>().eq(ReceiptOrderAccount::getOrderId, stockOutOrderPO.getOutOrderId()));
stockOutOrderPO.setReceiptOrderAccountList(list);
stockOutOrderPO.setReceiptOrderAccountList(
accountByOrderId.getOrDefault(stockOutOrderPO.getOutOrderId(), Collections.emptyList()));
}
return stockOutOrderPOS;
}
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO;
@@ -35,6 +36,11 @@ public interface IOutMaterialDetailService extends IService<OutMaterialDetail>
public List<OutMaterialDetailPO> queryListChildren(OutMaterialDetailDO outMaterialDetailDO);
/**
* 出库列表页:按出库单号批量聚合明细(仅 level=1)
*/
List<OutStockListMaterialAgg> selectAggregatesForStockOutList(List<String> outOrderNumbers);
/**
* 新增物料明细
*/
@@ -3,8 +3,10 @@ package com.mhd.wms.domain.outMaterialDetail.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -53,4 +55,9 @@ public interface OutMaterialDetailMapper extends BaseMapper<OutMaterialDetail>
* @return int
*/
public int batchAddPickingQuantityByUniqueIds(OutMaterialDetailDO outMaterialDetailDO);
/**
* 出库列表页:按出库单号批量聚合(仅 level=1)
*/
List<OutStockListMaterialAgg> selectAggregatesForStockOutList(@Param("outOrderNumbers") List<String> outOrderNumbers);
}
@@ -33,6 +33,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetail
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import com.mhd.wms.domain.outMaterialDetailSerialNumber.entity.OutMaterialDetailSerialNumber;
@@ -117,6 +118,14 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
return outMaterialDetailParentList;
}
@Override
public List<OutStockListMaterialAgg> selectAggregatesForStockOutList(List<String> outOrderNumbers) {
if (CollectionUtils.isEmpty(outOrderNumbers)) {
return Collections.emptyList();
}
return outMaterialDetailMapper.selectAggregatesForStockOutList(outOrderNumbers);
}
private List<OutMaterialDetailPO> getChildren(Long parentUniqueId, List<OutMaterialDetailPO> materialDetailPOList, Integer maxLevel){
List<OutMaterialDetailPO> childrenCityList = materialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(childrenCityList)){
@@ -2,6 +2,7 @@ package com.mhd.wms.domain.pickingMaterialDetail.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate;
@@ -37,6 +38,11 @@ public interface IPickingMaterialDetailService extends IService<PickingMaterialD
*/
Integer countMaterialTypesByOutOrderNumber(String outOrderNumber);
/**
* 出库列表页:按出库单号批量汇总拣货与物料种类
*/
List<PickingAggByOutOrderRow> listPickingAggregatesByOutOrderNumbers(List<String> outOrderNumbers);
/**
* 新增拣货单物料明细
*/
@@ -2,6 +2,7 @@ package com.mhd.wms.domain.pickingMaterialDetail.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate;
@@ -35,6 +36,11 @@ public interface PickingMaterialDetailMapper extends BaseMapper<PickingMaterialD
*/
Integer countMaterialTypesByOutOrderNumber(@Param("outOrderNumber") String outOrderNumber);
/**
* 出库列表页:按出库单号批量汇总拣货数量与有拣货的物料种类数
*/
List<PickingAggByOutOrderRow> listPickingAggregatesByOutOrderNumbers(@Param("outOrderNumbers") List<String> outOrderNumbers);
/**
* 按出库单号查询有拣货数量的 out_unique_id 列表(= out_material_detail.unique_id,即复核单上的明细)
*/
@@ -16,6 +16,7 @@ import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.todo.OutMater
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService;
import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate;
@@ -78,6 +79,15 @@ public class PickingMaterialDetailImpl extends ServiceImpl<PickingMaterialDetail
return count != null ? count : 0;
}
@Override
public List<PickingAggByOutOrderRow> listPickingAggregatesByOutOrderNumbers(List<String> outOrderNumbers) {
if (CollectionUtils.isEmpty(outOrderNumbers)) {
return Collections.emptyList();
}
List<PickingAggByOutOrderRow> rows = pickingMaterialDetailMapper.listPickingAggregatesByOutOrderNumbers(outOrderNumbers);
return rows != null ? rows : Collections.emptyList();
}
/**
* 新增拣货单物料明细
*/