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();
}
/**
* 新增拣货单物料明细
*/
@@ -409,4 +409,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{item.uniqueId}
</foreach>
</update>
<!-- 出库列表:按单号批量聚合(仅 level=1,与列表上对父行汇总一致) -->
<select id="selectAggregatesForStockOutList" resultType="com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg">
SELECT
a.out_order_number AS outOrderNumber,
COALESCE(SUM(a.outbound_quantity), 0) AS totalOutboundQuantity,
COALESCE(SUM(a.check_quantity), 0) AS checkQuantitySum,
COUNT(DISTINCT CASE
WHEN a.material_base_info_id IS NOT NULL THEN CAST(a.material_base_info_id AS VARCHAR(50))
ELSE a.material_code
END) AS materialKindCountDistinct
FROM out_material_detail a
WHERE a.del_flag = 1
AND a.level = 1
AND a.out_order_number IN
<foreach collection="outOrderNumbers" item="num" open="(" separator="," close=")">
#{num}
</foreach>
GROUP BY a.out_order_number
</select>
</mapper>
@@ -229,6 +229,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND COALESCE(pmd.PICKING_QUANTITY, 0) > 0
</select>
<select id="listPickingAggregatesByOutOrderNumbers"
resultType="com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow">
SELECT
omd.out_order_number AS outOrderNumber,
COALESCE(SUM(pmd.picking_quantity), 0) AS sumPickingQty,
COUNT(DISTINCT CASE WHEN COALESCE(pmd.picking_quantity, 0) &gt; 0 THEN pmd.material_base_info_id END) AS materialTypeCount
FROM out_material_detail omd
LEFT JOIN picking_material_detail pmd ON pmd.out_unique_id = omd.unique_id AND pmd.del_flag = 1
WHERE omd.out_order_number IN
<foreach collection="outOrderNumbers" item="num" open="(" separator="," close=")">
#{num}
</foreach>
AND omd.del_flag = 1
GROUP BY omd.out_order_number
</select>
<select id="selectOutUniqueIdsWithPickingByOutOrderNumber" resultType="java.lang.Long">
SELECT DISTINCT pmd.OUT_UNIQUE_ID
FROM picking_material_detail pmd
@@ -33,7 +33,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="directWarehouse" column="direct_warehouse" />
<result property="review" column="review" />
<result property="annexUrl" column="annex_url" />
<result property="materialQuantity" column="material_quantity" />
<result property="quantity" column="quantity" />
<result property="weightLimit" column="weight_limit" />
<result property="volumeLimit" column="volume_limit" />
<result property="allocationQuantity" column="allocation_quantity" />
<result property="alreadyAllocationQuantity" column="already_allocation_quantity" />
<result property="pickingQuantity" column="picking_quantity" />
<result property="checkQuantity" column="check_quantity" />
<result property="cancelOrder" column="cancel_order" />
<result property="cancelRemark" column="cancel_remark" />
<result property="cancelBy" column="cancel_by" />
@@ -93,7 +100,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.out_order_id, a.organization_id, a.organization_name, a.top_organization_id, a.receipt_notice_id, a.notice_number, a.out_order_number, a.status,
a.audit_status, a.audit_remark, a.audit_by, a.audit_by_name, a.audit_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_code,
a.shipper_name, a.order_type_code, a.order_type_name, a.customer_id, a.customer_code, a.customer_name, a.expect_time, a.supply_chain_number, a.priority_level_code,
a.priority_level_name, a.direct_warehouse, a.review, a.annex_url, a.material_quantity, a.quantity, a.weight_limit, a.volume_limit, a.check_quantity, a.cancel_order, a.cancel_remark, a.cancel_by, a.cancel_by_name,
a.priority_level_name, a.direct_warehouse, a.review, a.annex_url, a.material_quantity, a.quantity, a.weight_limit, a.volume_limit,
a.allocation_quantity, a.already_allocation_quantity, a.picking_quantity, a.check_quantity, a.cancel_order, a.cancel_remark, a.cancel_by, a.cancel_by_name,
a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.check_status,
a.check_task_distribution, a.check_task_distribution_time, a.check_operators_by, a.check_operators_name, a.mobilize_code,
a.remark, a.create_time, a.create_by, a.create_by_name,