From cc479e6a056785103996cc7ea67dbd5faa3e800e Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 19 十月 2026 18:07:22 +0800
Subject: [PATCH] 数据采集模块

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java |  525 ++++++++++++++++++++++++++--------------------------------
 1 files changed, 235 insertions(+), 290 deletions(-)

diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
index c302ea0..4c9a20d 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -25,7 +25,6 @@
 import com.ruoyi.quartz.enums.MzGatherSlotEnum;
 import com.ruoyi.quartz.enums.MzGatherStatusEnum;
 import com.ruoyi.quartz.service.ICollectHISService;
-import com.ruoyi.quartz.util.CreateDataTable;
 import com.ruoyi.system.domain.SysConfig;
 import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.system.service.ISysConfigService;
@@ -34,8 +33,7 @@
 import com.ruoyi.message.sms.provider.sltd.ws.MessageSend;
 import com.smartor.common.QwenLLMUtil;
 import com.smartor.domain.*;
-import com.smartor.domain.VO.ServiceSubtaskDetailTraceVO;
-import com.smartor.domain.entity.ServiceSubtaskEntity;
+import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
 import com.smartor.mapper.*;
 import com.smartor.service.*;
 import lombok.extern.slf4j.Slf4j;
@@ -60,6 +58,24 @@
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import com.ruoyi.template.domain.HeLibrary;
+import com.ruoyi.inhospvisit.domain.PatMedInhosp;
+import com.ruoyi.template.api.TemplateFacade;
+import com.ruoyi.common.core.domain.entity.PatArchive;
+import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
+import com.ruoyi.task.domain.ServiceSubtask;
+import com.ruoyi.task.domain.ServiceSubtaskRecord;
+import com.ruoyi.task.domain.ServiceTask;
+import com.ruoyi.task.mapper.ServiceSubtaskMapper;
+import com.ruoyi.task.mapper.ServiceTaskMapper;
+import com.ruoyi.task.domain.ServiceSubtaskDetailTrace;
+import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
+import com.ruoyi.task.service.IServiceSubtaskDetailTraceService;
+import com.ruoyi.task.domain.ServiceOutPath;
+import com.ruoyi.task.service.IServiceOutPathService;
+import com.ruoyi.task.domain.ServiceSubtaskPreachform;
+import com.ruoyi.task.service.IServiceSubtaskService;
+import com.ruoyi.task.domain.SendMagParam;
 /**
  * 瀹氭椂浠诲姟璋冨害娴嬭瘯
  *
@@ -71,6 +87,12 @@
     @Autowired
     private IServiceThirdDataService iServiceThirdDataService;
 
+    /**
+     * 妯℃澘鏁版嵁涓�寰嬬粡 ruoyi-template 鐨勯棬闈㈠彇鐢紙璺ㄦā鍧楁暟鎹闂師鍒欙級銆�
+     */
+    @Autowired
+    private TemplateFacade templateFacade;
+
     @Autowired
     private IServiceOutPathService iServiceOutPathService;
 
@@ -80,11 +102,15 @@
     @Autowired
     private IPatMedInhospService iPatMedInhospService;
 
+    /**
+     * 鎵嬫湳闅忚妯″潡鐨�<b>甯搁┗闂ㄩ潰</b>锛堝師娉ㄥ叆 {@code IPatMedOperationService}锛夈��
+     * <p>
+     * 鎵嬫湳闅忚缂栨帓宸叉暣浣撹縼鍏� {@code ruoyi-othervisit}锛屾湰绫诲彧鍋氳皟鐢ㄣ��
+     * 鈿狅笍 娉ㄥ叆闂ㄩ潰鑰屼笉鏄ā鍧楀唴閮ㄥ疄鐜帮細闂ㄩ潰姘歌繙瀛樺湪锛屾ā鍧楁湭鎵撹繘搴旂敤鎴�
+     * {@code othervisit.enabled=false} 鏃跺彧鏄檷绾у苟鎵� WARN锛屼笉浼氬惎鍔ㄥけ璐ャ��
+     */
     @Autowired
-    private IPatMedOuthospService iPatMedOuthospService;
-
-    @Autowired
-    private IPatMedOperationService iPatMedOperationService;
+    private com.ruoyi.othervisit.api.OtherVisitFacade otherVisitFacade;
 
     @Autowired
     private IServiceSubtaskService iServiceSubtaskService;
@@ -92,17 +118,17 @@
     @Autowired
     private IServicePatientTempService iServicePatientTempService;
 
-    @Autowired
-    private IHNGatherPatArchiveService ihnGatherPatArchiveService;
+    // 鈿狅笍 2026-10 绉婚櫎锛氬師 `IHNGatherPatArchiveService ihnGatherPatArchiveService` 瀛楁銆�
+    //    瀹冨湪鏈被閲�**鍙�**琚� dealHisData 鐨勬渤鍗楀垎鏀娇鐢紙姝诲瓧娈垫鏌ワ細鏀瑰墠鍏ㄦ枃浠朵粎 1 澶勪娇鐢級锛�
+    //    璇ュ垎鏀凡闅忔柟娉曚綋鎼繘 ruoyi-datacollection锛屾晠瀛楁杩炲甫鍒犻櫎 鈥斺��
+    //    鐣欑潃瀹冧細璁╀汉璇互涓� smartor 鐨勬渤鍗楅噰闆嗚繕鏈夋湰绫昏繖涓娇鐢ㄦ柟
+    //    锛堢湡姝g殑浣跨敤鏂瑰凡鏄暟鎹噰闆嗘ā鍧楃粡濂戠害 HisGatherApi 璋冪敤鐨� Bridge锛夈��
 
     @Autowired
     private IServiceSLTDHealthcareRecordService serviceSLTDHealthcareRecordService;
 
     @Autowired
     private SysUserImportMapper sysUserImportMapper;
-
-    @Autowired
-    private HeLibraryMapper heLibraryMapper;
 
     @Autowired
     private ICollectHISService ichService;
@@ -115,7 +141,6 @@
 
     @Autowired
     private ISysUserService userService;
-
 
     @Value("${localIP}")
     private String localIP;
@@ -138,8 +163,9 @@
     @Autowired
     private IServiceSubtaskRecordService serviceSubtaskRecordService;
 
