Commit 892ce3e13a942bf43c45dd60673d5dfc71e14b35
1 parent
5738e2b8
✨ feat(mes): 添加领料出库单数量校验功能
新增校验领料出库单数量的接口,确保每行明细数量之和等于行领料数量。此功能提升了数据一致性检查,避免了潜在的数量不匹配问题。
Showing
3 changed files
with
30 additions
and
12 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java
| @@ -142,7 +142,13 @@ public class MesWmProductionIssueController { | @@ -142,7 +142,13 @@ public class MesWmProductionIssueController { | ||
| 142 | return success(true); | 142 | return success(true); |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | - // TODO @AI:【芋艿】check quantity;晚点搞; | 145 | + @GetMapping("/check-quantity") |
| 146 | + @Operation(summary = "校验领料出库单数量", description = "校验每行明细数量之和是否等于行领料数量") | ||
| 147 | + @Parameter(name = "id", description = "编号", required = true) | ||
| 148 | + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") | ||
| 149 | + public CommonResult<Boolean> checkProductionIssueQuantity(@RequestParam("id") Long id) { | ||
| 150 | + return success(issueService.checkProductionIssueQuantity(id)); | ||
| 151 | + } | ||
| 146 | 152 | ||
| 147 | // ==================== 拼接 VO ==================== | 153 | // ==================== 拼接 VO ==================== |
| 148 | 154 |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java
| @@ -85,4 +85,12 @@ public interface MesWmProductionIssueService { | @@ -85,4 +85,12 @@ public interface MesWmProductionIssueService { | ||
| 85 | */ | 85 | */ |
| 86 | void cancelProductionIssue(Long id); | 86 | void cancelProductionIssue(Long id); |
| 87 | 87 | ||
| 88 | + /** | ||
| 89 | + * 校验领料出库单的数量:每行明细数量之和是否等于行领料数量 | ||
| 90 | + * | ||
| 91 | + * @param id 编号 | ||
| 92 | + * @return 是否全部一致 | ||
| 93 | + */ | ||
| 94 | + Boolean checkProductionIssueQuantity(Long id); | ||
| 95 | + | ||
| 88 | } | 96 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java
| @@ -125,17 +125,6 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ | @@ -125,17 +125,6 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ | ||
| 125 | if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { | 125 | if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { |
| 126 | throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); | 126 | throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); |
| 127 | } | 127 | } |
| 128 | - // 校验每行明细数量之和是否等于行领料数量 | ||
| 129 | - List<MesWmProductionIssueLineDO> lines = issueLineService.getProductionIssueLineListByIssueId(id); | ||
| 130 | - for (MesWmProductionIssueLineDO line : lines) { | ||
| 131 | - List<MesWmProductionIssueDetailDO> details = issueDetailService.getProductionIssueDetailListByLineId(line.getId()); | ||
| 132 | - BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, | ||
| 133 | - MesWmProductionIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); | ||
| 134 | - if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { | ||
| 135 | - throw exception(WM_PRODUCTION_ISSUE_DETAIL_QUANTITY_MISMATCH); | ||
| 136 | - } | ||
| 137 | - } | ||
| 138 | - | ||
| 139 | // 执行拣货(待拣货 → 待执行领出) | 128 | // 执行拣货(待拣货 → 待执行领出) |
| 140 | issueMapper.updateById(new MesWmProductionIssueDO() | 129 | issueMapper.updateById(new MesWmProductionIssueDO() |
| 141 | .setId(id).setStatus(MesWmProductionIssueStatusEnum.APPROVED.getStatus())); | 130 | .setId(id).setStatus(MesWmProductionIssueStatusEnum.APPROVED.getStatus())); |
| @@ -175,12 +164,27 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ | @@ -175,12 +164,27 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ | ||
| 175 | MesWmProductionIssueStatusEnum.CANCELED.getStatus())) { | 164 | MesWmProductionIssueStatusEnum.CANCELED.getStatus())) { |
| 176 | throw exception(WM_PRODUCTION_ISSUE_CANCEL_NOT_ALLOWED); | 165 | throw exception(WM_PRODUCTION_ISSUE_CANCEL_NOT_ALLOWED); |
| 177 | } | 166 | } |
| 167 | + | ||
| 178 | // 取消 | 168 | // 取消 |
| 179 | issueMapper.updateById(new MesWmProductionIssueDO() | 169 | issueMapper.updateById(new MesWmProductionIssueDO() |
| 180 | .setId(id).setStatus(MesWmProductionIssueStatusEnum.CANCELED.getStatus())); | 170 | .setId(id).setStatus(MesWmProductionIssueStatusEnum.CANCELED.getStatus())); |
| 181 | } | 171 | } |
| 182 | 172 | ||
| 183 | @Override | 173 | @Override |
| 174 | + public Boolean checkProductionIssueQuantity(Long id) { | ||
| 175 | + List<MesWmProductionIssueLineDO> lines = issueLineService.getProductionIssueLineListByIssueId(id); | ||
| 176 | + for (MesWmProductionIssueLineDO line : lines) { | ||
| 177 | + List<MesWmProductionIssueDetailDO> details = issueDetailService.getProductionIssueDetailListByLineId(line.getId()); | ||
| 178 | + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, | ||
| 179 | + MesWmProductionIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); | ||
| 180 | + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { | ||
| 181 | + return false; | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | + return true; | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + @Override | ||
| 184 | public MesWmProductionIssueDO validateProductionIssueExists(Long id) { | 188 | public MesWmProductionIssueDO validateProductionIssueExists(Long id) { |
| 185 | MesWmProductionIssueDO issue = issueMapper.selectById(id); | 189 | MesWmProductionIssueDO issue = issueMapper.selectById(id); |
| 186 | if (issue == null) { | 190 | if (issue == null) { |