Kaynağa Gözat

国际病毒接口上传

wangsy 2 ay önce
ebeveyn
işleme
dc1b70b5e8

+ 51 - 0
src/main/java/com/qizhen/healsphere/common/util/ContinentConverter.java

@@ -0,0 +1,51 @@
+package com.qizhen.healsphere.common.util;
+
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description: 大洲转换工具类
+ * @author: dsYun
+ * @time: 2025/04/27 14:21
+ */
+public class ContinentConverter {
+
+    // 大洲中英文映射表(英文小写 + 下划线格式)
+    private static final Map<String, String> CONTINENT_MAP;
+    static {
+        Map<String, String> map = new HashMap<>();
+        map.put("asia", "亚洲");
+        map.put("europe", "欧洲");
+        map.put("africa", "非洲");
+        map.put("north america", "北美洲");
+        map.put("south america", "南美洲");
+        map.put("oceania", "大洋洲");
+        map.put("antarctica", "南极洲"); // 可选
+        CONTINENT_MAP = Collections.unmodifiableMap(map); // 不可变 Map
+    }
+
+    /**
+    * 将英文大洲名称转换为中文(支持多个大洲逗号分隔)
+    * @param englishNames 如 "North America, Oceania"
+    * @return 如 "北美洲, 大洋洲"
+    */
+    public static String toChinese(String englishNames) {
+        if (englishNames == null || englishNames.isEmpty()) {
+            return "未知地区";
+        }
+        String[] parts = englishNames.split(",\\s*");
+        StringBuilder result = new StringBuilder();
+        for (String part : parts) {
+            // 统一处理格式:小写 + 替换空格为下划线
+            String key = part.trim().toLowerCase().replace(" ", "_");
+            String chinese = CONTINENT_MAP.getOrDefault(key, part + "(未知)");
+            result.append(chinese).append(", ");
+        }
+        if (result.length() > 0) {
+            result.setLength(result.length() - 2); // 移除末尾的 ", "
+        }
+        return result.toString();
+    }
+}

+ 285 - 0
src/main/java/com/qizhen/healsphere/common/util/CountryConverter.java

