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-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java |  517 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 409 insertions(+), 108 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 ff0e3e7..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
@@ -14,6 +14,7 @@
 import com.ruoyi.common.enums.ServiceFromEnum;
 import com.ruoyi.common.utils.*;
 import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.common.utils.sms.SmsUtils;
 import com.ruoyi.message.SendResult;
 import com.ruoyi.message.sms.SmsSendRequest;
 import com.ruoyi.message.sms.SmsSenderFactory;
@@ -32,6 +33,7 @@
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.message.sms.provider.sltd.ws.MessageSend;
 import com.smartor.common.QwenLLMUtil;
+import com.smartor.common.SpecificArchiveConstants;
 import com.smartor.domain.*;
 import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
 import com.smartor.mapper.*;
@@ -39,6 +41,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -66,8 +69,12 @@
 import com.ruoyi.task.domain.ServiceSubtask;
 import com.ruoyi.task.domain.ServiceSubtaskRecord;
 import com.ruoyi.task.domain.ServiceTask;
+import com.ruoyi.task.domain.ServiceTaskSchedule;
+import com.ruoyi.task.domain.ServiceTaskScheduleDetail;
 import com.ruoyi.task.mapper.ServiceSubtaskMapper;
 import com.ruoyi.task.mapper.ServiceTaskMapper;
+import com.ruoyi.task.mapper.ServiceTaskScheduleMapper;
+import com.ruoyi.task.mapper.ServiceTaskScheduleDetailMapper;
 import com.ruoyi.task.domain.ServiceSubtaskDetailTrace;
 import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
 import com.ruoyi.task.service.IServiceSubtaskDetailTraceService;
@@ -76,6 +83,13 @@
 import com.ruoyi.task.domain.ServiceSubtaskPreachform;
 import com.ruoyi.task.service.IServiceSubtaskService;
 import com.ruoyi.task.domain.SendMagParam;
+import com.ruoyi.task.service.IServiceSubtaskRecordService;
+import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
+import com.ruoyi.patarchive.service.IPatArchiveService;
+import com.ruoyi.datacollection.service.IXHGatherPatArchiveService;
+import com.ruoyi.datacollection.service.IServiceSLTDHealthcareRecordService;
+import com.ruoyi.datacollection.domain.ServiceSLTDInhospReqVO;
+import com.ruoyi.datacollection.domain.ServiceSLTDInhospResDTO;
 
 /**
  * 瀹氭椂浠诲姟璋冨害娴嬭瘯
@@ -157,6 +171,12 @@
 
     @Autowired
     private ServiceSubtaskMapper serviceSubtaskMapper;
+
+    @Autowired
+    private ServiceTaskScheduleMapper serviceTaskScheduleMapper;
+
+    @Autowired
+    private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper;
 
     @Autowired
     private RedisCache redisCache;
@@ -1044,8 +1064,10 @@
      * 澶勭悊鎮h�呬俊鎭紝杩涘叆瀛愪换鍔¤〃(浠诲姟缁�)
      * <p>
      * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 閬楃暀瀹炵幇锛屼笉鍒ゅ紑鍏筹紙鍚� {@link #dealOutHospInfo()}锛夈��
-     * 鐜拌蛋妯″潡闂ㄩ潰銆傛敞鎰忔ā鍧椾晶鐨� {@code dealOutHospInfoBySchedule} 鍐呴儴浠嶄細杞彂鍥� smartor
-     * 锛坽@code OtherVisitApiBridge}锛岃璇ョ被娉ㄩ噴锛夛紝浣�<b>寮�鍏冲湪闂ㄩ潰杩欎竴灞傚垽</b>锛屾墍浠ュ叧闂椂涓嶄細璧板埌閭i噷銆�
+     * 鐜拌蛋妯″潡闂ㄩ潰銆傛ā鍧椾晶 {@code dealOutHospInfoBySchedule} 缁� {@code OtherVisitApi} 濂戠害
+     * 鍥炶皟 {@code ruoyi-task/api/contract/OtherVisitApiImpl}锛�2026-11 璧峰疄鐜版暣绨囨惉杩� task 妯″潡锛�
+     * smartor 渚х殑 {@code OtherVisitApiBridge} 宸插垹闄わ級锛屼絾<b>寮�鍏冲湪闂ㄩ潰杩欎竴灞傚垽</b>锛�
+     * 鎵�浠ュ叧闂椂涓嶄細璧板埌閭i噷銆�
      */
     public void dealOutHospInfoBySchedule() {
         String config = configService.selectConfigByKey("visit.early.day");
@@ -1140,18 +1162,61 @@
             serviceSubtaskList.addAll(compensateServiceSubtaskList);
         }
         for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
