ソースを参照

畜牧产品产量登记

wwh 2 週間 前
コミット
dd136a2fd6

+ 21 - 7
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/service/impl/BizDisposableIncomeServiceImpl.java

@@ -2,6 +2,7 @@ package com.ruoyi.web.modules.industryservice.service.impl;
2 2
 
3 3
 import java.util.ArrayList;
4 4
 import java.util.List;
5
+import java.util.Objects;
5 6
 import org.springframework.beans.factory.annotation.Autowired;
6 7
 import org.springframework.stereotype.Service;
7 8
 import org.springframework.transaction.annotation.Transactional;
@@ -40,7 +41,7 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
40 41
     {
41 42
         DisposableIncomeValidation.validateRowForSave(row);
42 43
         assertUniqueYear(row.getStatYear(), null);
43
-        applyMissingGrowth(row);
44
+        applyGrowthForSave(row, null);
44 45
         return bizDisposableIncomeMapper.insertBizDisposableIncome(row);
45 46
     }
46 47
 
@@ -53,9 +54,9 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
53 54
             throw new ServiceException("主键不能为空");
54 55
         }
55 56
         DisposableIncomeValidation.validateRowForSave(row);
56
-        requireExistingRow(row.getId());
57
+        BizDisposableIncome existing = requireExistingRow(row.getId());
57 58
         assertUniqueYear(row.getStatYear(), row.getId());
58
-        applyMissingGrowth(row);
59
+        applyGrowthForSave(row, existing);
59 60
         return bizDisposableIncomeMapper.updateBizDisposableIncome(row);
60 61
     }
61 62
 
@@ -88,15 +89,27 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
88 89
         return YakHerdInventoryYearSupport.resolveYearOptions();
89 90
     }
90 91
 
91
-    /** 增幅、增速未填时,按上年可支配收入公式补齐 */
92
-    private void applyMissingGrowth(BizDisposableIncome row)
92
+    /**
93
+     * 年份或可支配收入变更时按新口径强制重算;否则仅对未填的增幅/增速补齐。
94
+     */
95
+    private void applyGrowthForSave(BizDisposableIncome row, BizDisposableIncome existing)
93 96
     {
94 97
         if (row == null || row.getStatYear() == null)
95 98
         {
96 99
             return;
97 100
         }
98 101
         BizDisposableIncome previous = bizDisposableIncomeMapper.selectByStatYear(row.getStatYear() - 1);
99
-        DisposableIncomeGrowthSupport.fillMissingGrowth(row, previous);
102
+        boolean yearOrIncomeChanged = existing != null && (!Objects.equals(existing.getStatYear(), row.getStatYear())
103
+                || !DisposableIncomeGrowthSupport.sameDecimal(existing.getRuralDisposableIncome(),
104
+                        row.getRuralDisposableIncome()));
105
+        if (yearOrIncomeChanged)
106
+        {
107
+            DisposableIncomeGrowthSupport.recalculateGrowth(row, previous);
108
+        }
109
+        else
110
+        {
111
+            DisposableIncomeGrowthSupport.fillMissingGrowth(row, previous);
112
+        }
100 113
     }
101 114
 
102 115
     private void assertUniqueYear(Integer statYear, Long excludeId)
@@ -108,12 +121,13 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
108 121
         }
109 122
     }
110 123
 
111
-    private void requireExistingRow(Long id)
124
+    private BizDisposableIncome requireExistingRow(Long id)
112 125
     {
113 126
         BizDisposableIncome existing = bizDisposableIncomeMapper.selectBizDisposableIncomeById(id);
114 127
         if (existing == null)
115 128
         {
116 129
             throw new ServiceException("记录不存在或已删除");
117 130
         }
131
+        return existing;
118 132
     }
119 133
 }

+ 28 - 1
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/support/DisposableIncomeGrowthSupport.java

@@ -5,7 +5,7 @@ import java.math.RoundingMode;
5 5
 import com.ruoyi.web.modules.industryservice.domain.BizDisposableIncome;
6 6
 
7 7
 /**
8
- * 可支配收入增幅、增速:可选填;未填时按公式补齐
8
+ * 可支配收入增幅、增速:可选填;未填或口径变更时按公式计算
9 9
  * 增幅 = 本年人均可支配收入 - 上年人均可支配收入;
10 10
  * 增速 = 增幅 / 上年人均可支配收入。
11 11
  */
@@ -17,6 +17,20 @@ public final class DisposableIncomeGrowthSupport
17 17
     {
18 18
     }
19 19
 
20
+    /**
21
+     * 按公式强制重算增幅、增速(先清空再填)。
22
+     */
23
+    public static void recalculateGrowth(BizDisposableIncome current, BizDisposableIncome previousYear)
24
+    {
25
+        if (current == null)
26
+        {
27
+            return;
28
+        }
29
+        current.setIncomeIncrease(null);
30
+        current.setIncomeGrowthRate(null);
31
+        fillMissingGrowth(current, previousYear);
32
+    }
33
+
20 34
     /**
21 35
      * 仅对未填写的增幅、增速按上年数据补齐;已填写的保留。
22 36
      */
@@ -46,4 +60,17 @@ public final class DisposableIncomeGrowthSupport
46 60
             }
47 61
         }
48 62
     }
63
+
64
+    public static boolean sameDecimal(BigDecimal a, BigDecimal b)
65
+    {
66
+        if (a == null && b == null)
67
+        {
68
+            return true;
69
+        }
70
+        if (a == null || b == null)
71
+        {
72
+            return false;
73
+        }
74
+        return a.compareTo(b) == 0;
75
+    }
49 76
 }

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

@@ -68,6 +68,19 @@ class DisposableIncomeGrowthSupportTest
68 68
         assertNull(current.getIncomeGrowthRate());
69 69
     }
70 70
 
71
+    @Test
72
+    @DisplayName("强制重算会覆盖已有增幅增速")
73
+    void recalculateOverwritesManual()
74
+    {
75
+        BizDisposableIncome current = row(2022, "13346");
76
+        current.setIncomeIncrease(new BigDecimal("1"));
77
+        current.setIncomeGrowthRate(new BigDecimal("0.01"));
78
+        BizDisposableIncome previous = row(2021, "11886");
79
+        DisposableIncomeGrowthSupport.recalculateGrowth(current, previous);
80
+        assertEquals(0, new BigDecimal("1460").compareTo(current.getIncomeIncrease()));
81
+        assertEquals(0, new BigDecimal("0.122834").compareTo(current.getIncomeGrowthRate()));
82
+    }
83
+
71 84
     private static BizDisposableIncome row(int year, String income)
72 85
     {
73 86
         BizDisposableIncome row = new BizDisposableIncome();