Commit 892ce3e13a942bf43c45dd60673d5dfc71e14b35

Authored by YunaiV
1 parent 5738e2b8

✨ feat(mes): 添加领料出库单数量校验功能

新增校验领料出库单数量的接口,确保每行明细数量之和等于行领料数量。此功能提升了数据一致性检查,避免了潜在的数量不匹配问题。
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) {