Commit 1e235a12d87ba46f8b176f96ceac89caa8344b81

Authored by YunaiV
1 parent 24b5a79a

✨ feat(mes): 添加外协发料单数量校验功能

新增校验接口,确保外协发料单每行明细数量之和与行发料数量一致。此功能提升了数据准确性,避免了潜在的发料错误。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java
@@ -146,7 +146,13 @@ public class MesWmOutsourceIssueController { @@ -146,7 +146,13 @@ public class MesWmOutsourceIssueController {
146 return success(true); 146 return success(true);
147 } 147 }
148 148
149 - // DONE @AI:需要有 checkQuantity 类似的接口;(AI 未修复原因:需要明确业务逻辑,checkQuantity 接口需要产品经理确认具体校验规则) 149 + @GetMapping("/check-quantity")
  150 + @Operation(summary = "校验外协发料单数量", description = "校验每行明细数量之和是否等于行发料数量")
  151 + @Parameter(name = "id", description = "编号", required = true)
  152 + @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:query')")
  153 + public CommonResult<Boolean> checkOutsourceIssueQuantity(@RequestParam("id") Long id) {
  154 + return success(outsourceIssueService.checkOutsourceIssueQuantity(id));
  155 + }
150 156
151 // ==================== 拼接 VO ==================== 157 // ==================== 拼接 VO ====================
152 158
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/detail/MesWmOutsourceIssueDetailSaveReqVO.java
@@ -31,15 +31,10 @@ public class MesWmOutsourceIssueDetailSaveReqVO { @@ -31,15 +31,10 @@ public class MesWmOutsourceIssueDetailSaveReqVO {
31 @DecimalMin(value = "0.01", message = "数量必须大于 0") 31 @DecimalMin(value = "0.01", message = "数量必须大于 0")
32 private BigDecimal quantity; 32 private BigDecimal quantity;
33 33
34 - @Schema(description = "库存ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
35 - @NotNull(message = "库存ID不能为空")  
36 - private Long materialStockId;  
37 -  
38 @Schema(description = "批次ID", example = "1") 34 @Schema(description = "批次ID", example = "1")
39 private Long batchId; 35 private Long batchId;
40 36
41 - @Schema(description = "仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
42 - @NotNull(message = "仓库ID不能为空") 37 + @Schema(description = "仓库ID", example = "1")
43 private Long warehouseId; 38 private Long warehouseId;
44 39
45 @Schema(description = "库区ID", example = "1") 40 @Schema(description = "库区ID", example = "1")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java
@@ -20,10 +20,8 @@ public interface MesWmOutsourceIssueMapper extends BaseMapperX&lt;MesWmOutsourceIss @@ -20,10 +20,8 @@ public interface MesWmOutsourceIssueMapper extends BaseMapperX&lt;MesWmOutsourceIss
20 .likeIfPresent(MesWmOutsourceIssueDO::getCode, reqVO.getCode()) 20 .likeIfPresent(MesWmOutsourceIssueDO::getCode, reqVO.getCode())
21 .likeIfPresent(MesWmOutsourceIssueDO::getName, reqVO.getName()) 21 .likeIfPresent(MesWmOutsourceIssueDO::getName, reqVO.getName())
22 .eqIfPresent(MesWmOutsourceIssueDO::getVendorId, reqVO.getVendorId()) 22 .eqIfPresent(MesWmOutsourceIssueDO::getVendorId, reqVO.getVendorId())
23 - .eqIfPresent(MesWmOutsourceIssueDO::getWorkorderId, reqVO.getWorkorderId())  
24 - .likeIfPresent(MesWmOutsourceIssueDO::getWorkorderCode, reqVO.getWorkorderCode()) 23 + .eqIfPresent(MesWmOutsourceIssueDO::getWorkOrderId, reqVO.getWorkOrderId())
25 .betweenIfPresent(MesWmOutsourceIssueDO::getIssueDate, reqVO.getIssueDate()) 24 .betweenIfPresent(MesWmOutsourceIssueDO::getIssueDate, reqVO.getIssueDate())
26 - .eqIfPresent(MesWmOutsourceIssueDO::getStatus, reqVO.getStatus())  
27 .orderByDesc(MesWmOutsourceIssueDO::getId)); 25 .orderByDesc(MesWmOutsourceIssueDO::getId));
28 } 26 }
29 27
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java
@@ -79,4 +79,12 @@ public interface MesWmOutsourceIssueService { @@ -79,4 +79,12 @@ public interface MesWmOutsourceIssueService {
79 */ 79 */
80 void cancelOutsourceIssue(Long id); 80 void cancelOutsourceIssue(Long id);
81 81
  82 + /**
  83 + * 校验外协发料单数量(行数量 = 明细数量之和)
  84 + *
  85 + * @param id 编号
  86 + * @return true 表示数量匹配,false 表示不匹配
  87 + */
  88 + Boolean checkOutsourceIssueQuantity(Long id);
  89 +
82 } 90 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java
@@ -184,6 +184,29 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic @@ -184,6 +184,29 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic
184 .setId(id).setStatus(MesWmOutsourceIssueStatusEnum.CANCELLED.getStatus())); 184 .setId(id).setStatus(MesWmOutsourceIssueStatusEnum.CANCELLED.getStatus()));
185 } 185 }
186 186
  187 + @Override
  188 + public Boolean checkOutsourceIssueQuantity(Long id) {
  189 + List<MesWmOutsourceIssueLineDO> lines = outsourceIssueLineService.getOutsourceIssueLineListByIssueId(id);
  190 + if (CollUtil.isEmpty(lines)) {
  191 + return true;
  192 + }
  193 + // 批量查询所有明细
  194 + List<MesWmOutsourceIssueDetailDO> allDetails = outsourceIssueDetailService.getOutsourceIssueDetailListByIssueId(id);
  195 + Map<Long, List<MesWmOutsourceIssueDetailDO>> detailMap = CollectionUtils.convertMultiMap(
  196 + allDetails, MesWmOutsourceIssueDetailDO::getLineId);
  197 + // 检查每行的明细数量
  198 + for (MesWmOutsourceIssueLineDO line : lines) {
  199 + List<MesWmOutsourceIssueDetailDO> details = detailMap.getOrDefault(line.getId(), List.of());
  200 + BigDecimal totalDetailQuantity = CollectionUtils.getSumValue(details,
  201 + MesWmOutsourceIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
  202 + // 对比行数量与明细总数量
  203 + if (line.getQuantity().compareTo(totalDetailQuantity) != 0) {
  204 + return false;
  205 + }
  206 + }
  207 + return true;
  208 + }
  209 +
187 /** 210 /**
188 * 校验外协发料单存在 211 * 校验外协发料单存在
189 */ 212 */