Ver código fonte

疫苗接种数据填报

wwh 2 semanas atrás
pai
commit
2b5a8ba4d9

+ 2 - 2
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/domain/BizVaccinationData.java

@@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
9 9
  * <p>
10 10
  * 粒度:某一自然年、某一自然月、某一行政村快照。<br>
11 11
  * 唯一键:{@code (stat_year, stat_month, village_dept_id)}。<br>
12
- * 免疫率由实免数/应免数派生落库(小数比例,如 0.9833 表示 98.33%)。
12
+ * 免疫率派生落库:{@code (实免数/应免数)×100},保留 2 位小数(如 98.33)。
13 13
  * </p>
14 14
  */
15 15
 public class BizVaccinationData extends BaseEntity
@@ -40,7 +40,7 @@ public class BizVaccinationData extends BaseEntity
40 40
     /** 实免数(头) */
41 41
     private Integer actualVaccinateCount;
42 42
 
43
-    /** 免疫率(派生:实免/应免,小数比例) */
43
+    /** 免疫率(派生:(实免/应免)×100保留 2 位小数) */
44 44
     private BigDecimal immunityRate;
45 45
 
46 46
     public Long getId()

+ 5 - 4
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/support/VaccinationDataDerivedSupport.java

@@ -6,7 +6,7 @@ import com.ruoyi.web.modules.industryservice.domain.BizVaccinationData;
6 6
 
7 7
 /**
8 8
  * 疫苗接种派生字段。
9
- * <p>免疫率 = 实免数 / 应免数(应免数 &gt; 0 且实免数非空时;存小数比例)。</p>
9
+ * <p>免疫率 = (实免数 / 应免数) × 100,保留 2 位小数(应免数 &gt; 0 且实免数非空时)。</p>
10 10
  */
11 11
 public final class VaccinationDataDerivedSupport
12 12
 {
@@ -28,16 +28,17 @@ public final class VaccinationDataDerivedSupport
28 28
             return;
29 29
         }
30 30
         row.setImmunityRate(BigDecimal.valueOf(actual.longValue())
31
-                .divide(BigDecimal.valueOf(should.longValue()), 6, RoundingMode.HALF_UP));
31
+                .multiply(BigDecimal.valueOf(100))
32
+                .divide(BigDecimal.valueOf(should.longValue()), 2, RoundingMode.HALF_UP));
32 33
     }
33 34
 
34
-    /** 导出/展示用百分比文案,如 98.33% */
35
+    /** 导出/展示用百分比文案,如 98.33%(库内已是百分数值) */
35 36
     public static String formatImmunityRatePercent(BigDecimal rate)
36 37
     {
37 38
         if (rate == null)
38 39
         {
39 40
             return "";
40 41
         }
41
-        return rate.multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toPlainString() + "%";
42
+        return rate.setScale(2, RoundingMode.HALF_UP).toPlainString() + "%";
42 43
     }
43 44
 }

+ 1 - 1
baqing-admin/src/test/java/com/ruoyi/web/modules/industryservice/support/VaccinationDataExcelParserTest.java

@@ -54,7 +54,7 @@ class VaccinationDataExcelParserTest
54 54
         row.setShouldVaccinateCount(12000);
55 55
         row.setActualVaccinateCount(11800);
56 56
         VaccinationDataDerivedSupport.applyDerived(row);
57
-        assertEquals("0.983333", row.getImmunityRate().toPlainString());
57
+        assertEquals("98.33", row.getImmunityRate().toPlainString());
58 58
         assertEquals("98.33%", VaccinationDataDerivedSupport.formatImmunityRatePercent(row.getImmunityRate()));
59 59
         assertTrue(VaccinationDataValidation.buildActualExceedShouldWarn(row) == null);
60 60
         row.setActualVaccinateCount(13000);

+ 2 - 1
doc/产业数据模型及服务/疫苗接种数据填报/疫苗接种数据填报功能需求.md

@@ -17,7 +17,7 @@
17 17
 - 保存时由所选村反推所属乡镇。
18 18
 - 唯一键:所属年份 + 所属月份 + 所属村。
