From b0da81d9276922b223583807093bd6420d9bf705 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期五, 14 二月 2025 17:10:50 +0800
Subject: [PATCH] 优化电话拨打功能

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java                             |    5 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java |   12 ++--
 smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java            |   22 +++++++
 ruoyi-admin/src/main/resources/application-druid.yml                                     |   66 +++++++++++-----------
 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java                   |   20 +++++-
 smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml                       |    2 
 6 files changed, 79 insertions(+), 48 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
index be6aa8b..9d203fd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -190,8 +190,8 @@
     @PostMapping("/phoneCallBackYQ")
     public PhoneCallBackYQVO phoneCallBackYQ(@RequestBody PhoneCallReqYQVO phoneCallReqYQVO) {
         log.error("鐢佃瘽ASR閫氳瘽鍥炶皟(闆ㄧ划) 锛焮}", phoneCallReqYQVO);
-        SysUser user = getLoginUser().getUser();
-        phoneCallReqYQVO.setOrgid(user.getOrgid());
+//        SysUser user = getLoginUser().getUser();
+//        phoneCallReqYQVO.setOrgid(user.getOrgid());
         PhoneCallBackYQVO phoneCallBackYQVO = serviceSubtaskService.phoneCallBackYQ(phoneCallReqYQVO);
         return phoneCallBackYQVO;
     }
@@ -214,8 +214,8 @@
     @ApiOperation("鎮h�呴棶棰樼粨鏋滆褰曪紙鐢佃瘽锛�")
     @PostMapping("/saveQuestionAnswerPhone")
     public AjaxResult saveQuestionAnswerPhone(@RequestBody ServiceSubTaskDetailReq serviceSubTaskDetailReq) {
-        SysUser user = getLoginUser().getUser();
-        serviceSubTaskDetailReq.setOrgid(user.getOrgid());
+//        SysUser user = getLoginUser().getUser();
+//        serviceSubTaskDetailReq.setOrgid(user.getOrgid());
         return toAjax(serviceSubtaskService.saveQuestionAnswerPhone(serviceSubTaskDetailReq));
     }
 
@@ -236,8 +236,8 @@
     public AjaxResult recordAccept(@RequestBody PhoneCallRecordVO phoneCallRecordVO) {
         log.error("閫氳瘽璁板綍鍥炶皟(闆ㄧ划):{}", phoneCallRecordVO);
 //        return toAjax(serviceSubtaskService.saveQuestionAnswerPhone(serviceSubTaskDetailReq));
-        SysUser user = getLoginUser().getUser();
-        phoneCallRecordVO.setOrgid(user.getOrgid());
+//        SysUser user = getLoginUser().getUser();
+//        phoneCallRecordVO.setOrgid(user.getOrgid());
         serviceSubtaskService.recordAccept(phoneCallRecordVO);
         return success();
     }
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index 91d9bc9..de89676 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -11,12 +11,12 @@
         #        username: root
         #        password: 123456
         #        鍏徃
-        # url: jdbc:mysql://192.168.2.9:3308/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://192.168.2.9:3308/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         #        涓芥按
         #        url: jdbc:mysql://127.0.0.1:3308/smartor-lisui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-        #        username: smartor
-        #        password: Smartor.2023
-        #        driverClassName: com.mysql.cj.jdbc.Driver
+        username: smartor
+        password: Smartor.2023
+        driverClassName: com.mysql.cj.jdbc.Driver
         # 鏂板崕
         # url: jdbc:mysql://192.168.191.181:3308/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         # username: smartor
@@ -24,26 +24,26 @@
         # driverClassName: com.mysql.cj.jdbc.Driver
 
         #        鍏徃浜�
-        url: jdbc:mysql://116.62.18.175:6002/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-        username: hxsoft
-        password: Hxerp2000
-        driverClassName: com.mysql.cj.jdbc.Driver
+        #        url: jdbc:mysql://116.62.18.175:6002/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+      #        username: hxsoft
+      #        password: Hxerp2000
+      #        driverClassName: com.mysql.cj.jdbc.Driver
 
       # 浠庡簱鏁版嵁婧�
       slave:
