diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueController.java index 3c61b0c..104c22b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueController.java @@ -142,14 +142,6 @@ public class MesWmReturnIssueController { return success(true); } - @GetMapping("/check-quantity") - @Operation(summary = "校验生产退料单数量", description = "校验每行明细数量之和是否等于行退料数量") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-return-issue:query')") - public CommonResult checkReturnIssueQuantity(@RequestParam("id") Long id) { - return success(issueService.checkReturnIssueQuantity(id)); - } - // ==================== 拼接 VO ==================== private List buildRespVOList(List list) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java index b03959c..68118a2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java @@ -85,12 +85,4 @@ public interface MesWmReturnIssueService { */ void cancelReturnIssue(Long id); - /** - * 校验生产退料单的数量:每行明细数量之和是否等于行退料数量 - * - * @param id 编号 - * @return 是否全部一致 - */ - Boolean checkReturnIssueQuantity(Long id); - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java index 87f5160..dd183ce 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java @@ -8,12 +8,14 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssuePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssueSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnissue.MesWmReturnIssueMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueStatusEnum; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import jakarta.annotation.Resource; @@ -23,6 +25,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -45,6 +48,8 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { private MesMdWorkstationService workstationService; @Resource private MesProWorkOrderService workOrderService; + @Resource + private MesMdItemService itemService; @Override @Transactional(rollbackFor = Exception.class) @@ -133,12 +138,33 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { @Override @Transactional(rollbackFor = Exception.class) public void stockReturnIssue(Long id) { - // 校验存在 + 待上架状态 + // 1.1 校验存在 + 待上架状态 MesWmReturnIssueDO issue = validateReturnIssueExists(id); if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { throw exception(WM_RETURN_ISSUE_NOT_APPROVING); } - // 入库上架(待上架 → 待执行退料) + // 1.2 检查每个行的明细数量是否完成上架 + List lines = issueLineService.getReturnIssueLineListByIssueId(id); + if (CollUtil.isNotEmpty(lines)) { + // 批量查询所有明细 + List allDetails = issueDetailService.getReturnIssueDetailListByIssueId(id); + Map> detailMap = CollectionUtils.convertMultiMap( + allDetails, MesWmReturnIssueDetailDO::getLineId); + // 检查每行的明细数量 + for (MesWmReturnIssueLineDO line : lines) { + List details = detailMap.getOrDefault(line.getId(), List.of()); + BigDecimal totalDetailQuantity = CollectionUtils.getSumValue(details, + MesWmReturnIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + // 对比行数量与明细总数量,不满足直接抛出 + if (line.getQuantity().compareTo(totalDetailQuantity) > 0) { + MesMdItemDO item = itemService.validateItemExists(line.getItemId()); + throw exception(WM_RETURN_ISSUE_DETAIL_QUANTITY_MISMATCH, + item.getCode() + " " + item.getName() + " 未完成上架"); + } + } + } + + // 2. 入库上架(待上架 → 待执行退料) issueMapper.updateById(new MesWmReturnIssueDO() .setId(id).setStatus(MesWmReturnIssueStatusEnum.APPROVED.getStatus())); } @@ -185,20 +211,6 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { } @Override - public Boolean checkReturnIssueQuantity(Long id) { - List lines = issueLineService.getReturnIssueLineListByIssueId(id); - for (MesWmReturnIssueLineDO line : lines) { - List details = issueDetailService.getReturnIssueDetailListByLineId(line.getId()); - BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, - MesWmReturnIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); - if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { - return false; - } - } - return true; - } - - @Override public MesWmReturnIssueDO validateReturnIssueExists(Long id) { MesWmReturnIssueDO issue = issueMapper.selectById(id); if (issue == null) {