fix(wms):出入库查询和导出修改

This commit is contained in:
zhaoqing
2026-08-11 17:46:49 +08:00
parent 40a906a9fb
commit 8b4e785de3
18 changed files with 161 additions and 0 deletions
@@ -36,6 +36,7 @@ import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrder
import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg;
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO;
import com.mhd.wms.domain.materialBaseInfo.entity.MaterialBaseInfo;
import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService;
@@ -242,7 +243,38 @@ public class StockInOrderApplicationService {
}
}
List<StockInOrderPO> stockInOrderPOS = stockInOrderDomainService.queryList(stockInOrderDO);
if (CollectionUtils.isEmpty(stockInOrderPOS)) {
return stockInOrderPOS;
}
List<String> inOrderNumbers = stockInOrderPOS.stream()
.map(StockInOrderPO::getInOrderNumber)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 列表页展示:按入库单号批量取去重后的 Invoice No
Map<String, String> invoiceNoByNum = new HashMap<>();
inMaterialDetailService.selectDistinctInvoiceNoForStockInList(inOrderNumbers)
.stream()
.filter(a -> StringUtils.isNotBlank(a.getInvoiceNo()))
.forEach(a -> invoiceNoByNum.merge(a.getInOrderNumber(), a.getInvoiceNo().trim(), (o, n) -> o + "," + n));
// 导出场景(needDetail=true):批量取出完整明细树(level=1 父行 + children),按入库单号分组挂到列表
Map<String, List<InMaterialDetailPO>> detailByNum = Collections.emptyMap();
if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(inOrderNumbers)) {
InMaterialDetailDO detailQuery = new InMaterialDetailDO();
detailQuery.setInOrderNumberList(inOrderNumbers);
List<InMaterialDetailPO> detailTreeList = inMaterialDetailService.queryListChildren(detailQuery);
detailByNum = detailTreeList.stream()
.collect(Collectors.groupingBy(InMaterialDetailPO::getInOrderNumber));
}
for (StockInOrderPO stockInOrderPO : stockInOrderPOS) {
if (invoiceNoByNum.containsKey(stockInOrderPO.getInOrderNumber())) {
stockInOrderPO.setInvoiceNo(invoiceNoByNum.get(stockInOrderPO.getInOrderNumber()));
}
if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail())) {
stockInOrderPO.setMaterialDetailList(detailByNum.getOrDefault(stockInOrderPO.getInOrderNumber(), Collections.emptyList()));
}
Long inOrderId = stockInOrderPO.getInOrderId();
List<ReceiptOrderAccount> list = receiptOrderAccountService.list(new LambdaQueryWrapper<ReceiptOrderAccount>().eq(ReceiptOrderAccount::getOrderId, inOrderId).eq(ReceiptOrderAccount::getInOrOut, "in"));
stockInOrderPO.setReceiptOrderAccountList(list);
@@ -253,9 +253,33 @@ public class StockOutOrderApplicationService {
accountByOrderId = accounts.stream().collect(Collectors.groupingBy(ReceiptOrderAccount::getOrderId));
}
// 列表页展示按出库单号批量取去重后的 Invoice No
Map<String, String> invoiceNoByNum = new HashMap<>();
outMaterialDetailService.selectDistinctInvoiceNoForStockOutList(outOrderNumbers)
.stream()
.filter(a -> StringUtils.isNotBlank(a.getInvoiceNo()))
.forEach(a -> invoiceNoByNum.merge(a.getOutOrderNumber(), a.getInvoiceNo().trim(), (o, n) -> o + "," + n));
// 导出场景needDetail=true批量取出完整明细树level=1 父行 + children按出库单号分组挂到列表
Map<String, List<OutMaterialDetailPO>> detailByNum = Collections.emptyMap();
if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(outOrderNumbers)) {
OutMaterialDetailDO detailQuery = new OutMaterialDetailDO();
detailQuery.setOutOrderNumberList(outOrderNumbers);
List<OutMaterialDetailPO> detailTreeList = outMaterialDetailService.queryListChildren(detailQuery);
detailByNum = detailTreeList.stream()
.collect(Collectors.groupingBy(OutMaterialDetailPO::getOutOrderNumber));
}
for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOS) {
String outOrderNumber = stockOutOrderPO.getOutOrderNumber();
if (invoiceNoByNum.containsKey(outOrderNumber)) {
stockOutOrderPO.setInvoiceNo(invoiceNoByNum.get(outOrderNumber));
}
if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail())) {
stockOutOrderPO.setMaterialDetailList(detailByNum.getOrDefault(outOrderNumber, Collections.emptyList()));
}
List<DeliveryDetailsLink> list = deliveryDetailsLinkService.list(new LambdaQueryWrapper<DeliveryDetailsLink>().eq(DeliveryDetailsLink::getOrderNumber, outOrderNumber));
stockOutOrderPO.setDeliveryDetailsLinkList(list);
@@ -3,6 +3,7 @@ package com.mhd.wms.domain.inMaterialDetail.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg;
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO;
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO;
import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO;
@@ -31,6 +32,11 @@ public interface IInMaterialDetailService extends IService<InMaterialDetail>
*/
public List<InMaterialDetailPO> queryListChildren(InMaterialDetailDO inMaterialDetailDO);
/**
* 入库列表页按入库单号批量取去重后的 Invoice No level=1
*/
List<InStockListMaterialAgg> selectDistinctInvoiceNoForStockInList(List<String> inOrderNumbers);
/**
* 新增物料明细
*/
@@ -3,8 +3,10 @@ package com.mhd.wms.domain.inMaterialDetail.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg;
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO;
import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -26,4 +28,9 @@ public interface InMaterialDetailMapper extends BaseMapper<InMaterialDetail>
*/
public List<InMaterialDetailPO> queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO);
/**
* 入库列表页按入库单号批量取去重后的 Invoice No level=1
*/
List<InStockListMaterialAgg> selectDistinctInvoiceNoForStockInList(@Param("inOrderNumbers") List<String> inOrderNumbers);
}
@@ -14,6 +14,7 @@ import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService;
import com.mhd.wms.domain.inMaterialDetail.repository.mapper.InMaterialDetailMapper;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO;
import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg;
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO;
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO;
import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService;
@@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -86,6 +88,14 @@ public class InMaterialDetailImpl extends ServiceImpl<InMaterialDetailMapper, In
return inMaterialDetailPOParentList;
}
@Override
public List<InStockListMaterialAgg> selectDistinctInvoiceNoForStockInList(List<String> inOrderNumbers) {
if (CollectionUtils.isEmpty(inOrderNumbers)) {
return Collections.emptyList();
}
return inMaterialDetailMapper.selectDistinctInvoiceNoForStockInList(inOrderNumbers);
}
private List<InMaterialDetailPO> getChildren(Long parentUniqueId, List<InMaterialDetailPO> inMaterialDetailPOList, Integer maxLevel){
List<InMaterialDetailPO> childrenCityList = inMaterialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(childrenCityList)){
@@ -0,0 +1,12 @@
package com.mhd.wms.domain.inMaterialDetail.repository.po;
import lombok.Data;
/**
* 入库列表页批量取去重后的 Invoice No
*/
@Data
public class InStockListMaterialAgg {
private String inOrderNumber;
private String invoiceNo;
}
@@ -41,6 +41,11 @@ public interface IOutMaterialDetailService extends IService<OutMaterialDetail>
*/
List<OutStockListMaterialAgg> selectAggregatesForStockOutList(List<String> outOrderNumbers);
/**
* 出库列表页按出库单号批量取去重后的 Invoice No level=1
*/
List<OutStockListMaterialAgg> selectDistinctInvoiceNoForStockOutList(List<String> outOrderNumbers);
/**
* 新增物料明细
*/
@@ -60,4 +60,9 @@ public interface OutMaterialDetailMapper extends BaseMapper<OutMaterialDetail>
* 出库列表页按出库单号批量聚合 level=1
*/
List<OutStockListMaterialAgg> selectAggregatesForStockOutList(@Param("outOrderNumbers") List<String> outOrderNumbers);
/**
* 出库列表页按出库单号批量取去重后的 Invoice No level=1
*/
List<OutStockListMaterialAgg> selectDistinctInvoiceNoForStockOutList(@Param("outOrderNumbers") List<String> outOrderNumbers);
}
@@ -130,6 +130,14 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
return outMaterialDetailMapper.selectAggregatesForStockOutList(outOrderNumbers);
}
@Override
public List<OutStockListMaterialAgg> selectDistinctInvoiceNoForStockOutList(List<String> outOrderNumbers) {
if (CollectionUtils.isEmpty(outOrderNumbers)) {
return Collections.emptyList();
}
return outMaterialDetailMapper.selectDistinctInvoiceNoForStockOutList(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)){
@@ -13,4 +13,6 @@ public class OutStockListMaterialAgg {
private BigDecimal totalOutboundQuantity;
private BigDecimal checkQuantitySum;
private Integer materialKindCountDistinct;
/** 列表页展示用:该出库单的 Invoice No */
private String invoiceNo;
}
@@ -235,6 +235,9 @@ public class StockInOrderPO extends BaseVOEntity {
@Excel(name = "备注")
private String remark;
@ApiModelProperty("Invoice No(多个用逗号隔开)")
private String invoiceNo;
@ApiModelProperty("物料明细")
private List<InMaterialDetailPO> materialDetailList;
@@ -448,4 +448,7 @@ public class StockInOrderDO extends BaseVOEntity {
@ApiModelProperty("任务移除用户ID")
private String removeUserId;
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
}
@@ -256,6 +256,9 @@ public class StockOutOrderPO extends BaseVOEntity {
@Excel(name = "备注")
private String remark;
@ApiModelProperty("Invoice No(多个用逗号隔开)")
private String invoiceNo;
@ApiModelProperty("物料明细")
private List<OutMaterialDetailPO> materialDetailList;
@@ -513,4 +513,7 @@ public class StockOutOrderDO extends BaseVOEntity {
@ApiModelProperty("任务移除用户ID")
private String removeUserId;
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
}
@@ -445,4 +445,7 @@ public class StockInOrderDTO extends StockInOrderBaseDTO {
@ApiModelProperty("任务移除用户ID")
private String removeUserId;
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
}
@@ -502,4 +502,7 @@ public class StockOutOrderDTO extends StockOutOrderBaseDTO {
@ApiModelProperty("任务移除用户ID")
private String removeUserId;
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
}
@@ -451,4 +451,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
GROUP BY a.out_order_number
</select>
<!-- 出库列表页:按出库单号批量取去重后的 Invoice No -->
<select id="selectDistinctInvoiceNoForStockOutList" resultType="com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg">
SELECT DISTINCT
a.out_order_number AS outOrderNumber,
a.INVOICE_NO AS invoiceNo
FROM out_material_detail a
WHERE a.del_flag = 1
AND a.level = 1
AND a.INVOICE_NO IS NOT NULL
AND a.INVOICE_NO != ''
AND a.out_order_number IN
<foreach collection="outOrderNumbers" item="num" open="(" separator="," close=")">
#{num}
</foreach>
</select>
</mapper>
@@ -356,4 +356,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="joinStockInOrderPoWhere"/>
</where>
</select>
<!-- 入库列表页:按入库单号批量取去重后的 Invoice No -->
<select id="selectDistinctInvoiceNoForStockInList" resultType="com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg">
SELECT DISTINCT
a.in_order_number AS inOrderNumber,
a.INVOICE_NO AS invoiceNo
FROM in_material_detail a
WHERE a.del_flag = 1
AND a.level = 1
AND a.INVOICE_NO IS NOT NULL
AND a.INVOICE_NO != ''
AND a.in_order_number IN
<foreach collection="inOrderNumbers" item="num" open="(" separator="," close=")">
#{num}
</foreach>
</select>
</mapper>