Commit 1e235a12d87ba46f8b176f96ceac89caa8344b81
1 parent
24b5a79a
✨ feat(mes): 添加外协发料单数量校验功能
新增校验接口,确保外协发料单每行明细数量之和与行发料数量一致。此功能提升了数据准确性,避免了潜在的发料错误。
Showing
5 changed files
with
40 additions
and
10 deletions
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<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 | */ | ... | ... |