|
@@ -0,0 +1,156 @@
|
|
|
+package com.qizhen.healsphere.service.impl;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.annotation.JsonProperty;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import lombok.Data;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.nio.file.Files;
|
|
|
+import java.nio.file.Paths;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class IcdDataProcessor {
|
|
|
+
|
|
|
+ @Data
|
|
|
+ private static class TreeNode {
|
|
|
+ String name;
|
|
|
+ @JsonProperty("sNode")
|
|
|
+ List<TreeNode> sNode;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void processIcdData() throws IOException {
|
|
|
+ try {
|
|
|
+ // 1. 读取当前疾病列表
|
|
|
+ Set<String> currentDiseases = readCurrentDiseases();
|
|
|
+ log.info("读取到 {} 个疾病名称", currentDiseases.size());
|
|
|
+
|
|
|
+ // 2. 读取ICD10数据并建立映射关系
|
|
|
+ Map<String, String> diseaseToIcdMap = readIcd10Data();
|
|
|
+ log.info("读取到 {} 个ICD10映射关系", diseaseToIcdMap.size());
|
|
|
+
|
|
|
+ // 3. 读取原JSON数据
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ TreeNode rootNode;
|
|
|
+ try (InputStream is = Files.newInputStream(Paths.get("src/main/resources/old_json.txt"))) {
|
|
|
+ rootNode = mapper.readValue(is, TreeNode.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 按ICD编码分组当前疾病
|
|
|
+ Map<String, List<String>> icdGroupedDiseases = new HashMap<>();
|
|
|
+ for (String disease : currentDiseases) {
|
|
|
+ String icdCode = diseaseToIcdMap.get(disease);
|
|
|
+ if (icdCode != null && icdCode.length() >= 3) {
|
|
|
+ String icdPrefix = icdCode.substring(0, 3);
|
|
|
+ icdGroupedDiseases.computeIfAbsent(icdPrefix, k -> new ArrayList<>())
|
|
|
+ .add(disease);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 更新JSON树
|
|
|
+ updateTreeNodes(rootNode, icdGroupedDiseases);
|
|
|
+
|
|
|
+ // 6. 写入新文件
|
|
|
+ try (Writer writer = new FileWriter("src/main/resources/new_icd_json.json")) {
|
|
|
+ mapper.writerWithDefaultPrettyPrinter().writeValue(writer, rootNode);
|
|
|
+ log.info("成功生成新的JSON文件");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理疾病数据失败", e);
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Set<String> readCurrentDiseases() throws IOException {
|
|
|
+ Set<String> diseases = new LinkedHashSet<>();
|
|
|
+ try (BufferedReader reader = new BufferedReader(
|
|
|
+ new InputStreamReader(
|
|
|
+ Files.newInputStream(Paths.get("src/main/resources/current_disease_new.csv")),
|
|
|
+ StandardCharsets.UTF_8
|
|
|
+ ))) {
|
|
|
+ String line;
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
+ String disease = line.trim();
|
|
|
+ if (!disease.isEmpty()) {
|
|
|
+ diseases.add(disease);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return diseases;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, String> readIcd10Data() throws IOException {
|
|
|
+ Map<String, String> diseaseToIcdMap = new HashMap<>();
|
|
|
+ try (BufferedReader reader = new BufferedReader(
|
|
|
+ new InputStreamReader(
|
|
|
+ Files.newInputStream(Paths.get("src/main/resources/new_icd10_data.csv")),
|
|
|
+ StandardCharsets.UTF_8
|
|
|
+ ))) {
|
|
|
+ String line;
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
+ String[] parts = line.split(",");
|
|
|
+ if (parts.length >= 2) {
|
|
|
+ String disease = parts[0].trim();
|
|
|
+ String icdCode = parts[1].trim();
|
|
|
+ if (!disease.isEmpty() && !icdCode.isEmpty()) {
|
|
|
+ diseaseToIcdMap.put(disease, icdCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return diseaseToIcdMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateTreeNodes(TreeNode node, Map<String, List<String>> icdGroupedDiseases) {
|
|
|
+ if (node == null) return;
|
|
|
+
|
|
|
+ // 如果当前节点的name是3位ICD码
|
|
|
+ if (node.name != null && node.name.length() == 3 && icdGroupedDiseases.containsKey(node.name)) {
|
|
|
+ // 替换sNode为新的疾病名称列表
|
|
|
+ node.sNode = icdGroupedDiseases.get(node.name).stream()
|
|
|
+ .map(name -> {
|
|
|
+ TreeNode newNode = new TreeNode();
|
|
|
+ newNode.name = name;
|
|
|
+ newNode.sNode = new ArrayList<>();
|
|
|
+ return newNode;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ } else if (node.sNode != null) {
|
|
|
+ // 递归处理子节点
|
|
|
+ List<TreeNode> newChildren = new ArrayList<>();
|
|
|
+ for (TreeNode child : node.sNode) {
|
|
|
+ // 只处理和添加包含匹配疾病的节点
|
|
|
+ if (hasMatchingDiseases(child, icdGroupedDiseases)) {
|
|
|
+ updateTreeNodes(child, icdGroupedDiseases);
|
|
|
+ newChildren.add(child);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ node.sNode = newChildren;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean hasMatchingDiseases(TreeNode node, Map<String, List<String>> icdGroupedDiseases) {
|
|
|
+ if (node == null) return false;
|
|
|
+
|
|
|
+ // 如果是ICD码节点,直接检查是否有匹配的疾病
|
|
|
+ if (node.name != null && node.name.length() == 3) {
|
|
|
+ return icdGroupedDiseases.containsKey(node.name);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 对于非ICD码节点,检查其子节点
|
|
|
+ if (node.sNode != null) {
|
|
|
+ for (TreeNode child : node.sNode) {
|
|
|
+ if (hasMatchingDiseases(child, icdGroupedDiseases)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|