From 0bbbd746e8c39d91ad7b47a4e36e29ab972dc98c Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期二, 20 十月 2026 16:56:54 +0800
Subject: [PATCH] 处理长期任务发送问题

---
 ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospTaskOrchestrator.java |  447 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 258 insertions(+), 189 deletions(-)

diff --git a/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospTaskOrchestrator.java b/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospTaskOrchestrator.java
index 2d460cf..7fcaa35 100644
--- a/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospTaskOrchestrator.java
+++ b/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospTaskOrchestrator.java
@@ -21,12 +21,26 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
 /**
  * 鍑洪櫌闅忚銆岀紪鎺掑櫒銆嶁�斺�� 閫愯鎼嚜 {@code PatMedInhospServiceImpl}
  * 鐨勭紪鎺掑眰锛坽@code addSubTaskByRule} + 3 涓� {@code *ForPatient} + {@code dealInHospInfo}锛夈��
+ *
+ * <h3>鈿狅笍 2026-10 鍙e緞鍙樻洿锛氫竴涓偅鑰咃紙涓�娆″嚭闄級鍙敓鎴� <b>涓�鏉�</b> 闅忚瀛愪换鍔�</h3>
+ * 鎼縼鏃舵湰绫绘槸"閫愯绛変环"鐨勶紙鍘熷疄鐜版寜缁村害鍏ㄧ敓鎴愶細姣忎釜 {@code *ForPatient} 鎶婂懡涓殑
+ * <b>鎵�鏈�</b>闀挎湡浠诲姟鍚勫啓涓�鏉★級銆備笟鍔$‘璁ゆ敼涓猴細
+ * <ol>
+ *   <li>缁村害鎸� {@code service_task_rule} 浼樺厛绾ф帓搴忓皾璇曪細棣栬 鈫� 娆¤ 鈫� 閫氱敤鍏滃簳锛堢瀹ゃ�佺梾鍖猴級锛�</li>
+ *   <li>绗竴涓湡姝h惤搴撴垚鍔熺殑缁村害鍗冲仠姝� 鈫� 鍙暀涓�鏉★紱</li>
+ *   <li>鏃犺鍒欐椂鎸� {@code service_taskdept} 鐨勭瀹�/鐥呭尯"閫氱敤妯″潡"鐢熸垚锛�</li>
+ *   <li>鏍囧織浣嶇粺涓�鍥炲啓锛屼繚璇� {@code deptcheck_flag} 涓嶅啀鍋滃湪 0锛堥槻閲嶅鎵弿锛夛紱
+ *       骞跺湪鍐欏簱鍓嶆寜 {@code patid+inhospid+taskid} 鍒ら噸锛堣 {@code VisitTaskCreateApi#existsSubtask}锛夈��</li>
+ * </ol>
+ * 鍥犳 {@code verify_inhospvisit_orchestration_semantics.py} 閲� O18~O23 閭� 6 鏉�
+ * "鎼縼绛変环"鏂█宸茶鏀逛负"鍙e緞鍙樻洿"鏂█锛堣剼鏈噷鍗曠嫭鍒嗙粍骞舵敞鏄庝緷鎹級銆�
  *
  * <h3>鏉ユ簮瀵圭収锛園 b25c3b51锛�</h3>
  * <table border="1">
@@ -74,19 +88,29 @@
 @Service
 public class InhospTaskOrchestrator {
 
-    /** 鍑洪櫌闅忚鐨勬湇鍔$被鍨� */
+    /**
+     * 鍑洪櫌闅忚鐨勬湇鍔$被鍨�
+     */
     private static final String SERVICE_TYPE_DISCHARGE = "2";
 
-    /** 缁村害锛氱瀹� */
+    /**
+     * 缁村害锛氱瀹�
+     */
     private static final String DEPT_TYPE_DEPT = "1";
 
-    /** 缁村害锛氱梾鍖� */
+    /**
+     * 缁村害锛氱梾鍖�
+     */
     private static final String DEPT_TYPE_WARD = "2";
 
-    /** 绔欑偣锛氭柊鍗庯紙璺宠繃鐥呭尯+鐤剧梾缁村害锛� */
+    /**
+     * 绔欑偣锛氭柊鍗庯紙璺宠繃鐥呭尯+鐤剧梾缁村害锛�
+     */
     private static final String SITE_XH = "xh";
 
-    /** 绔欑偣锛氬崡鍗庨檮涓�锛堢柧鐥呯淮搴︾敤璇婃柇鍚嶏級 */
+    /**
+     * 绔欑偣锛氬崡鍗庨檮涓�锛堢柧鐥呯淮搴︾敤璇婃柇鍚嶏級
+     */
     private static final String SITE_NHFY = "nhfy";
 
     @Value("${spring.profiles.active}")