-        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴(鍏徃)
-        # enabled: true
-        # url: jdbc:sqlserver://116.62.18.175:6001;DatabaseName=iv-ywey;encrypt=false;SelectMethod=cursor
-        # username: sa
-        # password: Hxerp2000
-        # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+      # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴(鍏徃)
+      # enabled: true
+      # url: jdbc:sqlserver://116.62.18.175:6001;DatabaseName=iv-ywey;encrypt=false;SelectMethod=cursor
+      # username: sa
+      # password: Hxerp2000
+      # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
 
-        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴(涔変箤浜岄櫌)
-        # enabled: true
-        # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=IntelligentVoice;encrypt=false;SelectMethod=cursor
-        # username: sa
-        # password: sfxt#2023
-        # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+      # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴(涔変箤浜岄櫌)
+      # enabled: true
+      # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=IntelligentVoice;encrypt=false;SelectMethod=cursor
+      # username: sa
+      # password: sfxt#2023
+      # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
 
       # 鍒濆杩炴帴鏁�
       initialSize: 5
@@ -151,12 +151,12 @@
 qrpath: D:\qrcode
 
 #鍏徃鍐呭閾捐姹侷P鍜岀鍙e彿
-#req_path: 8095
-#localIP: 192.168.2.13
+req_path: 8095
+localIP: 192.168.2.13
 
 #鏂板崕鍖婚櫌澶栭摼璇锋眰IP鍜岀鍙e彿
-req_path: 8093
-localIP: https://wx.lihusmart.com
+#req_path: 8093
+#localIP: https://wx.lihusmart.com
 
 #鑾峰彇鎮h�呬俊鎭疷RL(鍗庡崜鎻愪緵)
 hosp_info_url: http://esb-core-rest.wowjoy.cn/esb/exchange
@@ -165,23 +165,23 @@
 uploadSwitch: 1
 
 ##  鎸囧畾asr鍥炶皟鐨剈rl璺緞(鏈湴)
-#ASRCallBackPath: http://192.168.2.13:8095/smartor/serviceSubtask/phoneCallBackYQ
+ASRCallBackPath: http://192.168.2.13:8095/smartor/serviceSubtask/phoneCallBackYQ
 ##鎸傛柇IP(鏈湴)
-#hangup: http://192.168.2.13:8091/hangup
+hangup: http://192.168.2.13:8091/hangup
 ##fs鎵�浣跨敤鐨勯樋閲岀殑app_key(鏈湴)
 #app_key_yq: ZurNHpaQLq6P55YS
 
 #  鎸囧畾asr鍥炶皟鐨剈rl璺緞(鏂板崕)
-ASRCallBackPath: http://192.168.101.135:8095/smartor/serviceSubtask/phoneCallBackYQ
+#ASRCallBackPath: http://192.168.101.135:8095/smartor/serviceSubtask/phoneCallBackYQ
 #鎸傛柇IP(鏂板崕)
-hangup: http://192.16.4.220:8091/hangup
+#hangup: http://192.16.4.220:8091/hangup
 #fs鎵�浣跨敤鐨勯樋閲岀殑app_key(鏂板崕)
 app_key_yq: ZurNHpaQLq6P55YS
 
 #鏈� 鍦� 鐭俊璇锋眰鍦板潃(杩欎釜鏈嶅姟鏄垜浠嚜宸卞啓鐨�)
-#xhsmsPath: http://192.168.2.13:8092/sendSms
+xhsmsPath: http://192.168.2.13:8092/sendSms
 #鏂板崕鐭俊璇锋眰鍦板潃(杩欎釜鏈嶅姟鏄垜浠嚜宸卞啓鐨�)
-xhsmsPath: http://192.16.4.220:8092/sendSms
+#xhsmsPath: http://192.16.4.220:8092/sendSms
 #甯愬彿
 xhsmsAccount: 911124
 #鎺ュ彛瀵嗙爜
@@ -200,12 +200,12 @@
 FTP_PASSWORD: xh@2023
 
 #璇煶鍦板潃璁块棶鍓嶇紑(鏂板崕)
-voicePathPrefix: http://192.168.191.181:8095/profile/upload/vadio/
+#voicePathPrefix: http://192.168.191.181:8095/profile/upload/vadio/
 #璇煶鍦板潃璁块棶鍓嶇紑(鍏徃)