+            //currentPreachform涓虹┖锛岃鏄庤瀛愪换鍔¤繕娌℃湁鎵ц杩囦换浣曚竴绉嶅彂閫佹柟寮�(sendstate=1锛屽睘浜庨娆¤ˉ鍋�)锛�
+            //杩欓噷鐩存帴浜ょ粰sfHandlle澶勭悊锛屽畠浼氭寜sort=1鐨勭涓�绉嶅彂閫佹柟寮忓彂閫侊紝涓巊etSendPreachform涓殑澶勭悊淇濇寔涓�鑷�
+            if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
+                log.warn("銆恈ompensateTask銆憇ubid锛歿}锛宑urrentPreachform涓虹┖锛屾寜绗竴绉嶅彂閫佹柟寮忚ˉ鍋垮鐞�", serviceSubtask.getId());
+                sfHandlle(serviceSubtask);
+                continue;
+            }
             //鏍规嵁褰撳墠鐨勬墽琛屾柟寮忥紝鑾峰彇涓嬩竴绉嶆墽琛屾柟寮�
             ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
             serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
             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)
+                // 涓旀湭濉啓鏃讹紝鎸夐粯璁ら�夐」瀹屾垚锛岄伩鍏嶈繘鍏ヤ笅涓�绉嶅彂閫佹柟寮忔垨鏈�鍚庝竴姝ヨ秴鏃躲��
+                // 鍏堢敤鍐呭瓨瀛楁蹇�熻繃婊わ紝鍏朵粬鍖婚櫌/浠诲姟/鍙戦�佹柟寮忎笉浼氳繘鍏ヤ笅闈㈢殑榛樿瀹屾垚閫昏緫銆�
+                if (IServiceSubtaskService.WECHAT_DEFAULT_COMPLETE_ORGID.equals(serviceSubtask.getOrgid())
+                        && "2".equals(serviceSubtask.getType())
+                        && "5".equals(serviceSubtask.getCurrentPreachform())
+                        && Long.valueOf(1L).equals(serviceSubtask.getSendstate())
+                        && !Long.valueOf(1L).equals(serviceSubtask.getSubmit())) {
+                    try {
+                        if (iServiceSubtaskService.completeWechatClaimedByDefault(serviceSubtask)) {
+                            log.info("銆恈ompensateTask銆憇ubid锛歿}锛屽井淇″叕浼楀彿宸查鍙栨湭濉啓锛屾寜榛樿閫夐」瀹屾垚", serviceSubtask.getId());
+                            continue;
+                        }
+                    } catch (Exception e) {
+                        // 鍗曚釜瀛愪换鍔″け璐ヤ笉褰卞搷鍏朵粬浠诲姟锛屽洖婊氬悗缁х画鍘熻ˉ鍋挎祦绋�
+                        log.error("銆恈ompensateTask銆戝井淇″叕浼楀彿榛樿瀹屾垚澶辫触锛宻ubid锛歿}锛岀户缁師琛ュ伩娴佺▼", serviceSubtask.getId(), e);
+                    }
+                }
+
                 //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);
@@ -1167,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);
             }
         }
     }