@@ -122,165 +146,190 @@
 
     /**
      * 鎸� {@code service_task_rule} 鐨勩�岄瑕�(1)/娆¤(2)銆嶈鍒欑紪鎺掔瀹�/鐥呭尯/鐤剧梾涓変釜缁村害銆�
-     * <p>
-     * 閫愯瀵瑰簲鍘� {@code addSubTaskByRule(String config, List<PatMedInhosp> patMedInhosps)}銆�
-     * <p>
-     * 鈿狅笍 瑙勫垯鏌ヨ {@code serviceTaskRuleMapper.selectServiceTaskRuleByDeptOrWard} 浠嶅湪 smartor锛�
-     * 鎵�浠ユ湰鏂规硶鎺ユ敹<b>宸叉煡濂界殑瑙勫垯</b>锛堢敱璋冪敤鏂� {@code InhospVisitTaskService} 閫氳繃
-     * {@code PublicityDataPort} 鍙栤�斺�旇绔彛宸插惈"鎸夌瀹�/鐥呭尯鏌ヨ鍒�"鐨勮兘鍔涳紝瑙佷笅锛夈��
-     * 杩欐牱鍋氭槸涓轰簡閬垮厤涓�"瑙勫垯琛�"鍐嶅姞涓�涓� Mapper 鎴栫鍙c��
      *
-     * @param inhosp 寰呭鐞嗙殑鍑洪櫌鎮h��
+     * <h3>鈿狅笍 2026-10 鍙e緞鍙樻洿锛氫竴涓偅鑰咃紙涓�娆″嚭闄級鍙敓鎴� <b>涓�鏉�</b> 闅忚瀛愪换鍔�</h3>
+     * 鍘熷疄鐜帮紙浠ュ強鎼縼鍚庣殑绛変环鐗堬級鏄寜缁村害"鍏ㄧ敓鎴�"锛氬厛璺戞墍鏈夈�岄瑕併�嶇淮搴︾殑
+     * {@code *ForPatient}锛岃�屾瘡涓� {@code *ForPatient} 鍙堟妸鍛戒腑鐨�<b>鎵�鏈�</b>闀挎湡浠诲姟鍚勫啓涓�鏉°��
+     * 缁撴灉鏄悓涓�鎮h�呬竴娆″嚭闄㈣兘鐢熸垚鍑犲崄鏉★紙绾夸笂瀹炴祴 27 鏉★級锛岃�屼笖鍥犱负鎵弿閿�
+     * {@code deptcheck_flag} 鍦�"鍙湁鐥呭尯/鐤剧梾缁村害"鐨勮鍒欎笅涓嶄細琚疆 1锛�
+     * 鎮h�呮瘡杞壂鎻忛兘琚噸鏂板鐞� 鈫� 閲嶅瀛愪换鍔℃寔缁疮绉��
+     * <p>
+     * 鐜板彛寰勶紙涓氬姟纭锛夛細
+     * <ol>
+     *   <li>鎶婁笁涓淮搴︽寜瑙勫垯浼樺厛绾ф帓鎴愪竴涓�<b>灏濊瘯椤哄簭</b>锛�
+     *       棣栬(1) 鈫� 娆¤(2) 鈫� 閫氱敤鍏滃簳锛堢瀹ゃ�佺梾鍖猴級锛涘悓浼樺厛绾у唴鍥哄畾 绉戝 &gt; 鐥呭尯 &gt; 鐤剧梾銆�
+     *       {@code service_task_rule} 娌℃湁璇ユ偅鑰呯瀹�/鐥呭尯瀵瑰簲鐨勮鍒欐椂 鈫� 椤哄簭涓� 绉戝 鈫� 鐥呭尯
+     *       锛堝嵆"鎸� {@code service_taskdept} 閲岀殑閫氱敤妯″潡鐢熸垚"锛夈��</li>
+     *   <li>鎸夐『搴忛�愪釜缁村害灏濊瘯锛�<b>绗竴涓湡姝h惤搴撴垚鍔燂紙鎴栧凡瀛樺湪锛夌殑缁村害鍗冲仠姝�</b> 鈥斺�� 鍙暀涓�鏉°��</li>
+     *   <li>鏈�鍚庣粺涓�鍥炲啓鏍囧織浣嶏細鍛戒腑缁村害 = {@code 1}锛涘叾浣欑淮搴� = {@code 2}锛堣烦杩囷級锛�
+     *       涓�<b>鏃犺鍛戒腑鍝釜缁村害锛寋@code deptcheck_flag} 涓�瀹氫細琚啓鎴愰潪 0</b>
+     *       鈥斺�� 杩欏氨鏄�"涓嶅啀琚笅涓�杞壂鎻忛噸澶嶇敓鎴�"鐨勪繚璇併��</li>
+     * </ol>
+     * 鍙︽湁涓�閬撳厹搴曞湪 {@code InhospSubtaskWriter#writeInSubTask}锛氳惤搴撳墠鎸�
+     * {@code patid + inhospid + taskid} 鍒ら噸锛岃 {@link VisitTaskCreateApi#existsSubtask}銆�
+     *
+     * <h3>绔欑偣宸紓锛堜繚鐣欙級</h3>
+     * {@code xh} 鍙仛绉戝缁村害 鈥斺�� {@link #addDimension} 閲岀粺涓�鎸℃帀鐥呭尯/鐤剧梾銆�
+     *
+     * @param inhosp  寰呭鐞嗙殑鍑洪櫌鎮h��
      * @param archive 鎮h�呮。妗�
-     * @param rule 宸叉煡濂界殑瑙勫垯锛泏@code null} = 鏈厤缃鍒欙紙鍏ㄩ儴鐢熸垚锛�
-     * @param config {@code sys_config: visit.early.day}
+     * @param rule    宸叉煡濂界殑瑙勫垯锛泏@code null} = 璇ョ瀹�/鐥呭尯鏈厤缃鍒�
+     * @param config  {@code sys_config: visit.early.day}
      */