-#voicePathPrefix: http://192.168.2.13:8095/profile/upload/vadio/
+voicePathPrefix: http://192.168.2.13:8095/profile/upload/vadio/
 
 #鍏佽鑷姩鐢熸垚浠诲姟
 createTaskServiceType: 2
 
 #姣忓ぉ鐢佃瘽绔嬪嵆鎵ц鐨勪笂闄�
-phoneUpEveryHour: 120
+phoneUpEveryHour: 10
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
index 13210c8..6d48711 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -8,10 +8,7 @@
 import java.util.concurrent.TimeUnit;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.BoundSetOperations;
-import org.springframework.data.redis.core.HashOperations;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.data.redis.core.*;
 import org.springframework.stereotype.Component;
 
 /**
@@ -19,7 +16,7 @@
  *
  * @author ruoyi
  **/
-@SuppressWarnings(value = {"unchecked" , "rawtypes"})
+@SuppressWarnings(value = {"unchecked", "rawtypes"})
 @Component
 public class RedisCache {
     @Autowired
@@ -245,6 +242,19 @@
     }
 
     /**
+     * 鍒犻櫎缂撳瓨LIST涓殑鏌愪釜鏁版嵁
+     *
+     * @param key           Redis閿�
+     * @param valueToRemove 闇�瑕佸垹闄ょ殑鍊�
+     * @return Long 澶т簬0琛ㄧず鍒犻櫎浜嗗嚑涓紝绛変簬0琛ㄧず娌℃湁鍒犻櫎锛屽皬浜�0琛ㄧず鍦ㄦ墽琛屽垹闄ゆ搷浣滄椂鍙戠敓浜嗛敊璇�
+     */
+    public Long removeElementFromList(String key, String valueToRemove) {
+        ListOperations<String, String> listOps = redisTemplate.opsForList();
+        Long remove = listOps.remove(key, 0, valueToRemove);
+        return remove;
+    }
+
+    /**
      * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛�
      *
      * @param pattern 瀛楃涓插墠缂�
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 801c238..00c9162 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
@@ -343,8 +343,9 @@
                         }
                     }
                     //灏嗚鎵ц鐨勬斁鍒扮紦瀛樹腑
-                    redisCache.setCacheList("cache-0", list);
-
+                    if (list.size() > 0) {
+                        redisCache.setCacheList("cache-0", list);
+                    }
                 } else if (descByCode.equals("澶氬獟浣�")) {
                     //澶氬獟浣�
                 } else if (descByCode.equals("绾歌川")) {
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 56f5de4..c82af7b 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -819,6 +819,9 @@
      */
     @Override
     public PhoneCallBackYQVO phoneCallBackYQ(PhoneCallReqYQVO phoneCallReqYQVO) {
+        //鍏堟妸璇ubId浠巆ache_exist涓墧闄わ紝鍙鏈夊洖璋冨氨鍓旈櫎锛堢洰鐨勬槸锛屽敖蹇cache-exist涓虹┖锛屽幓缂撳瓨涓嬩竴鎵硅鎵撶殑鐢佃瘽;杩欓噷鍓旈櫎涓嶅奖鍝嶇數璇濈殑姝e父涓氬姟锛�
+        redisCache.removeElementFromList("cache-exist", phoneCallReqYQVO.getTaskid());
+
         //鍒ゆ柇鏄惁鎸傛満
         String hangupState = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "- hangup");
         Object cacheObject1 = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup");
@@ -833,6 +836,12 @@
                 if (ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) {
                     return new PhoneCallBackYQVO();
                 }
+                //濡傛灉鍙戦�佺姸鎬佷负6锛屽氨璇存槑宸茬粡鎵撳畬浜嗭紝涔熸病鏈夊繀瑕佺户缁線涓嬭蛋浜�
+                if (StringUtils.isNotEmpty(phoneCallReqYQVO.getTaskid())) {
+                    ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid()));
+                    if (serviceSubtask.getSendstate() == 6L) return new PhoneCallBackYQVO();
+                }
+
                 ServiceSubtask serviceSubtask2 = new ServiceSubtask();
                 serviceSubtask2.setRemark("鐢佃瘽鍙戦�佹垚鍔燂紙鎮h�呮寕鏂級");
                 serviceSubtask2.setSenduuid(phoneCallReqYQVO.getUuid());