@@ -0,0 +1,285 @@
+package com.qizhen.healsphere.common.util;
+
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description: 国家转换工具类
+ * @author: dsYun
+ * @time: 2025/04/27 14:21
+ */
+public class CountryConverter {
+
+    // 国家中英文映射表(英文小写 + 下划线格式)
+    private static final Map<String, String> COUNTRY_MAP;
+    static {
+        Map<String, String> map = new HashMap<>();
+        // ------------------- 亚洲 -------------------
+        // ------------------- 东亚 -------------------
+        map.put("china", "中国");       // 中国
+        map.put("japan", "日本");       // 日本
+        map.put("south korea", "韩国"); // 韩国(大韩民国)
+        map.put("north korea", "朝鲜"); // 朝鲜(朝鲜民主主义人民共和国)
+        map.put("mongolia", "蒙古");    // 蒙古
+
+// ------------------- 东南亚 -------------------
+        map.put("vietnam", "越南");         // 越南
+        map.put("laos", "老挝");            // 老挝
+        map.put("cambodia", "柬埔寨");       // 柬埔寨
+        map.put("thailand", "泰国");        // 泰国
+        map.put("myanmar", "缅甸");         // 缅甸
+        map.put("malaysia", "马来西亚");     // 马来西亚
+        map.put("singapore", "新加坡");      // 新加坡
+        map.put("indonesia", "印度尼西亚");  // 印度尼西亚
+        map.put("philippines", "菲律宾");    // 菲律宾
+        map.put("brunei", "文莱");          // 文莱
+        map.put("east timor", "东帝汶");     // 东帝汶(Timor-Leste)
+
+// ------------------- 南亚 -------------------
+        map.put("india", "印度");           // 印度
+        map.put("pakistan", "巴基斯坦");     // 巴基斯坦
+        map.put("bangladesh", "孟加拉国");  // 孟加拉国
+        map.put("sri lanka", "斯里兰卡");    // 斯里兰卡
+        map.put("nepal", "尼泊尔");         // 尼泊尔
+        map.put("bhutan", "不丹");          // 不丹
+        map.put("maldives", "马尔代夫");     // 马尔代夫
+        map.put("afghanistan", "阿富汗");   // 阿富汗
+
+// ------------------- 中亚 -------------------
+        map.put("kazakhstan", "哈萨克斯坦");  // 哈萨克斯坦
+        map.put("uzbekistan", "乌兹别克斯坦");// 乌兹别克斯坦
+        map.put("turkmenistan", "土库曼斯坦");// 土库曼斯坦
+        map.put("kyrgyzstan", "吉尔吉斯斯坦");// 吉尔吉斯斯坦
+        map.put("tajikistan", "塔吉克斯坦");  // 塔吉克斯坦
+
+// ------------------- 西亚 -------------------
+        map.put("turkey", "土耳其");         // 土耳其(部分领土在亚洲)
+        map.put("iran", "伊朗");             // 伊朗
+        map.put("iraq", "伊拉克");           // 伊拉克
+        map.put("saudi arabia", "沙特阿拉伯");// 沙特阿拉伯
+        map.put("yemen", "也门");            // 也门
+        map.put("syria", "叙利亚");          // 叙利亚
+        map.put("jordan", "约旦");           // 约旦
+        map.put("lebanon", "黎巴嫩");         // 黎巴嫩
+        map.put("israel", "以色列");          // 以色列
+        map.put("palestine", "巴勒斯坦");     // 巴勒斯坦(联合国观察员国)
+        map.put("kuwait", "科威特");         // 科威特
+        map.put("united arab emirates", "阿联酋");  // 阿拉伯联合酋长国
+        map.put("qatar", "卡塔尔");           // 卡塔尔
+        map.put("oman", "阿曼");              // 阿曼
+        map.put("georgia", "格鲁吉亚");        // 格鲁吉亚(部分领土在亚洲)
+        map.put("armenia", "亚美尼亚");        // 亚美尼亚
+        map.put("azerbaijan", "阿塞拜疆");      // 阿塞拜疆
+        map.put("cyprus", "塞浦路斯");         // 塞浦路斯(地理属亚洲,文化属欧洲)
+
+// 注:根据国际惯例,部分跨大洲国家仅列出其亚洲部分
+        // ------------------- 欧洲 -------------------
+        // ------------------- 西欧 -------------------
+        map.put("germany", "德国");
+        map.put("france", "法国");
+        map.put("netherlands", "荷兰");
+        map.put("belgium", "比利时");
+        map.put("luxembourg", "卢森堡");
+        map.put("switzerland", "瑞士");
+        map.put("austria", "奥地利");
+        map.put("liechtenstein", "列支敦士登");
+        map.put("monaco", "摩纳哥");
+
+// ------------------- 北欧 -------------------
+        map.put("denmark", "丹麦");
+        map.put("norway", "挪威");
+        map.put("sweden", "瑞典");
+        map.put("finland", "芬兰");
+        map.put("iceland", "冰岛");
+
+// ------------------- 南欧 -------------------
+        map.put("italy", "意大利");
+        map.put("spain", "西班牙");
+        map.put("portugal", "葡萄牙");
+        map.put("greece", "希腊");
+        map.put("malta", "马耳他");
+        map.put("san marino", "圣马力诺");
+        map.put("vatican city", "梵蒂冈");
+        map.put("andorra", "安道尔");
+        map.put("croatia", "克罗地亚");
+        map.put("slovenia", "斯洛文尼亚");
+        map.put("bosnia and herzegovina", "波黑");
+        map.put("montenegro", "黑山");
+        map.put("albania", "阿尔巴尼亚");
+        map.put("north macedonia", "北马其顿");
+
+// ------------------- 东欧 -------------------
+        map.put("russia", "俄罗斯");         // 欧洲部分
+        map.put("poland", "波兰");
+        map.put("czech republic", "捷克");
+        map.put("slovakia", "斯洛伐克");
+        map.put("hungary", "匈牙利");
+        map.put("romania", "罗马尼亚");
+        map.put("bulgaria", "保加利亚");
+        map.put("serbia", "塞尔维亚");
+        map.put("ukraine", "乌克兰");
+        map.put("belarus", "白俄罗斯");
+        map.put("moldova", "摩尔多瓦");
+        map.put("estonia", "爱沙尼亚");
+        map.put("latvia", "拉脱维亚");
+        map.put("lithuania", "立陶宛");
+
+// ------------------- 其他 -------------------
+        map.put("united kingdom", "英国");    // 包括英格兰、苏格兰、威尔士、北爱尔兰
+        map.put("ireland", "爱尔兰");
+        map.put("cyprus", "塞浦路斯");        // 政治文化属欧洲
+        map.put("georgia", "格鲁吉亚");       // 地理部分属欧洲
+        map.put("armenia", "亚美尼亚");       // 文化关联欧洲
+        map.put("azerbaijan", "阿塞拜疆");    // 部分领土在欧洲
+        map.put("turkey", "土耳其");          // 欧洲部分(色雷斯地区)
+        // ------------------- 非洲 -------------------
+        // ------------------- 北非 -------------------
+        map.put("algeria", "阿尔及利亚");
+        map.put("egypt", "埃及");
+        map.put("libya", "利比亚");
+        map.put("morocco", "摩洛哥");
+        map.put("sudan", "苏丹");
+        map.put("tunisia", "突尼斯");
+        map.put("south sudan", "南苏丹");  // 2011年独立
+
+// ------------------- 西非 -------------------
+        map.put("benin", "贝宁");
+        map.put("burkina faso", "布基纳法索");
+        map.put("cape verde", "佛得角");
+        map.put("cote divoire", "科特迪瓦");  // Côte d'Ivoire
+        map.put("gambia", "冈比亚");
+        map.put("ghana", "加纳");
+        map.put("guinea", "几内亚");
+        map.put("guinea bissau", "几内亚比绍");
+        map.put("liberia", "利比里亚");
+        map.put("mali", "马里");
+        map.put("mauritania", "毛里塔尼亚");
+        map.put("niger", "尼日尔");
+        map.put("nigeria", "尼日利亚");
+        map.put("senegal", "塞内加尔");
+        map.put("sierra leone", "塞拉利昂");
+        map.put("togo", "多哥");
+
+// ------------------- 中非 -------------------
+        map.put("cameroon", "喀麦隆");
+        map.put("central african republic", "中非共和国");
+        map.put("chad", "乍得");
+        map.put("congo brazzaville", "刚果(布)");  // Republic of the Congo
+        map.put("congo kinshasa", "刚果(金)");     // Democratic Republic of the Congo
+        map.put("equatorial guinea", "赤道几内亚");
+        map.put("gabon", "加蓬");
+        map.put("sao tome and principe", "圣多美和普林西比");
+
+// ------------------- 东非 -------------------
+        map.put("burundi", "布隆迪");
+        map.put("comoros", "科摩罗");
+        map.put("djibouti", "吉布提");
+        map.put("eritrea", "厄立特里亚");
+        map.put("ethiopia", "埃塞俄比亚");
+        map.put("kenya", "肯尼亚");
+        map.put("madagascar", "马达加斯加");
+        map.put("malawi", "马拉维");
+        map.put("mauritius", "毛里求斯");
+        map.put("mozambique", "莫桑比克");
+        map.put("rwanda", "卢旺达");
+        map.put("seychelles", "塞舌尔");
+        map.put("somalia", "索马里");
+        map.put("tanzania", "坦桑尼亚");
+        map.put("uganda", "乌干达");
+        map.put("zambia", "赞比亚");
+        map.put("zimbabwe", "津巴布韦");
+
+// ------------------- 南部非洲 -------------------
+        map.put("angola", "安哥拉");
+        map.put("botswana", "博茨瓦纳");
+        map.put("eswatini", "斯威士兰");       // 旧称Swaziland
+        map.put("lesotho", "莱索托");
+        map.put("namibia", "纳米比亚");
+        map.put("south africa", "南非");
+        // ------------------- 北美洲 -------------------
+        map.put("canada", "加拿大");
+        map.put("united states", "美国");   // 美利坚合众国
+        map.put("mexico", "墨西哥");
+
+// ------------------- 中美洲 -------------------
+        map.put("belize", "伯利兹");
+        map.put("costa rica", "哥斯达黎加");
+        map.put("el salvador", "萨尔瓦多");
+        map.put("guatemala", "危地马拉");
+        map.put("honduras", "洪都拉斯");
+        map.put("nicaragua", "尼加拉瓜");
+        map.put("panama", "巴拿马");
+
+// ------------------- 加勒比海地区 -------------------
+        map.put("antigua and barbuda", "安提瓜和巴布达");
+        map.put("bahamas", "巴哈马");         // 全称:The Commonwealth of The Bahamas
+        map.put("barbados", "巴巴多斯");
+        map.put("cuba", "古巴");
+        map.put("dominica", "多米尼克");
+        map.put("dominican republic", "多米尼加");
+        map.put("grenada", "格林纳达");
+        map.put("haiti", "海地");
+        map.put("jamaica", "牙买加");
+        map.put("saint kitts and nevis", "圣基茨和尼维斯");
+        map.put("saint lucia", "圣卢西亚");
+        map.put("saint vincent and the grenadines", "圣文森特和格林纳丁斯");
+        map.put("trinidad and tobago", "特立尼达和多巴哥");
+        // ------------------- 南美洲 -------------------
+        map.put("argentina", "阿根廷");
+        map.put("bolivia", "玻利维亚");
+        map.put("brazil", "巴西");
+        map.put("chile", "智利");
+        map.put("colombia", "哥伦比亚");
+        map.put("ecuador", "厄瓜多尔");
+        map.put("guyana", "圭亚那");
+        map.put("paraguay", "巴拉圭");
+        map.put("peru", "秘鲁");
+        map.put("suriname", "苏里南");
+        map.put("uruguay", "乌拉圭");
+        map.put("venezuela", "委内瑞拉");
+        // ------------------- 大洋洲 -------------------
+        map.put("australia", "澳大利亚");
+        map.put("new zealand", "新西兰");
+        map.put("papua new guinea", "巴布亚新几内亚");
+
+// ------------------- 太平洋岛国 -------------------
+        map.put("fiji", "斐济");
+        map.put("solomon islands", "所罗门群岛");
+        map.put("vanuatu", "瓦努阿图");
+        map.put("samoa", "萨摩亚");
+        map.put("tonga", "汤加");
+        map.put("nauru", "瑙鲁");
+        map.put("kiribati", "基里巴斯");
+        map.put("tuvalu", "图瓦卢");
+        map.put("marshall islands", "马绍尔群岛");
+        map.put("micronesia", "密克罗尼西亚联邦");
+        map.put("palau", "帕劳");
+        // ... 其他国家的映射可在此补充
+        COUNTRY_MAP = Collections.unmodifiableMap(map); // 不可变 Map
+    }
+
+    /**
+    * 将英文国家名称转换为中文(支持多个国家逗号分隔)
+    * @param englishNames 如 "United States, Japan"
+    * @return 如 "美国, 日本"
+    */
+    public static String toChinese(String englishNames) {
+        if (englishNames == null || englishNames.isEmpty()) {
+            return "未知地区";
+        }
+        String[] parts = englishNames.split(",\\s*");
+        StringBuilder result = new StringBuilder();
+        for (String part : parts) {
+            // 统一处理格式:小写 + 替换空格为下划线
+            String key = part.trim().toLowerCase().replace(" ", "_");
+            String chinese = COUNTRY_MAP.getOrDefault(key, part + "(未知)");
+            result.append(chinese).append(", ");
+        }
+        if (result.length() > 0) {
+            result.setLength(result.length() - 2); // 移除末尾的 ", "
+        }
+        return result.toString();
+    }
+}