-    public void addSubTaskByRule(VisitInhospRow inhosp, VisitArchiveRow archive,
-                                 VisitTaskRule rule, String config) {
+    public void addSubTaskByRule(VisitInhospRow inhosp, VisitArchiveRow archive, VisitTaskRule rule, String config) {
         try {
-            if (rule == null) {
-                // 鍘� L1709-1716锛氳鍒欎负绌猴紝鍏ㄩ儴鐢熸垚
-                log.info("銆愬熀浜庤鍒欍�戞偅鑰厈}鏈厤缃鍒欙紝鎵ц鍏ㄩ儴鐢熸垚閫昏緫", inhosp.getInhospid());
-                addDeptSubTaskForPatient(inhosp, archive, config);
-                if (!SITE_XH.equals(active)) {
-                    addWardSubTaskForPatient(inhosp, archive, config);
-                    addIcd10SubTaskForPatient(inhosp, archive, config);
-                }
-                return;
-            }
-            // 鍘� L1717-1726锛氭湁瑙勫垯锛屾寜瑙勫垯鎵ц
-            log.info("銆愬熀浜庤鍒欍�戞偅鑰厈}鏌ヨ鍒拌鍒欙細deptRule={}, wradRule={}, diagRule={}",
-                    inhosp.getInhospid(), rule.getDeptRule(), rule.getWradRule(), rule.getDiagRule());
+            List<Integer> order = resolveDimensionOrder(rule);
+            log.info("銆愬熀浜庤鍒欍�戞偅鑰厈}瑙勫垯锛歞eptRule={}, wradRule={}, diagRule={}锛涚淮搴﹀皾璇曢『搴�={}", inhosp.getInhospid(), rule == null ? null : rule.getDeptRule(), rule == null ? null : rule.getWradRule(), rule == null ? null : rule.getDiagRule(), order);
 
-            boolean deptIsPrimary = "1".equals(rule.getDeptRule());
-            boolean wardIsPrimary = "1".equals(rule.getWradRule());
-            boolean diagIsPrimary = "1".equals(rule.getDiagRule());
-            boolean deptIsSecondary = "2".equals(rule.getDeptRule());
-            boolean wardIsSecondary = "2".equals(rule.getWradRule());
-            boolean diagIsSecondary = "2".equals(rule.getDiagRule());
-
-            boolean hasPrimaryRule = deptIsPrimary || wardIsPrimary || diagIsPrimary;
-
-            if (!hasPrimaryRule) {
-                // 鍘� L1829-1837锛氭病鏈夐瑕佽鍒欙紝鍏ㄩ儴鐢熸垚
-                log.info("銆愬熀浜庤鍒欍�戞棤棣栬瑙勫垯锛屾墽琛屽叏閮ㄧ敓鎴愰�昏緫");
-                addDeptSubTaskForPatient(inhosp, archive, config);
-                if (!SITE_XH.equals(active)) {
-                    addWardSubTaskForPatient(inhosp, archive, config);
-                    addIcd10SubTaskForPatient(inhosp, archive, config);
-                }
-                return;
-            }
-
-            // 鍘� L1730-1754锛氬厛鎵ц鎵�鏈夎鍒�=1 鐨勬柟娉�
-            int deptGenCount = 0;
-            int wardGenCount = 0;
-            int diagGenCount = 0;
-
-            if (deptIsPrimary) {
-                log.info("銆愬熀浜庤鍒欍�戞墽琛岀瀹ら瑕佽鍒�");
-                deptGenCount = addDeptSubTaskForPatient(inhosp, archive, config);
-            }
-            if (!SITE_XH.equals(active)) {
-                if (wardIsPrimary) {
-                    log.info("銆愬熀浜庤鍒欍�戞墽琛岀梾鍖洪瑕佽鍒�");
-                    wardGenCount = addWardSubTaskForPatient(inhosp, archive, config);
-                }
-                if (diagIsPrimary) {
-                    log.info("銆愬熀浜庤鍒欍�戞墽琛岀柧鐥呴瑕佽鍒�");
-                    diagGenCount = addIcd10SubTaskForPatient(inhosp, archive, config);
+            Integer hit = null;
+            for (Integer type : order) {
+                log.info("銆愬熀浜庤鍒欍�戞偅鑰厈}灏濊瘯缁村害{}锛坽}锛�", inhosp.getInhospid(), type, dimensionName(type));
+                if (generateOneForDimension(inhosp, archive, type, config)) {
+                    hit = type;
+                    break;
                 }
             }
 
-            int primaryGeneratedCount = deptGenCount + wardGenCount + diagGenCount;
-            log.info("銆愬熀浜庤鍒欍�戦瑕佽鍒欐墽琛岀粨鏋�: deptGen={}, wardGen={}, diagGen={}, total={}",
-                    deptGenCount, wardGenCount, diagGenCount, primaryGeneratedCount);
-
-            String remark = inhosp.getRemark();
-
-            if (primaryGeneratedCount > 0) {
-                // 鍘� L1758-1796锛氳嚦灏戜竴涓瑕佽鍒欐垚鍔�
-                log.info("銆愬熀浜庤鍒欍�戦瑕佽鍒欐湁鎴愬姛(count={})锛屽皢娆¤瑙勫垯瀵瑰簲flag璁句负2", primaryGeneratedCount);
-                if (deptIsSecondary) {
-                    updateCheckFlag(inhosp, 1, "2", StringUtils.isNotEmpty(remark)
-                            ? remark + ";棣栬瑙勫垯宸茬敓鎴愶紝娆¤瑙勫垯璺宠繃" : "棣栬瑙勫垯宸茬敓鎴愶紝娆¤瑙勫垯璺宠繃");
-                }
-                if (!SITE_XH.equals(active)) {
-                    if (wardIsSecondary) {
-                        updateCheckFlag(inhosp, 2, "2", StringUtils.isNotEmpty(remark)
-                                ? remark + ";棣栬瑙勫垯宸茬敓鎴愶紝娆¤瑙勫垯璺宠繃" : "棣栬瑙勫垯宸茬敓鎴愶紝娆¤瑙勫垯璺宠繃");
-                    }
-                    if (diagIsSecondary) {
-                        updateCheckFlag(inhosp, 3, "2", StringUtils.isNotEmpty(remark)
-                                ? remark + ";棣栬瑙勫垯宸茬敓鎴愶紝娆¤瑙勫垯璺宠繃" : "棣栬瑙勫垯宸茬敓鎴愶紝娆¤瑙勫垯璺宠繃");
-                    }
-                }
-                if (deptIsPrimary && deptGenCount > 0) {
-                    updateCheckFlag(inhosp, 1, "1", StringUtils.isNotEmpty(remark)
-                            ? remark + ";绉戝棣栬瑙勫垯鐢熸垚鎴愬姛" : "绉戝棣栬瑙勫垯鐢熸垚鎴愬姛");
-                }
-                if (!SITE_XH.equals(active)) {
-                    if (wardIsPrimary && wardGenCount > 0) {
-                        updateCheckFlag(inhosp, 2, "1", StringUtils.isNotEmpty(remark)
-                                ? remark + ";鐥呭尯棣栬瑙勫垯鐢熸垚鎴愬姛" : "鐥呭尯棣栬瑙勫垯鐢熸垚鎴愬姛");
-                    }
-                    if (diagIsPrimary && diagGenCount > 0) {
-                        updateCheckFlag(inhosp, 3, "1", StringUtils.isNotEmpty(remark)
-                                ? remark + ";鐤剧梾棣栬瑙勫垯鐢熸垚鎴愬姛" : "鐤剧梾棣栬瑙勫垯鐢熸垚鎴愬姛");
-                    }
-                }
-                if (deptIsPrimary && deptGenCount == 0) {
-                    updateCheckFlag(inhosp, 1, "2", StringUtils.isNotEmpty(remark)
-                            ? remark + ";绉戝棣栬瑙勫垯鐢熸垚澶辫触" : "绉戝棣栬瑙勫垯鐢熸垚澶辫触");
-                }
-                if (!SITE_XH.equals(active)) {
-                    if (wardIsPrimary && wardGenCount == 0) {
-                        updateCheckFlag(inhosp, 2, "2", StringUtils.isNotEmpty(remark)
-                                ? remark + ";鐥呭尯棣栬瑙勫垯鐢熸垚澶辫触" : "鐥呭尯棣栬瑙勫垯鐢熸垚澶辫触");
-                    }
-                    if (diagIsPrimary && diagGenCount == 0) {
-                        updateCheckFlag(inhosp, 3, "2", StringUtils.isNotEmpty(remark)
-                                ? remark + ";鐤剧梾棣栬瑙勫垯鐢熸垚澶辫触" : "鐤剧梾棣栬瑙勫垯鐢熸垚澶辫触");
-                    }
-                }
-            } else {
-                // 鍘� L1797-1828锛氭墍鏈夐瑕佽鍒欏叏閮ㄥけ璐� 鈫� 鎶� =1 鐨勭疆 2锛岀劧鍚庢墽琛屾瑕佽鍒�
-                log.info("銆愬熀浜庤鍒欍�戦瑕佽鍒欏叏閮ㄥけ璐ワ紝灏�=1鐨刦lag璁句负2锛屽紑濮嬫墽琛屾瑕佽鍒�");
-                if (deptIsPrimary) {
-                    updateCheckFlag(inhosp, 1, "2", StringUtils.isNotEmpty(remark)
-                            ? remark + ";绉戝棣栬瑙勫垯鍏ㄩ儴澶辫触" : "绉戝棣栬瑙勫垯鍏ㄩ儴澶辫触");
-                }
-                if (!SITE_XH.equals(active)) {
-                    if (wardIsPrimary) {
-                        updateCheckFlag(inhosp, 2, "2", StringUtils.isNotEmpty(remark)
-                                ? remark + ";鐥呭尯棣栬瑙勫垯鍏ㄩ儴澶辫触" : "鐥呭尯棣栬瑙勫垯鍏ㄩ儴澶辫触");
-                    }
-                    if (diagIsPrimary) {
-                        updateCheckFlag(inhosp, 3, "2", StringUtils.isNotEmpty(remark)
-                                ? remark + ";鐤剧梾棣栬瑙勫垯鍏ㄩ儴澶辫触" : "鐤剧梾棣栬瑙勫垯鍏ㄩ儴澶辫触");
-                    }
-                }
-                if (deptIsSecondary) {
-                    log.info("銆愬熀浜庤鍒欍�戞墽琛岀瀹ゆ瑕佽鍒�");
-                    addDeptSubTaskForPatient(inhosp, archive, config);
-                }
-                if (!SITE_XH.equals(active)) {
-                    if (wardIsSecondary) {
-                        log.info("銆愬熀浜庤鍒欍�戞墽琛岀梾鍖烘瑕佽鍒�");
-                        addWardSubTaskForPatient(inhosp, archive, config);
-                    }
-                    if (diagIsSecondary) {
-                        log.info("銆愬熀浜庤鍒欍�戞墽琛岀柧鐥呮瑕佽鍒�");
-                        addIcd10SubTaskForPatient(inhosp, archive, config);
-                    }
-                }
-            }
+            writeFlagsAfterRun(inhosp, hit);
         } catch (Exception e) {
             // 鍘� L1839-1845
             e.printStackTrace();
             log.error("銆愬熀浜庤鍒欍�戞偅鑰厈}澶勭悊寮傚父锛歿}", inhosp.getInhospid(), e.getMessage());
             updateCheckFlag(inhosp, 1, "2", "鍩轰簬瑙勫垯澶勭悊寮傚父");
         }
+    }
+
+    /**
+     * 缁村害灏濊瘯椤哄簭锛�2026-10 鍙e緞锛夈��
+     * <p>
+     * 瑙勫垯涓� {@code null} 鈫� {@code [绉戝, 鐥呭尯]}锛氭寜 {@code service_taskdept} 閲岃鎮h�呯殑
+     * 绉戝/鐥呭尯"閫氱敤妯″潡"鐢熸垚锛涜繖鏄笟鍔℃槑纭姹傜殑鍏滃簳鍙e緞锛堟鏃�<b>涓嶈繘鍏ョ柧鐥呯淮搴�</b>锛夈��
+     * <p>
+     * 鏈夎鍒� 鈫� {@code [棣栬缁村害鈥�, 娆¤缁村害鈥�, 绉戝, 鐥呭尯]}锛�
+     * 棣栬浼樺厛銆佹瑕佸叾鍚庯紝鏈�鍚庣敤閫氱敤鍏滃簳淇濊瘉"鑳界敓鎴愪竴鏉″氨鐢熸垚涓�鏉�"銆�
+     */
+    private List<Integer> resolveDimensionOrder(VisitTaskRule rule) {
+        boolean xhSite = SITE_XH.equals(active);
+        List<Integer> order = new ArrayList<>(4);
+        if (rule == null) {
+            addDimension(order, 1, xhSite);
+            addDimension(order, 2, xhSite);
+            return order;
+        }
+        boolean deptIsPrimary = "1".equals(rule.getDeptRule());
+        boolean wardIsPrimary = "1".equals(rule.getWradRule());
+        boolean diagIsPrimary = "1".equals(rule.getDiagRule());
+        boolean deptIsSecondary = "2".equals(rule.getDeptRule());
+        boolean wardIsSecondary = "2".equals(rule.getWradRule());
+        boolean diagIsSecondary = "2".equals(rule.getDiagRule());
+        // 鍚屼紭鍏堢骇鍐呭浐瀹氶『搴忥細绉戝 鈫� 鐥呭尯 鈫� 鐤剧梾
+        if (deptIsPrimary) {
+            addDimension(order, 1, xhSite);
+        }
+        if (wardIsPrimary) {
+            addDimension(order, 2, xhSite);
+        }
+        if (diagIsPrimary) {
+            addDimension(order, 3, xhSite);
+        }
+        if (deptIsSecondary) {
+            addDimension(order, 1, xhSite);
+        }
+        if (wardIsSecondary) {
+            addDimension(order, 2, xhSite);
+        }
+        if (diagIsSecondary) {
+            addDimension(order, 3, xhSite);
+        }
+        // 閫氱敤鍏滃簳锛氳鍒欓噷閰嶇殑缁村害鍏ㄩ兘鍙栦笉鍒颁换鍔℃椂锛屼粛鎸� service_taskdept 鐨� 绉戝/鐥呭尯 鐢熸垚涓�鏉�
+        addDimension(order, 1, xhSite);
+        addDimension(order, 2, xhSite);
+        return order;
+    }
+
+    /**
+     * 杩藉姞涓�涓�欓�夌淮搴︼紱{@code xh} 绔欑偣鍙厑璁哥瀹ょ淮搴︼紙鍘� {@code !active.equals("xh")} 鐨勭瓑浠峰啓娉曪級
+     */
+    private void addDimension(List<Integer> order, int type, boolean xhSite) {
+        if (xhSite && type != 1) {
+            return;
+        }
+        if (!order.contains(type)) {
+            order.add(type);
+        }
+    }
+
+    private String dimensionName(int type) {
+        switch (type) {
+            case 1:
+                return "绉戝";
+            case 2:
+                return "鐥呭尯";
+            case 3:
+                return "鐤剧梾";
+            default:
+                return "鏈煡(" + type + ")";
+        }
+    }
+
+    /**
+     * 灏濊瘯涓�涓淮搴︼紝杩斿洖"鏄惁鐪熺殑鐢熸垚浜嗭紙鎴栨湰鏉ュ氨宸茬粡鏈夛級涓�鏉″瓙浠诲姟"
+     */
+    private boolean generateOneForDimension(VisitInhospRow inhosp, VisitArchiveRow archive, int type, String config) {
+        switch (type) {
+            case 1:
+                return addDeptSubTaskForPatient(inhosp, archive, config) > 0;
+            case 2:
+                return addWardSubTaskForPatient(inhosp, archive, config) > 0;
+            case 3:
+                return addIcd10SubTaskForPatient(inhosp, archive, config) > 0;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 涓�杞敓鎴愮粨鏉熷悗鐨勬爣蹇椾綅鍥炲啓銆�
+     * <p>
+     * 鈿狅笍 鍏抽敭鐐癸細鎵弿閿槸 {@code pat_med_inhosp.deptcheck_flag = '0'}锛�
+     * 鎵�浠�<b>涓嶈鍛戒腑鍝釜缁村害锛宒eptcheck_flag 閮藉繀椤昏鍐欐垚 1 鎴� 2</b>锛�
+     * 鍚﹀垯涓嬩竴杞壂鎻忎細鎶婅繖涓偅鑰呭啀澶勭悊涓�閬嶏紙2026-10 閲嶅鐢熸垚鐨勭洿鎺ュ師鍥狅級銆�
+     * <p>
+     * 娌$敓鎴愭椂锛坽@code hit == null}锛夊埢鎰�<b>鍙ˉ鎵弿閿�</b>锛氬悇缁村害鏂规硶宸茬粡鎶婃洿鍏蜂綋鐨勫師鍥�
+     * 锛�"璇ユ偅鑰呮墍鍦ㄧ瀹ゆ湭閰嶇疆绂婚櫌闀挎湡浠诲姟;" / "鐢熸垚瀛愪换鍔″け璐� 1" 鈥︼級鍐欒繘
+     * {@code long_task_reason} 浜嗭紝杩欓噷鍏堢敤涓�娆¢噸璇诲垽鏂� deptcheck 鏄惁宸茬粡闈� 0锛�
+     * 閬垮厤鎶婂畠瑕嗙洊鎴愭硾娉涚殑"鏈敓鎴愰殢璁夸换鍔�"銆�
+     *
+     * @param hit 鍛戒腑鐨勭淮搴︼紱{@code null} = 涓変釜缁村害閮芥病鑳界敓鎴�
+     */
+    private void writeFlagsAfterRun(VisitInhospRow inhosp, Integer hit) {
+        boolean xhSite = SITE_XH.equals(active);
+        if (hit == null) {
+            VisitInhospRow fresh = inhospMapper.selectByInhospid(inhosp.getInhospid());
+            String current = fresh == null ? null : fresh.getDeptcheckFlag();
+            if (current == null || "0".equals(current)) {
+                updateCheckFlag(inhosp, 1, "2", composeRemark(inhosp, "鏈敓鎴愰殢璁夸换鍔★紙鏃犲彲鐢ㄩ暱鏈熶换鍔★級"));
+            }
+            return;
+        }
+        for (int type = 1; type <= 3; type++) {
+            if (xhSite && type != 1) {
+                continue;
+            }
+            if (hit == type) {
+                updateCheckFlag(inhosp, type, "1", composeRemark(inhosp, "鎸変紭鍏堢骇鐢熸垚涓�鏉¢殢璁夸换鍔★紙缁村害=" + dimensionName(type) + "锛�"));
+            } else {
+                updateCheckFlag(inhosp, type, "2", composeRemark(inhosp, "宸茬敓鎴愪竴鏉¢殢璁夸换鍔★紙缁村害=" + dimensionName(hit) + "锛夛紝鏈淮搴﹁烦杩�"));
+            }
+        }
+    }
+
+    /**
+     * 鎷� reason锛氭部鐢ㄥ師瀹炵幇鐨� {@code remark + ";xxx"} 褰㈠紡
+     */
+    private String composeRemark(VisitInhospRow inhosp, String text) {
+        String remark = inhosp.getRemark();
+        return StringUtils.isNotEmpty(remark) ? remark + ";" + text : text;
     }
 
     /**
@@ -296,11 +345,14 @@
 
     /**
      * 涓哄崟涓偅鑰呯敓鎴愮瀹ょ淮搴︾殑瀛愪换鍔°��
+     * <p>
+     * 鈿狅笍 2026-10 鍙e緞鍙樻洿锛氬懡涓涓暱鏈熶换鍔℃椂<b>鍙敓鎴愮涓�鏉$湡姝h惤搴撶殑浠诲姟</b>
+     * 锛堝師瀹炵幇鏄� {@code for (t : taskdepts) writeInSubTask(...); generatedCount++;}锛�
+     * 涓�涓瀹ら厤 N 涓暱鏈熶换鍔″氨浼氱敓鎴� N 鏉� 鈥斺�� 鏄�"鍚屼竴鎮h�呭嚑鍗佹潯"鐨勪富鍥狅級銆�
      *
-     * @return 鐢熸垚鐨勫瓙浠诲姟鏁伴噺
+     * @return 鐢熸垚鐨勫瓙浠诲姟鏁伴噺锛�0 鎴� 1锛�
      */
     public int addDeptSubTaskForPatient(VisitInhospRow inhosp, VisitArchiveRow archive, String config) {
-        int generatedCount = 0;
         try {
             // 鍘� L1857-1864锛氭寜鎮h�呮墍鍦ㄧ瀹ゆ煡璇ョ瀹ょ殑闀挎湡浠诲姟锛坉ept_type=1 + service_type=2锛�
             VisitTaskdeptRow query = new VisitTaskdeptRow();
@@ -320,13 +372,15 @@
                 u.setWardcheckFlag(fresh == null ? null : fresh.getWardcheckFlag());
                 u.setDiagcheckFlag(fresh == null ? null : fresh.getDiagcheckFlag());
                 // 鍘熷疄鐜颁笉鍒� null锛坒resh.getLongTaskReason() + "..."锛夛紝鍘熸牱淇濈暀
-                u.setLongTaskReason((fresh == null ? null : fresh.getLongTaskReason())
-                        + "璇ユ偅鑰呮墍鍦ㄧ瀹ゆ湭閰嶇疆绂婚櫌闀挎湡浠诲姟;");
+                u.setLongTaskReason((fresh == null ? null : fresh.getLongTaskReason()) + "璇ユ偅鑰呮墍鍦ㄧ瀹ゆ湭閰嶇疆绂婚櫌闀挎湡浠诲姟;");
                 updateInhosp(u);
             } else {
                 for (VisitTaskdeptRow t : taskdepts) {
-                    subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 1, config);
-                    generatedCount++;
+                    // 涓�涓偅鑰呭彧鐣欎竴鏉★細绗竴鏉$湡姝h惤搴撶殑鍗宠繑鍥�
+                    if (subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 1, config)) {
+                        return 1;
+                    }
+                    log.info("銆愮瀹や换鍔°�戞偅鑰厈}浠诲姟{}鏈敓鎴愬瓙浠诲姟锛屽皾璇曚笅涓�涓�欓��", inhosp.getInhospid(), t.getTaskId());
                 }
             }
         } catch (Exception e) {
@@ -339,7 +393,7 @@
             u.setLongTaskReason("绉戝浠诲姟澶勭悊寮傚父");
             updateInhosp(u);
         }
-        return generatedCount;
+        return 0;
     }
 
     // ==========================================================================
@@ -348,11 +402,12 @@
 
     /**
      * 涓哄崟涓偅鑰呯敓鎴愮梾鍖虹淮搴︾殑瀛愪换鍔°��
+     * <p>
+     * 鈿狅笍 鍚屼笂锛氬懡涓涓暱鏈熶换鍔℃椂鍙敓鎴愮涓�鏉$湡姝h惤搴撶殑锛堝師瀹炵幇鏄叏鐢熸垚锛夈��
      *
-     * @return 鐢熸垚鐨勫瓙浠诲姟鏁伴噺
+     * @return 鐢熸垚鐨勫瓙浠诲姟鏁伴噺锛�0 鎴� 1锛�
      */
     public int addWardSubTaskForPatient(VisitInhospRow inhosp, VisitArchiveRow archive, String config) {
-        int generatedCount = 0;
         try {
             String errorreason = null;
             List<VisitTaskdeptRow> taskdeptList = null;
@@ -381,13 +436,15 @@
                 u.setDeptcheckFlag(fresh == null ? null : fresh.getDeptcheckFlag());
                 u.setDiagcheckFlag(fresh == null ? null : fresh.getDiagcheckFlag());
                 // 鍘熸湁鍒ょ┖锛堜笌绉戝缁村害閭e涓嶅悓锛夛紝鍘熸牱淇濈暀
-                u.setLongTaskReason(StringUtils.isNotEmpty(fresh == null ? null : fresh.getLongTaskReason())
-                        ? fresh.getLongTaskReason() + errorreason : errorreason);
+                u.setLongTaskReason(StringUtils.isNotEmpty(fresh == null ? null : fresh.getLongTaskReason()) ? fresh.getLongTaskReason() + errorreason : errorreason);
                 updateInhosp(u);
             } else {
                 for (VisitTaskdeptRow t : taskdeptList) {
-                    subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 2, config);
-                    generatedCount++;
+                    // 涓�涓偅鑰呭彧鐣欎竴鏉★細绗竴鏉$湡姝h惤搴撶殑鍗宠繑鍥�
+                    if (subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 2, config)) {
+                        return 1;
+                    }
+                    log.info("銆愮梾鍖轰换鍔°�戞偅鑰厈}浠诲姟{}鏈敓鎴愬瓙浠诲姟锛屽皾璇曚笅涓�涓�欓��", inhosp.getInhospid(), t.getTaskId());
                 }
             }
         } catch (Exception e) {
@@ -400,7 +457,7 @@
             u.setLongTaskReason("鐥呭尯浠诲姟澶勭悊寮傚父");
             updateInhosp(u);
         }
