From 357100150bd0ba266d78d8d0f3b02c37b22435d8 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期一, 02 十一月 2026 10:17:19 +0800
Subject: [PATCH] 【丽水】1、指标查询与随访统计条件不同问题 2、微信发送重复问题

---
 ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java |  450 +++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 318 insertions(+), 132 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java b/ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
index 7a7d6d6..ed37825 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -13,14 +13,12 @@
 import com.ruoyi.common.enums.ServiceFromEnum;
 import com.ruoyi.common.enums.WxGZHEnum;
 import com.ruoyi.common.exception.base.BaseException;
-import com.ruoyi.common.utils.HttpUtil;
-import com.ruoyi.common.utils.OkHttpExample;
-import com.ruoyi.common.utils.RSAPublicKeyExample;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.*;
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.ruoyi.common.utils.sign.Md5Utils;
-import com.ruoyi.common.utils.sms.smsUtils;
+import com.ruoyi.common.utils.sms.SmsUtils;
 import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.smartor.common.LSHospTokenUtil;
 import com.smartor.common.MtSubmitSmUtil;
@@ -33,6 +31,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.data.redis.connection.Message;
@@ -41,6 +40,7 @@
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
+import java.net.URLEncoder;
 import java.security.MessageDigest;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -109,6 +109,9 @@
 
     @Value("${xhsmsPwd}")
     private String xhsmsPwd;
+    // 铏氭嫙鎺ュ叆鐮�
+    @Value("${xhsmsjrm}")
+    private String xhsmsjrm;
 
     @Value("${server.port}")
     private String port;
