diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index fce0f40..d217817 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -330,6 +330,7 @@ public interface ErrorCodeConstants { // ========== MES 仓库管理-库存(1-040-703-000) ========== ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); + ErrorCode WM_MATERIAL_STOCK_INSUFFICIENT = new ErrorCode(1_040_703_001, "库存数量不足"); // ========== MES 仓库管理-到货通知单(1-040-704-000) ========== ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "到货通知单不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java index d0b1fe5..6f233b6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTra import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferLineMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -30,14 +31,20 @@ public class MesWmTransferLineServiceImpl implements MesWmTransferLineService { private MesWmTransferService transferService; @Resource private MesMdItemService itemService; + @Resource + private MesWmWarehouseAreaService warehouseAreaService; @Override public Long createTransferLine(MesWmTransferLineSaveReqVO createReqVO) { + // 校验父数据可编辑 transferService.validateTransferEditable(createReqVO.getTransferId()); + // 校验产品存在 itemService.validateItemExists(createReqVO.getItemId()); - // DONE @AI:当前先保留主单可编辑与物料存在校验,其他关联校验需结合库存与批次规则统一设计,暂不在本轮 TODO 修复中扩展 - // TODO @AI:位置相关的几个校验; + // 校验来源仓库、库区、库位的关联关系 + warehouseAreaService.validateWarehouseAreaExists(createReqVO.getFromWarehouseId(), + createReqVO.getFromLocationId(), createReqVO.getFromAreaId()); + // 插入 MesWmTransferLineDO line = BeanUtils.toBean(createReqVO, MesWmTransferLineDO.class); transferLineMapper.insert(line); return line.getId(); @@ -45,19 +52,26 @@ public class MesWmTransferLineServiceImpl implements MesWmTransferLineService { @Override public void updateTransferLine(MesWmTransferLineSaveReqVO updateReqVO) { + // 校验存在 validateTransferLineExists(updateReqVO.getId()); + // 校验父数据可编辑 transferService.validateTransferEditable(updateReqVO.getTransferId()); + // 校验产品存在 itemService.validateItemExists(updateReqVO.getItemId()); - // DONE @AI:当前先保留主单可编辑与物料存在校验,其他关联校验需结合库存与批次规则统一设计,暂不在本轮 TODO 修复中扩展 - // TODO @AI:位置相关的几个校验; + // 校验来源仓库、库区、库位的关联关系 + warehouseAreaService.validateWarehouseAreaExists(updateReqVO.getFromWarehouseId(), + updateReqVO.getFromLocationId(), updateReqVO.getFromAreaId()); + // 更新 MesWmTransferLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmTransferLineDO.class); transferLineMapper.updateById(updateObj); } @Override public void deleteTransferLine(Long id) { + // 校验存在 validateTransferLineExists(id); + // 删除 transferLineMapper.deleteById(id); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java index 00330c6..53c62c2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java @@ -99,12 +99,12 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { } // 配送模式下,提交后如果未确认,则进入待确认状态;否则直接进入待上架状态 - if (Boolean.TRUE.equals(transfer.getDeliveryFlag()) && Boolean.FALSE.equals(transfer.getConfirmFlag())) { + if (Boolean.TRUE.equals(transfer.getDeliveryFlag()) && !Boolean.TRUE.equals(transfer.getConfirmFlag())) { transfer.setStatus(MesWmTransferStatusEnum.UNCONFIRMED.getStatus()).setConfirmFlag(false); // DONE @AI:冻结库存属于主单状态流转的一部分,保留在主单 service 统一处理 freezeTransferLineStocks(lines, true); } else { - transfer.setStatus(MesWmTransferStatusEnum.UNSTOCK.getStatus()); + transfer.setStatus(MesWmTransferStatusEnum.APPROVING.getStatus()); } transferMapper.updateById(transfer); } @@ -116,7 +116,7 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { MesWmTransferDO transfer = validateTransferExistsAndConfirm(id); // 更新状态:待确认 -> 待上架 - transfer.setStatus(MesWmTransferStatusEnum.UNSTOCK.getStatus()); + transfer.setStatus(MesWmTransferStatusEnum.APPROVING.getStatus()); transfer.setConfirmFlag(true); transferMapper.updateById(transfer); } @@ -124,17 +124,24 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { @Override @Transactional(rollbackFor = Exception.class) public void stockTransfer(Long id) { - MesWmTransferDO transfer = validateTransferExistsAndUnstock(id); + // 1.1 校验存在 + MesWmTransferDO transfer = validateTransferExistsAndApproving(id); List lines = transferLineService.getTransferLineListByTransferId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_TRANSFER_NO_LINE); } + // 1.2 检查每个行的明细数量是否完成上架 + for (MesWmTransferLineDO line : lines) { + List details = transferDetailService.getTransferDetailListByLineId(line.getId()); + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, + MesWmTransferDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { + throw exception(WM_TRANSFER_DETAIL_QUANTITY_MISMATCH); + } + } - // TODO @AI:参考别的模块的 stockXXX 方法,直接放在这里;不需要抽方法; - validateTransferDetailQuantity(lines); - - // 更新状态:待上架 -> 待执行 - transfer.setStatus(MesWmTransferStatusEnum.UNEXECUTE.getStatus()); + // 2. 更新状态:待上架 -> 待执行 + transfer.setStatus(MesWmTransferStatusEnum.APPROVED.getStatus()); transferMapper.updateById(transfer); } @@ -142,7 +149,7 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { @Transactional(rollbackFor = Exception.class) public void finishTransfer(Long id) { // 校验存在 + 待执行状态 - MesWmTransferDO transfer = validateTransferExistsAndUnexecute(id); + MesWmTransferDO transfer = validateTransferExistsAndApproved(id); List lines = transferLineService.getTransferLineListByTransferId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_TRANSFER_NO_LINE); @@ -222,24 +229,24 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { return transfer; } - private MesWmTransferDO validateTransferExistsAndUnstock(Long id) { + private MesWmTransferDO validateTransferExistsAndApproving(Long id) { MesWmTransferDO transfer = transferMapper.selectById(id); if (transfer == null) { throw exception(WM_TRANSFER_NOT_EXISTS); } - if (!MesWmTransferStatusEnum.UNSTOCK.getStatus().equals(transfer.getStatus())) { - throw exception(WM_TRANSFER_NOT_UNSTOCK); + if (!MesWmTransferStatusEnum.APPROVING.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_NOT_APPROVING); } return transfer; } - private MesWmTransferDO validateTransferExistsAndUnexecute(Long id) { + private MesWmTransferDO validateTransferExistsAndApproved(Long id) { MesWmTransferDO transfer = transferMapper.selectById(id); if (transfer == null) { throw exception(WM_TRANSFER_NOT_EXISTS); } - if (!MesWmTransferStatusEnum.UNEXECUTE.getStatus().equals(transfer.getStatus())) { - throw exception(WM_TRANSFER_NOT_UNEXECUTE); + if (!MesWmTransferStatusEnum.APPROVED.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_NOT_APPROVED); } return transfer; } @@ -256,19 +263,7 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { return transfer; } - // DONE @AI:保留独立方法复用明细数量校验,待执行状态仍由主流程负责推进 - private void validateTransferDetailQuantity(List lines) { - for (MesWmTransferLineDO line : lines) { - List details = transferDetailService.getTransferDetailListByLineId(line.getId()); - BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, - MesWmTransferDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); - if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { - throw exception(WM_TRANSFER_DETAIL_QUANTITY_MISMATCH); - } - } - } - - // TODO @AI:materialStockService 封装一个方法,传入 transferId + frozen 统一处理了;不用判断 line 的 getMaterialStockId + // TODO @芋艿:【后续弄】materialStockService 封装一个方法,传入 transferId + frozen 统一处理了;不用判断 line 的 getMaterialStockId private void freezeTransferLineStocks(List lines, boolean frozen) { if (CollUtil.isEmpty(lines)) { return;