From 2d3b575ed96eee7ccd5b324baa3135d2236934ac Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期五, 13 十一月 2026 16:39:37 +0800
Subject: [PATCH] 【市一】1、登录服务问题处理 2、电话挂断问题处理 3、查询报错问题处理

---
 ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java           |   38 +++-
 ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/PatMedInhospMapper.xml    |   35 +++++
 ruoyi-admin/src/main/resources/application-hzszlyy.yml                            |    2 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java                      |  245 ++++++++++++++++++++++++++++------
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java |   10 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java   |   43 ++++++
 6 files changed, 308 insertions(+), 65 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 3ea1069..a093284 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -231,10 +231,12 @@
         SysUser user = SecurityUtils.getLoginUser().getUser();
         //鏄剧ず鎵�鏈夐櫌鍖烘潈闄�
         String allCampus = sysConfigService.selectConfigByKey("sys.authority.campus.all");
-        if (StringUtils.isNotEmpty(allCampus)) {
-            allCampus = "," + allCampus + ",";
-            if (allCampus.contains("," + user.getUserName() + ",")) {
-                user.setCampusid(null);
+        if (StringUtils.isNotEmpty(allCampus) && StringUtils.isNotEmpty(user.getUserName())) {
+            for (String item : allCampus.split("[,锛�;锛沑\s]+")) {
+                if (user.getUserName().equals(item.trim())) {
+                    user.setCampusid(null);
+                    break;
+                }
             }
         }
 
diff --git a/ruoyi-admin/src/main/resources/application-hzszlyy.yml b/ruoyi-admin/src/main/resources/application-hzszlyy.yml
index 1a5e2af..d6860fc 100644
--- a/ruoyi-admin/src/main/resources/application-hzszlyy.yml
+++ b/ruoyi-admin/src/main/resources/application-hzszlyy.yml
@@ -164,7 +164,7 @@
 #  鎸囧畾asr鍥炶皟鐨剈rl璺緞(鏈湴)
 ASRCallBackPath: http://192.169.129.198:8095/smartor/serviceSubtask/phoneCallBackYQ
 #鎸傛柇IP(鏈湴)
-hangup: http://192.169.129.198:8089/hangup
+hangup: http://192.169.129.198:8091/hangup
 #fs鎵�浣跨敤鐨勯樋閲岀殑app_key(鏈湴)
 app_key_yq: ZurNHpaQLq6P55YS
 
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java b/ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java
index 3a20a64..8fb88bc 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java
@@ -42,12 +42,19 @@
             {
                 String orgid = loginUser.getUser().getOrgid();
                 String campusid = loginUser.getUser().getCampusid();
+                boolean allCampusUser = false;
                 //鏄剧ず鎵�鏈夐櫌鍖烘潈闄�
                 String allCampus = sysConfigService.selectConfigByKey("sys.authority.campus.all");
-                if(StringUtils.isNotEmpty(allCampus)){
-                    allCampus = "," + allCampus + ",";
-                    if (allCampus.contains("," + loginUser.getUser().getUserName() + ",")) {
-                        campusid = null;
+                if (StringUtils.isNotEmpty(allCampus)) {
+                    String userName = loginUser.getUser().getUserName();
+                    if (StringUtils.isNotEmpty(userName)) {
+                        for (String item : allCampus.split("[,锛�;锛沑\s]+")) {
+                            if (userName.equals(item.trim())) {
+                                campusid = null;
+                                allCampusUser = true;
+                                break;
+                            }
+                        }
                     }
                 }
                 
@@ -76,17 +83,22 @@
                         }
                         
                         // 濡傛灉闇�瑕佸悓鏃惰缃甤ampusid
-                        if (setOrgId.withCampusId() && campusid != null)
+                        if (setOrgId.withCampusId())
                         {
                             String campusFieldName = setOrgId.campusField();
-                            
-                            // 妫�鏌ュ瓧娈垫槸鍚﹀凡缁忔湁鍊硷紝濡傛灉鏈変笖skipIfPresent涓簍rue锛屽垯璺宠繃璁剧疆
-                            Object currentValueCampus = getFieldValue(param, campusFieldName);
-                            if (setOrgId.skipIfPresent() && currentValueCampus != null && !currentValueCampus.toString().isEmpty()) {
-                                // 濡傛灉瀛楁宸茬粡鏈夊�间笖skipIfPresent涓簍rue锛屽垯璺宠繃璁剧疆
-                                log.debug("瀛楁 {} 宸叉湁鍊�: {}锛岃烦杩囪缃�", campusFieldName, currentValueCampus);
-                            } else {
-                                setFieldValue(param, campusFieldName, campusid);
+                            if (allCampusUser) {
+                                // 鍏ㄩ櫌鍖烘潈闄愬繀椤昏鐩栬姹傞噷鍙兘甯﹁繘鏉ョ殑 campusid锛�
+                                // 鍚﹀垯鍓嶇浼� campusid=8 浼氶噸鏂版妸闄㈠尯鏉′欢鍔犲洖鍘汇��
+                                setFieldValue(param, campusFieldName, null);
+                            } else if (campusid != null) {
+                                // 妫�鏌ュ瓧娈垫槸鍚﹀凡缁忔湁鍊硷紝濡傛灉鏈変笖skipIfPresent涓簍rue锛屽垯璺宠繃璁剧疆
+                                Object currentValueCampus = getFieldValue(param, campusFieldName);
+                                if (setOrgId.skipIfPresent() && currentValueCampus != null && !currentValueCampus.toString().isEmpty()) {
+                                    // 濡傛灉瀛楁宸茬粡鏈夊�间笖skipIfPresent涓簍rue锛屽垯璺宠繃璁剧疆
+                                    log.debug("瀛楁 {} 宸叉湁鍊�: {}锛岃烦杩囪缃�", campusFieldName, currentValueCampus);
+                                } else {
+                                    setFieldValue(param, campusFieldName, campusid);
+                                }
                             }
                         }
                     }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
index d25fb98..a1b7c72 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.core.service.IConfigService;
 import com.ruoyi.common.utils.ServletUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.ip.AddressUtils;
@@ -13,6 +14,7 @@
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -28,6 +30,7 @@
  *
  * @author ruoyi
  */
+@Slf4j
 @Component
 public class TokenService {
     // 浠ょ墝鑷畾涔夋爣璇�
@@ -51,6 +54,9 @@
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private IConfigService configService;
+
     /**
      * 鑾峰彇鐢ㄦ埛韬唤淇℃伅
      *
@@ -66,6 +72,8 @@
                 String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                 String userKey = getTokenKey(uuid);
                 LoginUser user = redisCache.getCacheObject(userKey);
+                // 缁熶竴鍦ㄤ細璇濊В鏋愬眰澶勭悊銆屽叏闄㈠尯鏉冮檺銆嶏紝閬垮厤鍚勪笟鍔℃帴鍙g洿鎺ヨ user.campusid 鏃剁粫杩囬厤缃��
+                applyCampusAuthority(user);
                 return user;
             } catch (Exception e) {
             }
@@ -74,6 +82,41 @@
     }
 
     /**
+     * 搴旂敤鍏ㄩ櫌鍖烘潈闄愩��
+     * <p>
+     * {@code sys.authority.campus.all} 閰嶇疆鐨勬槸鐢ㄦ埛鍚嶅垪琛紝鍛戒腑鍚庢妸褰撳墠浼氳瘽鐨�
+     * campusid 缃┖锛涘悗缁墍鏈夋寜 campusid 杩囨护鐨� SQL 閮戒細鍥犱负鍙傛暟涓虹┖鑰岃烦杩囬櫌鍖烘潯浠躲��
+     * <p>
+     * 杩欓噷姣忔璇诲彇浼氳瘽鏃堕兘鎸夊綋鍓嶉厤缃噸鏂板垽鏂紝鎵�浠ヤ笉闇�瑕侀噸鏂扮櫥褰曪紱鍚屾椂鍏煎閰嶇疆鍊�
+     * 涓甫绌烘牸銆佹崲琛屻�佷腑鏂囬�楀彿/鍒嗗彿鐨勬儏鍐点��
+     */
+    private void applyCampusAuthority(LoginUser loginUser) {
+        if (loginUser == null || loginUser.getUser() == null) {
+            return;
+        }
+        try {
+            String allCampus = configService.selectConfigByKey("sys.authority.campus.all");
+            if (StringUtils.isEmpty(allCampus)) {
+                return;
+            }
+            String userName = loginUser.getUser().getUserName();
+            if (StringUtils.isEmpty(userName)) {
+                return;
+            }
+            String[] users = allCampus.split("[,锛�;锛沑\s]+");
+            for (String item : users) {
+                if (userName.equals(item.trim())) {
+                    loginUser.getUser().setCampusid(null);
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            // 閰嶇疆鏈嶅姟寮傚父涓嶈兘瀵艰嚧 token 瑙f瀽澶辫触锛屽惁鍒欎細鎶婄敤鎴风洿鎺ヨ涪涓嬬嚎銆�
+            log.warn("銆愬叏闄㈠尯鏉冮檺銆戞牎楠� sys.authority.campus.all 澶辫触锛寀serId={}", loginUser.getUserId(), e);
+        }
+    }
+
+    /**
      * 璁剧疆鐢ㄦ埛韬唤淇℃伅
      */
     public void setLoginUser(LoginUser loginUser) {
diff --git a/ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/PatMedInhospMapper.xml b/ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/PatMedInhospMapper.xml
index 97e03fe..015d62e 100644
--- a/ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/PatMedInhospMapper.xml
+++ b/ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/PatMedInhospMapper.xml
@@ -432,6 +432,41 @@
       涓绘煡璇㈠凡鍘绘帀 GROUP BY锛歱at_med_inhosp.inhospid 鍞竴銆乸at_archive.id 鏄富閿紝
       a.id = b.patid 涓�瀵逛竴锛屽洜姝� join 缁撴灉琛屾暟灏辨槸涓氬姟璁板綍鏁般��
       杩欓噷鐩存帴瀵圭浉鍚岀殑 FROM/WHERE 鍋� COUNT锛屼笉鍐嶅寘涓�灞傚垎缁勫瓙鏌ヨ銆�
+
+      鈿狅笍鈿狅笍 銆愭湰鎺ュ彛鐪熸鐨勭儹鐐规槸杩欐潯 count锛屼笉鏄笂闈㈢殑鍒楄〃 SQL銆�
+
+      2026-11-13 瀹炴祴锛坰martor_sltd锛歱at_med_inhosp 50,175 琛屻�乸at_archive 249,045 琛屻��
+      MySQL 5.7.34銆乮nnodb_buffer_pool_size=128MB锛夛細
+
+        鍒楄〃  ORDER BY b.endtime DESC LIMIT 10  鈫�   25 ~ 35 ms
+        count 鏈潯璇彞                            鈫� 10467 ms锛堝喎锛�/ 350 ms锛堢儹锛�
+
+      鐢ㄦ埛鐪嬪埌鐨勩�屽叏鏃堕棿娈� 20s / 3 涓湀 8s銆嶅氨鏄畠锛氫竴娆$炕椤� = count + 鍒楄〃銆�
+      鍘熷洜鏈変笁鏉★紝鏀� SQL 瑙e喅涓嶄簡锛屽繀椤诲湪搴撲笂鍋氾細
+
+        1) b 渚у繀椤绘湁 (del_flag, orgid, inhospstate, endtime) 澶嶅悎绱㈠紩锛�
+           鍚﹀垯 MySQL 瑕佹寜 orgid 鍥炶〃閫愯杩囨护 del_flag / inhospstate锛�
+           鏈変簡瀹冿紝count(1) 鏄� Using index锛堜笉鍥炶〃锛夛紝鍒楄〃涔熻兘鎸夌储寮曢『搴忔彁鍓� LIMIT銆�
+        2) MySQL 5.7 瀵广�屼笉鍦ㄧ储寮曢噷鐨勭瓑鍊兼潯浠躲�嶆寜 10% 浼帮紙EXPLAIN 鐨� filtered=10.0锛夛紝
+           浼氭妸銆屾病鏈� inhospstate 鐨勭储寮曘�嶇畻寰楁洿渚垮疁锛屼粠鑰岄�夐敊銆�
+           sltd 涓婂疄娴嬶細寮鸿璧� idx_pmi_del_org_state_end = 349ms锛�
+           榛樿鎵ц璁″垝 = 2085ms銆傛墍浠ュ厜寤虹储寮曚笉澶燂紝杩樿娓呮帀绔炰簤绱㈠紩鎴栧己鍒剁储寮曘��
+        3) pat_archive 鏄� 60+ 鍒楃殑澶ц〃锛宑ount 姣忓懡涓竴琛岄兘瑕佹寜涓婚敭鍥炶〃涓�娆�
+           锛坰ltd 鏄� 38,881 娆¢殢鏈鸿锛夈�傜紦瀛樺懡涓� 0.35s銆佸喎缂撳瓨 10s锛�
+           宸窛鍏ㄥ湪纾佺洏闅忔満璇� 鈫� 瑙佺 5 姝� innodb_buffer_pool_size銆�
+
+      閰嶅鑴氭湰锛歴ql/optimize_pat_med_inhosp_list_count_20261113.sql
+
+      鈿狅笍 銆愪笉瑕佺粰 pat_med_inhosp 鍔� idx_pmi_patid (patid)銆�
+         瀹炴祴鍔犱笂鍚庝紭鍖栧櫒浼氭敼鎴愩�屽厛鎵� pat_archive 鍐嶅洖鏌� pat_med_inhosp銆嶏紝
+         鍒楄〃鏌ヨ 25 ms 鈫� 481 ms锛堟參 20 鍊嶏級锛孫RDER BY 涔熺敤涓嶄笂绱㈠紩銆�
+         鏈煡璇㈢殑椹卞姩琛ㄥ繀椤诲浐瀹氭槸 b銆�
+
+      鈿狅笍 銆愪笉瑕佷负浜嗗揩鎶� a 鐨� join 鍘绘帀銆�
+         a.id = b.patid 涓嶆槸鎭掔瓑鐨勶細pat_med_inhosp.patid 鍙兘涓虹┖鎴栧湪 pat_archive 閲�
+         鎵句笉鍒般��2026-11-13 瀹炴祴 smartor_shiyi 鏈� 5,713 琛� patid 涓虹┖銆�
+         smartor_lishui 鏈� 9,270 琛屽鍎胯 鈥斺�� 鍘绘帀 join 浼氭妸杩欎簺琛岀畻杩� total锛�
+         鍙細鍦ㄣ�屽鍎胯鎭板ソ涓� 0銆嶇殑搴撲笂鐪嬭捣鏉ユ纭��
     -->
     <select id="selectPatMedInhospList_COUNT" parameterType="com.ruoyi.inhospvisit.domain.PatMedInhosp"
             resultType="java.lang.Long">
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 c1ee902..b5cafc8 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
@@ -1175,9 +1175,24 @@
             serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
             serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
             List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
+            if (CollectionUtils.isEmpty(serviceSubtaskPreachforms)) {
+                // current_preachform 鏈夊�间絾鍙戦�佹柟寮忔槑缁嗕竴鏉¢兘娌℃湁锛屽睘浜庝笉鍙慨澶嶇殑鑴忔暟鎹��
+                log.error("銆恈ompensateTask銆戝瓙浠诲姟鍙戦�佹柟寮忔槑缁嗕负绌猴紝subid锛歿}锛宑urrentPreachform锛歿}",
+                        serviceSubtask.getId(), serviceSubtask.getCurrentPreachform());
+                closeSubtaskForMissingPreachform(serviceSubtask);
+                continue;
+            }
             //鑾峰彇褰撳墠鎵ц鏂瑰紡鐨勫簭鍙�
-            Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
-            Optional<Long> id = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getId).findFirst();
+            Optional<Long> currentSort = serviceSubtaskPreachforms.stream()
+                    .filter(Objects::nonNull)
+                    .filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform()))
+                    .map(ServiceSubtaskPreachform::getSort)
+                    .findFirst();
+            Optional<Long> id = serviceSubtaskPreachforms.stream()
+                    .filter(Objects::nonNull)
+                    .filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform()))
+                    .map(ServiceSubtaskPreachform::getId)
+                    .findFirst();
             if (currentSort.isPresent()) {
                 // 鏂规B锛氬彧澶勭悊褰撳墠瀛愪换鍔♀�斺�斿叕浼楀彿宸查鍙�(service_subtask.sendstate=1 + current_preachform=5)
                 // 涓旀湭濉啓鏃讹紝鎸夐粯璁ら�夐」瀹屾垚锛岄伩鍏嶈繘鍏ヤ笅涓�绉嶅彂閫佹柟寮忔垨鏈�鍚庝竴姝ヨ秴鏃躲��
@@ -1199,7 +1214,9 @@
                 }
 
                 //1鍏堟鏌ヤ竴涓嬶紝鏄笉鏄湁鎵ц鐘舵�佹槸瀹屾垚鐨勶紙鎬曚箣鍓嶅凡缁忔湁瀹岀殑浜嗭紝娌℃湁灏唖ervuce_subtask鐨勭姸鎬佹敼鎴愬姛锛岃繖閲屽啀妫�鏌ヤ竴涓嬶級