+ 3 - 4
src/main/java/com/qizhen/healsphere/common/util/ProvinceConverter.java

@@ -6,13 +6,12 @@ import java.util.HashMap;
 import java.util.Map;
 
 /**
- * @Description: 对象转换工具类
- * @author: gaodm
- * @time: 2018/12/14 14:21
+ * @Description: 省份转换工具类
+ * @author: dsYun
+ * @time: 2025/04/27 14:21
  */
 public class ProvinceConverter {
 
-    // 使用静态代码块初始化映射表(兼容 Java 8)
     private static final Map<String, String> PROVINCE_MAP;
     static {
         Map<String, String> map = new HashMap<>();

+ 36 - 7
src/main/java/com/qizhen/healsphere/facade/IsolateFacade.java

@@ -2,6 +2,8 @@ package com.qizhen.healsphere.facade;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qizhen.healsphere.common.util.BeanUtil;
+import com.qizhen.healsphere.common.util.ContinentConverter;
+import com.qizhen.healsphere.common.util.CountryConverter;
 import com.qizhen.healsphere.common.util.ProvinceConverter;
 import com.qizhen.healsphere.repository.mapper.EpifluMapper;
 import com.qizhen.healsphere.repository.mapper.EpifluQueryMapper;
@@ -15,6 +17,8 @@ import org.apache.poi.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.ZoneId;
@@ -86,7 +90,11 @@ public class IsolateFacade extends IsolateServiceImpl {
         isolateDTO.setEpifluentName("甲流");
         // 处理首个隔离信息
         Epiflu firstEpiflu = epiflus.get(0);
-        String firstLocation = firstEpiflu.getLocation() != null ? firstEpiflu.getLocation() : "未知地区";
+        String continent = getSegment(firstEpiflu.getLocation(), 0);//大洲
+        String continentChinese = ContinentConverter.toChinese(continent);
+        String country = getSegment(firstEpiflu.getLocation(), 1);//国家
+        String countryChinese= CountryConverter.toChinese(country);
+//        String firstLocation = firstEpiflu.getLocation() != null ? firstEpiflu.getLocation() : "未知地区";
         Date firstDate = firstEpiflu.getCollectionDate();
         // 格式化日期(处理空值)
         String formattedDate = (firstDate != null) ? dateFormat.format(firstDate) : "未知日期";
@@ -96,15 +104,19 @@ public class IsolateFacade extends IsolateServiceImpl {
         for (int i = 1; i < epiflus.size(); i++) {
             String location = epiflus.get(i).getLocation();
             if (location != null) {
-                String lastSegment = getLastSegment(location);
-                propagationLocations.add(lastSegment);
+//                String lastSegment = getLastSegment(location);
+                String continent2 = getSegment(location, 0);//大洲
+                String continentChinese2 = ContinentConverter.toChinese(continent2);
+                String country2 = getSegment(location, 1);//国家
+                String countryChinese2= CountryConverter.toChinese(country2);
+                propagationLocations.add(continentChinese2+countryChinese2);
             }
         }
 
         String propagation = propagationLocations.isEmpty() ? "无" : String.join(",", propagationLocations);
         // 构建分析文本
-        String analyse = String.format("%s首次爆发在%s的%s,之后在%s传播。",
-                subtype, formattedDate, firstLocation, propagation);
+        String analyse = String.format("%s首次爆发在%s的%s%s,之后在%s传播。",
+                subtype, formattedDate, continentChinese,countryChinese,propagation);
 
         // 创建并填充DTO
         isolateDTO.setEpifluentName("甲流");
@@ -150,7 +162,12 @@ public class IsolateFacade extends IsolateServiceImpl {
             inputVO.setSubtype(epifluDTO.getSubtype());
             inputVO.setClade(cladeList);
             Integer count = epifluMapper.selectCountByInput(inputVO);
-            double percentage = (chinaCollectionDateDTO.getCount() == 0) ? 0.0 : (count * 100.0) / chinaCollectionDateDTO.getCount();
+//            double percentage = (chinaCollectionDateDTO.getCount() == 0) ? 0.0 : (count * 100.0) / chinaCollectionDateDTO.getCount();
+            // 计算百分比并保留两位小数
+            double percentage = (chinaCollectionDateDTO.getCount() == 0) ? 0.0 :
+                    new BigDecimal((count * 100.0) / chinaCollectionDateDTO.getCount())
+                            .setScale(2, RoundingMode.HALF_UP)  // 保留两位小数(四舍五入)
+                            .doubleValue();
             cumulativeDTO.setCount(count);
             cumulativeDTO.setPercentage(percentage);
             cumulativeMap.put(localDate.toString(), cumulativeDTO);
@@ -367,7 +384,11 @@ public class IsolateFacade extends IsolateServiceImpl {
             chinaInputVO.setSubtype(chinaEpifluDTO.getSubtype());
             chinaInputVO.setClade(cladeList);
             Integer count = epifluMapper.selectCountByChinaInput(chinaInputVO);
-            double percentage = (chinaCollectionDateDTO.getCount() == 0) ? 0.0 : (count * 100.0) / chinaCollectionDateDTO.getCount();
+//            double percentage = (chinaCollectionDateDTO.getCount() == 0) ? 0.0 : (count * 100.0) / chinaCollectionDateDTO.getCount();
+            double percentage = (chinaCollectionDateDTO.getCount() == 0) ? 0.0 :
+                    new BigDecimal((count * 100.0) / chinaCollectionDateDTO.getCount())
+                            .setScale(2, RoundingMode.HALF_UP)  // 保留两位小数(四舍五入)
+                            .doubleValue();
             cumulativeDTO.setCount(count);
             cumulativeDTO.setPercentage(percentage);
             cumulativeMap.put(localDate.toString(), cumulativeDTO);
@@ -382,6 +403,14 @@ public class IsolateFacade extends IsolateServiceImpl {
         return matcher.find() ? matcher.group(1) : "";
     }
 
+    public static String getSegment(String input, int index) {
+        if (input == null || input.isEmpty()) {
+            return "";
+        }
+        String[] segments = input.split("/");
+        return (index >= 0 && index < segments.length) ? segments[index] : "";
+    }
+
 
     /**
      * 生成固定间隔的日期列表(包含起始和结束日期)

+ 2 - 2
src/main/java/com/qizhen/healsphere/service/impl/ZYApiServiceImpl.java

@@ -98,9 +98,9 @@ public class ZYApiServiceImpl {
         // 遍历从 oneWeekAgo 到 today 的每一天
         for (LocalDate date = oneWeekAgo; !date.isAfter(today); date = date.plusDays(1)) {
             // 调用 mapper.selectCount 方法获取数量
-            Integer count = epifluMapper.selectCount(inputVO.getSubtype(), inputVO.getIsChina(), date);
+//            Integer count = epifluMapper.selectCount(inputVO.getSubtype(), inputVO.getIsChina(), date);
             // 将日期格式化为 yyyy-MM-dd 并存入 Map
-            cumulative.put(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
+//            cumulative.put(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
         }
 
         return cumulative;

+ 0 - 1
src/main/java/com/qizhen/healsphere/web/vo/InputVO.java

@@ -10,7 +10,6 @@ public class InputVO {
     private String constellation;
     private List<String> clade; // clade
     private String subtype;
-    private Integer isChina = 0; // 0: 全球 1: 中国
     private String startDate;
     private String endDate;
     private String continent; //大洲