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 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 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 31 @DecimalMin(value = "0.01", message = "数量必须大于 0")
32 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 34 @Schema(description = "批次ID", example = "1")
39 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 38 private Long warehouseId;
44 39  
45 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 20 .likeIfPresent(MesWmOutsourceIssueDO::getCode, reqVO.getCode())
21 21 .likeIfPresent(MesWmOutsourceIssueDO::getName, reqVO.getName())
22 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 24 .betweenIfPresent(MesWmOutsourceIssueDO::getIssueDate, reqVO.getIssueDate())
26   - .eqIfPresent(MesWmOutsourceIssueDO::getStatus, reqVO.getStatus())
27 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 79 */
80 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 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 */
... ...