From 7191c6d38f03f2e1baf39f959227ce9c038e4e96 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期二, 03 十一月 2026 14:39:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into smartor_ls_261012

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java |  148 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 98 insertions(+), 50 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 5340943..3f3c482 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;
@@ -39,6 +40,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;
@@ -1149,6 +1151,13 @@
             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());
@@ -1217,6 +1226,24 @@
         LocalDate today = LocalDate.now();
         // 濡傛灉鏃ユ湡鏃╀簬鎴栫瓑浜庝粖澶╋紝杩斿洖 true
         return !localDate.isAfter(today);
+    }
+
+    /**
+     * 鎸夋満鏋勬煡璇㈤厤缃�硷紙鍚屼竴 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;
     }
 
     /**
@@ -1374,7 +1401,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()));
@@ -1394,7 +1421,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()));
@@ -1410,6 +1437,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);
@@ -1417,9 +1451,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());
@@ -1487,6 +1536,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");
@@ -1854,14 +1904,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() : "");
@@ -1963,10 +2014,16 @@
             return false;
         }
         // 鍩哄噯鏃跺埢锛氬嚭闄㈡椂闂� + 鍙戦�佹棩锛坰endDay 缂虹渷鎸� 1锛夛紝骞跺厹搴曢伩鍏� NPE/鑴忔暟鎹�
+        if (serviceSubtask.getEndtime() == null) {
+            log.warn("銆恑sSubtaskDeadline銆憇ubid锛歿} endtime涓虹┖锛屾棤娉曡绠楄秴鏃讹紝鎸夋湭瓒呮椂澶勭悊", serviceSubtask.getId());
+            return false;
+        }
         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();
+        int sumCompensateTime = CollectionUtils.isEmpty(serviceSubtaskPreachforms) ? 0 : serviceSubtaskPreachforms.stream()
+                .mapToInt(x -> NumberUtils.toInt(x.getCompensateTime(), 0))
+                .sum();
         sumCompensateTime = sumCompensateTime + 1;
         // 鍙ˉ鍋挎渶鍚庝竴姝ヨ嚜韬殑琛ュ伩鏃堕棿锛堝ぉ锛夛紝鑴忓�间竴寰嬫寜 0 鍏滃簳
         deadline = DateUtils.addDays(deadline, sumCompensateTime);
@@ -1977,16 +2034,24 @@
     /**
      * 澶勭悊瓒呮椂闅忚浠诲姟锛堥殢璁胯秴鏃� 鈫� 鐢熸垚"鍐嶆闅忚"锛�
      * <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 鍚屽彛寰勩��
@@ -2002,9 +2067,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);
@@ -2013,44 +2086,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