wwh 1 неделя назад
Родитель
Сommit
2f0b8a73ff

+ 16 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/support/YakHerdInventoryValidation.java

@@ -51,6 +51,7 @@ public final class YakHerdInventoryValidation
51 51
         validateNonNegative(row.getFertileCowCount(), "能繁母牛存栏数");
52 52
         validateNonNegative(row.getSheepTotal(), "羊总存栏数");
53 53
         validateNonNegative(row.getMilkingSheepCount(), "产奶羊存栏数");
54
+        validateMilkingSheepLessThanSheepTotal(row);
54 55
         validateNonNegative(row.getInsuredYakCount(), "保险牦牛存栏数");
55 56
         if (StringUtils.isNotEmpty(row.getRemark()) && row.getRemark().length() > 500)
56 57
         {
@@ -59,6 +60,21 @@ public final class YakHerdInventoryValidation
59 60
         recalculateDerived(row);
60 61
     }
61 62
 
63
+    /**
64
+     * 产奶羊存栏数须小于羊总存栏数(两者均非空时)。
65
+     */
66
+    public static void validateMilkingSheepLessThanSheepTotal(BizYakHerdInventory row)
67
+    {
68
+        if (row == null || row.getMilkingSheepCount() == null || row.getSheepTotal() == null)
69
+        {
70
+            return;
71
+        }
72
+        if (row.getMilkingSheepCount() >= row.getSheepTotal())
73
+        {
74
+            throw new ServiceException("产奶羊存栏数须小于羊总存栏数");
75
+        }
76
+    }
77
+
62 78
     /**
63 79
      * 按模板计算逻辑回写合计字段(直接覆盖,不以 Excel 合计为准)。
64 80
      */

+ 21 - 0
baqing-admin/src/test/java/com/ruoyi/web/modules/industryservice/support/YakHerdInventoryValidationTest.java

@@ -68,6 +68,27 @@ class YakHerdInventoryValidationTest
68 68
         assertEquals(1, row.getBullTotal());
69 69
     }
70 70
 
71
+    @Test
72
+    @DisplayName("产奶羊存栏数须小于羊总存栏数")
73
+    void milkingSheepLessThanSheepTotal()
74
+    {
75
+        BizYakHerdInventory row = new BizYakHerdInventory();
76
+        row.setSheepTotal(10);
77
+        row.setMilkingSheepCount(10);
78
+        assertThrows(ServiceException.class,
79
+                () -> YakHerdInventoryValidation.validateMilkingSheepLessThanSheepTotal(row));
80
+
81
+        row.setMilkingSheepCount(11);
82
+        assertThrows(ServiceException.class,
83
+                () -> YakHerdInventoryValidation.validateMilkingSheepLessThanSheepTotal(row));
84
+
85
+        row.setMilkingSheepCount(9);
86
+        YakHerdInventoryValidation.validateMilkingSheepLessThanSheepTotal(row);
87
+
88
+        row.setMilkingSheepCount(null);
89
+        YakHerdInventoryValidation.validateMilkingSheepLessThanSheepTotal(row);
90
+    }
91
+
71 92
     @Test
72 93
     @DisplayName("派生合计计算")
73 94
     void recalculateDerived()

+ 2 - 1
doc/产业数据模型及服务/牦牛存栏数据填报/牦牛存栏数据填报功能需求.md

@@ -177,7 +177,7 @@ flowchart TD
177 177
 | 默认值 | 打开新增弹窗时,所属年份、所属月份**默认当前年月**(可改) |
178 178
 | 唯一性 | 同年同月同村已存在有效记录时**禁止新增**,提示「该年该月该村已填报」 |
179 179
 | 计算字段 | 表单**不展示**;保存时服务端按 **§2.5** 重算 |
180
-| 数字 | 选填项若填写须为非负整数 |
180
+| 数字 | 选填项若填写须为非负整数;**产奶羊存栏数与羊总存栏数均填写时,产奶羊须小于羊总** |
181 181
 
182 182
 ---
183 183
 
@@ -328,4 +328,5 @@ flowchart TD
328 328
 | 1.4 | 取消逻辑删除:表无 `del_flag`,删除为物理删除;唯一约束 `uk_year_town` |
329 329
 | 1.5 | **按年月填报**:增加 `stat_month`;唯一键「年+月+乡镇」;每月导入一次 |
330 330
 | 1.6 | **按村填报**:唯一键「年+月+村」;表单只选村;字段对齐新模板(幼畜/成畜、奶牛、羊、保险等);导入年月全量覆盖;导出合计按列求和;计算字段仅详情展示 |
331
+| 1.8 | 后端校验:产奶羊存栏数须小于羊总存栏数(两者均非空) |
331 332
 | 1.7 | 导入改为按 `(年,月,村)` upsert;导出增加可选所属乡镇筛选 |

+ 1 - 1
doc/产业数据模型及服务/牦牛存栏数据填报/牦牛存栏数据填报技术方案.md

@@ -130,7 +130,7 @@ yak_sheep_total = bull_total + cow_total + insured_yak_count + sheep_total
130 130
 | --- | --- | --- |
131 131
 | `statYear` / `statMonth` | Y | 合法且非未来月 |
132 132
 | `villageDeptId` | Y | 合法村;反推乡镇 |
133
-| 明细 `*Count` | N | `>= 0` |
133
+| 明细 `*Count` | N | `>= 0`;**产奶羊与羊总均非空时**:`milkingSheepCount < sheepTotal` |
134 134
 | `id` | 修改必填 | — |
135 135
 
136 136
 **唯一性**:`countByYearMonthAndVillageExcludeId(...) > 0` →「该年该月该村已填报」。