-                boolean finishState = serviceSubtaskPreachforms.stream().allMatch(item -> item.getSendstate().equals("9"));
+                boolean finishState = serviceSubtaskPreachforms.stream()
+                        .filter(Objects::nonNull)
+                        .allMatch(item -> "9".equals(item.getSendstate()));
                 if (finishState) {
                     serviceSubtask.setSendstate(6L);
                     serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
@@ -1215,15 +1232,20 @@
 
                     serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                     //淇敼鍙戦�佹柟寮忕殑鐘舵�佷负澶辫触
-                    serviceSubtaskPreachform.setSendstate("5");
-                    serviceSubtaskPreachform.setId(id.get());
-
-                    serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform);
+                    if (id.isPresent()) {
+                        serviceSubtaskPreachform.setSendstate("5");
+                        serviceSubtaskPreachform.setId(id.get());
+                        serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform);
+                    }
                     continue;
                 }
 
                 //3.涓嶆槸鏈�鍚庝竴涓紝鑾峰彇鍒颁笅涓�涓墽琛屾柟寮�(鍥犱负閮芥槸鍦ㄤ粖澶╂墽琛岋紝閭e氨鐩存帴鍙戝嚭鍘诲氨瀹屼簡)
                 sfHandlle(serviceSubtask);
