diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsTransferOrderServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsTransferOrderServiceImpl.java index 0339d061..7cdcb8e8 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsTransferOrderServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsTransferOrderServiceImpl.java @@ -15,15 +15,23 @@ import com.klp.domain.bo.WmsTransferOrderBo; import com.klp.domain.vo.WmsTransferOrderVo; import com.klp.domain.WmsTransferOrder; import com.klp.domain.WmsTransferOrderItem; +import com.klp.domain.WmsMaterialCoil; +import com.klp.domain.WmsRawMaterial; +import com.klp.domain.WmsProduct; import com.klp.mapper.WmsTransferOrderMapper; import com.klp.mapper.WmsTransferOrderItemMapper; +import com.klp.mapper.WmsMaterialCoilMapper; +import com.klp.mapper.WmsRawMaterialMapper; +import com.klp.mapper.WmsProductMapper; import com.klp.service.IWmsTransferOrderService; import com.klp.service.IWmsTransferOrderItemService; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.stream.Collectors; /** * 调拨单主Service业务层处理 @@ -38,6 +46,9 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService { private final WmsTransferOrderMapper baseMapper; private final WmsTransferOrderItemMapper wmsTransferOrderItemMapper; private final IWmsTransferOrderItemService wmsTransferOrderItemService; + private final WmsMaterialCoilMapper coilMapper; + private final WmsRawMaterialMapper rawMaterialMapper; + private final WmsProductMapper productMapper; /** * 查询调拨单主 @@ -136,7 +147,9 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService { * 审批调拨单 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean approve(Long orderId, Integer approveStatus) { + // 1. 查询并校验调拨单 WmsTransferOrder order = baseMapper.selectById(orderId); if (order == null) { throw new RuntimeException("调拨单不存在"); @@ -144,9 +157,133 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService { if (order.getApproveStatus() != null && order.getApproveStatus() != 1) { throw new RuntimeException("该调拨单已审批,不能重复审批"); } + + // 2. 更新审批状态 order.setApproveStatus(approveStatus); order.setApproveBy(LoginHelper.getUsername()); order.setApproveTime(new Date()); - return baseMapper.updateById(order) > 0; + boolean updateResult = baseMapper.updateById(order) > 0; + + // 3. 如果审批通过,批量更新钢卷信息 + if (updateResult && approveStatus != null && approveStatus == 1) { + batchUpdateCoilsOnApprove(orderId, order.getTransferType()); + } + + return updateResult; + } + + /** + * 审批通过时批量更新钢卷信息 + */ + private void batchUpdateCoilsOnApprove(Long orderId, String transferType) { + // 1. 批量查询调拨明细 + LambdaQueryWrapper itemWrapper = new LambdaQueryWrapper<>(); + itemWrapper.eq(WmsTransferOrderItem::getTransferId, orderId); + List items = wmsTransferOrderItemMapper.selectList(itemWrapper); + + if (items == null || items.isEmpty()) { + return; + } + + // 2. 构建coilId到明细项的映射 + Map coilToItemMap = items.stream() + .filter(item -> item.getCoilId() != null) + .collect(Collectors.toMap( + WmsTransferOrderItem::getCoilId, + v -> v, + (a, b) -> a + )); + + // 3. 收集所有coilId + List coilIds = new ArrayList<>(coilToItemMap.keySet()); + + if (coilIds.isEmpty()) { + return; + } + + // 4. 批量查询钢卷并校验存在性 + List coils = coilMapper.selectBatchIds(coilIds); + if (coils.size() != coilIds.size()) { + throw new RuntimeException("部分钢卷不存在"); + } + + // 5. 收集所有需要校验的itemId(使用调拨前的值) + List itemIdsToValidate = items.stream() + .map(WmsTransferOrderItem::getItemIdBefore) + .filter(itemId -> itemId != null) + .distinct() + .collect(Collectors.toList()); + + // 6. 按物料类型分组校验itemId是否存在 + validateItemIds(items, itemIdsToValidate); + + // 7. 批量更新钢卷信息 + List coilsToUpdate = coils.stream() + .map(coil -> { + // 从映射中快速找到对应的明细项 + WmsTransferOrderItem item = coilToItemMap.get(coil.getCoilId()); + if (item == null) { + return null; + } + + // 使用调拨后的值更新钢卷 + Long finalItemId = item.getItemIdAfter(); + Long finalMaterialType = item.getMaterialTypeAfter(); + Long finalWarehouseId = item.getWarehouseIdAfter(); + String finalItemType = finalMaterialType != null && finalMaterialType == 1 ? "raw_material" : "product"; + + // 更新钢卷信息 + coil.setItemId(finalItemId); + coil.setItemType(finalItemType); + coil.setMaterialType(finalMaterialType != null && finalMaterialType == 1 ? "原料" : "成品"); + coil.setWarehouseId(finalWarehouseId); + coil.setTransferType(transferType); + + return coil; + }) + .filter(coil -> coil != null) + .collect(Collectors.toList()); + + // 8. 批量更新数据库 + if (!coilsToUpdate.isEmpty()) { + for (WmsMaterialCoil coil : coilsToUpdate) { + coilMapper.updateById(coil); + } + } + } + + /** + * 校验itemId是否存在 + */ + private void validateItemIds(List items, List itemIdsToValidate) { + if (itemIdsToValidate.isEmpty()) { + return; + } + + // 按物料类型分组 + Map> materialTypeGroupMap = items.stream() + .filter(item -> item.getItemIdBefore() != null && item.getMaterialTypeBefore() != null) + .collect(Collectors.groupingBy( + WmsTransferOrderItem::getMaterialTypeBefore, + Collectors.mapping(WmsTransferOrderItem::getItemIdBefore, Collectors.toList()) + )); + + // 校验原料 + if (materialTypeGroupMap.containsKey(1L)) { + List rawMaterialIds = materialTypeGroupMap.get(1L).stream().distinct().collect(Collectors.toList()); + List rawMaterials = rawMaterialMapper.selectBatchIds(rawMaterialIds); + if (rawMaterials.size() != rawMaterialIds.size()) { + throw new RuntimeException("部分原材料不存在"); + } + } + + // 校验成品 + if (materialTypeGroupMap.containsKey(2L)) { + List productIds = materialTypeGroupMap.get(2L).stream().distinct().collect(Collectors.toList()); + List products = productMapper.selectBatchIds(productIds); + if (products.size() != productIds.size()) { + throw new RuntimeException("部分产品不存在"); + } + } } }