-        return generatedCount;
+        return 0;
     }
 
     // ==========================================================================
@@ -409,11 +466,12 @@
 
     /**
      * 涓哄崟涓偅鑰呯敓鎴愮柧鐥呯淮搴︾殑瀛愪换鍔°��
+     * <p>
+     * 鈿狅笍 鍚屼笂锛氬懡涓涓暱鏈熶换鍔℃椂鍙敓鎴愮涓�鏉$湡姝h惤搴撶殑锛堝師瀹炵幇鏄叏鐢熸垚锛夈��
      *
-     * @return 鐢熸垚鐨勫瓙浠诲姟鏁伴噺
+     * @return 鐢熸垚鐨勫瓙浠诲姟鏁伴噺锛�0 鎴� 1锛�
      */
     public int addIcd10SubTaskForPatient(VisitInhospRow inhosp, VisitArchiveRow archive, String config) {
-        int generatedCount = 0;
         try {
             // 鍘� L1945-1947
             if (StringUtils.isEmpty(inhosp.getLeaveicd10code())) {
@@ -452,16 +510,19 @@
                 int flag = 0;
                 for (VisitTaskdiagRow t : taskdiags) {
                     // 鍘� L1975-1983锛氬繀椤荤瀹ゆ垨鐥呭尯鑳藉尮閰嶄笂鎵嶅缓
-                    if (StringUtils.isNotEmpty(t.getDeptCode())
-                            && t.getDeptCode().equals(inhosp.getLeaveldeptcode())) {
-                        subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 3, config);
-                        generatedCount++;
+                    if (StringUtils.isNotEmpty(t.getDeptCode()) && t.getDeptCode().equals(inhosp.getLeaveldeptcode())) {
                         flag = 1;
-                    } else if (StringUtils.isNotEmpty(t.getWardCode())
-                            && t.getWardCode().equals(inhosp.getLeavehospitaldistrictcode())) {
-                        subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 3, config);
-                        generatedCount++;
+                        // 涓�涓偅鑰呭彧鐣欎竴鏉★細绗竴鏉$湡姝h惤搴撶殑鍗宠繑鍥�
+                        if (subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 3, config)) {
+                            return 1;
+                        }
+                        log.info("銆愮柧鐥呬换鍔°�戞偅鑰厈}浠诲姟{}鏈敓鎴愬瓙浠诲姟锛屽皾璇曚笅涓�涓�欓��", inhosp.getInhospid(), t.getTaskId());
+                    } else if (StringUtils.isNotEmpty(t.getWardCode()) && t.getWardCode().equals(inhosp.getLeavehospitaldistrictcode())) {
                         flag = 1;
+                        if (subtaskWriter.writeInSubTask(t.getTaskId(), true, inhosp, archive, 3, config)) {
+                            return 1;
+                        }
+                        log.info("銆愮柧鐥呬换鍔°�戞偅鑰厈}浠诲姟{}鏈敓鎴愬瓙浠诲姟锛屽皾璇曚笅涓�涓�欓��", inhosp.getInhospid(), t.getTaskId());
                     }
                 }
                 if (flag == 0) {
@@ -484,7 +545,7 @@
             u.setLongTaskReason("鐤剧梾浠诲姟澶勭悊寮傚父");
             updateInhosp(u);
         }
-        return generatedCount;
+        return 0;
     }
 
     // ==========================================================================