@@ -1429,9 +1438,13 @@
     @Override
     public List<PullTaskVO> taskPull() {
         //pullTaskVOList鐢ㄤ簬鏁版嵁杩斿洖
-        List<PullTaskVO> pullTaskVOList = null;
+        List<PullTaskVO> pullTaskVOList = new ArrayList<>();
         List<String> cacheList = new ArrayList<>();
         ListOperations<String, String> listOps = redisTemplate.opsForList();
+        //蹇呴』绛塧che-exist鍏ㄩ儴鎵撳畬鎵嶈兘鎷夊彇涓嬩竴鎵癸紙涓昏鏄�曟墍鏈夌殑鏁版嵁閮藉爢鍦ㄧ數璇濈殑缂撳瓨閲岋紝鍦ㄨ瀹氱殑鏃堕棿鎵撲笉瀹岋級
+        long existSize = listOps.size("cache-exist");
+        if (existSize > 0) return pullTaskVOList;
+
         long size = listOps.size("cache-0");
         log.error("---------鎵撶數璇濅箣鍓嶇紦瀛樹腑鐨勬暟鎹噺锛歿}", size);
         int count = 0;
@@ -1465,12 +1478,16 @@
                 listOps.trim("cache-0" + i, count1, -1);
             }
         }
+        //existList鐢ㄦ潵璁板綍鎺ヤ笅鏉ラ渶瑕佹墽琛岀殑瀛愪换鍔D
+        List<String> existList = new ArrayList<>();
         if (CollectionUtils.isNotEmpty(pullTaskVOList)) {
             //缁欏洖璋冨弬鏁拌祴鍊�
             for (PullTaskVO pullTaskVO : pullTaskVOList) {
+                existList.add(pullTaskVO.getTaskid());
                 pullTaskVO.setAsrcallback(ASRCallBackPath);
             }
         }
+        if (existList.size() != 0) redisCache.setCacheList("cache-exist", existList);
         log.error("-----------瀹為檯鎷夊彇鐨勭數璇濇暟鎹噺锛歿}", pullTaskVOList.size());
         return pullTaskVOList;
     }
@@ -1853,6 +1870,7 @@
             ServiceSubtask serviceSubtask = new ServiceSubtask();
             serviceSubtask.setRemark("鐢佃瘽鎺ラ�氭垚鍔燂紝鎮h�呮嫆缁濋殢璁�");
             serviceSubtask.setId(Long.valueOf(phoneCallRecordVO.getTaskid()));
+            serviceSubtask.setSendstate(6L);
             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
             int startIndex = phoneCallRecordVO.getRecord_path().indexOf("voice") + "voice".length() + 1;  // 鍔�1鏄烦杩�/绗﹀彿
             int endIndex = phoneCallRecordVO.getRecord_path().lastIndexOf("/");
@@ -2051,7 +2069,9 @@
         redisCache.setCacheObject(subTaskId + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES);
         if (StringUtils.isNotEmpty(serviceSubtask.getRemark())) serviceSubtask.setRemark("鐢佃瘽鍙戦�佹嫆鎺�,鐭俊琛ュ伩鍙戦�佹垚鍔�");
         else serviceSubtask.setRemark("鐭俊琛ュ伩鍙戦�佹垚鍔�");
+        serviceSubtask.setSendstate(3L);
         serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+
     }
 
     //閫氳繃褰撳墠鏃堕棿锛屾媺鍙栫數璇濇�绘暟
diff --git a/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml b/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
index f636f09..8c975d2 100644
--- a/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -254,7 +254,7 @@
         </if>
         <if test="serviceType != null  and serviceType != ''and serviceType == '2'">order by endtime desc</if>
         <if test="serviceType != null  and serviceType != ''and serviceType == '3'">order by admindate desc</if>
-        -- order by update_time desc,id desc
+        <!-- order by update_time desc,id desc -->
     </select>
 
     <select id="selectServiceSubtaskById" parameterType="Long" resultMap="ServiceSubtaskResult">

--
Gitblit v1.9.3