@@ -1211,11 +1281,49 @@
     }
 
     /**
-     * 闅忚-琛ュ伩澶勭悊
+     * 鎸夋満鏋勬煡璇㈤厤缃�硷紙鍚屼竴 key 鍦ㄤ笉鍚屾満鏋勪笅鍙厤缃笉鍚屽�硷級
+     *
+     * @param configKey 閰嶇疆key
+     * @param orgid     鏈烘瀯ID
+     * @return 閰嶇疆鍊硷紝鏈厤缃繑鍥� null
+     */
+    private String getConfigValue(String configKey, String orgid) {
+        SysConfig query = new SysConfig();
+        query.setConfigKey(configKey);
+        query.setOrgid(orgid);
+        List<SysConfig> sysConfigs = configService.selectConfigList(query);
+        if (CollectionUtils.isNotEmpty(sysConfigs)) {
+            return sysConfigs.get(0).getConfigValue();
+        }
+        return null;
+    }
+
+    /**
+     * 闅忚-琛ュ伩澶勭悊銆�
+     * <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());
@@ -1225,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());
@@ -1244,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銆嶃�佷互鍙婃湰鏂规硶鍚庨潰
@@ -1343,7 +1474,7 @@
                     serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                     iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                     String url = "";
-                    String format = String.format("%03X", serviceOutPath.getId());
+                    String format = ShortCode.encode(serviceOutPath.getId());
                     //鍏堝垽鏂竴涓嬪彂鐨勬槸涓嶆槸瀹f暀
                     log.info("serviceSubtask.getType鐨勫�间负锛歿}", serviceSubtask.getType());
                     if (!"3".equals(serviceSubtask.getType())) {
@@ -1351,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);
 
@@ -1365,7 +1496,7 @@
                             sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
                         }
                         log.info("sysConfig鐨勫�间负锛歿}", sysConfig);
-                        if (!Objects.isNull(sysConfig)) {
+                        if (!Objects.isNull(sysConfig) && StringUtils.isNotEmpty(sysConfig.getConfigValue())) {
                             String smsContemt = sysConfig.getConfigValue();
 //                            sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
                             sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
@@ -1385,7 +1516,7 @@
                             sendMagParam.setUrl(url);
 
                             SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("xj.sms.template");
-                            if (!Objects.isNull(sysConfig)) {
+                            if (!Objects.isNull(sysConfig) && StringUtils.isNotEmpty(sysConfig.getConfigValue())) {
                                 String smsContemt = sysConfig.getConfigValue();
 //                              sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
                                 sendMagParam.setContent(smsContemt.replace("${xjurl}", sendMagParam.getUrl()));
@@ -1401,6 +1532,13 @@
 
                     }
 
+                    //鍐呭涓虹┖璇存槑鐭俊妯℃澘鏈厤缃垨瀹f暀/閫氱煡鍐呭涓虹┖锛岀洿鎺ユ寜鍙戦�佸け璐ュ鐞嗭紝閬垮厤鍚庣画鍙戦�佹椂鍑虹幇绌烘寚閽�
+                    if (StringUtils.isEmpty(sendMagParam.getContent())) {
+                        log.error("銆恠fHandlle銆戦暱鏈熶换鍔$煭淇″唴瀹逛负绌猴紝鏃犳硶鍙戦�侊紝subid锛歿}锛宼askid锛歿}锛宼ype锛歿}锛屾満鏋処D锛歿}", serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getType(), serviceSubtask.getOrgid());
+                        setSuccessPreachForm(serviceSubtask, sendPreachform, "闀挎湡浠诲姟鐭俊鍙戦�佸け璐�:鐭俊鍐呭涓虹┖(鐭俊妯℃澘鏈厤缃垨鍐呭涓虹┖), 鏃堕棿: " + now, "5");
+                        return;
+                    }
+
                     serviceOutPath.setRadix(format);
                     serviceOutPath.setUpdateTime(new Date());
                     serviceOutPath.setUrl(url);
@@ -1408,9 +1546,24 @@
                     //鐭俊鍙戦�侊細鍚勭珯鐐瑰鎺ユ柟寮忓樊寮傝緝澶э紙鎶ユ枃/绛惧悕/token/杩斿洖鍒ゅ畾閮戒笉鍚岋級锛�
                     //宸叉敹鍙e埌 ruoyi-message 妯″潡锛岃繖閲屽彧璐熻矗缁勮鍏ュ弬骞惰矾鐢�
                     log.info("active鐨勫�间负锛歿}", active);
-                    SendResult smsSendResult = sendSmsByActive(serviceSubtask, sendMagParam);
-                    log.info("smsSendResult鐨勫�间负锛歿}", smsSendResult);
-                    String isSuccess = smsSendResult.asLegacyFlag();
+                    String isSuccess = "";
+                    if ("ls".equals(active) && "47226079133110211G1001".equals(serviceSubtask.getOrgid())) {
+                        //涓芥按濡囧辜璧颁腑鍥界Щ鍔ㄤ簯MAS锛屼笉渚濊禆 ls.msg.info 涓� token锛�
+                        //ruoyi-message 鐨� ls 閫氶亾灏氭湭瑕嗙洊浜慚AS锛屾晠姝ゅ淇濈暀 SmsUtils 鐩磋繛
+                        SmsUtils.YunMasConfig yunMasConfig = SmsUtils.YunMasConfig.of(getConfigValue("ls.msg.yunmas", serviceSubtask.getOrgid()));
+                        SmsUtils.SmsResult yunMasSmsResult = SmsUtils.sendYunMasSms(yunMasConfig, sendMagParam.getPhone(), sendMagParam.getContent());
+                        log.info("銆恠fHandlle銆戜簯MAS鐭俊鍙戦�佺粨鏋滐細ok={}锛宺spcod={}锛宮sgGroup={}锛宮essage={}",
+                                yunMasSmsResult.isOk(), yunMasSmsResult.getRspcod(), yunMasSmsResult.getMsgGroup(), yunMasSmsResult.getMessage());
+                        isSuccess = yunMasSmsResult.isOk() ? "true" : "false";
+                        if (!yunMasSmsResult.isOk()) {
+                            log.error("銆恠fHandlle銆戜簯MAS鐭俊鍙戦�佸け璐ワ紝subid锛歿}锛屾墜鏈哄彿锛歿}锛屽師鍥狅細{}",
+                                    serviceSubtask.getId(), sendMagParam.getPhone(), yunMasSmsResult.getMessage());
+                        }
+                    } else {
+                        SendResult smsSendResult = sendSmsByActive(serviceSubtask, sendMagParam);
+                        log.info("smsSendResult鐨勫�间负锛歿}", smsSendResult);
+                        isSuccess = smsSendResult.asLegacyFlag();
+                    }
                     //浠诲姟鍙戦�佽褰�
                     ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                     serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
@@ -1464,7 +1617,7 @@
                     serviceOutPath.setCreateTime(new Date());
                     serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                     iServiceOutPathService.insertServiceOutPath(serviceOutPath);
-                    String format = String.format("%03X", serviceOutPath.getId());
+                    String format = ShortCode.encode(serviceOutPath.getId());
                     serviceOutPath.setRadix(format);
                     serviceOutPath.setUpdateTime(new Date());
                     serviceOutPath.setUrl(url);
@@ -1478,6 +1631,7 @@
                     //浠诲姟鍙戦�佽褰�
                     ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                     serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
+                    serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                     serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                     serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                     serviceSubtaskRecord.setPreachform("4");
@@ -1505,6 +1659,46 @@
             setSuccessPreachForm(serviceSubtask, sendPreachform, "浜哄伐鍙戦�佹垚鍔�", "2");
         }
 
+    }
+
+    /**
+     * 鑰佹暟鎹厹搴曪細瀛愪换鍔℃病鏈夊彲鐢ㄥ彂閫佹柟寮忔椂锛屾爣璁颁负瓒呮椂骞跺啓娓呭師鍥犮��
+     * <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);
+        }
     }
 
     /**
@@ -1558,10 +1752,10 @@
     private String resolveShiyiCampus(ServiceSubtask serviceSubtask) {
         SysDept sysDeptVo = new SysDept();
         List<SysDept> sysDepts = new ArrayList<>();
-        if (ObjectUtils.isNotEmpty(serviceSubtask.getDeptcode())) {
+        if (ObjectUtils.isNotEmpty(serviceSubtask.getLeaveldeptcode())) {
             sysDeptVo.setDeptType("1");
             sysDeptVo.setOrgid(serviceSubtask.getOrgid());
-            sysDeptVo.setDeptCode(serviceSubtask.getDeptcode());
+            sysDeptVo.setDeptCode(serviceSubtask.getLeaveldeptcode());
             sysDeptService.selectDeptList(sysDeptVo);
         } else if (ObjectUtils.isNotEmpty(serviceSubtask.getLeavehospitaldistrictcode())) {
             sysDeptVo.setDeptType("2");
@@ -1605,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)) {
@@ -1617,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);
@@ -1651,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)) {
@@ -1661,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) {
@@ -1718,6 +1956,25 @@
             log.info("銆恉ealHisData銆慔IS缁撴潫閲囬泦鏁版嵁");
         } catch (Exception e) {
             log.error("銆恉ealHisData銆慔IS鏁版嵁閲囬泦寮傚父", e);
+        }
+    }
+
+    /**
+     * 閲囬泦涓芥按甯傚骞间繚鍋ラ櫌闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍锛屽苟鎸夐厤缃敓鎴愬绉�/鍎跨妗f銆�
+     * 瀹氭椂浠诲姟榛樿閲囬泦鏄ㄥぉ 00:00:00 ~ 浠婂ぉ 00:00:00銆�
+     */
+    public void collectMchArchive() {
+        try {
+            LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
+            LocalDateTime yesterdayZero = todayZero.minusDays(1);
+            Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
+            Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
+            log.info("銆恈ollectMchArchive銆戝紑濮嬮噰闆嗕附姘村骞奸棬璇婃帴璇婂畬鎴愯褰�");
+            ichService.collectMchOuthospAndGenerateArchive(
+                    SpecificArchiveConstants.LISHUI_MCH_ORG_ID, startTime, endTime);
+            log.info("銆恈ollectMchArchive銆戜附姘村骞奸棬璇婃帴璇婂畬鎴愯褰曢噰闆嗙粨鏉�");
+        } catch (Exception e) {
+            log.error("銆恈ollectMchArchive銆戜附姘村骞奸棬璇婃帴璇婂畬鎴愯褰曢噰闆嗗紓甯�", e);
         }
     }
 