-    @Autowired
-    IIcd10Service iIcd10Service;
+    // 鈿狅笍 2026-10 绉婚櫎锛氬師 `IIcd10Service iIcd10Service` 瀛楁銆�
+    //    瀹冨湪鏈被閲�**鍙�**琚� dealHisData 鐨�"鐤剧梾瀛楀吀澧為噺閲囬泦"涓�琛岃皟鐢紝宸查殢鏂规硶浣撴惉杩�
+    //    ruoyi-datacollection锛堢粡濂戠害 HisGatherApi#gatherIcd10 璋冨洖 smartor 鐨勫疄鐜帮級銆�
 
     @Autowired
     IPatArchiveService patArchiveService;
@@ -154,12 +180,6 @@
     IPatMedOuthospService patMedOuthospService;
 
     @Autowired
-    ISvyTaskTemplateService svyTaskTemplateService;
-
-    @Autowired
-    IIvrTaskTemplateService iIvrTaskTemplateService;
-
-    @Autowired
     IXHGatherPatArchiveService ixhGatherPatArchiveService;
 
     @Autowired
@@ -168,12 +188,70 @@
     @Autowired
     ICollectHISService icollectHis;
 
+    /**
+     * 闂ㄨ瘖鍒嗚〃缁存姢宸叉暣浣撹縼鍏� {@code ruoyi-outpatientvisit}锛岃繖閲屽彧鎸佹湁瀹冪殑甯搁┗闂ㄩ潰銆�
+     * <p>
+     * 鈿狅笍 娉ㄥ叆闂ㄩ潰鑰屼笉鏄唴閮ㄥ疄鐜帮細闂ㄩ潰<b>姘歌繙瀛樺湪</b>锛屽嵆浣挎ā鍧楁病琚墦杩涘簲鐢ㄦ湰绫讳篃涓嶄細鍚姩澶辫触銆�
+     */
     @Autowired
-    CreateDataTable createDataTable;
+    private com.ruoyi.outpatientvisit.api.OuthospVisitFacade outhospVisitFacade;
 
+    /**
+     * 鍑哄叆闄㈤殢璁挎ā鍧楃殑<b>甯搁┗闂ㄩ潰</b>銆�
+     * <p>
+     * 鈿狅笍 2025 淇锛氭湰绫荤殑 <b>3 涓殢璁垮叆鍙e師鍏堜笉鍒ゅ紑鍏�</b> 鈥斺��
+     * 瀹冧滑璋冪敤 {@code IPatMedInhospService}锛坰martor 閲岀殑閬楃暀瀹炵幇锛岃
+     * {@code PatMedInhospServiceImpl}锛夛紝鑰岄偅涓疄鐜扮敤闂ㄩ潰<b>鍙槸涓轰簡鍙栨暟鎹�</b>
+     * 锛坽@code selectPatMedInhospList} / {@code updatePatMedInhosp}锛夛紝
+     * <b>浠庝笉璋冪敤闂ㄩ潰鐨勭紪鎺掓柟娉�</b>銆備簬鏄� {@code inhospvisit.enabled} /
+     * {@code publicity.enabled} / {@code othervisit.enabled} 瀵瑰畾鏃朵换鍔�<b>瀹屽叏澶辨晥</b>锛�
+     * 闂ㄩ潰鐨勭紪鎺掑畧鍗紙{@code InhospVisitFacade#dealOutHospInfo} 绛夛級铏界劧鏈夊疄鐜般��
+     * 鏈夋祴璇曪紝鍗村彧鏈� HTTP 鎵嬪姩瑙﹀彂閭d竴鏉¤矾璧板緱鍒般��
+     * <p>
+     * 鐜板湪鏀逛负涓庢墜鏈殢璁匡紙鎵嬫湳闅忚鏃╁凡璧� {@code otherVisitFacade}锛岃 {@link #dealOperationInfo()}锛�
+     * 瀹屽叏鍚屽舰锛氬畾鏃朵换鍔¤蛋闂ㄩ潰锛屽紑鍏冲湪闂ㄩ潰閲岀粺涓�鍒ゃ�傛ā鍧楀疄鐜板唴閮ㄤ細鍥炶皟
+     * {@code PublicityApi} / {@code OtherVisitApi}锛岄偅涓ゅ鍚勮嚜鍒よ嚜宸辩殑寮�鍏筹紝
+     * 鎵�浠ヤ竴娆″垏鎹㈣ 3 涓紑鍏冲悓鏃剁敓鏁堛��
+     * <p>
+     * 鈿狅笍 <b>涓嶈兘娉ㄥ叆 {@code InhospVisitApi} 鎺ュ彛</b>锛氬鍣ㄩ噷鏈変袱涓疄鐜�
+     * 锛堟湰闂ㄩ潰 + 鍐呴儴瀹炵幇 {@code DefaultInhospVisitApi}锛夛紝鎸夌被鍨嬫敞鍏ヤ細姝т箟锛�
+     * 鑰屼笖鍙湁闂ㄩ潰鎵嶅垽寮�鍏炽�俀uartz 渚濊禆鏈ā鍧椼�佷笉瀛樺湪鍙嶅悜渚濊禆锛屾墍浠ョ洿鎺ユ敞鍏ラ棬闈㈡槸瀹夊叏鐨勩��
+     */
+    @Autowired
+    private com.ruoyi.inhospvisit.api.InhospVisitFacade inhospVisitFacade;
 
