wwh недель назад: 2
Родитель
Сommit
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
 import java.util.ArrayList;
3
 import java.util.ArrayList;
4
 import java.util.List;
4
 import java.util.List;
5
+import java.util.Objects;
5
 import org.springframework.beans.factory.annotation.Autowired;
6
 import org.springframework.beans.factory.annotation.Autowired;
6
 import org.springframework.stereotype.Service;
7
 import org.springframework.stereotype.Service;
7
 import org.springframework.transaction.annotation.Transactional;
8
 import org.springframework.transaction.annotation.Transactional;
@@ -40,7 +41,7 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
40
     {
41
     {
41
         DisposableIncomeValidation.validateRowForSave(row);
42
         DisposableIncomeValidation.validateRowForSave(row);
42
         assertUniqueYear(row.getStatYear(), null);
43
         assertUniqueYear(row.getStatYear(), null);
43
-        applyMissingGrowth(row);
44
+        applyGrowthForSave(row, null);
44
         return bizDisposableIncomeMapper.insertBizDisposableIncome(row);
45
         return bizDisposableIncomeMapper.insertBizDisposableIncome(row);
45
     }
46
     }
46
 
47
 
@@ -53,9 +54,9 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
53
             throw new ServiceException("主键不能为空");
54
             throw new ServiceException("主键不能为空");
54
         }
55
         }
55
         DisposableIncomeValidation.validateRowForSave(row);
56
         DisposableIncomeValidation.validateRowForSave(row);
56
-        requireExistingRow(row.getId());
57
+        BizDisposableIncome existing = requireExistingRow(row.getId());
57
         assertUniqueYear(row.getStatYear(), row.getId());
58
         assertUniqueYear(row.getStatYear(), row.getId());
58
-        applyMissingGrowth(row);
59
+        applyGrowthForSave(row, existing);
59
         return bizDisposableIncomeMapper.updateBizDisposableIncome(row);
60
         return bizDisposableIncomeMapper.updateBizDisposableIncome(row);
60
     }
61
     }
61
 
62
 
@@ -88,15 +89,27 @@ public class BizDisposableIncomeServiceImpl implements IBizDisposableIncomeServi
88
         return YakHerdInventoryYearSupport.resolveYearOptions();
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
         if (row == null || row.getStatYear() == null)
97
         if (row == null || row.getStatYear() == null)
95
         {
98
         {
96
             return;
99
             return;
97
         }
100
         }
98
         BizDisposableIncome previous = bizDisposableIncomeMapper.selectByStatYear(row.getStatYear() - 1);
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
     private void assertUniqueYear(Integer statYear, Long excludeId)
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
         BizDisposableIncome existing = bizDisposableIncomeMapper.selectBizDisposableIncomeById(id);
126
         BizDisposableIncome existing = bizDisposableIncomeMapper.selectBizDisposableIncomeById(id);
114
         if (existing == null)
127
         if (existing == null)
115
         {
128
         {
116
             throw new ServiceException("记录不存在或已删除");
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
 import com.ruoyi.web.modules.industryservice.domain.BizDisposableIncome;
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
         assertNull(current.getIncomeGrowthRate());
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
     private static BizDisposableIncome row(int year, String income)
84
     private static BizDisposableIncome row(int year, String income)
72
     {
85
     {
73
         BizDisposableIncome row = new BizDisposableIncome();
86
         BizDisposableIncome row = new BizDisposableIncome();