Commit 3cde11921b913afcdf52325c156cffc275e43781
1 parent
8e43004c
fix(erp):采购入库数量补 >0 校验,0/负数量不再落库;审核链路 0 量防护
采购入库单数量填 0 或负数也能保存(count 仅 @NotNull、无 >0 约束), 数量为 0 的入库单审核时 updateCountIncrement 生成空 SET 的 UPDATE, MyBatis-Plus 直接抛异常 500(A23)。 两层修复: 1. 建单/改单入口:items 补 @Valid 级联 + count 补 @DecimalMin(0, inclusive=false),0/负数量建单返回参数校验错误; 2. 审核链路:updateCountIncrement 对 count=0 直接跳过(无库存增量), 历史已落库的 0 数量单审核不再 500。
Showing
2 changed files
with
8 additions
and
0 deletions
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java
| 1 | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in; | 1 | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | +import jakarta.validation.Valid; | ||
| 5 | +import jakarta.validation.constraints.DecimalMin; | ||
| 4 | import jakarta.validation.constraints.NotNull; | 6 | import jakarta.validation.constraints.NotNull; |
| 5 | import lombok.Data; | 7 | import lombok.Data; |
| 6 | 8 | ||
| @@ -39,6 +41,7 @@ public class ErpPurchaseInSaveReqVO { | @@ -39,6 +41,7 @@ public class ErpPurchaseInSaveReqVO { | ||
| 39 | private String remark; | 41 | private String remark; |
| 40 | 42 | ||
| 41 | @Schema(description = "入库清单列表") | 43 | @Schema(description = "入库清单列表") |
| 44 | + @Valid | ||
| 42 | private List<Item> items; | 45 | private List<Item> items; |
| 43 | 46 | ||
| 44 | @Data | 47 | @Data |
| @@ -68,6 +71,7 @@ public class ErpPurchaseInSaveReqVO { | @@ -68,6 +71,7 @@ public class ErpPurchaseInSaveReqVO { | ||
| 68 | 71 | ||
| 69 | @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") | 72 | @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| 70 | @NotNull(message = "产品数量不能为空") | 73 | @NotNull(message = "产品数量不能为空") |
| 74 | + @DecimalMin(value = "0", inclusive = false, message = "产品数量必须大于 0") | ||
| 71 | private BigDecimal count; | 75 | private BigDecimal count; |
| 72 | 76 | ||
| 73 | @Schema(description = "税率,百分比", example = "99.88") | 77 | @Schema(description = "税率,百分比", example = "99.88") |
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java
| @@ -36,6 +36,10 @@ public interface ErpStockMapper extends BaseMapperX<ErpStockDO> { | @@ -36,6 +36,10 @@ public interface ErpStockMapper extends BaseMapperX<ErpStockDO> { | ||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | default int updateCountIncrement(Long id, BigDecimal count, boolean negativeEnable) { | 38 | default int updateCountIncrement(Long id, BigDecimal count, boolean negativeEnable) { |
| 39 | + // 数量为 0 无库存增量(历史脏数据防护):直接跳过,避免生成空 SET 的 UPDATE 抛异常 500 | ||
| 40 | + if (count.compareTo(BigDecimal.ZERO) == 0) { | ||
| 41 | + return 0; | ||
| 42 | + } | ||
| 39 | LambdaUpdateWrapper<ErpStockDO> updateWrapper = new LambdaUpdateWrapper<ErpStockDO>() | 43 | LambdaUpdateWrapper<ErpStockDO> updateWrapper = new LambdaUpdateWrapper<ErpStockDO>() |
| 40 | .eq(ErpStockDO::getId, id); | 44 | .eq(ErpStockDO::getId, id); |
| 41 | if (count.compareTo(BigDecimal.ZERO) > 0) { | 45 | if (count.compareTo(BigDecimal.ZERO) > 0) { |