From 72337c4a38bc8f5dbadbb492e2f0548521842798 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期四, 22 十月 2026 16:20:12 +0800
Subject: [PATCH] 【丽水】1、出院未到28天超时,也到了随访中心 2、出院28天超时任务,到随访中心的,会一次性生成4条任务

---
 smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java |  334 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 321 insertions(+), 13 deletions(-)

diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
index 0736c29..301c40a 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -14,11 +14,13 @@
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.*;
 import com.ruoyi.common.utils.http.HttpUtils;
-import com.ruoyi.common.utils.sms.smsUtils;
+import com.ruoyi.common.utils.sms.SmsUtils;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.system.domain.SysConfig;
 import com.ruoyi.system.mapper.SysConfigMapper;
+import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysDeptService;
 import com.smartor.common.FtpService;
 import com.smartor.common.MtSubmitSmUtil;
 import com.smartor.common.ScheduleSubtaskBuilder;
@@ -137,6 +139,9 @@
     private IPatArchiveService patArchiveService;
 
     @Autowired
+    private ISysDeptService sysDeptService;
+
+    @Autowired
     private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
 
     @Autowired
@@ -216,8 +221,14 @@
     private ServiceOutPathMapper serviceOutPathMapper;
 
     private static final String KEY_SEP = "\u0001";
