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 1 package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.Valid;
  5 +import jakarta.validation.constraints.DecimalMin;
4 6 import jakarta.validation.constraints.NotNull;
5 7 import lombok.Data;
6 8  
... ... @@ -39,6 +41,7 @@ public class ErpPurchaseInSaveReqVO {
39 41 private String remark;
40 42  
41 43 @Schema(description = "入库清单列表")
  44 + @Valid
42 45 private List<Item> items;
43 46  
44 47 @Data
... ... @@ -68,6 +71,7 @@ public class ErpPurchaseInSaveReqVO {
68 71  
69 72 @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
70 73 @NotNull(message = "产品数量不能为空")
  74 + @DecimalMin(value = "0", inclusive = false, message = "产品数量必须大于 0")
71 75 private BigDecimal count;
72 76  
73 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 36 }
37 37  
38 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 43 LambdaUpdateWrapper<ErpStockDO> updateWrapper = new LambdaUpdateWrapper<ErpStockDO>()
40 44 .eq(ErpStockDO::getId, id);
41 45 if (count.compareTo(BigDecimal.ZERO) > 0) {
... ...