@@ -121,6 +124,8 @@
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
 
     public RedisMqReceiver(RedisMessageListenerContainer listenerContainer) {
         super(listenerContainer);
@@ -302,21 +307,33 @@
                         serviceOutPath.setParam2(patid);
                         serviceOutPath.setParam6(subId);
                         serviceOutPath.setCreateTime(new Date());
+                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
+                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
+                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
+                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
+                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                         iServiceOutPathService.insertServiceOutPath(serviceOutPath);
 //                                sendMagParam.setUrl(ip + ":" + req_path + "/followvisit/particty?param1=" + taskId + "&param2=" + patid + "&param5=false");
                         //杞垚16杩涘埗
                         String format = String.format("%03X", serviceOutPath.getId());
                         serviceOutPath.setRadix(format);
                         serviceOutPath.setUpdateTime(new Date());
+                        serviceOutPath.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                         iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                         sendMagParam.setPhone(serviceSubtask.getPhone());
                         sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
-                        if (active.equals("ls") || active.equals("sltd") || active.equals("nhfy")) {
-                            sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌闅忚璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
-                        } else if (active.equals("xh")) {
-                            sendMagParam.setContent("銆愭柊鍗庡尰闄€�戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌闅忚璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
-                        } else if (active.equals("hzszlyy")) {
-                            sendMagParam.setContent("銆愭澀宸炲競鑲跨槫鍖婚櫌銆戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
+                        SysConfig sysConfig = new SysConfig();
+                        if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("6")) {
+                            sysConfig = sysConfigMapper.checkConfigKeyUnique("zymyd.sms.template");
+                        } else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
+                            sysConfig = sysConfigMapper.checkConfigKeyUnique("mzmyd.sms.template");
+                        } else {
+                            sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
+                        }
+                        if (!Objects.isNull(sysConfig)) {
+                            String smsContemt = sysConfig.getConfigValue();
+//                          sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌闅忚璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
+                            sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
                         }
 
                     } else if (type == 2) {
@@ -328,26 +345,36 @@
 //                                serviceOutPath.setParam3(URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()));
                         serviceOutPath.setParam3(ivrTask1.getTaskName());
                         serviceOutPath.setCreateTime(new Date());
+                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
+                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
+                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
+                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
+                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                         iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                         String format = String.format("%03X", serviceOutPath.getId());
                         serviceOutPath.setRadix(format);
                         serviceOutPath.setUpdateTime(new Date());
+                        serviceOutPath.setUrl(StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/wt?p=" + format : ip + "/wt?p=" + format);
                         iServiceOutPathService.updateServiceOutPath(serviceOutPath);
 //                                sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false");
                         sendMagParam.setPhone(serviceSubtask.getPhone());
-                        sendMagParam.setUrl(ip + ":" + req_path + "/wt?p=" + format);
-                        log.info("sendMagParam鐨勫�间负锛歿}", sendMagParam);
+                        sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/wt?p=" + format : ip + "/wt?p=" + format);
                         //濡傛灉type鏄闊抽殢璁跨殑璇濓紙璇存槑琛ュ伩鍙戦�佹柟寮忎腑鏈夌數璇濋殢璁跨殑鏂瑰紡锛岃繖閲岀殑澶栭摼灏卞湴鍧�鍙兘鐢�/sf锛�
                         if (serviceSubtask.getType().equals("1"))
-                            sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
-                        if (active.equals("ls") || active.equals("sltd") || active.equals("nhfy")) {
-                            sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
-                        } else if (active.equals("xh")) {
-                            sendMagParam.setContent("銆愭柊鍗庡尰闄€�戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
-                        } else if (active.equals("druid")) {
-                            sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
-                        } else if (active.equals("hzszlyy")) {
-                            sendMagParam.setContent("銆愭澀宸炲競鑲跨槫鍖婚櫌銆戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
+                            sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/sf?p=" + format : ip + "/sf?p=" + format);
+
+                        SysConfig sysConfig = new SysConfig();
+                        if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("6")) {
+                            sysConfig = sysConfigMapper.checkConfigKeyUnique("zymyd.sms.template");
+                        } else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
+                            sysConfig = sysConfigMapper.checkConfigKeyUnique("mzmyd.sms.template");
+                        } else {
+                            sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
+                        }
+                        if (!Objects.isNull(sysConfig)) {
+                            String smsContemt = sysConfig.getConfigValue();
+//                          sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌闅忚璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
+                            sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
                         }
                     } else if (type == 3) {
                         //瀹f暀
@@ -357,44 +384,74 @@
                         serviceOutPath.setParam6(subId);
                         serviceOutPath.setParam3(ivrTask1.getTaskName());
                         serviceOutPath.setCreateTime(new Date());
+                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
+                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
+                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
+                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
+                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                         iServiceOutPathService.insertServiceOutPath(serviceOutPath);
+                        String url = "";
                         String format = String.format("%03X", serviceOutPath.getId());
-                        serviceOutPath.setRadix(format);
-                        serviceOutPath.setUpdateTime(new Date());
-                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                         //闇�瑕侀�氳繃妯℃澘ID鍘诲垽鏂鍙戠殑鍐呭鏄鏁欒繕鏄�氱煡
                         HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                         if (heLibrary.getHetype().equals("1")) {
                             sendMagParam.setPhone(serviceSubtask.getPhone());
-                            sendMagParam.setUrl(ip + ":" + req_path + "/xj?p=" + format);
-                            if (active.equals("ls") || active.equals("sltd") || active.equals("nhfy")) {
-                                sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
-                            } else if (active.equals("xh")) {
-                                sendMagParam.setContent("銆愭柊鍗庡尰闄€�戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
-                            } else if (active.equals("hzszlyy")) {
-                                sendMagParam.setContent("銆愭澀宸炲競鑲跨槫鍖婚櫌銆戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
+                            url = StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/xj?p=" + format : ip + "/xj?p=" + format;
+                            sendMagParam.setUrl(url);
+
+
+                            SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("xj.sms.template");
+                            if (!Objects.isNull(sysConfig)) {
+                                String smsContemt = sysConfig.getConfigValue();
+//                              sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
+                                sendMagParam.setContent(smsContemt.replace("${xjurl}", sendMagParam.getUrl()));
+
                             }
+//                            if (active.equals("ls") || active.equals("sltd") || active.equals("nhfy")) {
+//                                sendMagParam.setContent("鎮ㄥソ锛岄個璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
+//                            } else if (active.equals("xh")) {
+//                                sendMagParam.setContent("銆愭柊鍗庡尰闄€�戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "鏌ョ湅銆傛劅璋㈡偍閰嶅悎锛�");
+//                            } else if (active.equals("hzszlyy")) {
+//                                sendMagParam.setContent("銆愭澀宸炲競绗竴浜烘皯鍖婚櫌銆戞偍濂斤紝閭�璇锋偍濉啓鍑洪櫌瀹f暀璋冩煡琛紝璇风偣鍑�" + sendMagParam.getUrl() + "濉啓銆傛劅璋㈡偍閰嶅悎锛�");
+//                            }
                         } else if (heLibrary.getHetype().equals("2")) {
                             //閫氱煡
                             String sc = getSC(serviceSubtask, heLibrary.getPreachcontent());
                             sendMagParam.setPhone(serviceSubtask.getPhone());
                             sendMagParam.setContent(sc);
                         }
+                        serviceOutPath.setRadix(format);
+                        serviceOutPath.setUpdateTime(new Date());
+                        serviceOutPath.setUrl(url);
+                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                     }
-
+                    log.info("sendMagParam鐨勫�间负锛歿}", sendMagParam);
                     //鐭俊杩橀渶瑕佹ā鏉�
                     String s = null;
                     if (active.equals("xh")) {
                         //鏂板崕鐨勭煭淇″彂閫佹柟寮�
-                        Map<String, String> req = new HashMap<>();
-                        req.put("phone", sendMagParam.getPhone());
-                        req.put("content", sendMagParam.getContent());
-                        log.info("content杩斿洖鍊肩殑鍐呭鏄細{}", sendMagParam.getContent());
-                        s = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
-                    } else if (active.equals("ls")) {
-//                        String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
-//                        log.info("-------00token.360鐨刄RL涓猴細{}", url);
+                        Map<String, String> map2 = new HashMap<String, String>();
+                        map2.put("action", "send");
+                        map2.put("account", xhsmsAccount);
+                        map2.put("password", xhsmsPwd);
+                        map2.put("mobile", sendMagParam.getPhone());
+                        map2.put("content", sendMagParam.getContent());
+                        map2.put("extno", xhsmsjrm);
+                        map2.put("rt", "json");
+                        StringBuilder encodedParams = new StringBuilder();
 
+                        for (Map.Entry<String, String> entry : map2.entrySet()) {
+                            if (encodedParams.length() > 0) {
+                                encodedParams.append("&");
+                            }
+                            // 瀵归敭鍜屽�艰繘琛孶RL缂栫爜
+                            String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
+                            String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
+                            encodedParams.append(encodedKey).append("=").append(encodedValue);
+                        }
+                        Boolean isSuccess = HttpUtil.postJsonRequest(xhsmsPath, encodedParams.toString());
+                        if (isSuccess) s = "true";
+                    } else if (active.equals("ls")) {
                         //涓芥按鐨勭煭淇″彂閫佹柟寮�
                         SysConfig config = new SysConfig();
                         config.setConfigKey("ls.msg.info");
@@ -436,16 +493,18 @@
                         if (active.equals("sltd")) {
                             data = MessageSend.sendMsg(sendMagParam.getContent(), "6", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
                             if (StringUtils.isNotEmpty(data)) {
-                                ObjectMapper mapper = new ObjectMapper();
-                                JsonNode root = mapper.readTree(data);
-                                String status = root.get("result").get(0).get("status").asText();
-                                if (status.equals("00000")) {
-                                    s = "true";
-                                } else {
-                                    setFailPreachForm(serviceSubtask, sendPreachform, "鐭俊鍙戦�佸け璐�: " + data, "5");
-                                    throw new BaseException("鐭俊鍙戦�佸け璐�");
+                                String[] pairs = data.split("&");
+                                String resultVal = null;
+                                for (String pair : pairs) {
+                                    String[] kv = pair.split("=", 2);
+                                    if ("result".equals(kv[0])) {
+                                        resultVal = kv.length > 1 ? kv[1] : null;
+                                        break;
+                                    }
                                 }
-
+                                if ("0".equals(resultVal)) {
+                                    s = "true";
+                                }
                             } else {
                                 setFailPreachForm(serviceSubtask, sendPreachform, "鐭俊鍙戦�佸け璐�: " + data, "5");
                                 throw new BaseException("鐭俊鍙戦�佸け璐�");
@@ -466,7 +525,8 @@
                         String sign = Md5Utils.hash(xhsmsAccount + timestamp + Md5Utils.hash(xhsmsPwd));
                         String content = sendMagParam.getContent();
                         String jsonMsg = "{" + "\"userName\": \"" + xhsmsAccount + "\"," + "\"content\": \"" + content + "\"," + "\"phoneList\": [" + sendMagParam.getPhone() + "]," + "\"timestamp\": " + timestamp + "," + "\"sign\": \"" + sign + "\"" + "}";
-                        s = HttpUtil.postJsonRequest(xhsmsPath, jsonMsg);
+                        Boolean b = HttpUtil.postJsonRequest(xhsmsPath, jsonMsg);
+                        if (b) s = "true";
                         log.info("------甯備竴鐭俊鍙戦�佺殑鍊间负锛歿}", s);
                         if (StringUtils.isNotEmpty(s)) {
                             JSONObject jsonObject = JSONObject.parseObject(s);
@@ -519,7 +579,7 @@
                 RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                 String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                 String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
-
+                String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
                 try {
                     SendMagParam sendMagParam = new SendMagParam();
                     sendMagParam.setType("5");
@@ -530,41 +590,60 @@
                         ServiceOutPath serviceOutPath = new ServiceOutPath();
                         serviceOutPath.setParam1(taskId);
                         serviceOutPath.setParam2(patid);
+                        serviceOutPath.setParam6(subId);
                         serviceOutPath.setCreateTime(new Date());
+                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
+                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
+                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
+                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
+                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                         iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                         String format = String.format("%03X", serviceOutPath.getId());
                         serviceOutPath.setRadix(format);
                         serviceOutPath.setUpdateTime(new Date());
-                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                         url = ip + ":" + req_path + "/sf?p=" + format;
+                        serviceOutPath.setUrl(url);
+                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                     } else if (type == 2) {
                         //闂埜
                         ServiceOutPath serviceOutPath = new ServiceOutPath();
                         serviceOutPath.setParam1(taskId);
                         serviceOutPath.setParam2(patid);
                         serviceOutPath.setParam3(ivrTask1.getTaskName());
+                        serviceOutPath.setParam6(subId);
                         serviceOutPath.setCreateTime(new Date());
+                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
+                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
+                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
+                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
+                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
                         iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                         String format = String.format("%03X", serviceOutPath.getId());
-                        serviceOutPath.setRadix(format);
-                        serviceOutPath.setUpdateTime(new Date());
-                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
-                        url = ip + ":" + req_path + "/wt?p=" + format;
+
+                        url = StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/wt?p=" + format : ip + "/wt?p=" + format;
                         //濡傛灉type鏄闊抽殢璁跨殑璇濓紙璇存槑琛ュ伩鍙戦�佹柟寮忎腑鏈夌數璇濋殢璁跨殑鏂瑰紡锛岃繖閲岀殑澶栭摼灏卞湴鍧�鍙兘鐢�/sf锛�
                         if (serviceSubtask.getType().equals("1"))
                             sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
+
+                        serviceOutPath.setRadix(format);
+                        serviceOutPath.setUrl(url);
+                        serviceOutPath.setUpdateTime(new Date());
+                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                     } else if (type == 3) {
                         //瀹f暀
                         ServiceOutPath serviceOutPath = new ServiceOutPath();
                         serviceOutPath.setParam1(taskId);
                         serviceOutPath.setParam2(patid);
                         serviceOutPath.setParam3(ivrTask1.getTaskName());
+                        serviceOutPath.setParam6(subId);
                         serviceOutPath.setCreateTime(new Date());
+                        serviceOutPath.setDeptCode(serviceSubtask.getDeptcode());
+                        serviceOutPath.setWardCode(serviceSubtask.getLeavehospitaldistrictcode());
+                        serviceOutPath.setDeptName(serviceSubtask.getDeptname());
+                        serviceOutPath.setWardName(serviceSubtask.getLeavehospitaldistrictname());
+                        serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                         iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                         String format = String.format("%03X", serviceOutPath.getId());
-                        serviceOutPath.setRadix(format);
-                        serviceOutPath.setUpdateTime(new Date());
-                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
 
                         //闇�瑕侀�氳繃妯℃澘ID鍘诲垽鏂鍙戠殑鍐呭鏄鏁欒繕鏄�氱煡
 //                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
@@ -584,6 +663,10 @@
 //                        }
 
                         url = ip + ":" + req_path + "/xj?p=" + format;
+                        serviceOutPath.setRadix(format);
+                        serviceOutPath.setUpdateTime(new Date());
+                        serviceOutPath.setUrl(url);
+                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                     }
                     if (StringUtils.isEmpty(patArchive.getPatidHis())) {
                         serviceSubtask.setCurrentPreachform(sendPreachform);
@@ -609,8 +692,8 @@
                     }
                     String wxCode = "";
                     if (active.equals("hzszlyy")) {
-                        wxCode = smsUtils.sendChat(url, patArchive.getTelcode(), serviceSubtask.getSfzh());
-                        log.info(wxCode);
+                        wxCode = SmsUtils.sendChat(url, patArchive.getTelcode(), serviceSubtask.getSfzh());
+                        log.info("wxCode鐨勫�间负:{}", wxCode);
                     } else {
                         wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskName(), patArchive.getTelcode(), patArchive.getName(), patArchive.getPatidHis(), wxqqxx);
                         log.error("wxCode鐨勫�间负:{}", wxCode);
@@ -656,10 +739,15 @@
                     continue;
                 }
                 //鍦ㄥ瓙浠诲姟琛ㄩ噷璁板綍涓�涓�
-                setFailPreachForm(serviceSubtask, sendPreachform, "鍏紬鍙峰彂閫佹垚鍔�", "2");
+                Boolean stateUpdated = setFailPreachForm(serviceSubtask, sendPreachform, "鍏紬鍙峰彂閫佹垚鍔�", "2");
+                if (!Boolean.TRUE.equals(stateUpdated)) {
+                    log.error("鍏紬鍙峰彂閫佹垚鍔熶絾鏇存柊瀛愪换鍔$姸鎬佸け璐ワ紝subid锛歿}锛宲reachform锛歿}", serviceSubtask.getId(), sendPreachform);
+                    continue;
+                }
                 //浠诲姟鍙戦�佽褰�
                 ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                 serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
+                serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                 serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                 serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                 serviceSubtaskRecord.setPreachform("5");
@@ -710,15 +798,15 @@
         List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
 
         if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
-            Optional<String> ct = serviceSubtaskPreachforms.stream().filter(item -> currentPreachform.equals(item.getPreachform())).map(ServiceSubtaskPreachform::getCompensateTime).findFirst();
-            String compensateTime = "0";
-            if (ct.isPresent()) compensateTime = ct.get();
-            int hoursToAdd = Integer.valueOf(compensateTime) * 24;
+            Optional<String> ct = serviceSubtaskPreachforms.stream()
+                    .filter(item -> Objects.equals(currentPreachform, item.getPreachform()))
+                    .map(ServiceSubtaskPreachform::getCompensateTime)
+                    .findFirst();
+            int daysToAdd = ct.map(value -> NumberUtils.toInt(value, 0)).orElse(0);
             Calendar calendar = Calendar.getInstance();
-            calendar.setTime(visitTime);
-            calendar.add(Calendar.HOUR_OF_DAY, hoursToAdd);
-            Date newDate = calendar.getTime();
-            return newDate;
+            calendar.setTime(visitTime == null ? new Date() : visitTime);
+            calendar.add(Calendar.HOUR_OF_DAY, daysToAdd * 24);
+            return calendar.getTime();
         }
         return visitTime;
     }
@@ -757,6 +845,7 @@
                 if (allSendStateNot1AndNot9) {
                     //璇存槑鍏ㄥ彂閫佸け璐ヤ簡
                     serviceSubtask.setSendstate(5L);
+                    serviceSubtask.setUpdateTime(new Date());
                     serviceSubtask.setRemark("-----getSendPreachform,鍙戦�佹柟寮忓叏閮ㄥけ璐�");
                     serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                 }
@@ -812,7 +901,7 @@
      */
     public Boolean setFailPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
         log.info("^^^^^^^^^--------setFailPreachForm鐨勫叆鍙備负serviceSubtask锛歿}   锛宲reachform鍊间负锛歿}锛�  failSendstate锛歿}", serviceSubtask, preachform, failSendstate);
-        if (preachform.equals("-1")) {
+        if ("-1".equals(preachform)) {
             //璇存槑閮戒笉闇�瑕佹墽琛屼簡
             ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
             serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
@@ -820,81 +909,142 @@
             serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
             serviceSubtaskPreachform.setSendstate(failSendstate);
             serviceSubtaskPreachform.setCurrentSendTime(new Date());
-            if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
+            if (isEducationOrNotice(serviceSubtask) && "2".equals(failSendstate)) {
                 //濡傛灉鏄鏁欐垨閫氱煡锛屽苟涓斿彂閫佹垚鍔燂紝鐩存帴灏嗗彂閫佺姸鎬佹敼鎴�9
-                if (failSendstate.equals("2")) serviceSubtaskPreachform.setSendstate("9");
+                serviceSubtaskPreachform.setSendstate("9");
             }
             serviceSubtaskPreachformMapper.updateSSPByCondition(serviceSubtaskPreachform);
 
             return true;
         }
 
-        //灏嗙姸鎬佽缃负澶辫触
-        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
-        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
-        serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
-        serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
-        //鑾峰彇璇ユ偅鑰呯殑鍙戦�佹柟寮忔�绘暟
-        List<ServiceSubtaskPreachform> spSize = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
-        log.error("-------spSize鐨勫�间负锛歿}", spSize);
-        serviceSubtaskPreachform.setPreachform(preachform);
-        //1:鏈彂閫佺姸鎬�
-        serviceSubtaskPreachform.setSendstate("1");
-        log.info("---serviceSubtaskPreachform鍏ュ弬涓猴細{}", serviceSubtaskPreachform);
-        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
-        log.info("---serviceSubtaskPreachform杩斿弬涓猴細{}", serviceSubtaskPreachforms);
-        //鐢佃瘽鐨勬湭鍙戦�佺姸鎬侊紝闇�瑕佹煡2锛屽洜涓猴紝鏁版嵁鍙兘鍗″湪闃熷垪閲屼簡(涔熸湁鍙兘娌℃湁鎷夊彇锛宻endstate=1,鎵�浠ュ鏋滄槸鐢佃瘽鐘舵�佸垽鏂璼erviceSubtaskPreachforms鏄笉鏄负绌�)
-        if (preachform.equals("3") && CollectionUtils.isEmpty(serviceSubtaskPreachforms)) {
-            serviceSubtaskPreachform.setSendstate("2");
-            serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
-        }
-        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
-            ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
-            serviceSubtaskPreachform1.setSendstate(failSendstate);
-            if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
-                //濡傛灉鏄鏁欐垨閫氱煡锛屽苟涓斿彂閫佹垚鍔燂紝鐩存帴灏嗗彂閫佺姸鎬佹敼鎴�9
-                if (failSendstate.equals("2")) serviceSubtaskPreachform1.setSendstate("9");
-            }
-            serviceSubtaskPreachform1.setRemark(remark);
-            serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
-            //濡傛灉褰撳墠鐨刾reachform宸茬粡鏄渶鍚庝竴涓簡,骞朵笖鏈杩樻槸鍙戦�佸け璐ワ紝閭g洿鎺ュ皢serviceSubtask鐨剆endstate鐘舵�佹敼鎴�5灏辫浜�(鍏ㄥけ璐ヤ簡)
-            if (CollectionUtils.isNotEmpty(spSize) && serviceSubtaskPreachform1.getSort() == spSize.size()) {
-                if (serviceSubtaskPreachform1.getSort() == spSize.size()) {
-                    if (failSendstate.equals("4") || failSendstate.equals("5")) {
-                        serviceSubtask.setCurrentPreachform(preachform);
-                        serviceSubtask.setSendstate(5L);
-                        serviceSubtask.setRemark("澶勭悊琛ュ伩浠诲姟,褰撳墠澶勭悊鏈�鍚庤ˉ鍋匡紝鍏ㄩ儴鎵ц澶辫触");
-                        //浜哄伐鍙戦�佽秴鏃�
-                        if (ObjectUtils.isNotEmpty(preachform) && preachform.equals("1") && failSendstate.equals("7")) {
-                            serviceSubtask.setSendstate(7L);
-                            serviceSubtask.setRemark("浜哄伐鍙戦�佽秴鏃�");
-                        }
-                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
-                        return true;
-                    }
-                }
-            }
-        } else {
+        // 鏌ヨ璇ュ瓙浠诲姟鐨勫叏閮ㄥ彂閫佹柟寮忥紝涓嶅啀鍙煡 sendstate=1銆�
+        // 绗竴娆″彂閫佸悗璇ヨ鍙兘宸茬粡鍙樻垚 sendstate=2锛岄噸璇曟椂浠嶉渶瑕佸畾浣嶅埌鍚屼竴琛屻��
+        ServiceSubtaskPreachform query = new ServiceSubtaskPreachform();
+        query.setSubid(serviceSubtask.getId());
+        query.setTaskid(serviceSubtask.getTaskid());
+        query.setOrgid(serviceSubtask.getOrgid());
+        List<ServiceSubtaskPreachform> allPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(query);
+        log.info("---serviceSubtaskPreachform杩斿弬涓猴細{}", allPreachforms);
+        if (CollectionUtils.isEmpty(allPreachforms)) {
             log.error("銆怣Q涓鎮h�呮病鏈夋煡璇㈠埌灞炰簬浠栫殑鍙戦�佹柟寮忥紝subid锛歿},prechform:{},orgid:{}銆�", serviceSubtask.getId(), preachform, serviceSubtask.getOrgid());
             return false;
         }
-        log.info("^^^^^^^^^--------preachform鐨勫�间负锛歿}", preachform);
-        serviceSubtask.setCurrentPreachform(preachform);
-        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), serviceSubtask.getCurrentPreachform()));
-        serviceSubtask.setSendstate(3L);
-        //浜哄伐鍙戦�佽秴鏃�
-        if (ObjectUtils.isNotEmpty(preachform) && preachform.equals("1") && failSendstate.equals("7")) {
-            serviceSubtask.setSendstate(7L);
-            serviceSubtask.setRemark("浜哄伐鍙戦�佽秴鏃�");
+
+        // 鎸� getSendPreachform 鐨勯�夋嫨瑙勫垯瀹氫綅鏈瀹為檯澶勭悊鐨勫彂閫佹柟寮忚銆�
+        ServiceSubtaskPreachform currentPreachformRow = findCurrentPreachformRow(allPreachforms, serviceSubtask, preachform);
+        if (currentPreachformRow == null) {
+            log.error("銆怣Q涓鎮h�呮病鏈夋煡璇㈠埌褰撳墠鍙戦�佹柟寮忥紝subid锛歿},prechform:{},orgid:{}銆�", serviceSubtask.getId(), preachform, serviceSubtask.getOrgid());
+            return false;
         }
-        if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
+
+        // 鍏堣惤搴� service_subtask 鐘舵�侊紝鍐嶆洿鏂板彂閫佹柟寮忔槑缁嗐��
+        // 杩欐牱鍗充娇鍚庣画姝ラ寮傚父锛�60 绉掗噸璇曚篃涓嶄細鍐嶆閫変腑骞跺彂閫併��
+        serviceSubtask.setCurrentPreachform(preachform);
+        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), preachform));
+        serviceSubtask.setSendstate(3L);
+        if (isEducationOrNotice(serviceSubtask) && "2".equals(failSendstate)) {
             //濡傛灉鏄鏁欐垨閫氱煡锛屽苟涓斿彂閫佹垚鍔燂紝鍒欑洿鎺ュ皢serviceSubtask鐘舵�佹敼鎴�6L锛堣繖涓偅鑰呮槸娌℃湁棰樺仛鐨勶紝涓嶄細鍐嶈Е鍙戞帴鍙h繘琛岀姸鎬佷慨鏀癸級
-            if (failSendstate.equals("2")) {
-                serviceSubtask.setSendstate(6L);
-            }
+            serviceSubtask.setSendstate(6L);
         }
         serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+
+        // 鏇存柊褰撳墠鍙戦�佹柟寮忔槑缁嗭紱鍙戦�佹垚鍔熸椂鍏佽褰撳墠琛屽凡缁忔槸 sendstate=2銆�
+        currentPreachformRow.setSendstate(failSendstate);
+        if (isEducationOrNotice(serviceSubtask) && "2".equals(failSendstate)) {
+            currentPreachformRow.setSendstate("9");
+        }
+        currentPreachformRow.setRemark(remark);
+        serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(currentPreachformRow);
+
+        // 鍙湁鏈�鍚庝竴姝ヤ笖鍙戦�佸け璐ワ紙4/5锛夋椂鎵嶉渶瑕佸垽鏂秴鏃跺苟缃负 7銆�
+        boolean lastStep = currentPreachformRow.getSort() != null
+                && currentPreachformRow.getSort() == allPreachforms.size();
+        if (lastStep && ("4".equals(failSendstate) || "5".equals(failSendstate))
+                && isSubtaskDeadline(serviceSubtask, allPreachforms)) {
+            serviceSubtask.setSendstate(7L);
+            serviceSubtask.setFinishtime(null);
+            serviceSubtask.setRemark("澶勭悊琛ュ伩浠诲姟,褰撳墠澶勭悊鏈�鍚庤ˉ鍋匡紝鍏ㄩ儴鎵ц澶辫触(瓒呮椂)");
+            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+        }
         return true;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓哄鏁欐垨閫氱煡绫诲瀷銆�
+     */
+    private boolean isEducationOrNotice(ServiceSubtask serviceSubtask) {
+        return serviceSubtask != null
+                && ("3".equals(serviceSubtask.getType()) || "4".equals(serviceSubtask.getType()));
+    }
+
+    /**
+     * 瀹氫綅鏈瀹為檯澶勭悊鐨勫彂閫佹柟寮忚銆�
+     * 閫夋嫨瑙勫垯涓� getSendPreachform 淇濇寔涓�鑷达細
+     * 1. current_preachform 涓虹┖鏃跺彇 sort=1锛�
+     * 2. current_preachform 涓嶄负绌烘椂鍙� current_preachform 瀵瑰簲 sort 鐨勪笅涓�姝ワ紱
+     * 3. 鍏滃簳鎸夊彂閫佹柟寮忓尮閰嶏紝浼樺厛鍙� current_send_time 鏈�杩戠殑涓�琛岋紝鍐嶅彇 sort 杈冨皬鐨勪竴琛屻��
+     */
+    private ServiceSubtaskPreachform findCurrentPreachformRow(List<ServiceSubtaskPreachform> rows,
+                                                              ServiceSubtask serviceSubtask,
+                                                              String preachform) {
+        if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
+            for (ServiceSubtaskPreachform row : rows) {
+                if (Objects.equals(preachform, row.getPreachform())
+                        && row.getSort() != null && row.getSort() == 1L) {
+                    return row;
+                }
+            }
+        } else {
+            Long currentSort = null;
+            for (ServiceSubtaskPreachform row : rows) {
+                if (Objects.equals(serviceSubtask.getCurrentPreachform(), row.getPreachform())) {
+                    currentSort = row.getSort();
+                    break;
+                }
+            }
+            if (currentSort != null) {
+                Long nextSort = currentSort + 1;
+                for (ServiceSubtaskPreachform row : rows) {
+                    if (Objects.equals(nextSort, row.getSort())
+                            && Objects.equals(preachform, row.getPreachform())) {
+                        return row;
+                    }
+                }
+            }
+        }
+
+        ServiceSubtaskPreachform target = null;
+        for (ServiceSubtaskPreachform row : rows) {
+            if (!Objects.equals(preachform, row.getPreachform())) {
+                continue;
+            }
+            if (target == null) {
+                target = row;
+                continue;
+            }
+            Date rowTime = row.getCurrentSendTime();
+            Date targetTime = target.getCurrentSendTime();
+            if (rowTime != null && (targetTime == null || rowTime.after(targetTime))) {
+                target = row;
+            } else if (Objects.equals(rowTime, targetTime) && comparePreachformSort(row, target) < 0) {
+                target = row;
+            }
+        }
+        return target;
+    }
+
+    private int comparePreachformSort(ServiceSubtaskPreachform row, ServiceSubtaskPreachform target) {
+        if (row.getSort() == null && target.getSort() == null) {
+            return 0;
+        }
+        if (row.getSort() == null) {
+            return 1;
+        }
+        if (target.getSort() == null) {
+            return -1;
+        }
+        return row.getSort().compareTo(target.getSort());
     }
 
     private String getKey() {
@@ -993,6 +1143,7 @@
         String body = new Gson().toJson(map);
 
         String result = null;
+        log.info("銆恎etDXCode銆�-鐭俊鍙戦�佸叆鍙� body = {}", body);
         try {
             result = OkHttpExample.sendPostRequest(address, body, token);
         } catch (IOException e) {
@@ -1019,4 +1170,39 @@
         }
         return toHex(md5.digest());
     }
+
+    /**
+     * 闅忚浠诲姟鏄惁瓒呮椂
+     * @param serviceSubtask
+     * @param serviceSubtaskPreachforms
+     * @return
+     */
+    public boolean isSubtaskDeadline(ServiceSubtask serviceSubtask, List<ServiceSubtaskPreachform> serviceSubtaskPreachforms){
+        if (ObjectUtils.isNotEmpty(serviceSubtask)) {
+            //鍙湁鍑洪櫌闅忚鍜屼笓鐥呴殢璁挎湁瓒呮椂
+            if(StringUtils.isNotEmpty(serviceSubtask.getServiceType()) &&
+                    !serviceSubtask.getServiceType().equals("2") && !serviceSubtask.getServiceType().equals("13")){
+                return true;
+            }
+        }
+        if (Objects.isNull(serviceSubtask) || CollectionUtils.isEmpty(serviceSubtaskPreachforms)) {
+            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 -> NumberUtils.toInt(x.getCompensateTime(), 0))
+                .sum();
+        sumCompensateTime = sumCompensateTime + 1;
+        // 鍙ˉ鍋挎渶鍚庝竴姝ヨ嚜韬殑琛ュ伩鏃堕棿锛堝ぉ锛夛紝鑴忓�间竴寰嬫寜 0 鍏滃簳
+        deadline = DateUtils.addDays(deadline, sumCompensateTime);
+        // 鍑洪櫌(鍙戦��)鏃堕棿 + 鏈琛ュ伩鏃堕棿 灏忎簬褰撳墠鏃堕棿 -> 瓒呮椂
+        return deadline.getTime() < new Date().getTime();
+    }
 }

--
Gitblit v1.9.3