From c24d16a37523a49080392610357872ce580cbc38 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 26 十月 2026 14:03:33 +0800
Subject: [PATCH] 代码提交

---
 ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java |  299 +++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 186 insertions(+), 113 deletions(-)

diff --git a/ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java b/ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java
index 4ebe673..805a713 100644
--- a/ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java
+++ b/ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java
@@ -16,8 +16,10 @@
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -41,6 +43,21 @@
  *       鈥斺�� 閭f槸"椤烘墜浼樺寲"锛屼細鏀瑰彉鏌ヨ璇箟锛屽洖褰掓椂鏃犳硶閫愭潯姣斿銆�</li>
  * </ul>
  *
+ * <h3>2026-10 淇锛氭帴鍙� 1500 鏉′笂闄愬鑷寸殑闈欓粯涓㈡暟</h3>
+ * 鏉ユ湭鏉� {@code dtcQueryHealthcareRecordList} <b>鍗曟鏈�澶氳繑鍥� 1500 鏉�</b>锛岃秴鍑洪儴鍒嗙洿鎺ユ埅鏂紝
+ * 涓� {@code code} 浠嶆槸 200銆佷笉鎶ラ敊銆傚師"4 澶╀竴娈�"鍦ㄥ嚭闄㈤珮宄版湡锛堥櫌鍐呮瘡澶� 380~500 鏉★級蹇呯劧瓒呴檺锛�
+ * 浜庢槸姣忔鎮勬倓灏戝嚑鍗佹潯 鈥斺�� 琛ㄧ幇涓�"鍥炴函璺戞垚鍔熶簡锛屼絾鏌愭湀鐥呭尯浜烘暟姣旂湡瀹炲�煎皯鍑犳潯"銆�
+ * <p>
+ * 鐜板湪鐨勫仛娉曪紙瑙� {@link #gatherRange}锛夛細
+ * <ol>
+ *   <li>濂戠害鏂规硶鏀逛负杩斿洖鏉℃暟锛岀紪鎺掍晶鎹鍒ゆ柇鏄惁瑙﹂《锛�</li>
+ *   <li>瑙﹂《灏辫<b>鏃ユ湡浜屽垎</b>閲嶉噰锛�4 澶� 鈫� 2 澶� 鈫� 1 澶╋級锛�</li>
+ *   <li>鍗曟棩浠嶈Е椤跺氨鎸� {@code statusList} <b>鎷嗙姸鎬�</b>閲嶉噰锛堢姸鎬佷簰鏂ワ紝鍙棤鎹熸媶鍒嗭級锛�</li>
+ *   <li>杩炲崟鏃ュ崟鐘舵�侀兘瑙﹂《鏃舵墦 ERROR锛堝弬鏁板凡鏃犳硶鍐嶆媶锛夛紝鎶�"杩欐涓嶅畬鏁�"鍠婂嚭鏉ワ紝鑰屼笉鏄户缁潤榛樸��</li>
+ * </ol>
+ * 浜屽垎鍙湪瑙﹂《鏃跺彂鐢燂紝姝e父鍒嗘浠嶇劧鍙彂 1 娆¤姹傦紝涓嶄細鎶婃棩甯稿洖婧殑璇锋眰閲忕炕鍑犲�嶃��
+ *
+ *
  * <h3>瀹冧笉绠′粈涔�</h3>
  * 鐪熸鐨勯噰闆嗗姩浣滐紙HTTP 鍙栨暟銆佸叆搴擄級涓嶅湪鏈被锛氶偅閲屼粛鍦� smartor锛岀粡
  * {@link HisGatherApi} 濂戠害璋冪敤锛屽悗缁垎鎵规惉杩涙湰妯″潡銆�
@@ -55,6 +72,47 @@
      * 鐪佺珛鍚屽痉 / 鍗楀崕闄勪竴鐨勬満鏋処D锛堝師瀹炵幇閲岀殑瀛楅潰閲� {@code "20001001"}锛�
      */
     private static final String SLTD_ORG_ID = "20001001";
+
+    /**
+     * 鏉ユ湭鏉ユ煡璇㈡帴鍙g殑鍗曟杩斿洖涓婇檺锛氳秴杩囪繖涓潯鏁�<b>涓嶆姤閿欍�佸彧鎴柇</b>銆�
+     * <p>
+     * 瀹炴祴 {@code dtcQueryHealthcareRecordList} 鏈� 1500 鏉$‖涓婇檺锛坽@code code} 浠嶄负 200锛�
+     * 鍒嗛〉鍙傛暟 {@code pageNo/pageSize/current/size} 鍧囨棤鏁堬級锛屾墍浠ュ彧鑳介潬璋冪敤鏂硅瘑鍒苟鎷嗗垎銆�
+     */
+    private static final int HIS_QUERY_LIMIT = 1500;
+
+    /**
+     * 鍥炴函鏃朵竴娈垫渶澶氳法鍑犲ぉ锛�4 澶╀负鍘嗗彶鍊硷級銆�
+     * <p>
+     * 娈甸暱鍙奖鍝�"骞虫椂瑕佸彂鍑犳璇锋眰"锛屽畨鍏ㄦ�х敱 {@link #gatherRange} 鐨勮Е椤朵簩鍒嗕繚璇侊紝
+     * 鎵�浠ヤ笉蹇呬负浜嗕繚瀹堟妸瀹冩敼鎴� 1 澶╋紙閭d細璁╂棩甯稿洖婧姹傞噺缈� 4 鍊嶏級銆�
+     */
+    private static final int BACKFILL_SEGMENT_DAYS = 4;
+
+    /**
+     * 棰勫叆闄� / 鍏ラ櫌 / 鍑洪櫌涓夌被閲囬泦鍚勮嚜鐨勭姸鎬佺爜锛堜笌鍘熷疄鐜颁竴涓�瀵瑰簲锛屾娊甯搁噺渚夸簬鎸夌姸鎬佹媶鍒嗛噸閲囷級
+     */
+    private static final List<String> PRE_ADMIT_STATUS = Collections.unmodifiableList(Arrays.asList("FH0109.22", "FH0109.23", "FH0109.53"));
+
+    private static final List<String> ADMIT_STATUS = Collections.singletonList("FH0109.24");
+
+    private static final List<String> DISCHARGE_STATUS = Collections.unmodifiableList(Arrays.asList("FH0109.27", "FH0109.25"));
+
+    /**
+     * 璇婄枟璁板綍鐨勪笁绫婚噰闆嗗彛寰勶細鍐冲畾鏃ユ湡鏉′欢钀藉湪 DTO 鐨勫摢涓�缁勫瓧娈典笂銆�
+     */
+    private enum RecordKind {
+
+        PRE_ADMIT("棰勫叆闄�"),
+        ADMIT("鍏ラ櫌"),
+        DISCHARGE("鍑洪櫌");
+
+        private final String label;
+
+        RecordKind(String label) {
+            this.label = label;
+        }
+    }
 
     /**
      * 褰撴椂绔欑偣鏍囪瘑锛堝師 {@code RyTask} 鐨� {@code @Value("${spring.profiles.active}")}锛�
@@ -173,91 +231,56 @@
                     hisGatherApi.gatherIcd10();
                 }
 
-                // nhfy/sltd鍥炴函30澶╁垎娈甸噰闆嗗垽鏂紙姣忔鏈�澶�4澶╋級
+                // nhfy/sltd鍥炴函30澶╁垎娈甸噰闆嗗垽鏂紙姣忔鏈�澶� BACKFILL_SEGMENT_DAYS 澶╋紝瑙﹂《鑷姩浜屽垎锛�
                 boolean isBackfill = (active.trim().equals("nhfy") || active.trim().equals("sltd")) && StringUtils.isNotBlank(todayZeroStr);
                 if (isBackfill) {
                     DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                    LocalDate segStart = todayZero.toLocalDate().minusDays(30);
                     LocalDate segEndDate = todayZero.toLocalDate();
+                    // 绐楀彛 = [鍏ュ弬鏃ユ湡 - 30 澶�, 鍏ュ弬鏃ユ湡]锛屼袱绔兘鍚��
+                    // 鈿狅笍 鍏ュ弬鏃ユ湡"涔嬪悗"鐨勬暟鎹笉鍦ㄧ獥鍙e唴锛氭兂琛� 2026-07-31 灏辫浼� 2026-07-31锛屼紶 07-30 涓嶄細甯﹀嚭 7/31銆�
+                    LocalDate segStart = segEndDate.minusDays(30);
                     int segCount = 0;
+                    long fetchedTotal = 0L;
                     while (!segStart.isAfter(segEndDate)) {
-                        LocalDate segEnd = segStart.plusDays(3);
+                        LocalDate segEnd = segStart.plusDays(BACKFILL_SEGMENT_DAYS - 1L);
                         if (segEnd.isAfter(segEndDate)) {
                             segEnd = segEndDate;
                         }
                         segCount++;
                         log.info("銆恉ealHisData銆憑}鍥炴函绗瑊}娈甸噰闆嗭紝鏃ユ湡鑼冨洿锛歿} ~ {}", active.trim(), segCount, segStart.format(dateFmt), segEnd.format(dateFmt));
                         for (Long cid : campusidList) {
-                            collectSegmentData(cid, segStart.format(dateFmt), segEnd.format(dateFmt));
+                            fetchedTotal += collectSegmentData(cid, segStart.format(dateFmt), segEnd.format(dateFmt));
                         }
                         segStart = segEnd.plusDays(1);
                     }
-                    log.info("銆恉ealHisData銆憑}鍥炴函閲囬泦瀹屾垚锛屽叡{}娈�", active.trim(), segCount);
+                    log.info("銆恉ealHisData銆憑}鍥炴函閲囬泦瀹屾垚锛屽叡{}娈碉紝绐楀彛{} ~ {}锛屾帴鍙h繑鍥炶褰曞悎璁}鏉�", active.trim(), segCount,
+                            segEndDate.minusDays(30).format(dateFmt), segEndDate.format(dateFmt), fetchedTotal);
                 }
 
                 // 鐪佺珛鍚屽痉鏁版嵁閲囬泦锛堥潪鍥炴函妯″紡鎵嶆墽琛岋級
                 if (!isBackfill) {
+                    DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                     for (Long cid : campusidList) {
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰烽鍏ラ櫌寮�濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-                        String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-                        SltdGatherReq serviceSLTDInhospReqVO = new SltdGatherReq();
-                        serviceSLTDInhospReqVO.setOrgId(SLTD_ORG_ID);
-                        serviceSLTDInhospReqVO.setCampusId(cid);
-                        serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
-                        serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
+                        // sltd 鍙噰"浠婂ぉ"锛沶hfy 閲�"鏄ㄥぉ ~ 浠婂ぉ"锛堜笌鍘熷疄鐜颁竴鑷达級
+                        String nowTime = LocalDate.now().format(dateFmt);
+                        String head = nowTime;
+                        String tail = nowTime;
                         if (active.trim().equals("nhfy")) {
-                            serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                            serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                            head = yesterdayZero.format(dateFmt);
+                            tail = todayZero.format(dateFmt);
                         }
-                        List<String> list = new ArrayList<>();
-                        list.add("FH0109.22");
-                        list.add("FH0109.23");
-                        list.add("FH0109.53");
-                        serviceSLTDInhospReqVO.setStatusList(list);
-//                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
-                        hisGatherApi.gatherSltdHealthcareRecords(serviceSLTDInhospReqVO);
+
+                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
+                        gatherRange(cid, RecordKind.PRE_ADMIT, head, tail, PRE_ADMIT_STATUS);
                         log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濈祼鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
 
                         log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-                        serviceSLTDInhospReqVO.setOrgId(SLTD_ORG_ID);
-                        serviceSLTDInhospReqVO.setCampusId(cid);
-                        serviceSLTDInhospReqVO.setEncounterTimeStart(null);
-                        serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
-                        serviceSLTDInhospReqVO.setStartHeadTime(nowTime);
-                        serviceSLTDInhospReqVO.setStartTailTime(nowTime);
-                        if (active.trim().equals("nhfy")) {
-                            serviceSLTDInhospReqVO.setStartHeadTime(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                            serviceSLTDInhospReqVO.setStartTailTime(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                        }
-                        List<String> listStr = new ArrayList<>();
-                        listStr.add("FH0109.24");
-                        serviceSLTDInhospReqVO.setStatusList(listStr);
-//                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
-                        hisGatherApi.gatherSltdHealthcareRecords(serviceSLTDInhospReqVO);
+                        gatherRange(cid, RecordKind.ADMIT, head, tail, ADMIT_STATUS);
                         log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濈祼鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
 
                         log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-                        serviceSLTDInhospReqVO.setStartHeadTime(null);
-                        serviceSLTDInhospReqVO.setStartTailTime(null);
-                        serviceSLTDInhospReqVO.setEncounterTimeStart(null);
-                        serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
-                        serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(nowTime);
-                        serviceSLTDInhospReqVO.setPreOutHospitalTailDate(nowTime);
-                        if (active.trim().equals("nhfy")) {
-                            serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                            serviceSLTDInhospReqVO.setPreOutHospitalTailDate(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                        }
-                        serviceSLTDInhospReqVO.setHealthcareRecordTypeList(null);
-                        List<String> list2 = new ArrayList<>();
-//                    list2.add("FH0108.02");
-                        //鍑洪櫌
-                        list2.add("FH0109.27");
-                        //棰勫嚭闄�
-                        list2.add("FH0109.25");
-                        serviceSLTDInhospReqVO.setStatusList(list2);
-//                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
-                        hisGatherApi.gatherSltdHealthcareRecords(serviceSLTDInhospReqVO);
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濇潫閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
+                        gatherRange(cid, RecordKind.DISCHARGE, head, tail, DISCHARGE_STATUS);
+                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濈祼鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
                     }
                 }
 
@@ -268,74 +291,124 @@
     }
 
     /**
-     * 鍒嗘閲囬泦鏁版嵁锛堥鍏ラ櫌銆佸叆闄€�佸嚭闄級
-     * 鐢ㄤ簬nhfy/sltd鍥炴函閲囬泦锛屾瘡娆℃渶澶氭煡璇�7澶╂暟鎹�
+     * 鍒嗘閲囬泦鏁版嵁锛堥鍏ラ櫌銆佸叆闄€�佸嚭闄級銆�
+     * <p>
+     * 娈甸暱瑙� {@link #BACKFILL_SEGMENT_DAYS}锛屾瘡绫婚噰闆嗗唴閮ㄨ繕浼氬仛"瑙﹂《浜屽垎"锛堣 {@link #gatherRange}锛夛紝
+     * 鍥犳涓嶄細鍥犱负鏉ユ湭鏉ユ帴鍙� 1500 鏉′笂闄愯�屾倓鎮勫皯鏁版嵁銆�
      *
      * @param cid          闄㈠尯ID
      * @param startDateStr 鏃ユ湡寮�濮� yyyy-MM-dd
      * @param endDateStr   鏃ユ湡缁撴潫 yyyy-MM-dd
+     * @return 鏈涓夌被閲囬泦鎺ュ彛杩斿洖鐨勮褰曟暟鍚堣锛堝洖婧粨鏉熸椂鐢ㄤ簬鎬婚噺鏍稿锛�
      */
-    private void collectSegmentData(Long cid, String startDateStr, String endDateStr) {
-//        // 棰勫叆闄�
+    private int collectSegmentData(Long cid, String startDateStr, String endDateStr) {
+        int count = 0;
+
         log.info("銆恉ealHisData銆戦鍏ラ櫌寮�濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
-        SltdGatherReq reqVO = new SltdGatherReq();
-        reqVO.setOrgId(SLTD_ORG_ID);
-        reqVO.setCampusId(cid);
-        reqVO.setEncounterTimeStart(startDateStr);
-        reqVO.setEncounterTimeEnd(endDateStr);
-        List<String> preAdmitStatus = new ArrayList<>();
-        preAdmitStatus.add("FH0109.22");
-        preAdmitStatus.add("FH0109.23");
-        preAdmitStatus.add("FH0109.53");
-        reqVO.setStatusList(preAdmitStatus);
-        log.info("銆恉ealHisData銆戦鍏ラ櫌閲囬泦鏁版嵁鍏ュ弬锛歿}", reqVO);
-        try {
-            hisGatherApi.gatherSltdHealthcareRecords(reqVO);
-        } catch (Exception e) {
-            // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
-            log.error("銆恉ealHisData銆戦鍏ラ櫌閲囬泦澶辫触锛岃烦杩囪绫荤户缁�傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
-        }
+        count += gatherRange(cid, RecordKind.PRE_ADMIT, startDateStr, endDateStr, PRE_ADMIT_STATUS);
         log.info("銆恉ealHisData銆戦鍏ラ櫌绲備簡閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
 
-        // 鍏ラ櫌
         log.info("銆恉ealHisData銆戝叆闄㈠紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
-        reqVO = new SltdGatherReq();
-        reqVO.setOrgId(SLTD_ORG_ID);
-        reqVO.setCampusId(cid);
-        reqVO.setStartHeadTime(startDateStr);
-        reqVO.setStartTailTime(endDateStr);
-        List<String> admitStatus = new ArrayList<>();
-        admitStatus.add("FH0109.24");
-        reqVO.setStatusList(admitStatus);
-        log.info("銆恉ealHisData銆戝叆闄㈤噰闆嗘暟鎹叆鍙傦細{}", reqVO);
-        try {
-            hisGatherApi.gatherSltdHealthcareRecords(reqVO);
-        } catch (Exception e) {
-            // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
-            log.error("銆恉ealHisData銆戝叆闄㈤噰闆嗗け璐ワ紝璺宠繃璇ョ被缁х画銆傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
-        }
+        count += gatherRange(cid, RecordKind.ADMIT, startDateStr, endDateStr, ADMIT_STATUS);
         log.info("銆恉ealHisData銆戝叆闄㈢祩浜嗛噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
 
-        // 鍑洪櫌
         log.info("銆恉ealHisData銆戝嚭闄㈠紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
-        reqVO = new SltdGatherReq();
-        reqVO.setOrgId(SLTD_ORG_ID);
-        reqVO.setCampusId(cid);
-        reqVO.setPreOutHospitalHeadDate(startDateStr);
-        reqVO.setPreOutHospitalTailDate(endDateStr);
-        List<String> dischargeStatus = new ArrayList<>();
-        //鍑洪櫌
-        dischargeStatus.add("FH0109.27");
-        //棰勫嚭闄�
-        dischargeStatus.add("FH0109.25");
-        reqVO.setStatusList(dischargeStatus);
-        log.info("銆恉ealHisData銆戝嚭闄㈤噰闆嗘暟鎹叆鍙傦細{}", reqVO);
-        try {
-            hisGatherApi.gatherSltdHealthcareRecords(reqVO);
-        } catch (Exception e) {
-            // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
-            log.error("銆恉ealHisData銆戝嚭闄㈤噰闆嗗け璐ワ紝璺宠繃璇ョ被缁х画銆傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
-        }
+        count += gatherRange(cid, RecordKind.DISCHARGE, startDateStr, endDateStr, DISCHARGE_STATUS);
         log.info("銆恉ealHisData銆戝嚭闄㈢粨鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
+
+        return count;
+    }
+
+    /**
+     * 鎸夐噰闆嗗彛寰勭粍瑁呭叆鍙傦細涓夌被鐨勫尯鍒彧鍦�"鏃ユ湡鏉′欢钀藉湪鍝竴缁勫瓧娈典笂"銆�
+     *
+     * @param cid      闄㈠尯ID
+     * @param kind     棰勫叆闄� / 鍏ラ櫌 / 鍑洪櫌
+     * @param from     璧峰鏃ユ湡 yyyy-MM-dd
+     * @param to       鎴鏃ユ湡 yyyy-MM-dd锛堝惈锛�
+     * @param statuses 璇ュ彛寰勫搴旂殑鐘舵�佺爜
+     */
+    private SltdGatherReq buildReq(Long cid, RecordKind kind, String from, String to, List<String> statuses) {
+        SltdGatherReq req = new SltdGatherReq();
+        req.setOrgId(SLTD_ORG_ID);
+        req.setCampusId(cid);
+        switch (kind) {
+            case PRE_ADMIT:
+                req.setEncounterTimeStart(from);
+                req.setEncounterTimeEnd(to);
+                break;
+            case ADMIT:
+                req.setStartHeadTime(from);
+                req.setStartTailTime(to);
+                break;
+            case DISCHARGE:
+                req.setPreOutHospitalHeadDate(from);
+                req.setPreOutHospitalTailDate(to);
+                // 鍑洪櫌閲囬泦鍙寜鍑洪櫌鏃堕棿杩囨护锛岃瘖鐤楃被鍨嬫樉寮忕疆 null锛堜笌鍘熷疄鐜颁竴鑷达級
+                req.setHealthcareRecordTypeList(null);
+                break;
+            default:
+                break;
+        }
+        req.setStatusList(statuses);
+        return req;
+    }
+
+    /**
+     * 閲囦竴娈碉紝蹇呰鏃舵媶灏忛噸閲囷紝杩斿洖杩欐瀹為檯鍙栧埌鐨勮褰曟暟銆�
+     *
+     * <p>鏉ユ湭鏉ユ帴鍙e崟娆℃渶澶氳繑鍥� {@link #HIS_QUERY_LIMIT} 鏉★紝瓒呭嚭閮ㄥ垎<b>鐩存帴鎴柇涓斾笉鎶ラ敊</b>锛�
+     * 鎵�浠ュ彧鑳界敤"杩斿洖鏉℃暟瑙﹂《"鏉ヨ瘑鍒紝骞舵寜涓嬮潰鐨勯『搴忔媶鍒嗭紙<b>鍙湁瑙﹂《鎵嶄細鎷嗭紝骞虫椂浠嶆槸 1 娆¤姹�</b>锛夛細
+     * <ol>
+     *   <li>璺ㄥ澶╋細鏃ユ湡瀵瑰崐鎷嗭紝閫掑綊閲嶉噰锛�</li>
+     *   <li>宸茬缉鍒板崟澶╋細鎸� {@code statusList} 鎷嗭紙鐘舵�佷簰鏂ワ紝鎷嗗紑鏃笉婕忎篃涓嶉噸锛夛紱</li>
+     *   <li>鍗曟棩鍗曠姸鎬佷粛瑙﹂《锛氭墦 ERROR 鈥斺�� 璇锋眰鍙傛暟缁村害宸茬敤灏斤紝鍙兘闈犱汉鐪嬫棩蹇楄ˉ閲囥��</li>
+     * </ol>
+     *
+     * @param cid      闄㈠尯ID
+     * @param kind     棰勫叆闄� / 鍏ラ櫌 / 鍑洪櫌
+     * @param from     璧峰鏃ユ湡 yyyy-MM-dd
+     * @param to       鎴鏃ユ湡 yyyy-MM-dd锛堝惈锛�
+     * @param statuses 璇ュ彛寰勫搴旂殑鐘舵�佺爜
+     * @return 瀹為檯鍙栧埌鐨勮褰曟暟锛堟媶鍒嗗悗涓哄悇瀛愭涔嬪拰锛�
+     */
+    private int gatherRange(Long cid, RecordKind kind, String from, String to, List<String> statuses) {
+        SltdGatherReq req = buildReq(cid, kind, from, to, statuses);
+        log.info("銆恉ealHisData銆憑}閲囬泦鍏ュ弬锛歿}", kind.label, req);
+
+        int count;
+        try {
+            count = hisGatherApi.gatherSltdHealthcareRecords(req);
+        } catch (Exception e) {
+            // 鍗曠被鏁版嵁澶辫触涓嶅悜涓婃姏锛氬惁鍒欎竴娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
+            log.error("銆恉ealHisData銆憑}閲囬泦澶辫触锛岃烦杩囪绫荤户缁�傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", kind.label, cid, from, to, e);
+            return 0;
+        }
+        if (count < HIS_QUERY_LIMIT) {
+            return count;
+        }
+
+        // 鍛戒腑涓婇檺锛氭帴鍙d笉鎶ラ敊锛屽彧鏄妸瓒呭嚭鐨勬暟鎹涪鎺夛紝蹇呴』鎷嗗皬閲嶉噰
+        LocalDate start = LocalDate.parse(from);
+        LocalDate end = LocalDate.parse(to);
+        if (start.isBefore(end)) {
+            LocalDate mid = start.plusDays(ChronoUnit.DAYS.between(start, end) / 2);
+            log.warn("銆恉ealHisData銆憑}涓�娆¤繑鍥炶Е杈炬帴鍙d笂闄� {} 鏉★紝鎸夋棩鏈熶簩鍒嗛噸閲囥�傞櫌鍖猴細{}锛寋} ~ {} => {} ~ {} / {} ~ {}",
+                    kind.label, HIS_QUERY_LIMIT, cid, from, to, from, mid, mid.plusDays(1), to);
+            return gatherRange(cid, kind, from, mid.toString(), statuses)
+                    + gatherRange(cid, kind, mid.plusDays(1).toString(), to, statuses);
+        }
+        if (statuses.size() > 1) {
+            log.warn("銆恉ealHisData銆憑}鍗曟棩浠嶈Е杈炬帴鍙d笂闄� {} 鏉★紝鎸夌姸鎬佹媶鍒嗛噸閲囥�傞櫌鍖猴細{}锛屾棩鏈燂細{}锛岀姸鎬侊細{}",
+                    kind.label, HIS_QUERY_LIMIT, cid, from, statuses);
+            int sum = 0;
+            for (String status : statuses) {
+                sum += gatherRange(cid, kind, from, to, Collections.singletonList(status));
+            }
+            return sum;
+        }
+        log.error("銆恉ealHisData銆憑}鍗曟棩鍗曠姸鎬佷粛瑙﹁揪鎺ュ彛涓婇檺 {} 鏉★紝宸叉棤娉曞啀鎷嗗垎锛屾湰娆℃暟鎹彲鑳戒笉瀹屾暣锛侀櫌鍖猴細{}锛屾棩鏈燂細{}锛岀姸鎬侊細{}",
+                kind.label, HIS_QUERY_LIMIT, cid, from, statuses);
+        return count;
     }
 }

--
Gitblit v1.9.3