Commit 3cde11921b913afcdf52325c156cffc275e43781

Authored by dadiyang
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。
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&lt;ErpStockDO&gt; { @@ -36,6 +36,10 @@ public interface ErpStockMapper extends BaseMapperX&lt;ErpStockDO&gt; {
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) {