-    @Value("${appid}")
-    private String appid;
+    /**
+     * 瀹f暀妯″潡鐨�<b>甯搁┗闂ㄩ潰</b>锛岀敤浜庡垽 {@code sys_config: publicity.enabled}銆�
+     * <p>
+     * 鈿狅笍 2025 淇锛氭湰绫诲師鏈彧鍦�**鐢熸垚**瀹f暀鏃跺彈寮�鍏崇锛堣蛋 inhospvisit 闂ㄩ潰鍥炶皟 PublicityApi锛夛紝
+     * 浣�**鍙戦��**瀹f暀锛坽@link #sfHandlle} 鐨� {@code type == 3} 鍒嗘敮锛変粠鏉ヤ笉璇诲鏁欏紑鍏� 鈥斺��
+     * 鎵�浠ュ叧鎺� {@code publicity.enabled} 鍚庯紝宸茬敓鎴愮殑瀹f暀瀛愪换鍔$収鏍烽�氳繃
+     * 鐭俊/鍏紬鍙�/鐢佃瘽鍙戝嚭鍘汇��
+     */
+    @Autowired
+    private com.ruoyi.publicity.api.PublicityFacade publicityFacade;
+
+    /**
+     * 鏁版嵁閲囬泦妯″潡鐨�<b>甯搁┗闂ㄩ潰</b>銆�
+     * <p>
+     * 鈿狅笍 2026-10 妯″潡鍖栵細鏈被鐨� {@code dealHisData(String)} 鏂规硶浣擄紙杩炲悓绉佹湁甯墜
+     * {@code collectSegmentData}锛夊凡鏁翠綋鎼繘 {@code ruoyi-datacollection}锛�
+     * 鏈被鍙繚鐣欏畾鏃朵换鍔″叆鍙o紙sys_job 鐨� invoke_target 鏄� {@code ryTask.dealHisData('...')}锛�
+     * 鍏ュ彛鍚嶄笉鑳藉彉锛夈�傜珯鐐瑰垎鏀�佹椂闂寸獥鍙c�佸垎娈靛洖婧�佹棩蹇楁枃妗堥兘鍦ㄦā鍧楅噷锛屼竴琛屾湭鏀广��
+     * <p>
+     * 娉ㄥ叆闂ㄩ潰鑰屼笉鏄ā鍧楀唴閮� Service锛氶棬闈�<b>姘歌繙瀛樺湪</b>锛屼笖鍙湁闂ㄩ潰鍒�
+     * {@code sys_config: datacollection.enabled} 寮�鍏炽��
+     */
+    @Autowired
+    private com.ruoyi.datacollection.api.DataCollectionFacade dataCollectionFacade;
+
+    // 鈿狅笍 2026-10 鍒犻櫎锛氬師 `@Value("${appid}") private String appid;`
+    //    瀹冩槸銆屾柊鍗庡井淇″叕浼楀彿鎺ㄩ�併�嶇殑閬楃暀瀛楁锛堟彁浜� 8590ef6a 寮曞叆锛屽彧琚�
+    //    xinHuaWXReq.setAppid(appid) 鐢ㄨ繃锛夈�傝鎺ㄩ�侀�昏緫宸叉惉杩� ruoyi-message
+    //    锛堝叕浼楀彿鍑嵁鏀圭敱 sys_config.wx.mp.config.* 涓嬪彂锛夛紝鏈被閲屽凡鏃犲紩鐢紱
+    //    浣嗗畠鐨� @Value 娌℃湁榛樿鍊硷紝鑰� application-nhfy.yml / -xh.yml / -ls.yml
+    //    閮芥病瀹氫箟 appid 杩欎釜 key锛岃繖浜� profile 鍚姩鏃朵細鐩存帴鎶�
+    //    `Could not resolve placeholder 'appid'`銆傜暀鐫�鏄畾鏃剁偢寮癸紝鏁呭垹闄ゃ��
 
     @Value("${server.port}")
     private String port;
@@ -195,8 +273,12 @@
     @Autowired
     private SysConfigMapper sysConfigMapper;
 
-    @Autowired
-    private IServiceTaskScheduleService serviceTaskScheduleService;
+    // 鈿狅笍 2025 绉婚櫎锛氬師 `IServiceTaskScheduleService serviceTaskScheduleService` 瀛楁銆�
+    //    瀹冨湪鏈被閲�**鍙�**琚� rollTaskGroupCycle() 鐢ㄦ潵璋� rollCycleTasks()锛堟瀛楁妫�鏌ワ細
+    //    鏀瑰墠鍏ㄦ枃浠朵粎 1 澶勪娇鐢級銆傝璋冪敤宸插垏鍒� inhospVisitFacade.rollTaskGroupCycle()锛�
+    //    鎵�浠ュ瓧娈佃繛甯﹀け鏁堝苟鍒犻櫎 鈥斺�� 鐣欑潃瀹冧細璁╀汉璇互涓� smartor 鐨� rollCycleTasks 杩樻湁浜虹敤銆�
+    //    smartor 渚х殑 ServiceTaskScheduleServiceImpl.rollCycleTasks() 鏈韩**淇濈暀涓嶅垹**
+    //    锛堝畠鍙兘浠嶈鐜扮綉鍏跺畠鍏ュ彛/鎺ュ彛璋冪敤锛屽垹闄ゅ睘鍙︿竴浠朵簨锛夈��
 
     public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {
         System.out.println(StringUtils.format("鎵ц澶氬弬鏂规硶锛� 瀛楃涓茬被鍨媨}锛屽竷灏旂被鍨媨}锛岄暱鏁村瀷{}锛屾诞鐐瑰瀷{}锛屾暣褰}", s, b, l, d, i));
@@ -352,7 +434,6 @@
         }
     }
 
-
     /**
      * 瀹氭椂澶勭悊澶栭摼鐨勬暟鎹�
      */
@@ -380,267 +461,57 @@
         dealHisData(formattedNow);
     }
 