@@ -510,13 +571,11 @@
         try {
             VisitTaskCreateApi api = taskApi();
             if (api == null) {
-                log.warn("銆愬嚭鍏ラ櫌闅忚銆慥isitTaskCreateApi 涓嶅彲鐢紝璺宠繃鍐嶅叆闄㈠鐞嗐�俰nhospid={}",
-                        newInHosp.getInhospid());
+                log.warn("銆愬嚭鍏ラ櫌闅忚銆慥isitTaskCreateApi 涓嶅彲鐢紝璺宠繃鍐嶅叆闄㈠鐞嗐�俰nhospid={}", newInHosp.getInhospid());
                 return;
             }
             // 鍘� L1324-1328锛歱atid + sendstate=2锛堜笉璁� taskid锛�
-            List<VisitPendingSubtaskDto> pendingList =
-                    api.findPendingSubtasks(newInHosp.getPatid(), null);
+            List<VisitPendingSubtaskDto> pendingList = api.findPendingSubtasks(newInHosp.getPatid(), null);
             if (CollectionUtils.isEmpty(pendingList)) {
                 return;
             }
@@ -531,8 +590,7 @@
                     continue;
                 }
                 // 鍘� L1342-1350锛氭棫瀛愪换鍔$殑鍑洪櫌鏃堕棿鍦ㄦ柊鍏ラ櫌鏃堕棿涔嬪墠 鈫� 鍋滄帀