19 19
 - 导入:存在则更新、不存在则插入(不按年月先删后插)。
20
-- 派生(保存时计算并落库):**免疫率 = 实免数 / 应免数**(应免数 &gt; 0 且实免数非空;存小数比例,如 0.9833;界面/导出展示为百分比)。
20
+- 派生(保存时计算并落库):**免疫率 = (实免数 / 应免数) × 100**,保留 2 位小数(应免数 &gt; 0 且实免数非空;如 98.33;界面/导出展示为 `98.33%`)。
21 21
 - 实免数大于应免数时允许保存;导入可返回软警告。
22 22
 
23 23
 ---
@@ -48,3 +48,4 @@
48 48
 | 版本 | 说明 |
49 49
 | --- | --- |
50 50
 | 1.0 | 首版:CRUD + upsert 导入 + 导出 |
51
+| 1.1 | 免疫率改为 (实免数/应免数)×100,保留 2 位小数落库 |

+ 1 - 1
doc/产业数据模型及服务/疫苗接种数据填报/疫苗接种数据填报技术方案.md

@@ -19,7 +19,7 @@
19 19
 | --- | --- |
20 20
 | should_vaccinate_count | 应免数(头) |
21 21
 | actual_vaccinate_count | 实免数(头) |
22
-| immunity_rate | 派生:实免/应免,`decimal(12,6)` 小数比例 |
22
+| immunity_rate | 派生:(实免/应免)×100,保留 2 位小数,`decimal(8,2)` |
23 23
 
24 24
 Excel 列:0 序号、1 乡镇、2 村、3 应免数、4 实免数、5 免疫率(导入跳过)。
25 25
 

+ 1 - 1
doc/产业数据模型及服务/疫苗接种数据填报/疫苗接种数据填报测试用例.md

@@ -5,7 +5,7 @@
5 5
 | 编号 | 场景 | 步骤 | 预期 |
6 6
 | --- | --- | --- | --- |
7 7
 | VD-01 | 列表筛选 | 按年/月/乡镇/村查询 | 分页结果正确 |
8
-| VD-02 | 新增 | 选村,填应免/实免,保存 | 免疫率=实免/应免落库;乡镇由村反推 |
8
+| VD-02 | 新增 | 选村,填应免/实免,保存 | 免疫率=(实免/应免)×100 保留2位小数落库;乡镇由村反推 |
9 9
 | VD-03 | 唯一键冲突 | 同年月同村再新增 | 拒绝 |
10 10
 | VD-04 | 修改 | 改应免/实免 | 免疫率重算 |
11 11
 | VD-05 | 删除 | 删除一条 | 物理删除成功 |

+ 2 - 1
sql/biz_vaccination_data.sql

@@ -1,7 +1,7 @@
1 1
 -- 疫苗接种数据填报(物理删除;全量覆盖建表)
2 2
 -- 交接依据:工作交接《疫苗接种数据填报.xlsx》;运行模板 vaccination_data_import_template.xlsx
3 3
 -- 唯一键:uk_year_month_village (stat_year, stat_month, village_dept_id)
4
+-- 派生落库:immunity_rate = (实免数/应免数)*100,保留2位小数(如 98.33)
4 5
 DROP TABLE IF EXISTS `biz_vaccination_data`;
5 6
 CREATE TABLE `biz_vaccination_data` (
6 7
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
@@ -13,7 +13,7 @@ CREATE TABLE `biz_vaccination_data` (
13 13
   `village_name` varchar(128) NOT NULL COMMENT '所属村名称',
14 14
   `should_vaccinate_count` int(11) DEFAULT NULL COMMENT '应免数(头)',
15 15
   `actual_vaccinate_count` int(11) DEFAULT NULL COMMENT '实免数(头)',
16
-  `immunity_rate` decimal(12,6) DEFAULT NULL COMMENT '免疫率=实免数/应免数(小数比例)',
16
+  `immunity_rate` decimal(8,2) DEFAULT NULL COMMENT '免疫率=(实免数/应免数)*100,保留2位小数',
17 17
   `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
18 18
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
19 19
   `update_by` varchar(64) DEFAULT '' COMMENT '更新者',