-
     /**
      * HIS鏁版嵁閲囬泦
      * 瀹氭椂浠诲姟锛氶噰闆嗘偅鑰呬俊鎭�佸嚭闄€�侀棬璇婃暟鎹�
      * todayZeroStr  褰撳墠鐨勬椂闂�   渚嬪锛�2026-05-06 00:00:00
+     * <p>
+     * 鈿狅笍 <b>2026-10 妯″潡鍖�</b>锛氭柟娉曚綋锛堣繛鍚岀鏈夊府鎵� {@code collectSegmentData}锛夊凡鏁翠綋鎼繘
+     * {@code ruoyi-datacollection}锛屽疄鐜拌
+     * {@code com.ruoyi.datacollection.service.impl.HisDataCollectionServiceImpl}銆�
+     * 杩欓噷鍙繚鐣�<b>瀹氭椂浠诲姟鍏ュ彛</b>锛歴ys_job 鐨� invoke_target 浠嶆槸
+     * {@code ryTask.dealHisData('...')}锛屽叆鍙e悕涓嶈兘鍙橈紝鎵�浠ユ湰鏂规硶鏄�<b>绾浆鍙�</b>銆�
+     * <p>
+     * 鍏抽棴鏁版嵁閲囬泦妯″潡锛坽@code sys_config: datacollection.enabled=false}锛夋椂闂ㄩ潰浼氭姏
+     * {@link com.ruoyi.datacollection.api.DataCollectionModuleDisabledException}锛�
+     * 鏈叆鍙f崟鑾峰悗鍙墦涓�鏉� WARN 鈥斺�� 閭f槸"妯″潡琚富鍔ㄥ叧鎺�"锛屼笉鏄噰闆嗗け璐ワ紝
+     * 涓嶈璁╁畾鏃朵换鍔¤鎴愭墽琛屽紓甯革紙鍚﹀垯杩愮淮浼氱湅鍒颁竴鐗囩孩鑹插け璐ヨ褰曪級銆�
      */
     public void dealHisData(String todayZeroStr) {
-        log.info("銆恉ealHisData銆戝紑濮嬫墽琛孒IS鏁版嵁閲囬泦浠诲姟");
-        // 鑾峰彇鏄ㄥぉ0鐐瑰埌浠婂ぉ0鐐圭殑鏃堕棿鑼冨洿
-        LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
-        if (StringUtils.isNotBlank(todayZeroStr)) {
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            todayZero = LocalDateTime.parse(todayZeroStr, formatter);
-        }
-        LocalDateTime yesterdayZero = todayZero.minusDays(1);
-        log.info("銆恉ealHisData銆戦噰闆嗘椂闂磋寖鍥达細{} ~ {}", yesterdayZero, todayZero);
-
-        if (active.trim().equals("xh")) {
-            try {
-                // 閲囬泦鍏ラ櫌鏁版嵁
-                log.info("銆恉ealHisData銆戞柊鍗庡紑濮嬮噰闆嗗叆闄㈡暟鎹�");
-                ixhGatherPatArchiveService.getInHospDataGather("0", yesterdayZero, todayZero);
-                log.info("銆恉ealHisData銆戞柊鍗庡叆闄㈡暟鎹噰闆嗗畬鎴�");
-
-                // 閲囬泦鍑洪櫌鏁版嵁
-                log.info("銆恉ealHisData銆戞柊鍗庡紑濮嬮噰闆嗗嚭闄㈡暟鎹�");
-                ixhGatherPatArchiveService.getInHospDataGather("1", yesterdayZero, todayZero);
-                log.info("銆恉ealHisData銆戞柊鍗庡嚭闄㈡暟鎹噰闆嗗畬鎴�");
-
-            } catch (Exception e) {
-                log.error("銆恉ealHisData銆戞柊鍗庢暟鎹噰闆嗗紓甯�", e);
-            }
-        } else if (active.trim().equals("hn")) {
-            try {
-                // 娌冲崡鏁版嵁閲囬泦
-                HnDataGatherVO hnDataGatherVO = new HnDataGatherVO();
-                log.info("銆恉ealHisData銆戞渤鍗楀紑濮嬮噰闆嗘暟鎹�");
-                Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
-                Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
-
-                hnDataGatherVO.setStartTime(startTime);
-                hnDataGatherVO.setEndTime(endTime);
-                ihnGatherPatArchiveService.hnDataGather(hnDataGatherVO);
-                log.info("銆恉ealHisData銆戞渤鍗楃粨鏉熼噰闆嗘暟鎹�");
-            } catch (Exception e) {
-                log.error("銆恉ealHisData銆戞渤鍗楁暟鎹噰闆嗗紓甯�", e);
-            }
-        } else if (active.trim().equals("sltd") || active.trim().equals("nhfy")) {
-            //鐪佺珛鍚屽痉涓庡崕鍗楅檮涓�鐢ㄥ悓涓�濂楅噰闆嗘柟娉曪紙閮芥槸鏉ユ湭鏉ユ彁渚涳級
-
-            try {
-                //鑾峰彇鏄惁闇�瑕侀噰闆嗙敤鎴枫�侀儴闂ㄤ俊鎭�
-                SysConfig config = new SysConfig();
-                config.setConfigKey("sltd.gather.sysuser");
-                config.setOrgid("20001001");
-                List<SysConfig> sysConfigs = configService.selectConfigList(config);
-
-                //鑾峰彇鐪佺珛鍚屽痉瑕侀噰闆嗙殑闄㈠尯
-                SysConfig cf = new SysConfig();
-                cf.setConfigKey("sltd.gather.campusid");
-                cf.setOrgid("20001001");
-                List<SysConfig> sysConfigcampusids = configService.selectConfigList(cf);
-
-                List<Long> campusidList = new ArrayList<>();
-                if (CollectionUtils.isNotEmpty(sysConfigcampusids)) {
-                    String[] split = sysConfigcampusids.get(0).getConfigValue().split(",");
-                    campusidList = Arrays.stream(split).map(Long::valueOf).collect(Collectors.toList());
-                } else {
-                    log.error("SysConfig涓殑闄㈠尯ID涓虹┖锛�");
-                    return;
-                }
-
-                //configValue = 1 涓嶉渶瑕侀噰闆�       configValue = 2闇�瑕侀噰闆�
-                if (CollectionUtils.isNotEmpty(sysConfigs) && sysConfigs.get(0).getConfigValue().equals("2")) {
-                    log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈儴闂ㄤ俊鎭�濆紑濮嬮噰闆嗘暟鎹�");
-                    ServiceSLTDDeptReqVO serviceSLTDDeptReqVO = new ServiceSLTDDeptReqVO();
-                    serviceSLTDDeptReqVO.setOrgId("20001001");
-                    serviceSLTDDeptReqVO.setCampusIds(campusidList);
-                    Boolean aBoolean1 = serviceSLTDHealthcareRecordService.queryDeptWardAreaInfoList(serviceSLTDDeptReqVO);
-                    log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈儴闂ㄤ俊鎭�濈粨鏉熼噰闆嗘暟鎹細{}", aBoolean1);
-
-                    Boolean aBoolean = false;
-                    for (Long cid : campusidList) {
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滅敤鎴蜂俊鎭�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-                        ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
-                        reqVO.setOrgId("20001001");
-                        reqVO.setCampusId(cid);
-                        ArrayList<String> statusList = new ArrayList<>();
-                        statusList.add("1");
-                        reqVO.setStatusList(statusList);
-                        aBoolean = serviceSLTDHealthcareRecordService.queryHospUserInfoList(reqVO);
-                    }
-                    log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滅敤鎴蜂俊鎭�濈粨鏉熼噰闆嗘暟鎹細{}", aBoolean);
-                    //鐤剧梾瀛楀吀閲囬泦
-                    iIcd10Service.queryAddIcd10();
-                }
-
-                // nhfy/sltd鍥炴函30澶╁垎娈甸噰闆嗗垽鏂紙姣忔鏈�澶�4澶╋級
-                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();
-                    int segCount = 0;
-                    while (!segStart.isAfter(segEndDate)) {
-                        LocalDate segEnd = segStart.plusDays(3);
-                        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));
-                        }
-                        segStart = segEnd.plusDays(1);
-                    }
-                    log.info("銆恉ealHisData銆憑}鍥炴函閲囬泦瀹屾垚锛屽叡{}娈�", active.trim(), segCount);
-                }
-
-                // 鐪佺珛鍚屽痉鏁版嵁閲囬泦锛堥潪鍥炴函妯″紡鎵嶆墽琛岋級
-                if (!isBackfill) {
-                    for (Long cid : campusidList) {
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰烽鍏ラ櫌寮�濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-                        String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-                        ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
-                        serviceSLTDInhospReqVO.setOrgId("20001001");
-                        serviceSLTDInhospReqVO.setCampusId(cid);
-                        serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
-                        serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
-                        if (active.trim().equals("nhfy")) {
-                            serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                            serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                        }
-                        List<String> list = new ArrayList<>();
-                        list.add("FH0109.22");
-                        list.add("FH0109.23");
-                        list.add("FH0109.53");
-                        serviceSLTDInhospReqVO.setStatusList(list);
-//                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
-                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濈祼鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-                        serviceSLTDInhospReqVO.setOrgId("20001001");
-                        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);
-                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
-                        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);
-                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
-                        log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濇潫閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
-                    }
-                }
-
-            } catch (Exception e) {
-                log.error("銆恉ealHisData銆戠渷绔嬪悓寰锋暟鎹噰闆嗗紓甯�", e);
-            }
+        try {
+            dataCollectionFacade.dealHisData(todayZeroStr);
+        } catch (com.ruoyi.datacollection.api.DataCollectionModuleDisabledException e) {
+            log.warn("銆恉ealHisData銆憑}锛堟湰杞畾鏃堕噰闆嗚烦杩囷級", e.getMessage());
         }
     }
 
     /**
-     * 鍒嗘閲囬泦鏁版嵁锛堥鍏ラ櫌銆佸叆闄€�佸嚭闄級
-     * 鐢ㄤ簬nhfy/sltd鍥炴函閲囬泦锛屾瘡娆℃渶澶氭煡璇�7澶╂暟鎹�
+     * 鍦ㄩ櫌鎮h��"绉戝 / 鐥呭尯 / 搴婁綅"鍒锋柊锛堝崡鍗庨檮涓�锛屾瘡澶╀竴娆★級銆�
+     * <p>
+     * 鍦ㄩ櫌鎮h�呬細杞銆佽浆鐥呭尯銆佹崲搴婏紝鑰� {@code pat_med_inhosp} 鐨勪綅缃瓧娈靛彧鍦ㄥ叆闄㈡椂鍐欒繃涓�娆★紝
+     * 涔嬪悗涓嶄細鑷繁鏇存柊 鈥斺�� 杩欓噷姣忓ぉ鎸夋偅鑰呮煡涓�閬� HIS 閲�<b>璇ユ偅鑰呭綋鍓嶇殑鍦ㄩ櫌淇℃伅</b>
+     * 锛坽@code dtcQueryHealthcareRecordList}锛屼笌鍏ラ櫌閲囬泦鏄悓涓�涓帴鍙o紝鎸�
+     * {@code healthcareRecordNo} 鍗曟煡 + {@code statusList=["FH0109.24"]}锛夛紝
+     * 涓庡簱鍐呮瘮瀵瑰悗鍙妸鍙樺寲鐨勫瓧娈靛啓鍥炲幓銆傚疄鐜颁笌鍒ゅ畾鍙e緞瑙�
+     * {@code com.ruoyi.datacollection.service.impl.InhospDeptRefreshServiceImpl}銆�
+     * <p>
+     * 涓� {@link #dealHisData(String)} 鍚屾牱鐨勯檷绾у彛寰勶細妯″潡琚叧鎺夛紙
+     * {@code sys_config: datacollection.enabled=false}锛夋椂闂ㄩ潰鎶�
+     * {@link com.ruoyi.datacollection.api.DataCollectionModuleDisabledException}锛�
+     * 杩欓噷鍙墦涓�鏉� WARN 鈥斺�� 閭f槸"妯″潡琚富鍔ㄥ叧鎺�"锛屼笉璇ヨ鎴愬畾鏃朵换鍔℃墽琛屽紓甯搞��
+     * <p>
+     * sys_job 鐨� invoke_target 涓� {@code ryTask.refreshInhospDeptInfo()}锛�
+     * 寤鸿姣忓ぉ 03:30锛堥伩寮� 01:00 鍏ラ櫌閲囬泦涓� 02:00 鍑洪櫌澶勭悊锛夛紝骞跺彂绛栫暐閫�"绂佹骞跺彂"銆�
      *
-     * @param cid          闄㈠尯ID
-     * @param startDateStr 鏃ユ湡寮�濮� yyyy-MM-dd
-     * @param endDateStr   鏃ユ湡缁撴潫 yyyy-MM-dd
+     * @return 鏈瀹為檯鏇存柊鐨勫湪闄㈣褰曟潯鏁帮紙0 = 鏃犲彉鍖� / 绔欑偣涓嶅尮閰� / 妯″潡琚叧闂級
      */