@@ -1764,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());
@@ -1786,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)
@@ -1796,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宸茬粡鏄渶鍚庝竴涓簡锛屽叏閮ㄦ墽琛屽け璐�");
@@ -1825,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);
             }
         }
@@ -1845,14 +2104,15 @@
      * @return
      */
     private String getObject(ServiceSubtask serviceSubtask, String scriptContent) {
+        //鍐呭涓虹┖鏃剁洿鎺ヨ繑鍥烇紝閬垮厤涓嬮潰鐨剅eplace鍑虹幇绌烘寚閽�
+        if (StringUtils.isEmpty(scriptContent)) {
+            return scriptContent;
+        }
         Map<String, Map<String, String>> param = getParam(serviceSubtask.getTaskid());
         for (Map<String, String> map : param.values()) {
             for (String key : map.keySet()) {
                 scriptContent = scriptContent.replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : "");
             }
-        }
-        if (StringUtils.isEmpty(scriptContent)) {
-            return scriptContent;
         }
         scriptContent = scriptContent.replace("${name}", StringUtils.isNotEmpty(serviceSubtask.getSendname()) ? serviceSubtask.getSendname() : "");
         scriptContent = scriptContent.replace("${dzz}", StringUtils.isNotEmpty(serviceSubtask.getAddr()) ? serviceSubtask.getAddr() : "");