+            } else {
+                log.error("銆恈ompensateTask銆慶urrent_preachform 鍦ㄥ彂閫佹柟寮忔槑缁嗕腑涓嶅瓨鍦紝subid锛歿}锛宑urrentPreachform锛歿}",
+                        serviceSubtask.getId(), serviceSubtask.getCurrentPreachform());
+                closeSubtaskForMissingPreachform(serviceSubtask);
             }
         }
     }
@@ -1277,11 +1299,31 @@
     }
 
     /**
-     * 闅忚-琛ュ伩澶勭悊
+     * 闅忚-琛ュ伩澶勭悊銆�
+     * <p>
+     * 鍗曟潯瀛愪换鍔″紓甯稿彧璁板綍鏃ュ織锛屼笉褰卞搷鍚屼竴鎵规鍏朵粬瀛愪换鍔°��
      *
      * @param serviceSubtask
      */
     private void sfHandlle(ServiceSubtask serviceSubtask) {
+        try {
+            doSfHandlle(serviceSubtask);
+        } catch (Exception e) {
+            log.error("銆恠fHandlle銆戝鐞嗗瓙浠诲姟寮傚父锛宻ubid={}锛宼askid={}锛宱rgid={}",
+                    serviceSubtask == null ? null : serviceSubtask.getId(),
+                    serviceSubtask == null ? null : serviceSubtask.getTaskid(),
+                    serviceSubtask == null ? null : serviceSubtask.getOrgid(), e);
+        }
+    }
+
+    /**
+     * 闅忚-琛ュ伩澶勭悊瀹為檯閫昏緫銆�
+     */
+    private void doSfHandlle(ServiceSubtask serviceSubtask) {
+        if (serviceSubtask == null) {
+            log.error("銆恠fHandlle銆戝瓙浠诲姟涓虹┖锛岃烦杩囧鐞�");
+            return;
+        }
         //杩欓噷闇�瑕佹牴鎹韩浠借瘉鍘婚噸(缁欏井淇″皬绋嬪簭鐨勫浐瀹氫换鍔$敤鐨�)
         List<ServiceSubtask> serviceSubtaskListFilter = new ArrayList<>();
         ServiceTask ivrTask1 = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -1291,15 +1333,31 @@
         //鑾峰彇鍙戦�佹柟寮�
         String sendPreachform = getSendPreachform(serviceSubtaskPreachform, serviceSubtask);
         log.info("sendPreachform鐨勫彂閫佹柟寮忔槸鍟ワ細{}", sendPreachform);
-        if (sendPreachform.equals("-1") || serviceSubtask.getSendstate() == 6 || serviceSubtask.getSendstate() == 5 || serviceSubtask.getSendstate() == 4) {
-            //璇存槑宸茬粡鍏ㄩ儴閬嶅巻瀹屼簡锛屽綋鍓嶇殑鎵ц鏂瑰紡搴忓彿鏄渶鍚庝竴涓簡   鎴栬��  璇ユ偅鑰呭凡缁忛殢璁跨粨鏉燂紙鎴愬姛鎴栧け璐ヤ簡鎴栦笉鎵ц锛�
-            log.error("璇存槑宸茬粡鍏ㄩ儴閬嶅巻瀹屼簡锛屽綋鍓嶇殑鎵ц鏂瑰紡搴忓彿鏄渶鍚庝竴涓簡   鎴栬��  璇ユ偅鑰呭凡缁忛殢璁跨粨鏉燂紙鎴愬姛鎴栧け璐ヤ簡鎴栦笉鎵ц锛�");
+
+        Long sendstate = serviceSubtask.getSendstate();
+        if (Long.valueOf(6L).equals(sendstate)
+                || Long.valueOf(5L).equals(sendstate)
+                || Long.valueOf(4L).equals(sendstate)) {
+            //璇ユ偅鑰呭凡缁忛殢璁跨粨鏉燂紙鎴愬姛銆佸け璐ユ垨涓嶆墽琛岋級
+            log.error("璇ユ偅鑰呭凡缁忛殢璁跨粨鏉燂紙鎴愬姛銆佸け璐ユ垨涓嶆墽琛岋級锛宻ubid={}锛宻endstate={}", serviceSubtask.getId(), sendstate);
             return;
         }
+        if (StringUtils.isEmpty(sendPreachform)) {
+            // 鑰佹暟鎹彲鑳藉瓨鍦� service_subtask_preachform 缂哄け銆乻ervice_task.preachform_desc 涓虹┖銆�
+            // current_preachform 涓庢槑缁嗕笉涓�鑷寸瓑鎯呭喌銆傛鏃朵笉鑳界户缁紝鍚﹀垯 sendPreachform.equals(...) 浼� NPE銆�
+            closeSubtaskForMissingPreachform(serviceSubtask);
+            return;
+        }
+        if ("-1".equals(sendPreachform)) {
+            //璇存槑宸茬粡鍏ㄩ儴閬嶅巻瀹屼簡锛屽綋鍓嶇殑鎵ц鏂瑰紡搴忓彿鏄渶鍚庝竴涓簡
+            log.error("璇存槑宸茬粡鍏ㄩ儴閬嶅巻瀹屼簡锛屽綋鍓嶇殑鎵ц鏂瑰紡搴忓彿鏄渶鍚庝竴涓簡锛宻ubid={}", serviceSubtask.getId());
+            return;
+        }
+
         //鍏堝垽鏂偅鑰呮槸涓嶆槸杩樿鍙戦��
         PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
         log.info("patArchive鐨勫�间负锛歿}", patArchive);
-        if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
+        if (!Objects.isNull(patArchive) && "1".equals(patArchive.getNotrequiredFlag())) {
             //涓嶉渶瑕佸彂閫�
             serviceSubtask.setResult("鎮h�呬笉闇�瑕侀殢璁�");
             serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + "鎮h�呬笉闇�瑕侀殢璁�," + patArchive.getNotrequiredreason() : "鎮h�呬笉闇�瑕侀殢璁�," + patArchive.getNotrequiredreason());
@@ -1310,7 +1368,14 @@
             return;
         }
 
-        String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
+        int sendCode = NumberUtils.toInt(sendPreachform, -1);
+        String descByCode = ServiceFromEnum.getDescByCode(sendCode);
+        if (StringUtils.isEmpty(descByCode)) {
+            log.error("銆恠fHandlle銆戝彂閫佹柟寮忕紪鐮侀潪娉曪紝subid={}锛宼askid={}锛宻endPreachform={}",
+                    serviceSubtask.getId(), serviceSubtask.getTaskid(), sendPreachform);
+            closeSubtaskForMissingPreachform(serviceSubtask);
+            return;
+        }
 
         // 鈿狅笍 2025 淇锛堝鏁欏紑鍏冲け鏁堬級锛歵ype == 3 鏄�**瀹f暀/閫氱煡**锛堢函鍙戦�併�佹棤浣滅瓟 鈥斺��
         // 瑙� setSuccessPreachForm 閲屻�屽鏁欐垨閫氱煡鈥︾洿鎺ユ敼鎴� 9銆嶃�佷互鍙婃湰鏂规硶鍚庨潰
@@ -1417,7 +1482,7 @@
                         url = StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/wt?p=" + format : localIP + "/wt?p=" + format;
                         sendMagParam.setUrl(url);
                         //濡傛灉type鏄闊抽殢璁跨殑璇濓紙璇存槑琛ュ伩鍙戦�佹柟寮忎腑鏈夌數璇濋殢璁跨殑鏂瑰紡锛岃繖閲岀殑澶栭摼灏卞湴鍧�鍙兘鐢�/sf锛�
-                        if (serviceSubtask.getType().equals("1"))
+                        if ("1".equals(serviceSubtask.getType()))
                             url = StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/sf?p=" + format : localIP + "/sf?p=" + format;
                         sendMagParam.setUrl(url);
 
@@ -1597,6 +1662,46 @@
     }
 
     /**
+     * 鑰佹暟鎹厹搴曪細瀛愪换鍔℃病鏈夊彲鐢ㄥ彂閫佹柟寮忔椂锛屾爣璁颁负瓒呮椂骞跺啓娓呭師鍥犮��
+     * <p>
+     * 杩欑被鏁版嵁閫氬父鏉ヨ嚜 {@code service_subtask_preachform} 缂哄け銆亄@code service_task.preachform_desc}
+     * 涓虹┖/闈炴硶锛屾垨 {@code current_preachform} 涓庢槑缁嗕笉涓�鑷淬�傛爣璁颁负缁堟�佸悗涓嶄細鍐嶈
+     * {@code longTaskSend}/{@code compensateTask} 鍙嶅鎹炲彇锛屼篃涓嶄細鍥犱竴鏉¤剰鏁版嵁涓柇鏁存壒浠诲姟銆�
+     */
+    private void closeSubtaskForMissingPreachform(ServiceSubtask serviceSubtask) {
+        if (serviceSubtask == null || serviceSubtask.getId() == null) {
+            log.error("銆恠fHandlle銆戝瓙浠诲姟涓虹┖鎴栫己灏慖D锛屾棤娉曟爣璁版棤鍙戦�佹柟寮�");
+            return;
+        }
+        try {
+            Long currentSendstate = serviceSubtask.getSendstate();
+            if (Long.valueOf(4L).equals(currentSendstate)
+                    || Long.valueOf(5L).equals(currentSendstate)
+                    || Long.valueOf(6L).equals(currentSendstate)
+                    || Long.valueOf(7L).equals(currentSendstate)) {
+                log.warn("銆恠fHandlle銆戝瓙浠诲姟宸叉槸缁堟�侊紝涓嶅啀閲嶅鏍囪銆俿ubid={}锛宻endstate={}",
+                        serviceSubtask.getId(), currentSendstate);
+                return;
+            }
+            String reason = "鏈煡璇㈠埌鏈夋晥鍙戦�佹柟寮忥紝浠诲姟鑷姩缁堟锛堟暟鎹紓甯革紝璇锋鏌ervice_subtask_preachform涓巗ervice_task.preachform_desc锛�";
+            // 鍙洿鏂板繀瑕佸瓧娈碉紝閬垮厤鎶婃煡璇㈡椂鐨勬暣琛屽揩鐓ц鐩栧洖鏁版嵁搴撱��
+            ServiceSubtask update = new ServiceSubtask();
+            update.setId(serviceSubtask.getId());
+            update.setSendstate(7L);
+            update.setUpdateTime(new Date());
+            update.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark())
+                    ? serviceSubtask.getRemark() + "," + reason : reason);
+            serviceSubtaskMapper.updateServiceSubtask(update);
+            log.error("銆恠fHandlle銆戝瓙浠诲姟鏃犳湁鏁堝彂閫佹柟寮忥紝宸叉爣璁颁负瓒呮椂銆俿ubid={}锛宼askid={}锛宱rgid={}锛宑urrentPreachform={}",
+                    serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getOrgid(),
+                    serviceSubtask.getCurrentPreachform());
+        } catch (Exception e) {
+            log.error("銆恠fHandlle銆戞爣璁版棤鍙戦�佹柟寮忓瓙浠诲姟澶辫触锛宻ubid={}锛宼askid={}",
+                    serviceSubtask.getId(), serviceSubtask.getTaskid(), e);
+        }
+    }
+
+    /**
      * 鎸� {@code active}锛堢珯鐐癸級璺敱鍒板搴旂殑鐭俊鍙戦�佹柟銆�
      * <p>
      * 鍚勭珯鐐瑰樊寮傝 {@code ruoyi-message} 妯″潡鍚勫疄鐜扮被锛涙湰鏂规硶鍙仛銆屽叆鍙傜粍瑁� + 璺敱 + 鏃ュ織銆嶃��
@@ -1694,7 +1799,13 @@
 
         // 鎯呭喌1锛歝urrentPreachform涓虹┖锛屽彇sort涓�1鐨刾reachform
         if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
-            String firstPreachform = serviceSubtaskPreachforms.stream().filter(item -> item.getSort() == 1L).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse(null);
+            String firstPreachform = serviceSubtaskPreachforms.stream()
+                    .filter(Objects::nonNull)
+                    .filter(item -> Long.valueOf(1L).equals(item.getSort()))
+                    .map(ServiceSubtaskPreachform::getPreachform)
+                    .filter(item -> StringUtils.isNotEmpty(item))
+                    .findFirst()
+                    .orElse(null);
 
             //鏇存柊涓�涓嬪綋鍓嶅彂閫佹椂闂�
             if (StringUtils.isNotEmpty(firstPreachform)) {
@@ -1706,11 +1817,17 @@
         }
 
         // 鎯呭喌2锛歝urrentPreachform涓嶄负绌猴紝鎵句笅涓�涓猻ort
-        Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
+        Optional<Long> currentSort = serviceSubtaskPreachforms.stream()
+                .filter(Objects::nonNull)
+                .filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform()))
+                .map(ServiceSubtaskPreachform::getSort)
+                .findFirst();
 
         if (currentSort.isPresent()) {
             // 妫�鏌ユ槸鍚︽墍鏈塻endstate涓嶇瓑浜�9
-            boolean allSendStateNot1AndNot9 = serviceSubtaskPreachforms.stream().allMatch(item -> !item.getSendstate().equals("9"));
+            boolean allSendStateNot1AndNot9 = serviceSubtaskPreachforms.stream()
+                    .filter(Objects::nonNull)
+                    .allMatch(item -> !"9".equals(item.getSendstate()));
             if (!allSendStateNot1AndNot9) {
                 //璇存槑锛屽湪鏌愮鏂瑰紡鍙戦�佸け璐ュ悗锛屽張鎴愬姛浜嗭紙渚嬪鐭俊鎴栧叕浼楀彿锛屽湪瑙勫畾鏃堕棿澶栨偅鑰呭仛瀹屼簡锛岃繖涓椂鍊欙紝鐘舵�佹敼鎴愪簡9锛�
                 serviceSubtask.setSendstate(6L);
@@ -1740,7 +1857,13 @@
             }
 
             // 鎵惧埌涓嬩竴涓猻ort瀵瑰簲鐨刾reachform
-            String nextPreachform = serviceSubtaskPreachforms.stream().filter(item -> nextSort.equals(item.getSort())).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse("-1");
+            String nextPreachform = serviceSubtaskPreachforms.stream()
+                    .filter(Objects::nonNull)
+                    .filter(item -> nextSort.equals(item.getSort()))
+                    .map(ServiceSubtaskPreachform::getPreachform)
+                    .filter(item -> StringUtils.isNotEmpty(item))
+                    .findFirst()
+                    .orElse("-1");
 
             //鏇存柊涓�涓嬪綋鍓嶅彂閫佹椂闂�
             if (StringUtils.isNotEmpty(nextPreachform)) {
@@ -1750,36 +1873,62 @@
             }
             return nextPreachform;
         }
+
+        log.warn("銆恎etSendPreachform銆戞湭鎵惧埌鍙敤鐨勫彂閫佹柟寮忥紝subid={}锛宼askid={}锛宑urrentPreachform={}",
+                serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getCurrentPreachform());
         return null;
     }
 
     private List<ServiceSubtaskPreachform> addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) {
         //灏唒reachformDesc鐨刯son瀵硅薄锛屾斁鍒發ist闆嗗悎涓�
         ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
+        if (serviceTask == null) {
+            log.error("ryTask--鍙戦�佹柟寮忓垵濮嬪寲澶辫触锛屼换鍔′笉瀛樺湪锛宼askid={}锛宻ubid={}",
+                    serviceSubtask.getTaskid(), serviceSubtask.getId());
+            return Collections.emptyList();
+        }
         String preachformDesc = serviceTask.getPreachformDesc();
-
-        List<ServiceSubtaskPreachform> sspl = null;
-        ObjectMapper objectMapper = new ObjectMapper();
-        if (org.apache.commons.lang3.StringUtils.isNotEmpty(preachformDesc)) {
-            try {
-                sspl = objectMapper.readValue(preachformDesc, new TypeReference<List<ServiceSubtaskPreachform>>() {
-                });
-            } catch (JsonProcessingException e) {
-                log.error("ryTask--preachform杞琇ist<ServiceSubtaskPreachform>鎶ラ敊浜嗭細{}", e.getMessage());
-            }
-            for (ServiceSubtaskPreachform serviceSubtaskPreachform : sspl) {
-                serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
-                serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
-                //杩欎釜sendstate闇�瑕佸湪鏁版嵁搴撹缃竴涓粯璁ゅ�间负鈥�1鈥�
-                serviceSubtaskPreachform.setSendstate("1");
-                if (StringUtils.isNotEmpty(sendstate)) serviceSubtaskPreachform.setSendstate(sendstate);
-                serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
-                serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
-            }
-
+        if (StringUtils.isEmpty(preachformDesc)) {
+            log.error("ryTask--鍙戦�佹柟寮忓垵濮嬪寲澶辫触锛宲reachform_desc涓虹┖锛宼askid={}锛宻ubid={}",
+                    serviceSubtask.getTaskid(), serviceSubtask.getId());
+            return Collections.emptyList();
         }
 
-        return sspl;
+        List<ServiceSubtaskPreachform> sspl;
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            sspl = objectMapper.readValue(preachformDesc, new TypeReference<List<ServiceSubtaskPreachform>>() {
+            });
+        } catch (JsonProcessingException e) {
+            log.error("ryTask--preachform杞琇ist<ServiceSubtaskPreachform>鎶ラ敊浜嗭紝taskid={}锛宻ubid={}锛宲reachformDesc={}",
+                    serviceSubtask.getTaskid(), serviceSubtask.getId(), preachformDesc, e);
+            return Collections.emptyList();
+        }
+        if (CollectionUtils.isEmpty(sspl)) {
+            log.error("ryTask--preachformDesc瑙f瀽鍚庝负绌猴紝taskid={}锛宻ubid={}锛宲reachformDesc={}",
+                    serviceSubtask.getTaskid(), serviceSubtask.getId(), preachformDesc);
+            return Collections.emptyList();
+        }
+
+        List<ServiceSubtaskPreachform> inserted = new ArrayList<>();
+        for (ServiceSubtaskPreachform serviceSubtaskPreachform : sspl) {
+            if (serviceSubtaskPreachform == null) {
+                continue;
+            }
+            if (StringUtils.isEmpty(serviceSubtaskPreachform.getPreachform())) {
+                log.warn("ryTask--preachformDesc涓瓨鍦ㄧ┖鐨刾reachform锛岃烦杩囥�倀askid={}锛宻ubid={}",
+                        serviceSubtask.getTaskid(), serviceSubtask.getId());
+                continue;
+            }
+            serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
+            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
+            //杩欎釜sendstate闇�瑕佸湪鏁版嵁搴撹缃竴涓粯璁ゅ�间负鈥�1鈥�
+            serviceSubtaskPreachform.setSendstate(StringUtils.isNotEmpty(sendstate) ? sendstate : "1");
+            serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
+            serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
+            inserted.add(serviceSubtaskPreachform);
+        }
+        return inserted;
     }
 
     private Integer setFail(List<ServiceSubtaskPreachform> serviceSubtaskPreachforms, ServiceSubtask serviceSubtask) {
@@ -1872,7 +2021,7 @@
 
     public Boolean setSuccessPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
         log.info("setSuccessPreachForm鐨勫叆鍙備负锛歴erviceSubtask = {}锛�  preachform = {}锛�  remark = {}锛� failSendstate = {}", serviceSubtask, preachform, remark, failSendstate);
-        if (preachform.equals("-1")) {
+        if ("-1".equals(preachform)) {
             //璇存槑閮戒笉闇�瑕佹墽琛屼簡
             ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
             serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
@@ -1894,7 +2043,7 @@
         //1:鏈彂閫佺姸鎬�
         serviceSubtaskPreachform.setSendstate("1");
         //鐢佃瘽鐨勬湭鍙戦�佺姸鎬侊紝闇�瑕佹煡2锛屽洜涓猴紝鏁版嵁鍙兘鍗″湪闃熷垪閲屼簡; 锛堟病杩涢槦鍒楋紝鐢佃瘽鐘舵�佽繕鏄�1锛�
-        if (preachform.equals("3") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
+        if ("3".equals(preachform) && NumberUtils.toInt(failSendstate, 0) > 2)
             serviceSubtaskPreachform.setSendstate("2");
 //        //浜哄伐鐨勬湭鍙戦�佺姸鎬侊紝闇�瑕佹煡2
 //        if (preachform.equals("1") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
@@ -1904,16 +2053,18 @@
         if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
             ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
             serviceSubtaskPreachform1.setSendstate(failSendstate);
-            if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
+            if ("3".equals(serviceSubtask.getType()) || "4".equals(serviceSubtask.getType())) {
                 //濡傛灉鏄鏁欐垨閫氱煡锛屽苟涓斿彂閫佹垚鍔燂紝鐩存帴灏嗗彂閫佺姸鎬佹敼鎴�9
-                if (failSendstate.equals("2")) serviceSubtaskPreachform1.setSendstate("9");
+                if ("2".equals(failSendstate)) serviceSubtaskPreachform1.setSendstate("9");
             }
             serviceSubtaskPreachform1.setRemark(remark);
             serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
             log.info("---------serviceSubtaskPreachform1鐨勫叆鍙傛槸 :  {}", serviceSubtaskPreachform1);
             //濡傛灉褰撳墠鐨刾reachform宸茬粡鏄渶鍚庝竴涓簡锛岄偅鐩存帴灏唖erviceSubtask鐨剆endstate鐘舵�佹敼鎴�7灏辫浜�(鍏ㄨ秴鏃朵簡)
-            if (serviceSubtaskPreachform1.getSort() == sspCount.size() && isSubtaskDeadline(serviceSubtask, serviceSubtaskPreachforms)) {
-                if (failSendstate.equals("4") || failSendstate.equals("5")) {
+            if (serviceSubtaskPreachform1.getSort() != null
+                    && serviceSubtaskPreachform1.getSort() == sspCount.size()
+                    && isSubtaskDeadline(serviceSubtask, serviceSubtaskPreachforms)) {
+                if ("4".equals(failSendstate) || "5".equals(failSendstate)) {
                     serviceSubtask.setCurrentPreachform(preachform);
                     serviceSubtask.setSendstate(7L);
                     log.error("setSuccessPreachForm鏂规硶锛屽綋鍓嶇殑preachform宸茬粡鏄渶鍚庝竴涓簡锛屽叏閮ㄦ墽琛屽け璐�");
@@ -1933,9 +2084,9 @@
         serviceSubtask.setCurrentPreachform(preachform);
         serviceSubtask.setSendstate(3L);
 
-        if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
+        if ("3".equals(serviceSubtask.getType()) || "4".equals(serviceSubtask.getType())) {
             //濡傛灉鏄鏁欐垨閫氱煡锛屽苟涓斿彂閫佹垚鍔燂紝鍒欑洿鎺ュ皢serviceSubtask鐘舵�佹敼鎴�6L锛堣繖涓偅鑰呮槸娌℃湁棰樺仛鐨勶紝涓嶄細鍐嶈Е鍙戞帴鍙h繘琛岀姸鎬佷慨鏀癸級
-            if (failSendstate.equals("2")) {
+            if ("2".equals(failSendstate)) {
                 serviceSubtask.setSendstate(6L);
             }
         }

--
Gitblit v1.9.3