出库交接详情,物料明细根据复核单生成;

This commit is contained in:
秦鸿展
2026-03-15 12:43:56 +08:00
parent bd1449f177
commit fdff381b09
3 changed files with 75 additions and 11 deletions
@@ -37,6 +37,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
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.PickingMaterialDetailPO;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
import com.mhd.wms.domain.stockOutOrder.repository.po.StockOutOrderPO;
@@ -269,9 +270,43 @@ public class StockOutOrderApplicationService {
// 4. 为每个物料明细设置分配按钮显示类型,递归处理所有层级
setAllocationButtonTypeRecursively(detailList);
// 5. 出库交接场景(已出库/已复核):过滤 pickingQuantity 为 0 的明细,与交接详情一致
if (stockOutOrderPO.getStatus() != null && (stockOutOrderPO.getStatus() == 9 || stockOutOrderPO.getStatus() == 12)) {
filterMaterialDetailByPickingQuantity(detailList, stockOutOrderPO.getReview(), stockOutOrderPO.getOutOrderNumber());
}
return stockOutOrderPO;
}
/**
* 出库交接场景:递归过滤 pickingQuantity 为 0 的明细(与交接详情一致)
* @param detailList 物料明细树
* @param review 是否需要复核 1-是 2-否
* @param outOrderNumber 出库单号(review=1 时用于 picking_material_detail 查询)
*/
private void filterMaterialDetailByPickingQuantity(List<OutMaterialDetailPO> detailList, Integer review, String outOrderNumber) {
if (CollectionUtils.isEmpty(detailList)) {
return;
}
for (int i = detailList.size() - 1; i >= 0; i--) {
OutMaterialDetailPO d = detailList.get(i);
List<OutMaterialDetailPO> children = d.getChildren();
if (!CollectionUtils.isEmpty(children)) {
filterMaterialDetailByPickingQuantity(children, review, outOrderNumber);
}
BigDecimal pickQty;
if (Integer.valueOf(1).equals(review) && d.getUniqueId() != null) {
PickingMaterialDetailPO pickingSummary = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(d.getUniqueId());
pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO;
} else {
pickQty = d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO;
}
if (pickQty.compareTo(BigDecimal.ZERO) <= 0) {
detailList.remove(i);
}
}
}
/**
* 递归为出库物料明细设置更多属性
* 如果已分配库存(materialInventoryId不为空),则从库存表中获取批次属性值
@@ -21,6 +21,7 @@ import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder;
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService;
import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper;
import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService;
import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO;
import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO;
@@ -42,7 +43,9 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 下发任务Service业务层处理
@@ -79,6 +82,9 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
@Autowired
private IOutMaterialDetailService outMaterialDetailService;
@Autowired
private PickingMaterialDetailMapper pickingMaterialDetailMapper;
/**
* 查询下发任务列表
*/
@@ -128,16 +134,7 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
BigDecimal pickingQuantity = pickingOrderPOS.getPickingQuantity();//已拣货数量
deliveTaskPO.setPickingQuantity(pickingQuantity);
}
// 物料种类数:从出库明细按料号去重统计
long materialQuantity = outMaterialDetailService.list(new LambdaQueryWrapper<OutMaterialDetail>()
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber))
.stream()
.map(d -> d.getMaterialCode() != null && !d.getMaterialCode().isEmpty() ? d.getMaterialCode() : d.getMaterialNo())
.filter(c -> c != null && !c.isEmpty())
.distinct()
.count();
deliveTaskPO.setMaterialQuantity((int) materialQuantity);
// 已复核数量、出库单信息:直接从出库单获取(getCheckInfo仅支持复核中状态会抛异常)
// 已复核数量、出库单信息:直接从出库单获取(需在物料统计前获取,用于判断是否需要复核)
StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, orderNumber));
if (stockOutOrder != null) {
@@ -147,6 +144,29 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
deliveTaskPO.setCarrier(stockOutOrder.getCarrier());
deliveTaskPO.setCheckQuantity(stockOutOrder.getCheckQuantity());//已复核数量
}
// 物料种类数:从出库明细按料号去重统计,pickingQuantity 为 0 的过滤掉(与交接详情一致)
List<OutMaterialDetail> omdList = outMaterialDetailService.list(new LambdaQueryWrapper<OutMaterialDetail>()
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber)
.eq(OutMaterialDetail::getDelFlag, 1));
Set<Long> outUniqueIdsWithPicking = null;
if (stockOutOrder != null && Integer.valueOf(1).equals(stockOutOrder.getReview())) {
List<Long> ids = pickingMaterialDetailMapper.selectOutUniqueIdsWithPickingByOutOrderNumber(orderNumber);
outUniqueIdsWithPicking = ids != null ? new HashSet<>(ids) : new HashSet<>();
}
final Set<Long> pickingIds = outUniqueIdsWithPicking;
long materialQuantity = omdList.stream()
.filter(d -> {
if (pickingIds != null) {
return pickingIds.contains(d.getUniqueId());
}
BigDecimal pq = d.getPickingQuantity();
return pq != null && pq.compareTo(BigDecimal.ZERO) > 0;
})
.map(d -> d.getMaterialCode() != null && !d.getMaterialCode().isEmpty() ? d.getMaterialCode() : d.getMaterialNo())
.filter(c -> c != null && !c.isEmpty())
.distinct()
.count();
deliveTaskPO.setMaterialQuantity((int) materialQuantity);
}
}
@@ -22,6 +22,7 @@ import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryM
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
import com.mhd.wms.domain.taskHandoverMaterialDetail.repository.po.TaskHandoverMaterialDetailPO;
import com.mhd.wms.domain.shiftManage.repository.po.ShiftManagePO;
import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO;
@@ -130,6 +131,7 @@ public class HandoverTaskOrderDomainService {
List<TaskHandoverMaterialDetailPO> materialDetailList = new ArrayList<>();
for (OutMaterialDetail omd : outMaterialDetailList) {
BigDecimal handoverQuantity;
BigDecimal pickQty;
if (Integer.valueOf(1).equals(review)) {
// 仅包含复核单上的明细(有拣货)且已复核的
if (outUniqueIdsWithPicking != null && !outUniqueIdsWithPicking.contains(omd.getUniqueId())) {
@@ -138,12 +140,19 @@ public class HandoverTaskOrderDomainService {
if (omd.getCheckQuantity() == null || omd.getCheckQuantity().compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
// pickingQuantity 为 0 的过滤掉:从 picking_material_detail 取拣货数量
PickingMaterialDetailPO pickingSummary = pickingMaterialDetailMapper.queryTotalsByOutNumberAndBaseId(omd.getUniqueId());
pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO;
if (pickQty.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
handoverQuantity = omd.getCheckQuantity();
} else {
BigDecimal qty = omd.getPickingQuantity() != null ? omd.getPickingQuantity() : omd.getQuantity();
if (qty == null || qty.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
pickQty = qty;
handoverQuantity = qty;
}
TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO();
@@ -160,7 +169,7 @@ public class HandoverTaskOrderDomainService {
detail.setWeightLimit(omd.getWeightLimit());
detail.setVolumeLimit(omd.getVolumeLimit());
detail.setQuantity(omd.getQuantity());
detail.setPickingQuantity(omd.getPickingQuantity());
detail.setPickingQuantity(pickQty);
detail.setCheckQuantity(handoverQuantity);
detail.setPackId(omd.getPackId());
detail.setPackCode(omd.getPackCode());