WMS出库查询问题修改
This commit is contained in:
+49
-25
@@ -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;
|
||||
}
|
||||
|
||||
+6
@@ -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);
|
||||
|
||||
/**
|
||||
* 新增物料明细
|
||||
*/
|
||||
|
||||
+7
@@ -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);
|
||||
}
|
||||
|
||||
+9
@@ -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)){
|
||||
|
||||
+6
@@ -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);
|
||||
|
||||
/**
|
||||
* 新增拣货单物料明细
|
||||
*/
|
||||
|
||||
+6
@@ -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,即复核单上的明细)
|
||||
*/
|
||||
|
||||
+10
@@ -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>
|
||||
+16
@@ -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) > 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,
|
||||
|
||||
Reference in New Issue
Block a user