@@ -1953,31 +2213,89 @@
         if (Objects.isNull(serviceSubtask) || CollectionUtils.isEmpty(serviceSubtaskPreachforms)) {
             return false;
         }
-        // 鍩哄噯鏃跺埢锛氬嚭闄㈡椂闂� + 鍙戦�佹棩锛坰endDay 缂虹渷鎸� 1锛夛紝骞跺厹搴曢伩鍏� NPE/鑴忔暟鎹�
         ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
-        int sendDay = serviceTask != null && serviceTask.getSendDay() != null ? serviceTask.getSendDay().intValue() : 1;
-        Date deadline = DateUtils.addDays(serviceSubtask.getEndtime(), sendDay);
-        int sumCompensateTime = CollectionUtils.isEmpty(serviceSubtaskPreachforms) ? 0 : serviceSubtaskPreachforms.stream().mapToInt(x -> x.getCompensateTime() == null ? 0 : Integer.parseInt(x.getCompensateTime())).sum();
+        Date deadline;
+        if (serviceTask != null && "5".equals(serviceTask.getAppltype())) {
+            // 浠诲姟缁勶細鍩哄噯 = schedule_benchmark 瑙f瀽鍑虹殑鏃堕棿 + day_offset锛屼笉鍙犲姞 send_day
+            deadline = resolveTaskGroupDeadlineBase(serviceSubtask);
+            if (deadline == null) {
+                log.warn("銆恑sSubtaskDeadline銆憇ubid锛歿} 浠诲姟缁勫熀鍑嗘椂闂翠负绌猴紝鏃犳硶璁$畻瓒呮椂锛屾寜鏈秴鏃跺鐞�", serviceSubtask.getId());
+                return false;
+            }
+        } else {
+            // 闈炰换鍔$粍锛氬熀鍑� = 鍑洪櫌鏃堕棿 + 鍙戦�佹棩锛坰endDay 缂虹渷鎸� 1锛�
+            if (serviceSubtask.getEndtime() == null) {
+                log.warn("銆恑sSubtaskDeadline銆憇ubid锛歿} endtime涓虹┖锛屾棤娉曡绠楄秴鏃讹紝鎸夋湭瓒呮椂澶勭悊", serviceSubtask.getId());
+                return false;
+            }
+            int sendDay = serviceTask != null && serviceTask.getSendDay() != null ? serviceTask.getSendDay().intValue() : 1;
+            deadline = DateUtils.addDays(serviceSubtask.getEndtime(), sendDay);
+        }
+        int sumCompensateTime = serviceSubtaskPreachforms.stream()
+                .mapToInt(x -> NumberUtils.toInt(x.getCompensateTime(), 0))
+                .sum();
         sumCompensateTime = sumCompensateTime + 1;