+
+    /** 浜屾闅忚鐢熸垚閿佸墠缂�锛岄槻姝㈠悓涓�鍘熶换鍔″苟鍙戠敓鎴愬鏉′簩娆¢殢璁� */
+    private static final String AGAIN_LOCK_KEY_PREFIX = "smartor:again:lock:";
+    private static final long AGAIN_LOCK_SECONDS = 30L;
     @Autowired
     private PatMedOperationItemMapper patMedOperationItemMapper;
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
 
     /**
      * 鏌ヨ鍗曚竴浠诲姟锛堥殢璁匡級
@@ -782,6 +793,7 @@
      * @return 缁撴灉
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public String addSubTaskAgain(ServiceSubtask serviceSubtask) {
         ServiceSubtask serviceSubtask1 = selectServiceSubtaskById(serviceSubtask.getId());
         PatMedInhosp patMedInhosp = new PatMedInhosp();
@@ -791,7 +803,7 @@
         PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(serviceSubtask1.getPatid());
         //鏅畞 鏂板鍐嶆闅忚涓嶈兘瑙﹀彂鎮h�呭啀鍏ラ櫌
         boolean inhospAgain = true;
-        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001")) {
+        if ("47255004333112711A1001".equals(serviceSubtask1.getOrgid())) {
             inhospAgain = false;
         }
         if (patMedInhospList.size() > 0 && inhospAgain) {
@@ -805,13 +817,17 @@
             serviceSubtask1.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";鏃犻渶鍐嶆闅忚锛屼换鍔¤鏍囪涓嶅湪鎵ц" : "鏃犻渶鍐嶆闅忚锛屼换鍔¤鏍囪涓嶅湪鎵ц");
             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
             return "鏃犻渶鍐嶆闅忚锛屼换鍔¤鏍囪涓嶅湪鎵ц";
-        } else if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
+        } else if (patArchive != null && StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
             serviceSubtask1.setIsVisitAgain(2);
             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
             serviceSubtask1.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";鏃犻渶鍐嶆闅忚锛屾偅鑰呰鏍囪涓嶉渶瑕佽鏈嶅姟" : "鏃犻渶鍐嶆闅忚锛屾偅鑰呰鏍囪涓嶉渶瑕佽鏈嶅姟");
             return "鏃犻渶鍐嶆闅忚锛屾偅鑰呰鏍囪涓嶉渶瑕佽鏈嶅姟";
         } else if (ObjectUtils.isNotEmpty(serviceSubtask1.getIsVisitAgain()) && serviceSubtask1.getIsVisitAgain() == 2) {
             return "鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡";
+        }
+        //涓芥按涓尰闄㈡牴鎹笅娆′换鍔D鐢熸垚鍐嶆闅忚
+        if ("47231022633110211A2101".equals(serviceSubtask1.getOrgid())) {
+            return addSubTaskAgainNextTaskId(serviceSubtask1);
         }
         //鏂板鍐嶆闅忚浠诲姟
         ServiceSubtask serviceSubtask2 = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtask.class);
@@ -832,6 +848,285 @@
             return "鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛";
         }
         return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屽啀璇锋閲嶈瘯";
+    }
+
+    public String addSubTaskAgainNextTaskId(ServiceSubtask serviceSubtask) {
+        if (ObjectUtils.isEmpty(serviceSubtask.getTaskid())) {
+            log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛岀己灏慣askId, 鍐嶈娆¢噸璇�");
+            return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛岀己灏慣askId, 鍐嶈娆¢噸璇�";
+        }
+        // 鍚屼竴鍘熶换鍔′覆琛岀敓鎴愶紝闃叉骞跺彂閲嶅鎻掑叆
+        String lockToken = tryLockAgainTask(serviceSubtask.getId());
+        if (lockToken == null) {
+            return "鍐嶆闅忚浠诲姟姝e湪鍒涘缓涓紝璇峰嬁閲嶅鎻愪氦";
+        }
+        try {
+            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
+            if (ObjectUtils.isEmpty(serviceTask)) {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 taskid = {}, 鍐嶈娆¢噸璇�", serviceSubtask.getTaskid());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 taskid = " + serviceSubtask.getTaskid() + ", 鍐嶈娆¢噸璇�";
+            }
+            // 骞傜瓑鏍¢獙锛氬悓涓�鍘熶换鍔″彧鍏佽鐢熸垚涓�鏉′簩娆¢殢璁�
+            ServiceSubtaskEntity againQuery = new ServiceSubtaskEntity();
+            againQuery.setUpid(serviceSubtask.getId().intValue());
+            if (CollectionUtils.isNotEmpty(serviceSubtaskMapper.selectServiceSubtaskList(againQuery))) {
+                return "鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡";
+            }
+            // 鏌ヨ鍑洪櫌璁板綍
+            PatMedInhosp patMedInhospVo = new PatMedInhosp();
+            patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
+            patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
+            patMedInhospVo.setCry(1);
+            List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhospList(patMedInhospVo);
+            PatMedInhosp patMedInhosp = new PatMedInhosp();
+            if (CollectionUtils.isNotEmpty(patMedInhospList)) {
+                patMedInhosp = patMedInhospList.get(0);
+            } else {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏� 瀵瑰簲鐨勫嚭闄㈣褰�, taskid = {}, 鍐嶈娆¢噸璇�", serviceSubtask.getTaskid());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏� 瀵瑰簲鐨勫嚭闄㈣褰�, taskid = " + serviceSubtask.getTaskid() + ", 鍐嶈娆¢噸璇�";
+            }
+            if (ObjectUtils.isEmpty(serviceTask.getNexttaskid())) {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏� nexttaskid, taskid = {}, 鍐嶈娆¢噸璇�", serviceSubtask.getTaskid());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏� nexttaskid, taskid = " + serviceSubtask.getTaskid() + ", 鍐嶈娆¢噸璇�";
+            }
+            ServiceTask nextServiceTask = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
+            if (ObjectUtils.isEmpty(nextServiceTask)) {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 nexttaskid = {}, 鍐嶈娆¢噸璇�", serviceTask.getNexttaskid());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 nexttaskid = " + serviceTask.getNexttaskid() + ", 鍐嶈娆¢噸璇�";
+            }
+            PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
+            if (ObjectUtils.isEmpty(patArchive)) {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭鎵惧埌鎮h�呮。妗� patid = {}, subTaskId = {}", serviceSubtask.getPatid(), serviceSubtask.getId());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭鎵惧埌鎮h�呮。妗�, subTaskId = " + serviceSubtask.getId() + ", 鍐嶈娆¢噸璇�";
+            }
+            String config = configService.selectConfigByKey("visit.early.day");
+            Integer type = 1;
+            // 闅忚涓績绉戝
+            String centerDept = configService.selectConfigByKey("sys.smartor.center.dept", serviceSubtask.getOrgid());
+            if (ObjectUtils.isEmpty(centerDept)) {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭閰嶇疆闅忚涓績绉戝鍙傛暟 sys.smartor.center.dept ,subTaskId = {}, 鍐嶈娆¢噸璇�", serviceSubtask.getId());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭閰嶇疆闅忚涓績绉戝鍙傛暟 sys.smartor.center.dept ,subTaskId = " + serviceSubtask.getId() + ", 鍐嶈娆¢噸璇�";
+            }
+            SysDept sysDeptVo = new SysDept();
+            sysDeptVo.setDeptType("1");
+            sysDeptVo.setOrgid(serviceSubtask.getOrgid());
+            sysDeptVo.setDeptCode(centerDept);
+            List<SysDept> sysDepts = sysDeptService.selectDeptList(sysDeptVo);
+            SysDept sysDept = new SysDept();
+            if (CollectionUtils.isNotEmpty(sysDepts)) {
+                sysDept = sysDepts.get(0);
+            } else {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭鎵惧埌鍙傛暟 sys.smartor.center.dept 閰嶇疆鐨勯殢璁夸腑蹇冪瀹� deptCode = {}, 鍐嶈娆¢噸璇�", centerDept);
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭鎵惧埌鍙傛暟 sys.smartor.center.dept 閰嶇疆鐨勯殢璁夸腑蹇冪瀹� deptCode = " + centerDept + ", 鍐嶈娆¢噸璇�";
+            }
+            // 鎸変笅涓�浠诲姟鐢熸垚浜屾闅忚瀛愪换鍔★紙琛ㄥ崟銆佸彂閫佹柟寮忓彇鑷笅涓�浠诲姟锛�
+            ServiceSubtask serviceSubtaskAgain = patMedInhospService.boxedServiceSubtask(nextServiceTask,
+                    patMedInhosp, patArchive, config, type);
+            if (ObjectUtils.isEmpty(serviceSubtaskAgain) || ObjectUtils.isEmpty(serviceSubtaskAgain.getTaskid())) {
+                log.error("鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼笅涓�浠诲姟鐢熸垚瀛愪换鍔′负绌�, subTaskId = {}, nextTaskId = {}", serviceSubtask.getId(), serviceTask.getNexttaskid());
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾偅鑰呭嚭闄㈣褰曚笉瀹屾暣鎴栦笅涓�浠诲姟閰嶇疆寮傚父, 鍐嶈娆¢噸璇�";
+            }
+            Date now = new Date();
+            serviceSubtaskAgain.setId(null);
+            serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
+            serviceSubtaskAgain.setVisitCount(ObjectUtils.isNotEmpty(serviceSubtask.getVisitCount())
+                    ? serviceSubtask.getVisitCount() + 1 : 1);
+            serviceSubtaskAgain.setSendstate(2L);
+            serviceSubtaskAgain.setIsVisitAgain(1);
+            serviceSubtaskAgain.setCreateTime(now);
+            serviceSubtaskAgain.setUpdateTime(now);
+
+//            // 浜屾闅忚鏃堕棿锛氫笂娆¢殢璁垮畬鎴愭椂闂达紙鏈畬鎴愬垯褰撳墠鏃堕棿锛�+ 涓嬩竴浠诲姟鍙戦�佸ぉ鏁帮紱杩囧幓鏃堕棿鍏滃簳涓哄綋鍓嶆椂闂�
+//            Date baseTime = ObjectUtils.isNotEmpty(serviceSubtask.getFinishtime()) ? serviceSubtask.getFinishtime() : now;
+//            int intervalDays = ObjectUtils.isNotEmpty(nextServiceTask.getSendDay())
+//                    ? nextServiceTask.getSendDay().intValue() : 0;
+//            Date nextVisitTime = DateUtils.addDays(baseTime, intervalDays);
+//            if (nextVisitTime.before(now)) {
+//                nextVisitTime = now;
+//            }
+//            serviceSubtaskAgain.setVisitTime(nextVisitTime);
+//            serviceSubtaskAgain.setLongSendTime(nextVisitTime);
+            serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
+            serviceSubtaskAgain.setVisitDeptCode(sysDept.getDeptCode());
+            serviceSubtaskAgain.setVisitDeptName(sysDept.getDeptName());
+            int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
+            if (i != 1) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屽啀璇锋閲嶈瘯";
+            }
+            // 鍒濆鍖栧彂閫佹柟寮忔槑缁嗭紝琛ュ伩锛坈ompensateTask锛夊拰瓒呮椂鍒ゆ柇渚濊禆璇ヨ〃
+            patMedInhospService.addServiceSubtaskPreachform(serviceSubtaskAgain, null);
+            // 鏉′欢鏇存柊鍘熶换鍔★細0 琛岃鏄庡凡琚叾浠栬姹傜敓鎴愶紝鎶涘紓甯稿洖婊氭湰娆℃彃鍏ョ殑閲嶅鏁版嵁
+            int updated = serviceSubtaskMapper.updateIsVisitAgainById(serviceSubtask.getId(), 2);
+            if (updated != 1) {
+                throw new BaseException("鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡");
+            }
+            return "鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛";
+        } finally {
+            unlockAgainTask(serviceSubtask.getId(), lockToken);
+        }
+    }
+
+    /**
+     * 棣栨闅忚浠诲姟瓒呮椂鍚庯紝鎸変笅涓�浠诲姟鑷姩鐢熸垚鍐嶆闅忚浠诲姟锛堥殢璁夸腑蹇冿級銆�
+     * <p>
+     * 瀹氭椂浠诲姟鍏ュ彛 {@code RyTask#dealSubtaskDeadline} 浣跨敤銆備笌鎵嬪姩鍏ュ彛涓�鑷寸殑閮ㄥ垎锛�
+     * 琛ㄥ崟/鍙戦�佹柟寮忓彇涓嬩竴浠诲姟銆侀摼璺� upid + visit_count銆佸彂閫佹柟寮忔槑缁嗗垵濮嬪寲锛�
+     * 宸紓锛氶殢璁夸腑蹇冪瀹ゆ湭閰嶇疆鏃跺洖閫�鍘熶换鍔$瀹わ紝鍘熶换鍔$疆涓哄彂閫佸け璐ワ紙sendstate=5锛夈��
+     * <p>
+     * 骞傜瓑锛氬悓涓�鍘熶换鍔″彧鍏佽鐢熸垚涓�鏉″啀娆¢殢璁匡紙Redis 閿� + upid 鏍¢獙 + 鍘熶换鍔℃潯浠舵洿鏂帮級锛�
+     * 澶氳妭鐐�/澶氱嚎绋嬪悓鏃舵壂鎻忔椂锛屽悗鍒扮殑浜嬪姟浼氬湪鏉′欢鏇存柊澶勬嬁鍒� 0 琛屽苟鍥炴粴鏈鎻掑叆銆�
+     *
+     * @param serviceSubtask 宸茶秴鏃剁殑棣栨闅忚瀛愪换鍔�
+     * @return 缁撴灉鎻忚堪
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String addSubTaskAgainByDeadline(ServiceSubtask serviceSubtask) {
+        if (ObjectUtils.isEmpty(serviceSubtask) || ObjectUtils.isEmpty(serviceSubtask.getId())) {
+            return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屽師浠诲姟涓嶅瓨鍦�";
+        }
+        String lockToken = tryLockAgainTask(serviceSubtask.getId());
+        if (lockToken == null) {
+            return "鍐嶆闅忚浠诲姟姝e湪鍒涘缓涓紝璇峰嬁閲嶅鎻愪氦";
+        }
+        try {
+            // 骞傜瓑鏍¢獙锛氬悓涓�鍘熶换鍔″彧鍏佽鐢熸垚涓�鏉″啀娆¢殢璁�
+            ServiceSubtaskEntity againQuery = new ServiceSubtaskEntity();
+            againQuery.setUpid(serviceSubtask.getId().intValue());
+            if (CollectionUtils.isNotEmpty(serviceSubtaskMapper.selectServiceSubtaskList(againQuery))) {
+                return "鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡";
+            }
+            // 鍘熶换鍔″凡琚爣璁颁负涓嶅啀闅忚锛堟墜鍔ㄥ叆鍙e啓杩� is_visit_again=2锛�
+            if (ObjectUtils.isNotEmpty(serviceSubtask.getIsVisitAgain()) && serviceSubtask.getIsVisitAgain() == 2) {
+                return "鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡";
+            }
+            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
+            if (ObjectUtils.isEmpty(serviceTask)) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 taskid = " + serviceSubtask.getTaskid();
+            }
+            if (ObjectUtils.isEmpty(serviceTask.getNexttaskid())) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏� nexttaskid, taskid = " + serviceSubtask.getTaskid();
+            }
+            ServiceTask nextServiceTask = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
+            if (ObjectUtils.isEmpty(nextServiceTask)) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 nexttaskid = " + serviceTask.getNexttaskid();
+            }
+            PatMedInhosp patMedInhosp = selectOutHospRecord(serviceSubtask);
+            if (ObjectUtils.isEmpty(patMedInhosp)) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏戝搴旂殑鍑洪櫌璁板綍, taskid = " + serviceSubtask.getTaskid();
+            }
+            PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
+            if (ObjectUtils.isEmpty(patArchive)) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭鎵惧埌鎮h�呮。妗�, subTaskId = " + serviceSubtask.getId();
+            }
+            // 闅忚涓績绉戝锛氭湭閰嶇疆锛堟垨绉戝涓嶅瓨鍦級鏃跺洖閫�鍘熶换鍔$瀹わ紝淇濇寔瓒呮椂鍏ュ彛鍘熸湁琛屼负
+            SysDept visitDept = selectCenterDept(serviceSubtask.getOrgid());
+            String config = configService.selectConfigByKey("visit.early.day");
+            ServiceSubtask serviceSubtaskAgain = patMedInhospService.boxedServiceSubtask(nextServiceTask,
+                    patMedInhosp, patArchive, config, 1);
+            if (ObjectUtils.isEmpty(serviceSubtaskAgain) || ObjectUtils.isEmpty(serviceSubtaskAgain.getTaskid())) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾偅鑰呭嚭闄㈣褰曚笉瀹屾暣鎴栦笅涓�浠诲姟閰嶇疆寮傚父, subTaskId = " + serviceSubtask.getId();
+            }
+            Date now = new Date();
+            serviceSubtaskAgain.setId(null);
+            serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
+            serviceSubtaskAgain.setVisitCount(ObjectUtils.isNotEmpty(serviceSubtask.getVisitCount())
+                    ? serviceSubtask.getVisitCount() + 1 : 2);
+            serviceSubtaskAgain.setSendstate(2L);
+            serviceSubtaskAgain.setIsVisitAgain(1);
+            serviceSubtaskAgain.setCreateTime(now);
+            serviceSubtaskAgain.setUpdateTime(now);
+            serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
+            if (ObjectUtils.isNotEmpty(visitDept)) {
+                serviceSubtaskAgain.setVisitDeptCode(visitDept.getDeptCode());
+                serviceSubtaskAgain.setVisitDeptName(visitDept.getDeptName());
+            } else {
+                serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
+                serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
+            }
+            if (serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain) != 1) {
+                return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屽啀璇锋閲嶈瘯";
+            }
+            // 鍒濆鍖栧彂閫佹柟寮忔槑缁嗭紝琛ュ伩锛坈ompensateTask锛夊拰瓒呮椂鍒ゆ柇渚濊禆璇ヨ〃
+            patMedInhospService.addServiceSubtaskPreachform(serviceSubtaskAgain, null);
+            // 鏉′欢鏇存柊鍘熶换鍔★細0 琛岃鏄庡凡琚叾浠栬姹傜敓鎴愶紝鎶涘紓甯稿洖婊氭湰娆℃彃鍏ョ殑閲嶅鏁版嵁
+            if (serviceSubtaskMapper.updateIsVisitAgainById(serviceSubtask.getId(), 2) != 1) {
+                throw new BaseException("鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡");
+            }
+            // 鍘熶换鍔¤秴鏃讹紝缃负鍙戦�佸け璐�
+            ServiceSubtask originUpdate = new ServiceSubtask();
+            originUpdate.setId(serviceSubtask.getId());
+            originUpdate.setSendstate(5L);
+            originUpdate.setUpdateTime(now);
+            serviceSubtaskMapper.updateServiceSubtask(originUpdate);
+            return "鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛";
+        } finally {
+            unlockAgainTask(serviceSubtask.getId(), lockToken);
+        }
+    }
+
+    /**
+     * 鎸� orgid + inhospid 鍙栧嚭闄㈣褰曪紙瓒呮椂鍐嶆闅忚鐢級銆�
+     */
+    private PatMedInhosp selectOutHospRecord(ServiceSubtask serviceSubtask) {
+        PatMedInhosp patMedInhospVo = new PatMedInhosp();
+        patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
+        patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
+        patMedInhospVo.setCry(1);
+        List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhospList(patMedInhospVo);
+        if (CollectionUtils.isEmpty(patMedInhospList)) {
+            return null;
+        }
+        return patMedInhospList.get(0);
+    }
+
+    /**
+     * 鍙栭殢璁夸腑蹇冪瀹わ紝鏈厤缃垨绉戝涓嶅瓨鍦ㄦ椂杩斿洖 null锛堢敱璋冪敤鏂瑰洖閫�鍘熶换鍔$瀹わ級銆�
+     */
+    private SysDept selectCenterDept(String orgid) {
+        String centerDept = configService.selectConfigByKey("sys.smartor.center.dept", orgid);
+        if (StringUtils.isEmpty(centerDept)) {
+            return null;
+        }
+        SysDept sysDeptVo = new SysDept();
+        sysDeptVo.setDeptType("1");
+        sysDeptVo.setOrgid(orgid);
+        sysDeptVo.setDeptCode(centerDept);
+        List<SysDept> sysDepts = sysDeptService.selectDeptList(sysDeptVo);
+        return CollectionUtils.isEmpty(sysDepts) ? null : sysDepts.get(0);
+    }
+
+    /**
+     * 鑾峰彇浜屾闅忚鐢熸垚閿併�俁edis 寮傚父鏃堕檷绾т负鏁版嵁搴撳箓绛夋牎楠岋紝涓嶉樆鏂笟鍔°��
+     */
+    private String tryLockAgainTask(Long subId) {
+        String token = UUID.randomUUID().toString();
+        try {
+            Boolean locked = redisTemplate.opsForValue().setIfAbsent(
+                    AGAIN_LOCK_KEY_PREFIX + subId, token, AGAIN_LOCK_SECONDS, TimeUnit.SECONDS);
+            return Boolean.TRUE.equals(locked) ? token : null;
+        } catch (Exception e) {
+            log.warn("鍐嶆闅忚鑾峰彇Redis閿佸け璐ワ紝闄嶇骇浣跨敤鏁版嵁搴撳箓绛夋牎楠�, subId={}", subId, e);
+            return token;
+        }
+    }
+
+    /**
+     * 閲婃斁浜屾闅忚鐢熸垚閿侊紝浠呴噴鏀捐嚜宸辨寔鏈夌殑閿併��
+     */
+    private void unlockAgainTask(Long subId, String token) {
+        if (token == null) {
+            return;
+        }
+        try {
+            String lockKey = AGAIN_LOCK_KEY_PREFIX + subId;
+            Object current = redisTemplate.opsForValue().get(lockKey);
+            if (token.equals(current)) {
+                redisTemplate.delete(lockKey);
+            }
+        } catch (Exception e) {
+            log.warn("鍐嶆闅忚閲婃斁Redis閿佸け璐�, subId={}", subId, e);
+        }
     }
 
     /**
@@ -4422,7 +4717,7 @@
                 serviceSubtaskCountReq.setVisitCount(1);
                 serviceSubtaskCountReq.setCurrentPreachform("4");
                 break;
-            case "wechatInfo":
+            case "weChatInfo":
                 serviceSubtaskCountReq.setVisitCount(1);
                 serviceSubtaskCountReq.setCurrentPreachform("5");
                 break;
@@ -4441,7 +4736,7 @@
                 serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(6L)));
                 serviceSubtaskCountReq.setCurrentPreachform("4");
                 break;
-            case "wechatSuccessInfo":
+            case "weChatSuccessInfo":
                 serviceSubtaskCountReq.setVisitCount(1);
                 serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(6L)));
                 serviceSubtaskCountReq.setCurrentPreachform("5");
@@ -4478,7 +4773,7 @@
                 serviceSubtaskCountReq.setVisitCount(2);
                 serviceSubtaskCountReq.setCurrentPreachform("4");
                 break;
-            case "wechatAgainInfo":
+            case "weChatAgainInfo":
                 serviceSubtaskCountReq.setVisitCount(2);
                 serviceSubtaskCountReq.setCurrentPreachform("5");
                 break;
@@ -4497,7 +4792,7 @@
                 serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(6L)));
                 serviceSubtaskCountReq.setCurrentPreachform("4");
                 break;
-            case "wechatAgainSuccessInfo":
+            case "weChatAgainSuccessInfo":
                 serviceSubtaskCountReq.setVisitCount(2);
                 serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(6L)));
                 serviceSubtaskCountReq.setCurrentPreachform("5");
@@ -5168,12 +5463,6 @@
         String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
         String taskId = rsaPublicKeyExample.encryptedData(serviceSubtask.getTaskid().toString(), pub_key);
 
-        //涓芥按涓尰闄㈠彂閫佺殑鏄井淇″叕浼楀彿
-        if (StringUtils.isNotEmpty(serviceSubtask.getOrgid()) && serviceSubtask.getOrgid().equals("47231022633110211A2101")) {
-            resultMap = wechatSubTask(subid);
-            return resultMap;
-        }
-
         //鍙戦�佹暟鎹殑灏佽
         ServiceOutPath serviceOutPath = new ServiceOutPath();
         serviceOutPath.setParam1(taskId);
@@ -5218,6 +5507,25 @@
         return resultMap;
     }
 
+    @Override
+    public Map<String, Object> weChatSubTask(Long subid) {
+        log.info("smsSubTask鐨勫叆鍙備负锛歿}", subid);
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("code", "500");
+        resultMap.put("msg", "鍙戦�佸け璐�");
+
+        //鑾峰彇鎮h�呯殑鍩烘湰淇℃伅
+        ServiceSubtask serviceSubtask = selectServiceSubtaskById(subid);
+        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
+        String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
+        String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
+        String taskId = rsaPublicKeyExample.encryptedData(serviceSubtask.getTaskid().toString(), pub_key);
+
+        //涓芥按涓尰闄㈠彂閫佺殑鏄井淇″叕浼楀彿
+        resultMap = wechatSubTask(subid);
+        return resultMap;
+    }
+
     public Map<String,Object> wechatSubTask(Long subid){
         log.info("wechatSubTask鐨勫叆鍙備负锛歿}", subid);
         Map<String, Object> resultMap = new HashMap<>();

--
Gitblit v1.9.3