-    private void collectSegmentData(Long cid, String startDateStr, String endDateStr) {
-//        // 棰勫叆闄�
-        log.info("銆恉ealHisData銆戦鍏ラ櫌寮�濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
-        ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
-        reqVO.setOrgId("20001001");
-        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);
+    public int refreshInhospDeptInfo() {
         try {
-            serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
-        } catch (Exception e) {
-            // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
-            log.error("銆恉ealHisData銆戦鍏ラ櫌閲囬泦澶辫触锛岃烦杩囪绫荤户缁�傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
+            return dataCollectionFacade.refreshInhospDeptInfo();
+        } catch (com.ruoyi.datacollection.api.DataCollectionModuleDisabledException e) {
+            log.warn("銆恟efreshInhospDeptInfo銆憑}锛堟湰杞湪闄俊鎭埛鏂拌烦杩囷級", e.getMessage());
+            return 0;
         }
-        log.info("銆恉ealHisData銆戦鍏ラ櫌绲備簡閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
-
-        // 鍏ラ櫌
-        log.info("銆恉ealHisData銆戝叆闄㈠紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
-        reqVO = new ServiceSLTDInhospReqVO();
-        reqVO.setOrgId("20001001");
-        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 {
-            serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
-        } catch (Exception e) {
-            // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
-            log.error("銆恉ealHisData銆戝叆闄㈤噰闆嗗け璐ワ紝璺宠繃璇ョ被缁х画銆傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
-        }
-        log.info("銆恉ealHisData銆戝叆闄㈢祩浜嗛噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-
-        // 鍑洪櫌
-        log.info("銆恉ealHisData銆戝嚭闄㈠紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
-        reqVO = new ServiceSLTDInhospReqVO();
-        reqVO.setOrgId("20001001");
-        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 {
-            serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
-        } catch (Exception e) {
-            // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
-            log.error("銆恉ealHisData銆戝嚭闄㈤噰闆嗗け璐ワ紝璺宠繃璇ョ被缁х画銆傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
-        }
-        log.info("銆恉ealHisData銆戝嚭闄㈢粨鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
     }
 
     /**
@@ -1072,7 +943,6 @@
         }
     }
 
-
     public void dealHisDataSLTD() {
         log.info("銆恉ealHisData銆戝紑濮嬫墽琛孒IS鏁版嵁閲囬泦浠诲姟");
 
@@ -1130,27 +1000,50 @@
 
     /**
      * 澶勭悊鎮h�呬俊鎭紝杩涘叆瀛愪换鍔¤〃
+     * <p>
+     * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氭湰鏂规硶鍘熻蛋 {@code iPatMedInhospService.dealOutHospInfo(config)}锛�
+     * 閭f槸 smartor 閲岀殑閬楃暀瀹炵幇锛�**涓嶅垽浠讳綍妯″潡寮�鍏�** 鈥斺�� 浜庢槸锛�
+     * <ul>
+     *   <li>鍏� {@code inhospvisit.enabled} 鐓ф牱鐢熸垚鍑洪櫌/闀挎湡闅忚锛�</li>
+     *   <li>鍏� {@code publicity.enabled} 鐓ф牱鍙戝叆闄㈠鏁欎笌鑽搧瀹f暀锛�</li>
+     *   <li>鍏� {@code othervisit.enabled} 鐓ф牱鐢熸垚鎵嬫湳闅忚銆�</li>
+     * </ul>
+     * 鐜版敼璧版ā鍧楅棬闈細闂ㄩ潰鍒� {@code inhospvisit.enabled}锛屾ā鍧楀疄鐜板唴閮ㄥ啀鍥炶皟
+     * {@code PublicityApi} / {@code OtherVisitApi}锛屼笁澶勫悇鑷垽鑷繁鐨勫紑鍏炽��
      */
     public void dealOutHospInfo() {
         String config = configService.selectConfigByKey("visit.early.day");
         if (port.equals("8095")) {
-            //鍑洪櫌琛�
-            iPatMedInhospService.dealOutHospInfo(config);
+            //鍑洪櫌琛紙鍚叆闄㈠鏁� / 鑽搧瀹f暀 / 鎵嬫湳闅忚 鈥斺�� 鍧囩敱妯″潡瀹炵幇鍥炶皟瀵瑰簲妯″潡闂ㄩ潰锛�
+            inhospVisitFacade.dealOutHospInfo(config);
             //闂ㄨ瘖琛�(鏂板崕鐨勬殏鏃朵笉鍋氶棬璇婇殢璁�)
             if (!active.equals("xh")) {
-                iPatMedOuthospService.dealOutpatientInfo();
+                // 銆愰棬鎬ヨ瘖妯″潡鍖栧垏鎹€�戦棬闈㈠唴閮ㄥ垽 sys_config: outpatientvisit.enabled锛堣繍琛屾椂鐑锛夛紝
+                // 鍏抽棴鏃惰繑鍥� 0 骞舵墦 WARN銆�
+                //
+                // 鈿狅笍 2025 淇锛氳繖閲屽師鍏堟槸 iPatMedOuthospService.dealOutpatientInfo()锛�
+                // 瀹冪粡 IPatMedOuthospService 鈫� PatMedOuthospServiceDelegatingImpl
+                // 鈫� OuthospDataFacade.dealOutpatientInfo()锛岃��**閭f潯璺笂娌℃湁寮�鍏冲畧鍗�** 鈥斺��
+                // OuthospVisitFacade.dealOutpatientInfo() 鎵嶆槸甯﹀畧鍗殑鍏ュ彛锛屽嵈鍏ㄤ粨闆惰皟鐢ㄨ�呫��
+                // 缁撴灉鏄� outpatientvisit.enabled=false 瀵瑰畾鏃朵换鍔�**瀹屽叏澶辨晥**銆�
+                // 鐜板湪涓庝笅闈� dealOperationInfo() 璧� otherVisitFacade 鐨勫舰鐘朵竴鑷淬��
+                outhospVisitFacade.dealOutpatientInfo();
             }
         }
     }
 
     /**
      * 澶勭悊鎮h�呬俊鎭紝杩涘叆瀛愪换鍔¤〃(浠诲姟缁�)
+     * <p>
+     * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 閬楃暀瀹炵幇锛屼笉鍒ゅ紑鍏筹紙鍚� {@link #dealOutHospInfo()}锛夈��
+     * 鐜拌蛋妯″潡闂ㄩ潰銆傛敞鎰忔ā鍧椾晶鐨� {@code dealOutHospInfoBySchedule} 鍐呴儴浠嶄細杞彂鍥� smartor
+     * 锛坽@code OtherVisitApiBridge}锛岃璇ョ被娉ㄩ噴锛夛紝浣�<b>寮�鍏冲湪闂ㄩ潰杩欎竴灞傚垽</b>锛屾墍浠ュ叧闂椂涓嶄細璧板埌閭i噷銆�
      */
     public void dealOutHospInfoBySchedule() {
         String config = configService.selectConfigByKey("visit.early.day");
         if (port.equals("8095")) {
             //鍑洪櫌琛�
-            iPatMedInhospService.dealOutHospInfoBySchedule(config);
+            inhospVisitFacade.dealOutHospInfoBySchedule(config);
             //闂ㄨ瘖琛�(鏂板崕鐨勬殏鏃朵笉鍋氶棬璇婇殢璁�)
 //            if (!active.equals("xh")) {
 //                //iPatMedOuthospService.dealOutpatientInfo();
@@ -1158,12 +1051,13 @@
         }
     }
 
-
     /**
      * 澶勭悊鎵嬫湳淇℃伅锛岃繘鍏ュ瓙浠诲姟琛�
      */
     public void dealOperationInfo() {
-        if (port.equals("8095")) iPatMedOperationService.dealOperationInfo();
+        // 銆愭墜鏈ā鍧楀寲鍒囨崲銆戝嚭鍙f敼涓鸿皟鐢� ruoyi-othervisit 鐨勫父椹婚棬闈€��
+        // 闂ㄩ潰鍐呴儴鍒� sys_config: othervisit.enabled锛堣繍琛屾椂鐑锛夛紝鍏抽棴鏃惰繑鍥� 0 骞舵墦 WARN銆�
+        if (port.equals("8095")) otherVisitFacade.dealOperationInfo();
 
     }
 
@@ -1177,7 +1071,10 @@
      */
     public void createOuthospQuarterTable() {
         log.info("銆恈reateOuthospQuarterTable銆戝紑濮嬫墽琛岄棬璇婂垎琛ㄤ换鍔�");
-        createDataTable.createOuthospQuarterTable();
+        // 銆愰棬璇婃ā鍧楀寲銆慍reateDataTable 宸叉暣浣撹縼鍏� ruoyi-outpatientvisit
+        // 锛堝疄鐜颁负 OuthospPartitionMaintainer锛岀粡 OuthospVisitFacade 鏆撮湶锛夈��
+        // 杩欓噷鍙仛璋冪敤锛涘缓琛ㄩ�昏緫涓�琛屾湭鍔ㄣ��
+        outhospVisitFacade.createOuthospQuarterTable();
     }
 
     /**
@@ -1190,7 +1087,6 @@
             List<ServicePatientTemp> servicePatientTemps = iServicePatientTempService.selectServicePatientTempList(new ServicePatientTemp());
         }
     }
-
 
     /**
      * 闀挎湡浠诲姟鍙戦��
@@ -1289,7 +1185,6 @@
         if (StringUtils.isNotEmpty(failDay)) iServiceSubtaskService.setFailSubTaskDefalutVal(Long.valueOf(failDay));
     }
 
-
     /**
      * 鍒ゆ柇鏃ユ湡鏄惁鏄粖澶�
      *
@@ -1341,6 +1236,22 @@
         }
 
         String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
+
+        // 鈿狅笍 2025 淇锛堝鏁欏紑鍏冲け鏁堬級锛歵ype == 3 鏄�**瀹f暀/閫氱煡**锛堢函鍙戦�併�佹棤浣滅瓟 鈥斺��
+        // 瑙� setSuccessPreachForm 閲屻�屽鏁欐垨閫氱煡鈥︾洿鎺ユ敼鎴� 9銆嶃�佷互鍙婃湰鏂规硶鍚庨潰
+        // 銆屽鏁欐垨閫氱煡锛屽彂閫佹垚鍔熷垯鐩存帴鏀规垚 6L銆嶇殑鍒ゅ畾锛夛紝鏁存潯娲惧彂鐨勬墍鏈夐�氶亾
+        // 锛堢數璇�/鐭俊/鍏紬鍙�/浜哄伐锛夊彂鐨勯兘鏄鏁欏唴瀹广�傚叧鎺� publicity.enabled 鏃跺簲**涓�涓�氶亾閮戒笉鍙�**銆�
+        //
+        // 鈿狅笍 鍒绘剰**涓嶆帹杩� subtask 鐘舵�併�佷篃涓嶈澶辫触**锛堜笌 RedisMqReceiver 鍚屽彛寰勶級锛�
+        // 鍏抽棴鏄�"鏆傛椂涓嶅彂"锛屼笉鏄�"杩欎釜鎮h�呬笉闇�瑕佸鏁�"銆傛爣鎴愬け璐�/涓嶉渶瑕佷細璁╄繖鏉″鏁�
+        // 鍦ㄥ紑鍏虫仮澶嶅悗姘歌繙涓㈠け銆備繚鎸� sendstate 涓嶅姩锛屽紑鍏虫墦寮�鍚庝笅涓�娆� longTaskSend/compensateTask
+        // 浼氱収甯告妸瀹冩崬鍑烘潵鍙戝嚭銆�
+        if ("3".equals(serviceSubtask.getType()) && !publicityFacade.isEnabled()) {
+            log.warn("銆愬鏁欍�戞ā鍧楁湭鍚敤锛堝弬鏁伴厤缃� publicity.enabled=false锛夛紝璺宠繃瀹f暀鍙戦�併�俿ubtaskId={}, patid={}",
+                    serviceSubtask.getId(), serviceSubtask.getPatid());
+            return;
+        }
+
         if (descByCode.equals("鐢佃瘽")) {
             List<String> list = new ArrayList<>();
             ServiceTask ivrTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -1450,7 +1361,13 @@
                             sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
                         }
                     } else {
-                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
+                        // 鈿狅笍 杩欓噷**鍒绘剰涓�**涓� TemplateModuleDisabledException 鍋氶檷绾э細
+                        // 妯℃澘妯″潡鍏抽棴锛坰ys_config: template.enabled=false锛夋椂锛屽鏁欏唴瀹圭‘瀹炲彇涓嶅埌锛�
+                        // 鐭俊涔熷氨纭疄鍙戜笉鍑哄幓銆傚灞� try-catch 浼氬瀹炶涓�"鐭俊鍙戦�佸け璐�"锛�
+                        // 骞堕�氳繃 setSuccessPreachForm(..., "5") 鎸夋棦鏈夋満鍒跺崌绾у埌涓嬩竴涓�氶亾锛堝叕浼楀彿/浜哄伐锛夈��
+                        // 鑻ュ湪杩欓噷纭鎴�"鍙戦�佹垚鍔�"锛岀瓑浜庣敤涓�鏉″亣璁板綍鎺╃洊"娌″彂鍑哄幓"锛�
+                        // 浜嬪悗浠庝换鍔¤褰曚笂瀹屽叏鐪嬩笉鍑洪棶棰� 鈥斺�� 閭f槸鏇村潖鐨勯檷绾с��
+                        HeLibrary heLibrary = templateFacade.findHeLibraryById(serviceSubtask.getLibtemplateid());
                         if (heLibrary.getHetype().equals("1")) {
                             sendMagParam.setPhone(serviceSubtask.getPhone());
                             url = StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/xj?p=" + format : localIP + "/xj?p=" + format;
@@ -1643,7 +1560,6 @@
         SysDept sysDept = CollectionUtils.isNotEmpty(sysDepts) ? sysDepts.get(0) : new SysDept();
         return ObjectUtils.isNotEmpty(sysDept) ? sysDept.getCampusid() : "2";
     }
-
 
     private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) {
         ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
@@ -1970,7 +1886,9 @@
         }
         try {
             String config = configService.selectConfigByKey("visit.early.day");
-            iPatMedInhospService.dealOutHospInfoBySchedule(config);
+            // 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 閬楃暀瀹炵幇锛屼笉鍒ゅ紑鍏筹紙鍚� dealOutHospInfo锛夈��
+            // 鐜拌蛋妯″潡闂ㄩ潰锛屼笌 RyTask#dealOutHospInfo 涓�鑷淬��
+            inhospVisitFacade.dealOutHospInfoBySchedule(config);
             log.info("銆恉ealTaskGroupOutHosp銆戜换鍔$粍棣栬疆绾冲叆鎵弿瀹屾垚");
         } catch (Exception e) {
             log.error("銆恉ealTaskGroupOutHosp銆戜换鍔$粍鎵弿寮傚父", e);
@@ -1988,7 +1906,18 @@
     public void rollTaskGroupCycle() {
         log.info("銆恟ollTaskGroupCycle銆戝紑濮嬫壂鎻忓惊鐜换鍔$粍");
         try {
-            int rolled = serviceTaskScheduleService.rollCycleTasks();
+            // 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 鐨� ServiceTaskScheduleServiceImpl.rollCycleTasks()锛�
+            // 涓嶅垽寮�鍏� 鈥斺�� 鍏虫帀 inhospvisit.enabled 鐓ф牱銆屾帹杩涜疆娆� + 鏂板缓 subtask銆嶃��
+            //
+            // 鐜拌蛋妯″潡闂ㄩ潰锛屽畬鎴愭ā鍧楀寲鏂规閲岀 10 姝ヤ竴鐩存病鍋氱殑閭d竴姝ュ垏鎹細
+            //   InhospVisitFacade#rollTaskGroupCycle锛堝垽寮�鍏筹級
+            //     鈫� DefaultInhospVisitApi#rollTaskGroupCycle
+            //     鈫� TaskGroupCycleRoller#rollCycleTasks锛堥�愯鎼嚜鍘� L170-190锛�
+            //     鈫� ScheduleRollPortBridge锛坰martor 渚х鍙e疄鐜帮紝116 瀛楁娣辨嫹璐濈瓑鐣欏湪瀹炵幇渚э級
+            // 璇ョ被鐨勬敞閲婃槑纭啓浜嗐�岀 10 姝ュ垏杩囨潵涔嬪墠涓嶈兘琚寕鍒颁换浣曡皟搴︿笂锛屽惁鍒欏弻璺戙�嶁�斺��
+            // 鏈灏辨槸閭d釜鍒囨崲鐐癸紝鍒囧畬鑰佺殑 rollCycleTasks 鍗抽��褰癸紙鍏ㄤ粨鍙湁鏈柟娉曡皟瀹冿級銆�
+            int rolled = inhospVisitFacade.rollTaskGroupCycle();
+            // 闂ㄩ潰鍐呴儴鐨� TaskGroupCycleRoller 宸叉墦銆屾湰娆℃帹杩� N 涓鍒掋�嶏紝杩欓噷鍙ˉ涓�鍙ユ�昏
             log.info("銆恟ollTaskGroupCycle銆戞湰娆℃帹杩� {} 涓鍒�", rolled);
         } catch (Exception e) {
             log.error("銆恟ollTaskGroupCycle銆戞粴鍔ㄨ皟搴﹀紓甯�", e);
@@ -2027,10 +1956,26 @@
     }
 
     /**
-     * 澶勭悊瓒呮椂闅忚浠诲姟
-     * @return
+     * 澶勭悊瓒呮椂闅忚浠诲姟锛堥殢璁胯秴鏃� 鈫� 鐢熸垚"鍐嶆闅忚"锛�
+     * <p>
+     * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氭湰鏂规硶鍘熶笉鍒や换浣曟ā鍧楀紑鍏� 鈥斺��
+     * 鍏虫帀 {@code inhospvisit.enabled} 鐓ф牱寤�"鍐嶆闅忚"瀛愪换鍔°��
+     * <p>
+     * <b>涓轰粈涔堣繖閲屾槸"鍏ュ彛鍒ゅ紑鍏�"鑰屼笉鏄儚 {@link #dealOutHospInfo()} 閭f牱鍒囧埌闂ㄩ潰</b>锛�
+     * 妯″潡渚у彧鎻愪緵浜� {@code InhospVisitApi#buildAgainVisitDraft}锛堢粍瑁呰崏绋匡級锛�
+     * <b>娌℃湁</b>瀹屾暣鐨�"鎵弿瓒呮椂 鈫� 钀藉簱 鈫� 鍥炲啓鍘熶换鍔$姸鎬�"鍏ュ彛锛�
+     * 鑰屾湰鏂规硶鑷繁缁勮骞� insert锛堣涓嬫柟 {@code insertServiceSubtask}锛夈��
+     * 閫犱竴涓ā鍧楀叆鍙e睘浜庢柊澧炶兘鍔涖�佽秴鍑�"鍙В鍐冲紑鍏�"鐨勮寖鍥达紝鎵�浠ュ彇鏈�灏忔敼鍔細鍏ュ彛瀹堝崼銆�
+     * <p>
+     * 鈿狅笍 鍏ㄤ粨鍙湁 {@code ServiceSubtaskController#dealSubtaskDeadline} 涓�涓皟鐢ㄨ�呫��
      */
     public void dealSubtaskDeadline(String orgid, Integer deadlineDay){
+        // 鈿狅笍 寮�鍏冲畧鍗細鍏堝垽鍐嶅共娲伙紝涓� dealOutHospInfo / rollTaskGroupCycle 鍚屽彛寰勩��
+        // 鍏抽棴鏃剁洿鎺ヨ繑鍥烇紝涓嶆壂鎻忋�佷笉寤�"鍐嶆闅忚"瀛愪换鍔°��
+        if (!inhospVisitFacade.isEnabled()) {
+            log.warn("銆恉ealSubtaskDeadline銆戞ā鍧楁湭鍚敤锛堝弬鏁伴厤缃� inhospvisit.enabled=false锛夛紝璺宠繃瓒呮椂闅忚澶勭悊銆俹rgid={}", orgid);
+            return;
+        }
         //鑾峰彇浠诲姟淇℃伅
         ServiceTask st = new ServiceTask();
         st.setDelFlag("0");

--
Gitblit v1.9.3