浏览代码

疫苗接种数据填报

wwh 2 周之前
父节点
当前提交
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
  * <p>
9
  * <p>
10
  * 粒度:某一自然年、某一自然月、某一行政村快照。<br>
10
  * 粒度:某一自然年、某一自然月、某一行政村快照。<br>
11
  * 唯一键:{@code (stat_year, stat_month, village_dept_id)}。<br>
11
  * 唯一键:{@code (stat_year, stat_month, village_dept_id)}。<br>
12
- * 免疫率由实免数/应免数派生落库(小数比例,如 0.9833 表示 98.33%)。
12
+ * 免疫率派生落库:{@code (实免数/应免数)×100},保留 2 位小数(如 98.33)。
13
  * </p>
13
  * </p>
14
  */
14
  */
15
 public class BizVaccinationData extends BaseEntity
15
 public class BizVaccinationData extends BaseEntity
@@ -40,7 +40,7 @@ public class BizVaccinationData extends BaseEntity
40
     /** 实免数(头) */
40
     /** 实免数(头) */
41
     private Integer actualVaccinateCount;
41
     private Integer actualVaccinateCount;
42
 
42
 
43
-    /** 免疫率(派生:实免/应免,小数比例) */
43
+    /** 免疫率(派生:(实免/应免)×100保留 2 位小数) */
44
     private BigDecimal immunityRate;
44
     private BigDecimal immunityRate;
45
 
45
 
46
     public Long getId()
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
 public final class VaccinationDataDerivedSupport
11
 public final class VaccinationDataDerivedSupport
12
 {
12
 {
@@ -28,16 +28,17 @@ public final class VaccinationDataDerivedSupport
28
             return;
28
             return;
29
         }
29
         }
30
         row.setImmunityRate(BigDecimal.valueOf(actual.longValue())
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
     public static String formatImmunityRatePercent(BigDecimal rate)
36
     public static String formatImmunityRatePercent(BigDecimal rate)
36
     {
37
     {
37
         if (rate == null)
38
         if (rate == null)
38
         {
39
         {
39
             return "";
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
         row.setShouldVaccinateCount(12000);
54
         row.setShouldVaccinateCount(12000);
55
         row.setActualVaccinateCount(11800);
55
         row.setActualVaccinateCount(11800);
56
         VaccinationDataDerivedSupport.applyDerived(row);
56
         VaccinationDataDerivedSupport.applyDerived(row);
57
-        assertEquals("0.983333", row.getImmunityRate().toPlainString());
57
+        assertEquals("98.33", row.getImmunityRate().toPlainString());
58
         assertEquals("98.33%", VaccinationDataDerivedSupport.formatImmunityRatePercent(row.getImmunityRate()));
58
         assertEquals("98.33%", VaccinationDataDerivedSupport.formatImmunityRatePercent(row.getImmunityRate()));
59
         assertTrue(VaccinationDataValidation.buildActualExceedShouldWarn(row) == null);
59
         assertTrue(VaccinationDataValidation.buildActualExceedShouldWarn(row) == null);
60
         row.setActualVaccinateCount(13000);
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
 | 1.0 | 首版:CRUD + upsert 导入 + 导出 |
50
 | 1.0 | 首版:CRUD + upsert 导入 + 导出 |
51
+| 1.1 | 免疫率改为 (实免数/应免数)×100,保留 2 位小数落库 |

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

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

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

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

+ 2 - 1
sql/biz_vaccination_data.sql

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