-        // 鍙ˉ鍋挎渶鍚庝竴姝ヨ嚜韬殑琛ュ伩鏃堕棿锛堝ぉ锛夛紝鑴忓�间竴寰嬫寜 0 鍏滃簳
+        // 琛ュ伩鏃堕棿鑴忓�间竴寰嬫寜 0 鍏滃簳锛屾渶鍚庡啀鍔� 1 澶╁闄�
         deadline = DateUtils.addDays(deadline, sumCompensateTime);
-        // 鍑洪櫌(鍙戦��)鏃堕棿 + 鏈琛ュ伩鏃堕棿 灏忎簬褰撳墠鏃堕棿 -> 瓒呮椂
         return deadline.getTime() < new Date().getTime();
     }
 
     /**
+     * 浠诲姟缁勫熀鍑嗘椂闂达細鎸� schedule_benchmark 瑙f瀽鍚庡姞 day_offset銆�
+     * 0/鍏跺畠-鑷畾涔夋椂闂� 1-鍏ラ櫌 2-鍑洪櫌 3-灏辫瘖 4-鍏ョ粍
+     */
+    private Date resolveTaskGroupDeadlineBase(ServiceSubtask serviceSubtask) {
+        if (serviceSubtask.getScheduleId() == null || serviceSubtask.getScheduleDetailId() == null) {
+            return null;
+        }
+        ServiceTaskSchedule schedule = serviceTaskScheduleMapper.selectServiceTaskScheduleById(serviceSubtask.getScheduleId());
+        ServiceTaskScheduleDetail detail = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailById(serviceSubtask.getScheduleDetailId());
+        if (schedule == null || detail == null || detail.getDayOffset() == null) {
+            return null;
+        }
+        Date base;
+        Integer benchmark = schedule.getScheduleBenchmark() == null ? 0 : schedule.getScheduleBenchmark();
+        switch (benchmark) {
+            case 1:
+                base = serviceSubtask.getStarttime();
+                break;
+            case 2:
+                base = serviceSubtask.getEndtime();
+                break;
+            case 3:
+                base = serviceSubtask.getAdmindate();
+                break;
+            case 4:
+                base = serviceSubtask.getCreateTime();
+                break;
+            default:
+                base = schedule.getScheduleBenchmarkCustomTime();
+                break;
+        }
+        return base == null ? null : DateUtils.addDays(base, detail.getDayOffset());
+    }
+
+    /**
      * 澶勭悊瓒呮椂闅忚浠诲姟锛堥殢璁胯秴鏃� 鈫� 鐢熸垚"鍐嶆闅忚"锛�
+     * <p>
+     * 鎵弿銆屽嚭闄㈡弧 deadlineDay 澶╀粛鏈畬鎴愩�嶇殑棣栨闅忚浠诲姟锛坰endstate=7 + visit_count=1锛夛紝
+     * 鎸夊綋鍓嶄换鍔$殑 nexttaskid 鐢熸垚鍐嶆闅忚浠诲姟锛岀瀹ゅ浐瀹氫负闅忚涓績绉戝銆�
+     * <p>
+     * 娉ㄦ剰锛氭埅姝㈡椂闂村繀椤诲湪寰幆澶栬绠椾竴娆°�傚巻鍙插疄鐜版妸 {@code deadlineDay = -deadlineDay}
+     * 鍐欏湪寰幆浣撳唴锛屾瘡杞彇鍙嶄竴娆★紝瀵艰嚧鍋舵暟杞敤銆屼粖澶� + deadlineDay銆嶅仛鎴鏃堕棿锛�
+     * 鎶婂嚭闄笉婊� 28 澶╃殑瓒呮椂浠诲姟涔熸壂浜嗚繘鏉ャ��
      * <p>
      * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氭湰鏂规硶鍘熶笉鍒や换浣曟ā鍧楀紑鍏� 鈥斺��
      * 鍏虫帀 {@code inhospvisit.enabled} 鐓ф牱寤�"鍐嶆闅忚"瀛愪换鍔°��
      * <p>
      * <b>涓轰粈涔堣繖閲屾槸"鍏ュ彛鍒ゅ紑鍏�"鑰屼笉鏄儚 {@link #dealOutHospInfo()} 閭f牱鍒囧埌闂ㄩ潰</b>锛�
      * 妯″潡渚у彧鎻愪緵浜� {@code InhospVisitApi#buildAgainVisitDraft}锛堢粍瑁呰崏绋匡級锛�
-     * <b>娌℃湁</b>瀹屾暣鐨�"鎵弿瓒呮椂 鈫� 钀藉簱 鈫� 鍥炲啓鍘熶换鍔$姸鎬�"鍏ュ彛锛�
-     * 鑰屾湰鏂规硶鑷繁缁勮骞� insert锛堣涓嬫柟 {@code insertServiceSubtask}锛夈��
-     * 閫犱竴涓ā鍧楀叆鍙e睘浜庢柊澧炶兘鍔涖�佽秴鍑�"鍙В鍐冲紑鍏�"鐨勮寖鍥达紝鎵�浠ュ彇鏈�灏忔敼鍔細鍏ュ彛瀹堝崼銆�
+     * 瓒呮椂鎵弿涓庡洖鍐欏師浠诲姟鐘舵�佺殑鍏ュ彛鐢� service 渚ф壙鎺ワ紙瑙佷笅鏂� {@code addSubTaskAgainByDeadline}锛夈��
      * <p>
      * 鈿狅笍 鍏ㄤ粨鍙湁 {@code ServiceSubtaskController#dealSubtaskDeadline} 涓�涓皟鐢ㄨ�呫��
+     *
+     * @param orgid       鏈烘瀯ID
+     * @param deadlineDay 鍑洪櫌婊″灏戝ぉ绠楄秴鏃讹紙姝f暟锛屽 28锛�
      */
     public void dealSubtaskDeadline(String orgid, Integer deadlineDay) {
         // 鈿狅笍 寮�鍏冲畧鍗細鍏堝垽鍐嶅共娲伙紝涓� dealOutHospInfo / rollTaskGroupCycle 鍚屽彛寰勩��
@@ -1993,9 +2311,17 @@
         st.setNexttaskflag("1");
         st.setOrgid(orgid);
         List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
+
+        // 鎴鏃堕棿鍙畻涓�娆★細鍑洪櫌鏃堕棿 <= 浠婂ぉ - deadlineDay
+        int days = Math.abs(ObjectUtils.isEmpty(deadlineDay) ? 28 : deadlineDay);
+        Date deadline = DateUtils.addDays(new Date(), -days);
+        log.info("銆恉ealSubtaskDeadline銆戝紑濮嬫壂鎻�, orgid={}, day={}, deadline={}, 浠诲姟鏁�={}",
+                orgid, days, deadline, serviceTasks.size());
+
         for (ServiceTask serviceTask : serviceTasks) {
-            deadlineDay = -deadlineDay;
-            Date deadline = DateUtils.addDays(new Date(), deadlineDay);
+            if (ObjectUtils.isEmpty(serviceTask.getNexttaskid())) {
+                continue;
+            }
             //閫氳繃浠诲姟ID鎷垮埌鎮h�呬俊鎭�,骞朵笖闅忚鏃堕棿寰楁槸浠婂ぉ涔嬪墠鐨�
             ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
             serviceSubtaskVO.setOrgid(orgid);
@@ -2004,44 +2330,19 @@
             serviceSubtaskVO.setVisitCount(1);
             serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
             serviceSubtaskVO.setEndOutHospTime(deadline);
-            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
+            List<ServiceSubtask> serviceSubtaskList
+                    = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
             log.info("銆恉ealSubtaskDeadline銆戣幏鍙栧埌{}涓秴鏃朵换鍔�, taskid={}", serviceSubtaskList.size(), serviceTask.getTaskid());
             for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
-                PatMedInhosp patMedInhospVo = new PatMedInhosp();
-                patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
-                patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
-                patMedInhospVo.setCry(1);
-                List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhospVo);
-                PatMedInhosp patMedInhosp = new PatMedInhosp();
-                if (!patMedInhospList.isEmpty()) {
-                    patMedInhosp = patMedInhospList.get(0);
-                } else {
-                    continue;
-                }
-                if (ObjectUtils.isEmpty(serviceTask.getNexttaskid())) {
-                    continue;
-                }
-                ServiceTask nextServiceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
-                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
-                String config = configService.selectConfigByKey("visit.early.day");
-                Integer type = 1;
-
-                //鏂板鍐嶆闅忚浠诲姟
-                ServiceSubtask serviceSubtaskAgain = iPatMedInhospService.boxedServiceSubtask(nextServiceTask, patMedInhosp, patArchive, config, type);
-                serviceSubtaskAgain.setId(null);
-                serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
-                serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
-                serviceSubtaskAgain.setSendstate(2L);
-                serviceSubtaskAgain.setCreateTime(new Date());
-                serviceSubtaskAgain.setUpdateTime(new Date());
-                serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
-                serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
-                serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
-                int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
-                if (i == 1) {
-                    //鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛鍚庯紝鍘熶换鍔℃敼涓哄け璐ョ姸鎬�
-                    serviceSubtask.setSendstate(5L);
-                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                try {
+                    // 鐢熸垚閫昏緫缁熶竴鏀跺彛鍒� service锛氶攣 + 骞傜瓑 + 浜嬪姟 + 鍙戦�佹柟寮忔槑缁嗗垵濮嬪寲
+                    String result = iServiceSubtaskService.addSubTaskAgainByDeadline(serviceSubtask);
+                    log.info("銆恉ealSubtaskDeadline銆戠敓鎴愬啀娆¢殢璁�, subId={}, taskid={}, 缁撴灉={}",
+                            serviceSubtask.getId(), serviceTask.getTaskid(), result);
+                } catch (Exception e) {
+                    // 鍗曟潯澶辫触涓嶅奖鍝嶅叾浠栨偅鑰�
+                    log.error("銆恉ealSubtaskDeadline銆戠敓鎴愬啀娆¢殢璁垮け璐�, subId=" + serviceSubtask.getId()
+                            + ", taskid=" + serviceTask.getTaskid(), e);
                 }
             }
         }

--
Gitblit v1.9.3