-                if (pending.getEndtime() != null && newInHosp.getStarttime() != null
-                        && pending.getEndtime().before(newInHosp.getStarttime())) {
+                if (pending.getEndtime() != null && newInHosp.getStarttime() != null && pending.getEndtime().before(newInHosp.getStarttime())) {
                     pending.setSendstate(4L);
                     pending.setIsVisitAgain(2);
                     pending.setRemark("鎮h�呭啀鍏ラ櫌");
@@ -546,7 +604,9 @@
         }
     }
 
-    /** 鏅畞鏈烘瀯ID锛堝師 L1338锛涗笌 InhospSubtaskWriter 閲岄偅浠芥槸鍚屼竴甯搁噺锛屽凡閫愬瓧鏍稿锛� */
+    /**
+     * 鏅畞鏈烘瀯ID锛堝師 L1338锛涗笌 InhospSubtaskWriter 閲岄偅浠芥槸鍚屼竴甯搁噺锛屽凡閫愬瓧鏍稿锛�
+     */
     private static final String ORG_JINGNING = "47255004333112711A1001";
 
     // ==========================================================================
@@ -594,13 +654,19 @@
      */
     public static class VisitTaskRule {
 
-        /** 绉戝瑙勫垯锛�"1"=棣栬 "2"=娆¤锛屽叾瀹�=涓嶅弬涓� */
+        /**
+         * 绉戝瑙勫垯锛�"1"=棣栬 "2"=娆¤锛屽叾瀹�=涓嶅弬涓�
+         */
         private String deptRule;
 
-        /** 鐥呭尯瑙勫垯锛堝師瀛楁鍚嶅氨鏄嫾閿欑殑 {@code wradRule}锛屼繚鎸佸悓鍚嶄互鍏嶈閿欙級 */
+        /**
+         * 鐥呭尯瑙勫垯锛堝師瀛楁鍚嶅氨鏄嫾閿欑殑 {@code wradRule}锛屼繚鎸佸悓鍚嶄互鍏嶈閿欙級
+         */
         private String wradRule;
 
-        /** 鐤剧梾瑙勫垯 */
+        /**
+         * 鐤剧梾瑙勫垯
+         */
         private String diagRule;
 
         public String getDeptRule() {
@@ -628,13 +694,16 @@
         }
     }
 
-    /** 渚涙祴璇�/鏃ュ織锛氭湰绫绘槸鍚︽嬁鍒颁簡蹇呴渶鐨� Mapper */
+    /**
+     * 渚涙祴璇�/鏃ュ織锛氭湰绫绘槸鍚︽嬁鍒颁簡蹇呴渶鐨� Mapper
+     */
     boolean hasMappers() {
-        return inhospMapper != null && archiveMapper != null
-                && taskdeptMapper != null && taskdiagMapper != null;
+        return inhospMapper != null && archiveMapper != null && taskdeptMapper != null && taskdiagMapper != null;
     }
 
-    /** 棰勭暀锛氫緵鏃ュ織浣跨敤鐨勬椂闂存埑锛堥伩鍏� IDE 鎶ユ湭浣跨敤 import Date锛� */
+    /**
+     * 棰勭暀锛氫緵鏃ュ織浣跨敤鐨勬椂闂存埑锛堥伩鍏� IDE 鎶ユ湭浣跨敤 import Date锛�
+     */
     @SuppressWarnings("unused")
     private Date now() {
         return new Date();

--
Gitblit v1.9.3