From ba8b51763d81a089a9c560a578f7b68441446494 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期四, 30 四月 2026 20:47:53 +0800
Subject: [PATCH] 南华附一 和  登陆优化

---
 smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java |  208 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 186 insertions(+), 22 deletions(-)

diff --git a/smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java
index e84b6a3..5b2d4a9 100644
--- a/smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java
@@ -1,97 +1,261 @@
 package com.smartor.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.google.gson.Gson;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.http.HttpUtils;
 import com.smartor.domain.Icd10;
 import com.smartor.mapper.Icd10Mapper;
 import com.smartor.service.IIcd10Service;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 鐤剧梾Service涓氬姟灞傚鐞�
- * 
+ *
  * @author ruoyi
  * @date 2023-12-21
  */
+@Slf4j
 @Service
-public class Icd10ServiceImpl implements IIcd10Service
-{
+public class Icd10ServiceImpl implements IIcd10Service {
+
     @Autowired
     private Icd10Mapper icd10Mapper;
 
+    @Value("${sltd_pub_path}")
+    private String sltdPubPath;
+
+    @Value("${lwl_app_key}")
+    private String APP_KEY;
+
+    /**
+     * 鍥哄畾 orgId
+     */
+    private static final long ORG_ID = 20001001L;
+    /**
+     * 姣忛〉鎷夊彇鏉℃暟锛堟帴鍙f渶澶у厑璁� 1000锛�
+     */
+    private static final int PAGE_SIZE = 1000;
+    /**
+     * 鎵归噺鍐欏叆鍗曟壒鏈�澶ф潯鏁�
+     */
+    private static final int BATCH_SIZE = 500;
+
     /**
      * 鏌ヨ鐤剧梾
-     * 
+     *
      * @param icdid 鐤剧梾涓婚敭
      * @return 鐤剧梾
      */
     @Override
-    public Icd10 selectIcd10ByIcdid(Long icdid)
-    {
+    public Icd10 selectIcd10ByIcdid(Long icdid) {
         return icd10Mapper.selectIcd10ByIcdid(icdid);
     }
 
     /**
      * 鏌ヨ鐤剧梾鍒楄〃
-     * 
+     *
      * @param icd10 鐤剧梾
      * @return 鐤剧梾
      */
     @Override
-    public List<Icd10> selectIcd10List(Icd10 icd10)
-    {
+    public List<Icd10> selectIcd10List(Icd10 icd10) {
         return icd10Mapper.selectIcd10List(icd10);
     }
 
     /**
      * 鏂板鐤剧梾
-     * 
+     *
      * @param icd10 鐤剧梾
      * @return 缁撴灉
      */
     @Override
-    public int insertIcd10(Icd10 icd10)
-    {
+    public int insertIcd10(Icd10 icd10) {
         icd10.setCreateTime(DateUtils.getNowDate());
         return icd10Mapper.insertIcd10(icd10);
     }
 
     /**
      * 淇敼鐤剧梾
-     * 
+     *
      * @param icd10 鐤剧梾
      * @return 缁撴灉
      */
     @Override
-    public int updateIcd10(Icd10 icd10)
-    {
+    public int updateIcd10(Icd10 icd10) {
         icd10.setUpdateTime(DateUtils.getNowDate());
         return icd10Mapper.updateIcd10(icd10);
     }
 
     /**
      * 鎵归噺鍒犻櫎鐤剧梾
-     * 
+     *
      * @param icdids 闇�瑕佸垹闄ょ殑鐤剧梾涓婚敭
      * @return 缁撴灉
      */
     @Override
-    public int deleteIcd10ByIcdids(Long[] icdids)
-    {
+    public int deleteIcd10ByIcdids(Long[] icdids) {
         return icd10Mapper.deleteIcd10ByIcdids(icdids);
     }
 
     /**
      * 鍒犻櫎鐤剧梾淇℃伅
-     * 
+     *
      * @param icdid 鐤剧梾涓婚敭
      * @return 缁撴灉
      */
     @Override
-    public int deleteIcd10ByIcdid(Long icdid)
-    {
+    public int deleteIcd10ByIcdid(Long icdid) {
         return icd10Mapper.deleteIcd10ByIcdid(icdid);
     }
+
+    /**
+     * 浠庤繙绋嬫帴鍙o紙鏉ユ湭鏉ワ級鍒嗛〉鎷夊彇骞跺閲忓啓鍏� icd10 琛ㄣ��
+     * <p>
+     * 浼樺寲瑕佺偣锛�
+     * 1. 姣忛〉鏈�澶ф媺鍙� 1000 鏉★紝鍑忓皯璇锋眰娆℃暟銆�
+     * 2. 姣忛〉鎶婂綋鍓嶉〉鎵�鏈� icdcode 鐢ㄤ竴鏉� IN SQL 涓�娆℃壒閲忔煡搴擄紝閬垮厤寰幆 N 娆″崟鏉℃煡璇€��
+     * 3. 灏嗕笉瀛樺湪鐨勮褰曟敹闆嗗悗鍒嗘壒锛堟瘡鎵� 500 鏉★級鎵归噺鎻掑叆銆�
+     * </p>
+     *
+     * @return 鏈杩愯鏂板鎬绘潯鏁�
+     */
+    @Override
+    public int queryAddIcd10() {
+        int totalInserted = 0;
+        long current = 1;
+        long totalPages = 1; // 棣栨寰幆鍓嶅厛鎵ц涓�娆�
+
+        log.info("[寮�濮媇 浠庢潵鏈潵鎷夊彇 ICD10 澧為噺鏁版嵁锛宱rgId={}", ORG_ID);
+
+        do {
+            // 鏋勫缓璇锋眰浣�
+            Map<String, Object> requestBody = new HashMap<>();
+            requestBody.put("orgId", ORG_ID);
+            requestBody.put("searchText", "");
+            requestBody.put("size", PAGE_SIZE);
+            requestBody.put("current", current);
+
+            String responseStr;
+            try {
+                Map<String, String> headers = buildRequestHeaders();
+                responseStr = HttpUtils.sendPostByHeader(sltdPubPath + "/hbos-thirdparty-integration/standard/base/dtc/pageDiagnosisDict", new Gson().toJson(requestBody), headers);
+
+            } catch (Exception e) {
+                log.error("[绗瑊}椤礭 璇锋眰鏉ユ湭鏉ユ帴鍙eけ璐�", current, e);
+                break;
+            }
+
+            if (responseStr == null || responseStr.isEmpty()) {
+                log.warn("[绗瑊}椤礭 鎺ュ彛杩斿洖绌猴紝鍋滄閲囬泦", current);
+                break;
+            }
+
+            JSONObject resp = JSON.parseObject(responseStr);
+            if (resp == null || !Boolean.TRUE.equals(resp.getBoolean("success"))) {
+                log.error("[绗瑊}椤礭 鎺ュ彛杩斿洖澶辫触锛歿}", current, responseStr);
+                break;
+            }
+
+            JSONObject data = resp.getJSONObject("data");
+            if (data == null) {
+                break;
+            }
+
+            // 璁$畻鎬婚〉鏁�
+            long total = data.getLongValue("total");
+            long pageSize = data.getLongValue("size");
+            if (pageSize <= 0) {
+                break;
+            }
+            totalPages = (total + pageSize - 1) / pageSize;
+
+            JSONArray records = data.getJSONArray("records");
+            if (records == null || records.isEmpty()) {
+                break;
+            }
+
+            log.info("[绗瑊}/{}椤礭 鑾峰彇 {} 鏉¤褰曪紝鎬粄}鏉�", current, totalPages, records.size(), total);
+
+            // 瑙f瀽褰撳墠椤垫暟鎹�
+            List<String> pageNames = new ArrayList<>();
+            List<Icd10> pageList = new ArrayList<>();
+            for (int i = 0; i < records.size(); i++) {
+                JSONObject rec = records.getJSONObject(i);
+                String icdCode = rec.getString("icdCode");
+                if (icdCode == null || icdCode.isEmpty()) {
+                    continue;
+                }
+                String icdName = StringUtils.isEmpty(rec.getString("name")) ? null : rec.getString("name").trim();
+                if (icdName == null || icdName.isEmpty()) {
+                    continue;
+                }
+                pageNames.add(icdName);
+
+                Icd10 icd10 = new Icd10();
+                icd10.setIcdcode(icdCode);
+                icd10.setIcdname(icdName);
+                icd10.setIcdpym(rec.getString("pinyin"));
+                icd10.setHisIcdid(rec.getString("his_icdid"));
+                icd10.setOrgid(String.valueOf(ORG_ID));
+                icd10.setDelFlag("0");
+                icd10.setCreateTime(DateUtils.getNowDate());
+                pageList.add(icd10);
+            }
+
+            if (pageNames.isEmpty()) {
+                current++;
+                continue;
+            }
+
+            // 涓�娆� IN 鏌ュ簱锛岃幏鍙栧凡瀛樺湪鐨� icdname锛堟牳蹇冨幓閲嶄紭鍖栫偣锛夊崡鍗庨檮涓�鐨刬cdname涓嶄細閲嶅锛宨cd10code浼氶噸澶�
+            Set<String> existingNames = new HashSet<>(icd10Mapper.selectExistingIcdcodes(pageNames));
+
+            // 杩囨护鍑轰笉瀛樺湪鐨勮褰�
+            List<Icd10> newList = pageList.stream().filter(item -> !existingNames.contains(item.getIcdname())).collect(Collectors.toList());
+
+            log.info("[绗瑊}/{}椤礭 褰撳墠椤靛叡 {} 鏉★紝宸插瓨鍦� {} 鏉★紝闇�鏂板叆搴� {} 鏉�", current, totalPages, pageList.size(), existingNames.size(), newList.size());
+
+            // 鍒嗘壒鎵归噺鎻掑叆
+            int inserted = batchInsert(newList);
+            totalInserted += inserted;
+
+            current++;
+        } while (current <= totalPages);
+
+        log.info("[瀹屾垚] ICD10 澧為噺閲囬泦缁撴潫锛屾湰娆″叡鏂板 {} 鏉�", totalInserted);
+        return totalInserted;
+    }
+
+    /**
+     * 鍒嗘壒鎵归噺鎻掑叆锛屾瘡鎵规渶澶� BATCH_SIZE 鏉�
+     */
+    private int batchInsert(List<Icd10> list) {
+        if (list == null || list.isEmpty()) {
+            return 0;
+        }
+        int total = 0;
+        int size = list.size();
+        for (int start = 0; start < size; start += BATCH_SIZE) {
+            int end = Math.min(start + BATCH_SIZE, size);
+            total += icd10Mapper.batchIcd10(list.subList(start, end));
+        }
+        return total;
+    }
+
+    private Map<String, String> buildRequestHeaders() {
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("app-key", APP_KEY);
+        return headers;
+    }
 }

--
Gitblit v1.9.3