From fdf1b9c1e4489a0c2615fa596268b2f71fad7b4c Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 15 四月 2024 09:08:10 +0800
Subject: [PATCH] 代码提交

---
 smartor/src/main/resources/mapper/smartor/IvrLibaTemplateMapper.xml                               |   15 
 ruoyi-admin/src/main/java/com/ruoyi/web/aa.puml                                                   |  170 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java               |  281 ++++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpEntity.java                            |   40 
 smartor/src/main/java/com/smartor/config/RabbitMqConfig.java                                      |   91 +
 smartor/src/main/java/com/smartor/domain/IvrTaskcallMQ.java                                       |   60 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java                                   |  358 ++++++
 smartor/src/main/java/com/smartor/domain/SocketMessage.java                                       |    5 
 smartor/src/main/java/com/smartor/service/impl/IvrTaskcallServiceImpl.java                        |  346 +++++
 smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplateMapper.java                             |    6 
 smartor/pom.xml                                                                                   |    6 
 ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java                                         |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaTemplateController.java         |   41 
 smartor/src/main/resources/mapper/smartor/IvrLibaExtemplateMapper.xml                             |    6 
 ruoyi-admin/src/main/java/com/ruoyi/web/task/PhoneTask.java                                       |   58 +
 smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml                         |   11 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlRequestBody.java                         |   10 
 smartor/src/main/java/com/smartor/config/PhoneUtils.java                                          |  275 ++++
 smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplatescriptMapper.java                       |   30 
 smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplateServiceImpl.java                  |   13 
 smartor/src/main/java/com/smartor/service/IIvrLibaExtemplatescriptService.java                    |    4 
 smartor/src/main/java/com/smartor/mapper/IvrTaskcallMapper.java                                   |   12 
 smartor/src/main/java/com/smartor/domain/IvrTaskcallVO.java                                       |   15 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplateController.java       |    4 
 smartor/src/main/java/com/smartor/domain/IvrTaskcall.java                                         |   29 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlResponseBody.java                        |   10 
 ruoyi-common/src/main/java/com/ruoyi/common/exception/HttpRequestException.java                   |   34 
 ruoyi-admin/src/main/resources/application.yml                                                    |   12 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplatescriptController.java |    2 
 smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java                             |   15 
 smartor/src/main/java/com/smartor/domain/QuestionMessage.java                                     |   28 
 smartor/src/main/resources/mapper/smartor/IvrLibaTemplateTargetoptionMapper.xml                   |    8 
 smartor/src/main/java/com/smartor/domain/IvrLibaExtemplatescript.java                             |   41 
 smartor/src/main/java/com/smartor/service/IIvrTaskcallService.java                                |   17 
 ruoyi-admin/src/main/resources/logback.xml                                                        |   18 
 ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java                                          |   20 
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java                      |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrTaskcallController.java             |   87 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonRequestBody.java                       |   11 
 smartor/src/main/java/com/smartor/domain/IvrLibaTemplateVO.java                                   |   21 
 smartor/src/main/java/com/smartor/domain/TaskSendTimeVO.java                                      |   44 
 smartor/src/main/resources/mapper/smartor/IvrLibaExtemplatescriptMapper.xml                       |   51 
 smartor/src/main/java/com/smartor/domain/IvrLibaTemplateTargetoption.java                         |  254 ----
 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java                             |  143 -
 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpBody.java                              |    6 
 smartor/src/main/java/com/smartor/domain/IvrLibaTemplate.java                                     |   24 
 smartor/src/main/java/com/smartor/service/impl/IvrLibaScriptServiceImpl.java                      |   45 
 smartor/src/main/java/com/smartor/service/impl/PersonVoiceServiceImpl.java                        |   17 
 smartor/src/main/java/com/smartor/service/impl/IvrLibaTargetServiceImpl.java                      |   24 
 smartor/src/main/java/com/smartor/domain/IvrLibaExtemplate.java                                   |    2 
 smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java                               |   15 
 smartor/src/main/resources/mapper/smartor/IvrTaskcallMapper.xml                                   |   88 +
 smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplatescriptServiceImpl.java            |   38 
 smartor/src/main/java/com/smartor/domain/IvrLibaScriptTargetoption.java                           |   12 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java                                  |  106 -
 ruoyi-admin/pom.xml                                                                               |    8 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java                      |    6 
 smartor/src/main/java/com/smartor/service/IIvrLibaExtemplateService.java                          |    6 
 smartor/src/main/java/com/smartor/service/PersonVoiceService.java                                 |    2 
 ruoyi-common/pom.xml                                                                              |   11 
 smartor/src/main/java/com/smartor/service/impl/IvrLibaTemplateServiceImpl.java                    |   37 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/tools/PersonVoiceController.java       |   45 
 smartor/src/main/java/com/smartor/domain/IvrLibaTargetoption.java                                 |   16 
 ruoyi-admin/src/main/resources/application-druid.yml                                              |   30 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonResponseBody.java                      |   11 
 ruoyi-admin/src/main/java/com/ruoyi/web/component/RabbitMqReceiver.java                           |  118 ++
 66 files changed, 2,770 insertions(+), 605 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 7340354..95b56e5 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -130,7 +130,11 @@
             <artifactId>nls-sdk-common</artifactId>
             <version>2.1.6</version>
         </dependency>
-
+        <!-- rabbitmq 渚濊禆-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
@@ -163,4 +167,4 @@
         <finalName>${project.artifactId}</finalName>
     </build>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index 6e1d70b..3ede9ae 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -29,7 +29,7 @@
                 " |  | \\ `'   /|   `-'  /           \n" +
                 " |  |  \\    /  \\      /           \n" +
                 " ''-'   `'-'    `-..-'              ");
-        //寮�鍚疭OCKET
-        new SocketCommunication().socketCommunication();
+//        //寮�鍚疭OCKET
+//        new SocketCommunication().socketCommunication();
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/aa.puml b/ruoyi-admin/src/main/java/com/ruoyi/web/aa.puml
new file mode 100644
index 0000000..526f836
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/aa.puml
@@ -0,0 +1,170 @@
+@startuml
+start
+:鍏ュ弬锛寀serid,socketMessage;
+    note right
+           //鍙戦�佸唴绌虹殑绫诲瀷锛坱ext,image锛�
+            private String type;
+            //鍐呭锛堣繖涓槸鍦ㄥ紑鍙戞祴璇曠殑鏃跺�欑敤锛�
+            private String content;
+            //妯℃澘ID
+            private Long templateId;
+            //闂淇℃伅
+            private QuestionMessage questionMessage;
+            //鐢ㄦ埛ID锛堟帴鏀舵斁锛�
+            private String userId;
+            //鍥剧墖
+            private String image;
+            //鍥剧墖锛岄煶銆佽棰戠殑瀛楄妭澶у皬
+            private Integer fileSize;
+    end note
+if (濡傛灉妯℃澘id涓嶄负绌猴紝socketMessage.getTemplateId() != null) then(涓嶄负绌�)
+      partition "閫氳繃妯℃澘ID鑾峰彇妯℃澘闂" {
+            :閫氳繃妯℃澘ID鑾峰彇妯℃澘淇℃伅锛屽苟灏嗕俊鎭斁鍒皉edis涓紝
+            key涓簎serId + "ivrLibaTemplateVO1"锛岃繃鏈熸椂闂�2灏忔椂;
+            note left
+                鐩存帴璋冪敤ivrLibaTemplateService.selectInfoByCondition
+                鑾峰彇鍒扳�滄ā鏉夸俊鎭�濄�佲�滈棶棰樿瘽鏈�濄�佲�滆瘽鏈�夐」鈥�
+             end note
+            :浠庤繑鍥炵殑妯℃澘淇℃伅涓幏鍙栭棶棰樿瘽鏈泦鍚�
+            骞跺皢闆嗗悎鏀惧埌redis涓紝key涓簎serId + "ivrLibaTemplateScriptVOList";
+            note left
+                  List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList
+                  鏍规嵁IvrLibaTemplateScriptVO涓殑Targetid锛堟殏鏃跺綋涓�涓棶棰樼殑搴忓彿锛�
+                  鎺掑簭涓�涓�
+             end note
+            :瀹氫箟涓�浜況edis,杩欓噷涔嬫墍浠ュぇ閲忕敤redis,鏄敤鏉ヨ繘琛屽杩涚▼闅旂;
+            note left
+                   userId + "backQuset" 鐢ㄦ潵杩斿洖璋冩煡鐨勬�荤粨鏋�
+                   userId + "noVoice"   鐢ㄦ潵璁板綍鏃犲0鍝嶅簲娆℃暟
+                   userId + "mateNum"   鐢ㄦ潵璁板綍鏃犲尮閰嶆鏁�
+                   userId + "isOver"    鐢ㄦ潵璁板綍鏁翠釜闂嵎鏄惁缁撴潫 0 锛氭湭缁撴潫     1锛氱粨鏉�
+            end note
+             :浠巌vrLibaTemplateScriptVOList涓幏鍙栧埌targetid涓�1鐨勯
+             鏀惧埌QuestionMessage涓�;
+             note left
+               QuestionMessage鐨勫瓧娈典负
+                        String content 杩斿洖鐨勫唴瀹�
+                        String kcb 寮�鍦虹櫧
+                        String jsy 缁撴潫璇�
+                        IvrLibaTemplateScriptVO nowQuestion 褰撳墠闂
+              end note
+             :瀹氫箟鈥滃紑鍦虹櫧鈥濓紝
+             鍜� userId + "returnQues" 鐨剅edis;
+    }
+
+
+else (涓虹┖)
+    :鑾峰彇鍓嶇杩斿洖鐨剄uestionMessage鈥滈棶棰樹俊鎭��;
+    :鍘籸edis涓幏鍙栧埌鈥滆瘽鏈棶棰橀泦鍚堚��
+    List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList;
+    :鑾峰彇鍒板綋鍓嶇殑瑕侀棶棰樼殑闂浠巕uestionMessage涓紝
+     IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO;
+    :鍘籸edis涓幏鍙栨ā鏉夸俊鎭�,IvrLibaTemplateVO ivrLibaTemplateVO1;
+    if(questionMessage鐨刢ontent涓虹┖锛岃鏄庡鏂规病鏈夊洖绛�) then(true)
+      partition "闈欓粯璇濇湳" {
+           :鍏堝幓redis涓紝鑾峰彇褰撳墠鐢ㄦ埛鐨勫璇ラ鐨勫疄闄呴潤榛樻鏁� Integer noVoice;
+           if(瀹為檯闈欓粯娆℃暟鏄惁绛変簬妯℃澘涓厤缃殑娆℃暟,noVoice == ivrLibaTemplateVO1.getNoVoiceNum().intValue()) then(true)
+                 :璇ラ璁板綍鍒拌皟鏌ョ殑鎬荤粨鏋滀腑锛屽嵆backQuset涓�,鏇存柊redis涓殑userId + "backQuset";
+                 if(鏈鐨則argetid 绛変簬 棰樼洰鏁伴噺鐨勬渶澶у�硷紝鍗砳vrLibaTemplateScriptVO.getTargetid() == ivrLibaTemplateScriptVOList.size()) then(true)
+                     :璇存槑杩欏氨鏄渶鍚庝竴閬撻浜嗭紝灏嗚皟鏌ョ殑缁撴灉锛屽拰缁撴潫璇斁鍒板璞′腑锛岃繘琛岃繑鍥炵粰鐢ㄦ埛;
+                     note right
+                         List<IvrLibaTemplateScriptVO> backQusetRedis = redisCache.getCacheObject(userId + "backQuset");
+                          returnQues.setContent(JSON.toJSONString(backQusetRedis));
+                          returnQues.setJsy("鎰熻阿鎮ㄧ殑鑰愬績鍥炵瓟锛屽啀瑙�");
+                          redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                          redisCache.setCacheObject(userId + "isOver", 1, 120, TimeUnit.MINUTES);
+                     end note
+                 else(涓嶇瓑浜�)
+                     :鍒欒繕鏈変笅涓�棰�,灏辨牴鎹綋鍓峵eagetID+1 鑾峰彇涓嬩竴棰�
+                      骞跺皢涓嬩竴棰樼殑淇℃伅鏀惧埌reids涓紝key涓簎serId + "returnQues", returnQues
+                      灏唘serId + "noVoice"娓呴浂;
+                 endif
+           else(瀹為檯闈欓粯娆℃暟鏄惁 涓嶇瓑浜� 妯℃澘涓厤缃殑娆℃暟) then(false)
+                 :杩涜鍐嶅皢璇㈤棶;
+                 :鍘籸edis涓幏鍙杣serId + "noVoice"锛堝疄闄呯殑闈欓粯娆℃暟锛�,寰楀埌Integer noVoice2
+                  瀵瑰疄闄呴潤榛樻鏁板姞1,鍐嶆斁鍥瀝eids涓�;
+             endif
+     }
+    else (瀵规柟鏈夊洖绛�) then(false)
+         partition "寰幆鏈鐨勯�夐」锛宨vrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList()" {
+               :鑾峰彇寰幆锛岃幏鍙栧埌閫夐」鐨勬鍒欏尮閰�,
+                鍐嶈幏鍙栧埌鐢ㄦ埛鐨勫洖绛斾俊鎭紝杩涜姝e垯鍖归厤;
+                note right
+                        Pattern pattern = Pattern.compile(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex());
+                        Matcher matcher = pattern.matcher(questionMessage.getContent());
+                end note
+                if(鍖归厤鍒颁簡) then(matcher.matches()涓簍rue)
+                        :鍒欏皢璇ラ�夐」涓殑IsUserOperation,璁剧疆鎴恡rue锛堝墠绔細鏍规嵁杩欎釜鎷垮�硷級;
+                        :鍘籸edis涓幏鍙杣serId + "backQuset",寰楀埌 List<IvrLibaTemplateScriptVO> backQuset;
+                        :灏嗚棰樼殑淇℃伅鏀惧埌backQuset涓�;
+                        :鏇存柊redis涓殑userId + "backQuset",骞跺皢userId + "noVoice"缃负0;
+                        :缁撴潫褰撳墠寰幆;
+                        :閫氳繃褰撳墠姝g‘閫夐」鐨刵extQeestion锛岃幏鍙栦笅涓�棰樼殑targetID,鍐嶅幓ivrLibaTemplateScriptVOList锛�
+                        杩涜鍖归厤锛岃幏鍙朓vrLibaTemplateScriptVO锛堜笅涓�棰樼殑淇℃伅锛�;
+                        :灏嗚幏鍙栧埌鐨勯淇℃伅鏀惧埌redis涓紝key涓簎serId + "returnQues";
+                else(娌″尮閰嶅埌)
+                        :鍘籸edis涓幏鍙杣serId + "mateNum",寰楀埌Integer mateNum(鏃犲尮閰嶆鏁�);
+                        :鏃犲尮閰嶆鏁板幓鍒ゆ柇鏄惁鍒版渶澶ц闂鏁帮紝骞朵笖鏄惁鎵�鏈夌殑閫夐」閮藉尮閰嶅畬浜�;
+                        if(鏃犲尮閰嶆鏁扳�滅瓑浜庘�濇渶澶ц闂鏁帮紝骞朵笖鎵�鏈夌殑閫夐」閮藉尮閰嶅畬浜�) then(true)
+                             :鍘籸edis涓幏鍙杣serId + "backQuset",寰楀埌 List<IvrLibaTemplateScriptVO> backQuset;
+                             :灏嗚棰樼殑淇℃伅鏀惧埌backQuset涓�,鏇存柊redis涓殑userId + "backQuset";
+                             :鍒ゆ柇鏄惁杩樻湁涓嬩竴棰�;
+                             if(鏈鐨則argetid < 鎬婚鏁�) then(鏈変笅涓�棰�)
+                                    :鍒欒繕鏈変笅涓�棰�,灏辨牴鎹綋鍓峵eagetID+1 鑾峰彇涓嬩竴棰�
+                                     骞跺皢涓嬩竴棰樼殑淇℃伅鏀惧埌reids涓紝key涓簎serId + "returnQues",
+                                     灏唘serId + "mateNum"娓呴浂;
+                             else(娌℃湁棰樹簡)
+                                    :瀹氫箟涓�涓┖鐨凲uestionMessage returnQues2(鐢ㄤ簬杩斿弬);
+                                    :鍘籸eids涓幏鍙杣serId + "backQuset"锛屾斁鍒皉eturnQues2鐨刢ontent涓�;
+                                    :缁檙eturnQues2璁剧疆缁撴潫璇�;
+                                    :鏇存柊redis涓殑userId + "returnQues";
+                                    :灏唕edis涓殑userId + "isOver"鍊硷紝璁剧疆涓�1锛堣〃绀烘暣涓祦绋嬬粨鏉燂級;
+                              endif
+
+                        else(鏃犲尮閰嶆鏁扳�滃皬浜庘�濇渶澶ц闂鏁帮紝骞朵笖鎵�鏈夌殑閫夐」閮藉尮閰嶅畬浜�)
+                            :鏃犲尮閰嶆鏁�+1,鏇存柊redis涓殑userId + "mateNum";
+                         endif
+                 endif
+         }
+         :閫夐」鍖归厤瀹屾垚鍚�,闇�瑕佸啀鍘婚�氳繃搴撳啀杩涜鍖归厤涓�娆�;
+         :鍘绘ā鏉夸俊鎭腑鑾峰彇閫氳繃搴撴ā鏉縄D闆嗗悎;
+         note right
+            String extemplateID = ivrLibaTemplateVO1.getSubmoduleID();
+         end note
+         if(閫氱敤搴撴ā鏉縄D闆嗗悎涓嶄负绌�) then(true)
+             :閫氳繃閫氱敤搴撴ā鏉縄D鑾峰彇閫氳繃璇濇湳淇℃伅闆嗗悎;
+             note right
+                     List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
+             end note
+             partition "寰幆閫氱敤璇濇湳闆嗗悎List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts" {
+                 :閫氳繃姝e垯灏嗗墠绔紶鍥炵殑缁撴灉锛屽拰閬嶅巻鍑烘潵鐨勮瘽鏈鍒欒繘琛屽尮閰�;
+                 :鍖归厤鍒板悗锛屽幓redis涓幏鍙杣serId + "returnQues",灏嗙瓟妗堟斁鍒伴棶棰樺璞′腑鐨剆ubmoduleText涓�;
+                  note right
+                        QuestionMessage returnQues = redisCache.getCacheObject(userId + "returnQues");
+                        IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
+                        nowQuestion.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
+                        nowQuestion.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
+                        redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                  end note
+              }
+           :缁撴潫寰幆;
+          endif
+    endif
+endif
+:鍘籸edis涓幏鍙杣serId + "returnQues",灏嗙粨鏋滆繑鍥炵粰鍓嶇;
+:娓呯┖redis鎵�鏈夌殑鍙橀噺;
+
+note left
+      //鏁翠釜娴佺▼鏄惁缁撴潫锛屽皢redis涓殑璇serId涓嬬殑鏁版嵁鍒犻櫎;
+      Integer isOver = redisCache.getCacheObject(userId + "isOver");
+       if (isOver == 1) {
+          redisCache.deleteObject(userId + "ivrLibaTemplateScriptVOList");
+          redisCache.deleteObject(userId + "backQuset");
+          redisCache.deleteObject(userId + "noVoice");
+          redisCache.deleteObject(userId + "returnQues");
+          redisCache.deleteObject(userId + "isOver");
+          redisCache.deleteObject(userId + "ivrLibaTemplateVO1");
+       }
+end note
+stop
+@enduml
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/component/RabbitMqReceiver.java b/ruoyi-admin/src/main/java/com/ruoyi/web/component/RabbitMqReceiver.java
new file mode 100644
index 0000000..4208bc2
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/component/RabbitMqReceiver.java
@@ -0,0 +1,118 @@
+package com.ruoyi.web.component;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.web.task.PhoneTask;
+import com.smartor.config.RabbitMqConfig;
+import com.smartor.domain.IvrLibaTemplateVO;
+import com.smartor.domain.IvrTaskcall;
+import com.smartor.domain.IvrTaskcallMQ;
+import com.smartor.mapper.IvrTaskcallMapper;
+import com.smartor.service.IIvrLibaTemplateService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.rabbitmq.client.Channel;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Slf4j
+@Component//鐩戝惉姝ら槦鍒�
+public class RabbitMqReceiver {
+
+    private static IIvrLibaTemplateService ivrLibaTemplateService;
+
+    private static IvrTaskcallMapper ivrTaskcallMapper;
+
+    private static RedisCache redisCache;
+
+    // 鍒涘缓鍥哄畾澶у皬鐨勭嚎绋嬫睜
+    private static final ExecutorService executorService = Executors.newFixedThreadPool(10);
+
+
+    @Autowired
+    public void setIIvrLibaTemplateService(IIvrLibaTemplateService ivrLibaTemplateService) {
+        RabbitMqReceiver.ivrLibaTemplateService = ivrLibaTemplateService;
+    }
+
+    @Autowired
+    public void setIvrTaskcallMapper(IvrTaskcallMapper ivrTaskcallMapper) {
+        RabbitMqReceiver.ivrTaskcallMapper = ivrTaskcallMapper;
+    }
+
+    @Autowired
+    public void setRedisCache(RedisCache redisCache) {
+        RabbitMqReceiver.redisCache = redisCache;
+    }
+
+//    @RabbitListener(queues = RabbitMqConfig.delay_queue)
+//    public void consultReceiveDealy(String content, Message message, Channel channel) throws IOException {
+//        log.info("----------------鎺ユ敹寤惰繜闃熷垪娑堟伅--------------------");
+//        //閫氱煡 MQ 娑堟伅宸茶鎺ユ敹,鍙互ACK(浠庨槦鍒椾腑鍒犻櫎)浜�
+//        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+//        try {
+//            log.info("=============Do Something==============");
+//        } catch (Exception e) {
+//            log.error("============娑堣垂澶辫触,灏濊瘯娑堟伅琛ュ彂鍐嶆娑堣垂!==============");
+//            log.error(e.getMessage());
+//            /**
+//             * basicRecover鏂规硶鏄繘琛岃ˉ鍙戞搷浣滐紝
+//             * 鍏朵腑鐨勫弬鏁板鏋滀负true鏄妸娑堟伅閫�鍥炲埌queue浣嗘槸鏈夊彲鑳借鍏跺畠鐨刢onsumer(闆嗙兢)鎺ユ敹鍒帮紝
+//             * 璁剧疆涓篺alse鏄彧琛ュ彂缁欏綋鍓嶇殑consumer
+//             */
+//            channel.basicRecover(false);
+//        }
+//    }
+
+    /**
+     * 鐢佃瘽闅忚
+     * concurrency = "50"  骞跺彂鏁颁负50
+     */
+    @RabbitListener(queues = RabbitMqConfig.phone_queue, concurrency = "50")
+    public void phoneVisit(String content, Message message, Channel channel) throws IOException {
+//        System.out.println(content);
+//        IvrTaskcallMQ ivrTaskcallMQ = null;
+//        ObjectMapper mapper = new ObjectMapper();
+//        try {
+//            ivrTaskcallMQ = mapper.readValue(content, IvrTaskcallMQ.class);
+//        } catch (JsonProcessingException e) {
+//            e.printStackTrace();
+//        }
+//        //閫氳繃妯℃澘ID鑾峰彇妯℃澘闂
+//        IvrLibaTemplateVO ivrLibaTemplateVO = new IvrLibaTemplateVO();
+//        ivrLibaTemplateVO.setID(Long.valueOf(ivrTaskcallMQ.getTemplateid()));
+//        IvrLibaTemplateVO ivrLibaTemplateVO1 = ivrLibaTemplateService.selectInfoByCondition(ivrLibaTemplateVO);
+//
+//        //閫氳繃浠诲姟ID鎷垮埌鎮h�呬俊鎭�
+//        IvrTaskcall ivrTaskcall = new IvrTaskcall();
+//        ivrTaskcall.setTaskid(ivrTaskcallMQ.getTaskid());
+//        List<IvrTaskcall> ivrTaskcalls = ivrTaskcallMapper.selectIvrTaskcallList(ivrTaskcall);
+//
+//        for (IvrTaskcall ivrTaskcall1 : ivrTaskcalls) {
+//            //閫氳繃澶氱嚎绋嬬殑鏂瑰紡鍘绘墦鐢佃瘽
+//            executorService.submit(new PhoneTask(ivrTaskcall1, ivrLibaTemplateVO1, redisCache));
+//        }
+        //閫氱煡 MQ 娑堟伅宸茶鎺ユ敹,鍙互ACK(浠庨槦鍒椾腑鍒犻櫎)浜�   锛堣繖涓渶瑕佹牴鎹笟鍔″啀鍘诲鐞咥CK锛�
+        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        try {
+            log.info("=============Do Something==============");
+        } catch (Exception e) {
+            log.error("============娑堣垂澶辫触,灏濊瘯娑堟伅琛ュ彂鍐嶆娑堣垂!==============");
+            log.error(e.getMessage());
+            /**
+             * basicRecover鏂规硶鏄繘琛岃ˉ鍙戞搷浣滐紝
+             * 鍏朵腑鐨勫弬鏁板鏋滀负true鏄妸娑堟伅閫�鍥炲埌queue浣嗘槸鏈夊彲鑳借鍏跺畠鐨刢onsumer(闆嗙兢)鎺ユ敹鍒帮紝
+             * 璁剧疆涓篺alse鏄彧琛ュ彂缁欏綋鍓嶇殑consumer
+             */
+            channel.basicRecover(false);
+        }
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java
index 678eec7..1540222 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java
@@ -1,8 +1,15 @@
 package com.ruoyi.web.controller.hanler;
 
+import com.alibaba.fastjson2.JSON;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.smartor.domain.SocketMessage;
+import com.google.gson.Gson;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.StringUtils;
+import com.smartor.domain.*;
+import com.smartor.mapper.IvrLibaExtemplatescriptMapper;
+import com.smartor.service.IIvrLibaTemplateService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.socket.BinaryMessage;
 import org.springframework.web.socket.CloseStatus;
@@ -11,16 +18,40 @@
 import org.springframework.web.socket.handler.AbstractWebSocketHandler;
 
 import java.io.IOException;
-import java.util.Map;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Slf4j
 @Component
 public class ChatWebSocketHandler extends AbstractWebSocketHandler {
 
+    private static RedisCache redisCache;
+
+    private static IIvrLibaTemplateService ivrLibaTemplateService;
+
+    private static IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper;
+
     // 鐢ㄤ簬瀛樺偍鐢ㄦ埛ID鍜學ebSocketSession鐨勬槧灏勫叧绯�
     private static Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
 
+    @Autowired
+    public void setIEMapper(IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper) {
+        ChatWebSocketHandler.ivrLibaExtemplatescriptMapper = ivrLibaExtemplatescriptMapper;
+    }
+
+    @Autowired
+    public void setTodayReaderService(IIvrLibaTemplateService ivrLibaTemplateService) {
+        ChatWebSocketHandler.ivrLibaTemplateService = ivrLibaTemplateService;
+    }
+
+    @Autowired
+    public void setRedisCache(RedisCache redisCache) {
+        ChatWebSocketHandler.redisCache = redisCache;
+    }
 
     @Override
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
@@ -42,7 +73,7 @@
         ObjectMapper mapper = new ObjectMapper();
         SocketMessage parsedMessage = mapper.readValue(payload, SocketMessage.class);
         if (parsedMessage != null) {
-            sendMessageToUser(parsedMessage.getUserId(), parsedMessage.getContent());
+            sendMessageToUser(parsedMessage.getUserId(), parsedMessage);
         }
 
     }
@@ -79,12 +110,250 @@
         return userId;
     }
 
-    private void sendMessageToUser(String userId, String message) throws IOException {
+    private void sendMessageToUser(String userId, SocketMessage socketMessage) throws IOException {
         WebSocketSession session = sessions.get(userId);
         if (session != null && session.isOpen()) {
-            session.sendMessage(new TextMessage(message));
+            if (socketMessage.getTemplateId() != null) {
+                //閫氳繃妯℃澘ID鑾峰彇妯℃澘闂
+                IvrLibaTemplateVO ivrLibaTemplateVO = new IvrLibaTemplateVO();
+                ivrLibaTemplateVO.setID(socketMessage.getTemplateId());
+                IvrLibaTemplateVO ivrLibaTemplateVO1 = ivrLibaTemplateService.selectInfoByCondition(ivrLibaTemplateVO);
+                redisCache.setCacheObject(userId + "ivrLibaTemplateVO1", ivrLibaTemplateVO1, 120, TimeUnit.MINUTES);
+                //灏嗘煡鍑烘潵鐨勯棶棰�,鏀惧埌鍏ㄥ眬鍙橀噺涓幓
+                List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList = ivrLibaTemplateVO1.getIvrLibaTemplateScriptVOList();
+                //鏍规嵁搴忓彿杩涜鎺掑簭
+                Collections.sort(ivrLibaTemplateScriptVOList, Comparator.comparing(IvrLibaTemplateScriptVO::getTargetid));
+
+                //灏嗘煡鍑烘潵鐨勬暟鎹斁鍒皉edis涓�
+                redisCache.setCacheObject(userId + "ivrLibaTemplateScriptVOList", ivrLibaTemplateScriptVOList, 120, TimeUnit.MINUTES);
+                //鐢ㄦ潵杩斿洖璋冩煡鐨勬�荤粨鏋�
+                redisCache.setCacheObject(userId + "backQuset", new ArrayList<>(), 120, TimeUnit.MINUTES);
+                //鐢ㄦ潵璁板綍鏃犲0鍝嶅簲娆℃暟
+                redisCache.setCacheObject(userId + "noVoice", 0, 120, TimeUnit.MINUTES);
+                //鐢ㄦ潵璁板綍鏃犲尮閰嶆鏁�
+                redisCache.setCacheObject(userId + "mateNum", 0, 120, TimeUnit.MINUTES);
+                //鐢ㄦ潵璁板綍鏁翠釜闂嵎鏄惁缁撴潫 0 锛氭湭缁撴潫     1锛氱粨鏉�
+                redisCache.setCacheObject(userId + "isOver", 0, 120, TimeUnit.MINUTES);
+
+                //鐢ㄦ潵杩斿洖褰撳墠闇�瑕侀棶鐨勯棶棰樹俊鎭�
+                QuestionMessage returnQues = new QuestionMessage();
+
+                for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVOList) {
+                    if (ivrLibaTemplateScriptVO.getTargetid() == ivrLibaTemplateVO1.getFirstQuestionNum().intValue())
+                        //鑾峰彇绗竴棰樼殑闂
+                        returnQues.setNowQuestion(ivrLibaTemplateScriptVO);
+//                        returnQues.setCode(ivrLibaTemplateScriptVO.getTargetid() + 1);
+                }
+//                returnQues.setKcb("浣犲ソ,澶у偦鐙�,鎴戜滑鏄煇鏌愭煇鍖婚櫌,鐜板湪闇�瑕佸仛涓�娆¢殢璁�;");
+                returnQues.setKcb(ivrLibaTemplateVO1.getRevisitBefore());
+
+                //璁板綍鍝嶅簲
+                redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+            } else {
+                //鑾峰彇socketMessage閲岀殑QuestionMessage,瀵圭瓟妗堣繘琛屽鐞嗙劧鍚�,鍐嶉棶涓嬩竴閬�
+                Gson gson = new Gson();
+                if (!StringUtils.isEmpty(socketMessage.getContent())) {
+                    socketMessage.setQuestionMessage(gson.fromJson(socketMessage.getContent(), QuestionMessage.class));
+                }
+
+                QuestionMessage questionMessage = socketMessage.getQuestionMessage();
+                List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList = redisCache.getCacheObject(userId + "ivrLibaTemplateScriptVOList");
+                //鏍规嵁鍓嶇浼犲洖鐨勬潯浠讹紝鑾峰彇褰撳墠棰樼洰
+                IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = questionMessage.getNowQuestion();
+                if (ivrLibaTemplateScriptVO.getID() == null) {
+                    QuestionMessage returnQues = redisCache.getCacheObject(userId + "returnQues");
+                    ivrLibaTemplateScriptVO = returnQues.getNowQuestion();
+                }
+                //鑾峰彇妯℃澘淇℃伅
+                IvrLibaTemplateVO ivrLibaTemplateVO1 = redisCache.getCacheObject(userId + "ivrLibaTemplateVO1");
+
+                if (StringUtils.isEmpty(questionMessage.getContent())) {
+                    //璋冪敤ivrLibaTemplateScriptVO涓殑slienceText(闈欓粯璇濇湳)
+                    Integer noVoice = redisCache.getCacheObject(userId + "noVoice");
+                    //瀹為檯闈欓粯娆℃暟鏄惁 绛変簬 妯℃澘涓厤缃殑娆℃暟
+                    if (noVoice == ivrLibaTemplateVO1.getNoVoiceNum().intValue()) {
+                        //鐢ㄦ潵杩斿洖璋冩煡鐨勬�荤粨鏋�
+                        List<IvrLibaTemplateScriptVO> backQuset = new ArrayList<>();
+                        backQuset.add(ivrLibaTemplateScriptVO);
+                        redisCache.setCacheObject(userId + "backQuset", backQuset, 120, TimeUnit.MINUTES);
+
+                        //濡傛灉鍑犳閮芥病鍝嶅簲锛屽氨涓嬩竴棰橈紙闇�瑕佸厛鍒ゆ柇鏄惁鏈変笅涓�棰橈級
+                        if (ivrLibaTemplateScriptVO.getTargetid() == ivrLibaTemplateScriptVOList.size()) {
+                            //濡傛灉涓嬩竴棰樻病鏈変簡锛屽氨缁撴潫浜�
+                            QuestionMessage returnQues = new QuestionMessage();
+//                            returnQues.setCode(null);
+                            List<IvrLibaTemplateScriptVO> backQusetRedis = redisCache.getCacheObject(userId + "backQuset");
+                            returnQues.setContent(JSON.toJSONString(backQusetRedis));
+                            returnQues.setJsy("鎰熻阿鎮ㄧ殑鑰愬績鍥炵瓟锛屽啀瑙�");
+                            redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                            redisCache.setCacheObject(userId + "isOver", 1, 120, TimeUnit.MINUTES);
+
+                        } else {
+                            //濡傛灉鏈変笅涓�棰橈紝灏辨牴鎹綋鍓峵eagetID+1 鑾峰彇涓嬩竴棰�
+                            QuestionMessage returnQues = getNextQuestion(ivrLibaTemplateScriptVOList, ivrLibaTemplateScriptVO);
+                            redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                            redisCache.setCacheObject(userId + "noVoice", 0, 120, TimeUnit.MINUTES);
+                        }
+                    } else {
+                        //瀹為檯闈欓粯娆℃暟鏄惁 涓嶇瓑浜� 妯℃澘涓厤缃殑娆℃暟
+//                        QuestionMessage returnQues = redisCache.getCacheObject(userId + "returnQues");
+//                        returnQues.setContent(null);
+//                        redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+
+                        Integer noVoice2 = redisCache.getCacheObject(userId + "noVoice");
+                        noVoice2 = noVoice2 + 1;
+                        redisCache.setCacheObject(userId + "noVoice", noVoice2, 120, TimeUnit.MINUTES);
+                    }
+                } else {
+                    //瀵瑰洖绛旂殑闂,杩涜姝e垯鍖归厤锛堣繖閲屽彧閽堝閫夋嫨棰橈紝鍏跺畠棰樺瀷涓嶈锛�
+                    for (int j = 0; j < ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().size(); j++) {
+                        //鍖呭惈
+                        Matcher matcher = null;
+                        if (StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) {
+                            Pattern pattern = Pattern.compile(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex());
+                            matcher = pattern.matcher(questionMessage.getContent());
+                        }
+                        //涓嶅寘鍚�
+                        Matcher matcher2 = null;
+                        if (StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) {
+                            Pattern pattern2 = Pattern.compile(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
+                            matcher2 = pattern2.matcher(questionMessage.getContent());
+                        }
+                        log.info("==============================Targetregex鐨勫�间负锛歿},   Targetregex2鐨勫�间负锛歿}", ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
+
+                        if (StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
+                            //璇存槑鍖归厤姝g‘浜�
+                            ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true);
+                            List<IvrLibaTemplateScriptVO> backQuset = redisCache.getCacheObject(userId + "backQuset");
+                            //鍖归厤瀹屾垚鍚�,灏嗙粨鏋滀繚瀛樺埌鏂扮殑鏁扮粍
+                            backQuset.add(ivrLibaTemplateScriptVO);
+                            redisCache.setCacheObject(userId + "backQuset", backQuset, 120, TimeUnit.MINUTES);
+                            //灏嗛潤榛樼疆涓�0
+                            redisCache.setCacheObject(userId + "noVoice", 0, 120, TimeUnit.MINUTES);
+                            //鑾峰彇涓嬩竴棰�
+                            Integer nextQuestion = ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion();
+                            for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOList) {
+                                if (script.getTargetid() == nextQuestion) {
+                                    QuestionMessage returnQues = new QuestionMessage();
+                                    returnQues.setNowQuestion(script);
+                                    redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                                    break;
+                                }
+                            }
+                            break;
+                        } else {
+                            //娌℃湁鍖归厤鍒�
+                            Integer mateNum = redisCache.getCacheObject(userId + "mateNum");
+
+                            //鏃犲尮閰嶆鏁板幓鍒ゆ柇鏄惁鍒版渶澶ц闂鏁帮紝骞朵笖鎵�鏈夌殑閫夐」閮藉尮閰嶅畬浜�
+                            if (mateNum == ivrLibaTemplateVO1.getMateNum().intValue() && j == ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().size() - 1) {
+                                //闂簡鏈�澶ц闂鏁板悗锛岃繕鏄病鏈夊尮閰嶄笂,灏嗙粨鏋滀繚瀛樺埌鏂扮殑鏁扮粍
+                                List<IvrLibaTemplateScriptVO> backQuset = redisCache.getCacheObject(userId + "backQuset");
+                                backQuset.add(ivrLibaTemplateScriptVO);
+                                redisCache.setCacheObject(userId + "backQuset", backQuset, 120, TimeUnit.MINUTES);
+
+                                //濡傛灉涓嬩竴棰樹负绌�.鍒欐柊鐨勬暟鎹繑鍥�,骞跺姞涓婃劅璋㈣
+                                if (ivrLibaTemplateScriptVO.getTargetid() < ivrLibaTemplateScriptVOList.size()) {
+                                    QuestionMessage returnQues = getNextQuestion(ivrLibaTemplateScriptVOList, ivrLibaTemplateScriptVO);
+                                    redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                                    redisCache.setCacheObject(userId + "mateNum", 0, 120, TimeUnit.MINUTES);
+                                } else {
+                                    QuestionMessage returnQues2 = new QuestionMessage();
+//                                    returnQues2.setCode(null);
+                                    List<IvrLibaTemplateScriptVO> backQusetRedis = redisCache.getCacheObject(userId + "backQuset");
+                                    returnQues2.setQuestionList(backQusetRedis);
+                                    returnQues2.setJsy("鎰熻阿鎮ㄧ殑鑰愬績鍥炵瓟锛屽啀瑙�");
+                                    redisCache.setCacheObject(userId + "returnQues", returnQues2, 120, TimeUnit.MINUTES);
+                                    redisCache.setCacheObject(userId + "isOver", 1, 120, TimeUnit.MINUTES);
+                                    break;
+                                }
+                            } else if (mateNum < ivrLibaTemplateVO1.getMateNum().intValue() && j == ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().size() - 1) {
+                                //娌℃湁闂埌瑙勫畾娆℃暟
+                                mateNum = mateNum + 1;
+                                redisCache.setCacheObject(userId + "mateNum", mateNum, 120, TimeUnit.MINUTES);
+                            }
+                        }
+                    }
+                    //閫夐」鍖归厤瀹屾垚鍚庯紝闇�瑕佸啀鍘婚�氳繃搴撳啀杩涜鍖归厤涓�娆�
+                    String extemplateID = ivrLibaTemplateVO1.getSubmoduleID();
+                    String[] split = extemplateID.split(",");
+                    List<String> list = Arrays.asList(split);
+                    List<Long> list1 = new ArrayList<>();
+                    if (StringUtils.isNotEmpty(extemplateID)) {
+                        for (String str : list) {
+                            list1.add(Long.valueOf(str));
+                        }
+                        List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
+                        for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
+                            Matcher matcher = null;
+                            if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
+                                Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
+                                matcher = pattern.matcher(questionMessage.getContent());
+                            }
+
+                            Matcher matcher2 = null;
+                            if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
+                                Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
+                                matcher2 = pattern2.matcher(questionMessage.getContent());
+                            }
+                            log.info("++++++++++++++++++++++++++閫氱敤搴撴槸鍚︿负绌猴細selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
+
+                            if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
+                                QuestionMessage returnQues = redisCache.getCacheObject(userId + "returnQues");
+                                IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
+                                nowQuestion.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
+                                nowQuestion.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
+                                redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+                                if (ivrLibaExtemplatescript.getIsEnd() == 1) {
+                                    //灏嗛棶棰樼疆绌�
+                                    IvrLibaTemplateScriptVO nowQuestion1 = returnQues.getNowQuestion();
+                                    nowQuestion1.setQuestionText(null);
+                                    nowQuestion1.setQuestionVoice(null);
+                                    returnQues.setNowQuestion(nowQuestion1);
+                                    redisCache.setCacheObject(userId + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+
+                                    redisCache.setCacheObject(userId + "isOver", 1, 120, TimeUnit.MINUTES);
+                                }
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+            QuestionMessage returnQues = redisCache.getCacheObject(userId + "returnQues");
+            List<IvrLibaTemplateScriptVO> backQusetRedis = redisCache.getCacheObject(userId + "backQuset");
+            returnQues.setQuestionList(backQusetRedis);
+            session.sendMessage(new TextMessage(JSON.toJSONString(returnQues).getBytes(StandardCharsets.UTF_8)));
+
+            //鏁翠釜娴佺▼鏄惁缁撴潫锛屽皢redis涓殑璇serId涓嬬殑鏁版嵁鍒犻櫎;
+            Integer isOver = redisCache.getCacheObject(userId + "isOver");
+            if (isOver == 1) {
+                redisCache.deleteObject(userId + "ivrLibaTemplateScriptVOList");
+                redisCache.deleteObject(userId + "backQuset");
+                redisCache.deleteObject(userId + "noVoice");
+                redisCache.deleteObject(userId + "returnQues");
+                redisCache.deleteObject(userId + "isOver");
+                redisCache.deleteObject(userId + "ivrLibaTemplateVO1");
+                try {
+                    //鏂紑閾炬帴
+                    afterConnectionClosed(session, null);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
         }
     }
 
+    //鑾峰彇涓嬩竴棰橈紙杩欎釜鏂规硶涓嶉�傚悎閫夐」涓殑nextQuestion锛�
+    private QuestionMessage getNextQuestion(List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList, IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO) {
+        QuestionMessage returnQues = new QuestionMessage();
+        for (int j = 0; j < ivrLibaTemplateScriptVOList.size(); j++) {
+            if (ivrLibaTemplateScriptVOList.get(j).getTargetid() == ivrLibaTemplateScriptVO.getTargetid() + 1) {
+                // 瀵硅鏉emplateScriptVO杩涜澶勭悊
+                returnQues.setNowQuestion(ivrLibaTemplateScriptVOList.get(j));
+            }
+        }
+        return returnQues;
+    }
 
-}
\ No newline at end of file
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplateController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplateController.java
index 1936d31..a76c116 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplateController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplateController.java
@@ -73,7 +73,7 @@
     @Log(title = "閫氳繃妯℃澘", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody IvrLibaExtemplate ivrLibaExtemplate) {
-        return toAjax(ivrLibaExtemplateService.insertIvrLibaExtemplate(ivrLibaExtemplate));
+        return AjaxResult.success(ivrLibaExtemplateService.insertIvrLibaExtemplate(ivrLibaExtemplate));
     }
 
     /**
@@ -94,7 +94,7 @@
     @PreAuthorize("@ss.hasPermi('smartor:extemplate:remove')")
     @Log(title = "閫氳繃妯℃澘", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{IDs}")
-    public AjaxResult remove(@PathVariable String[] IDs) {
+    public AjaxResult remove(@PathVariable Long[] IDs) {
         return toAjax(ivrLibaExtemplateService.deleteIvrLibaExtemplateByIDs(IDs));
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplatescriptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplatescriptController.java
index ce6297b..a0f6abd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplatescriptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaExtemplatescriptController.java
@@ -94,7 +94,7 @@
     @PreAuthorize("@ss.hasPermi('smartor:extemplatescript:remove')")
     @Log(title = "閫氱敤妯℃澘璇濇湳", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{IDs}")
-    public AjaxResult remove(@PathVariable String[] IDs) {
+    public AjaxResult remove(@PathVariable Long[] IDs) {
         return toAjax(ivrLibaExtemplatescriptService.deleteIvrLibaExtemplatescriptByIDs(IDs));
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaTemplateController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaTemplateController.java
index 425ca41..250db7d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaTemplateController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrLibaTemplateController.java
@@ -7,12 +7,18 @@
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.smartor.config.RabbitMqConfig;
 import com.smartor.domain.IvrLibaTemplate;
 import com.smartor.domain.IvrLibaTemplateVO;
 import com.smartor.service.IIvrLibaTemplateService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.amqp.AmqpException;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessagePostProcessor;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -26,12 +32,16 @@
  * @author ruoyi
  * @date 2023-12-23
  */
+@Slf4j
 @Api(description = "闅忚妯℃澘搴�")
 @RestController
 @RequestMapping("/smartor/template")
 public class IvrLibaTemplateController extends BaseController {
     @Autowired
     private IIvrLibaTemplateService ivrLibaTemplateService;
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
 
     /**
      * 鏌ヨ妯℃澘搴撳垪琛�
@@ -105,7 +115,6 @@
      * 鏂板鎴栦慨鏀归殢璁挎ā鏉垮簱璇︽儏
      */
     @ApiOperation("鏂板鎴栦慨鏀归殢璁挎ā鏉垮簱璇︽儏")
-    @PreAuthorize("@ss.hasPermi('smartor:script:list')")
     @PostMapping("/saveOrUpdateScript")
     public AjaxResult saveOrUpdateScript(@RequestBody IvrLibaTemplateVO ivrLibaTemplateVO) {
         if (ObjectUtils.isEmpty(ivrLibaTemplateVO)) {
@@ -125,4 +134,34 @@
         }
         return success(ivrLibaTemplateService.selectInfoByCondition(ivrLibaTemplateVO));
     }
+
+
+    /**
+     * 寮�濮嬫墽琛�(娴嬭瘯鐢�)
+     */
+    @GetMapping("/queryRabbitmq")
+    public AjaxResult queryRabbitmq(@RequestParam("routintKey") String routintKey, @RequestParam("content") String content, @RequestParam("times") Long times) {
+
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "phone.001", "娴嬭瘯鏁版嵁001");
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "phone.002", "娴嬭瘯鏁版嵁002");
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "phone.003", "娴嬭瘯鏁版嵁003");
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, routintKey, message, new MessagePostProcessor() {
+//            @Override
+//            public Message postProcessMessage(Message message) throws AmqpException {
+////                message.getMessageProperties().setDelay(times);
+//                message.getMessageProperties().getHeaders().put("x-delay", times);
+////message.getMessageProperties().setExpiration();
+//                return message;
+//            }
+//        });
+
+        log.info("-------------鍚姩鍜ㄨ搴旂瓟瓒呮椂鎻愰啋寤惰繜闃熷垪-------------");
+        this.rabbitTemplate.convertAndSend(RabbitMqConfig.phone_exchange, RabbitMqConfig.routing_key, content, message -> {
+            //娉ㄦ剰杩欓噷鏃堕棿鍙互浣縧ong锛岃�屼笖鏄缃甴eader
+            message.getMessageProperties().setHeader("x-delay", times);
+            return message;
+        });
+        log.info("-------------寤惰繜闃熷垪{}ms鍚庢墽琛�.-------------", times);
+        return success();
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrTaskcallController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrTaskcallController.java
index 417ca8b..e4a0f9f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrTaskcallController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/IvrTaskcallController.java
@@ -1,15 +1,19 @@
 package com.ruoyi.web.controller.smartor;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.DtoConversionUtils;
 import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.smartor.domain.HeTaskVO;
-import com.smartor.domain.IvrTaskcall;
-import com.smartor.domain.IvrTaskcallVO;
+import com.smartor.domain.*;
 import com.smartor.service.IIvrTaskcallService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -18,7 +22,9 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 鍗曚竴浠诲姟锛堥殢璁匡級Controller
@@ -26,7 +32,7 @@
  * @author ruoyi
  * @date 2024-02-02
  */
-@Api(description = "鍗曚竴浠诲姟锛堥殢璁匡級")
+@Api(description = "鍗曚竴浠诲姟锛堥殢璁垮鏁欙級")
 @RestController
 @RequestMapping("/smartor/taskcall")
 public class IvrTaskcallController extends BaseController {
@@ -36,7 +42,7 @@
     /**
      * 鏌ヨ鍗曚竴浠诲姟锛堥殢璁匡級鍒楄〃
      */
-    @ApiOperation("鏌ヨ鍗曚竴浠诲姟锛堥殢璁匡級鍒楄〃")
+    @ApiOperation("鏌ヨ鍗曚竴浠诲姟锛堥殢璁垮鏁欙級鍒楄〃")
     @PreAuthorize("@ss.hasPermi('system:taskcall:list')")
     @PostMapping("/list")
     public TableDataInfo list(@RequestBody IvrTaskcall ivrTaskcall) {
@@ -46,10 +52,10 @@
     }
 
     /**
-     * 瀵煎嚭鍗曚竴浠诲姟锛堥殢璁匡級鍒楄〃
+     * 瀵煎嚭鍗曚竴浠诲姟锛堥殢璁垮鏁欙級鍒楄〃
      */
     @PreAuthorize("@ss.hasPermi('system:taskcall:export')")
-    @Log(title = "鍗曚竴浠诲姟锛堥殢璁匡級", businessType = BusinessType.EXPORT)
+    @Log(title = "鍗曚竴浠诲姟锛堥殢璁垮鏁欙級", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, IvrTaskcall ivrTaskcall) {
         List<IvrTaskcall> list = ivrTaskcallService.selectIvrTaskcallList(ivrTaskcall);
@@ -78,5 +84,72 @@
     }
 
 
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ浠诲姟淇℃伅
+     */
+    @ApiOperation("鏍规嵁鏉′欢鏌ヨ浠诲姟淇℃伅")
+    @PostMapping("/queryTaskByCondition")
+    public AjaxResult queryTaskByCondition(@RequestBody IvrTaskcallVO ivrTaskcallVO) {
+        //鏍规嵁鍏ュ弬鏌ヨ淇℃伅
+        IvrTaskcall ivrTaskcall = DtoConversionUtils.sourceToTarget(ivrTaskcallVO, IvrTaskcall.class);
+        List<IvrTaskcall> list = ivrTaskcallService.selectIvrTaskcallList(ivrTaskcall);
+
+        //瀹氫箟鎮h�呬笌鍗曚竴浠诲姟鍏宠仈琛ㄩ泦鍚�
+        List<PatTaskRelevance> patTaskRelevances = new ArrayList<>();
+
+        //灏嗘煡鍑烘潵鐨勬暟鎹�掑叆IvrTaskcallVO涓�
+        IvrTaskcallVO ivrTaskcallVO2 = DtoConversionUtils.sourceToTarget(list.get(0), IvrTaskcallVO.class);
+        String sendTimeSlot = list.get(0).getSendTimeSlot();
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            //鑾峰彇鍒板彂閫佹椂闂寸殑闆嗗悎
+            if (StringUtils.isNotEmpty(sendTimeSlot)) {
+                List<TaskSendTimeVO> taskSendTimeVOList = objectMapper.readValue(sendTimeSlot, List.class);
+                ivrTaskcallVO2.setSendTimeslot(taskSendTimeVOList);
+            }
+            //鏂囨湰鍙橀噺鍙傛暟
+            if (StringUtils.isNotEmpty(list.get(0).getTextParam())) {
+                Map<String, Map<String, String>> textParam = objectMapper.readValue(list.get(0).getTextParam(), Map.class);
+                ivrTaskcallVO2.setTextParam(textParam);
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+        for (IvrTaskcall ivrTaskcall1 : list) {
+            PatTaskRelevance patTaskRelevance = new PatTaskRelevance();
+            //鑾峰彇鍒版偅鑰呬俊鎭紝骞舵斁鍏ュ埌闆嗗悎涓�
+            patTaskRelevance.setName(ivrTaskcall1.getSendname());
+            patTaskRelevance.setAge(ivrTaskcall1.getAge());
+            patTaskRelevance.setSfzh(ivrTaskcall1.getSfzh());
+            patTaskRelevance.setPhone(ivrTaskcall1.getPhone());
+            patTaskRelevance.setAddr(ivrTaskcall1.getAddr());
+            patTaskRelevances.add(patTaskRelevance);
+        }
+
+        ivrTaskcallVO2.setPatTaskRelevances(patTaskRelevances);
+        return success(ivrTaskcallVO2);
+    }
+
+
+    /**
+     * 浠诲姟鍙戦�佹墽琛�
+     */
+    @ApiOperation("浠诲姟鍙戦�佹墽琛�")
+    @PostMapping("/heTaskSend")
+    public AjaxResult heTaskSend(@RequestBody IvrTaskcallVO ivrTaskcallVO) {
+        return toAjax(ivrTaskcallService.heTaskSend(ivrTaskcallVO));
+    }
+
+
+    /**
+     * 鐢佃瘽鍥炶皟浠诲姟
+     */
+    @ApiOperation("鐢佃瘽鍥炶皟浠诲姟")
+    @PostMapping("/phoneCallBack")
+    public AjaxResult phoneCallBack(@RequestBody PhoneCallBackVO phoneCallBackVO) {
+        //濡傛灉uuid鍦╮edis涓壘涓嶅埌锛岄偅灏辩洿鎺ユ姤寮傚父
+        return success(ivrTaskcallService.phoneCallBack(phoneCallBackVO));
+    }
 
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/tools/PersonVoiceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/tools/PersonVoiceController.java
index b1b312f..84838b2 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/tools/PersonVoiceController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/tools/PersonVoiceController.java
@@ -1,46 +1,15 @@
 package com.ruoyi.web.controller.smartor.tools;
 
-import afu.org.checkerframework.checker.oigj.qual.O;
-import com.alibaba.nls.client.AccessToken;
-import com.alibaba.nls.client.protocol.NlsClient;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.annotation.RepeatSubmit;
 import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.smartor.domain.BaseSmsRequest;
-import com.smartor.domain.BaseSmsaccount;
-import com.smartor.domain.BatchBaseSmsRequest;
-import com.smartor.domain.TemplateSmsRequest;
-import com.smartor.service.DingTalkService;
-import com.smartor.service.IBaseSmsaccountService;
 import com.smartor.service.PersonVoiceService;
-import com.taobao.api.ApiException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -49,7 +18,7 @@
  * @author ls
  * @date 2023-11-17
  */
-@Api(description = "浜哄伐璇煶")
+@Api(description = "璇煶鍚堟垚杞崲")
 @RestController
 @RequestMapping("/smartor/voice")
 public class PersonVoiceController extends BaseController {
@@ -66,8 +35,8 @@
 
     @ApiOperation("鏂囧瓧杞闊�")
     @GetMapping("/texttospeech")
-    public Map<String, Object> texttospeech(@RequestParam("textspeech") String textspeech) {
-        String recognizerListener = personVoiceService.texttospeech(textspeech);
+    public Map<String, Object> texttospeech(@RequestParam("textspeech") String textspeech, @RequestParam("filePath") String filePath) {
+        String recognizerListener = personVoiceService.texttospeech(textspeech, filePath);
         return success(recognizerListener);
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/task/PhoneTask.java b/ruoyi-admin/src/main/java/com/ruoyi/web/task/PhoneTask.java
new file mode 100644
index 0000000..2d8ef9f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/task/PhoneTask.java
@@ -0,0 +1,58 @@
+package com.ruoyi.web.task;
+
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.smartor.config.PhoneUtils;
+import com.smartor.domain.IvrLibaTemplateScriptVO;
+import com.smartor.domain.IvrLibaTemplateVO;
+import com.smartor.domain.IvrTaskcall;
+import com.smartor.domain.QuestionMessage;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class PhoneTask implements Runnable {
+    private IvrTaskcall ivrTaskcall;
+    private List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVO;
+    private RedisCache redisCache;
+    private IvrLibaTemplateVO ivrLibaTemplateVO;
+
+    public PhoneTask(IvrTaskcall ivrTaskcall, IvrLibaTemplateVO ivrLibaTemplateVO, RedisCache redisCache) {
+        this.ivrTaskcall = ivrTaskcall;
+        this.ivrLibaTemplateScriptVO = ivrLibaTemplateVO.getIvrLibaTemplateScriptVOList();
+        this.ivrLibaTemplateVO = ivrLibaTemplateVO;
+        this.redisCache = redisCache;
+    }
+
+    @Override
+    public void run() {
+        //鑾峰彇鐢佃瘽缁勶紝鏌ョ湅鍝簺鐢佃瘽鍙互浣跨敤
+        PhoneUtils phoneUtils = new PhoneUtils();
+        String uuid = IdUtils.randomUUID();
+        Map<String, Object> objectMap = new HashMap<>();
+        objectMap.put("ivrTaskcall", ivrTaskcall);
+        objectMap.put("ivrLibaTemplateScriptVO", ivrLibaTemplateScriptVO);
+        //灏嗘暟鎹斁鍒皉edis涓紝鏂逛究鍦ㄥ洖璋冩柟娉曢噷鑾峰彇
+        redisCache.setCacheObject(uuid, objectMap, 120, TimeUnit.MINUTES);
+
+        //璁板綍棣栨闂
+        QuestionMessage returnQues = new QuestionMessage();
+        returnQues.setKcb(ivrLibaTemplateVO.getRevisitBefore());
+        for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVO) {
+            if (ivrLibaTemplateScriptVO.getTargetid() == ivrLibaTemplateVO.getFirstQuestionNum().intValue()) {
+                returnQues.setNowQuestion(ivrLibaTemplateScriptVO);
+            }
+        }
+        returnQues.setQuestionList(ivrLibaTemplateScriptVO);
+        //灏嗛棶棰橈紝鍜屾ā鏉夸俊鎭斁鍒皉edis涓�
+        redisCache.setCacheObject(uuid + "returnQues", returnQues, 120, TimeUnit.MINUTES);
+        redisCache.setCacheObject(uuid + "ivrLibaTemplateVO", ivrLibaTemplateVO, 120, TimeUnit.MINUTES);
+
+        //璋冪敤鏈哄櫒浜虹數璇濓紝寮�濮嬬數璇濓紙闇�瑕佸皢鍥炶皟鏂规硶浼犲叆锛岃繖涓瓑鈥濈數璇濇柟鈥滃憡璇夋�庝箞浼狅紝鐜板湪鍏堢┖鐫�,杩樻湁绗竴鍙ラ棶棰樿瘽鏈級
+        phoneUtils.ob(uuid, null, ivrTaskcall.getPhone(), null, null, null, null, null, null, null, null);
+
+
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java b/ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java
new file mode 100644
index 0000000..9374f8f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.test;
+
+import com.smartor.config.RabbitMqConfig;
+import org.junit.Test;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+
+//@SpringBootTest
+//@RunWith(SpringRunner.class)
+public class MQTest {
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @Test
+    public void testSend() {
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "phone.001", "娴嬭瘯鏁版嵁001");
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "phone.002", "娴嬭瘯鏁版嵁002");
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "phone.003", "娴嬭瘯鏁版嵁003");
+    }
+}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index c96831d..5484465 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -1,26 +1,49 @@
 # 鏁版嵁婧愰厤缃�
 spring:
+  rabbitmq:
+    host: 116.62.18.175
+    password: guest
+    port: 5672
+    username: guest
+    virtual-host: /
+     # 寮�鍚秷鎭彂閫佺‘璁�
+    publisher-confirms: true
+    publisher-returns: true
+    listener:
+      simple:
+        acknowledge-mode: manual
+
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     #    driverClassName: com.mysql.cj.jdbc.Driver
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
+        #        涔変箤浜岄櫌
         #        url: jdbc:mysql://127.0.0.1:3306/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         #        username: root
         #        password: 123456
+
+        #        鍏徃
         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://127.0.0.1:1433;DatabaseName=IntelligentVoice;encrypt=false;SelectMethod=cursor
+      #        username: sa
+      #        password: sfxt#2023
+      #        driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
       # 鍒濆杩炴帴鏁�
       initialSize: 5
       # 鏈�灏忚繛鎺ユ睜鏁伴噺
@@ -93,4 +116,7 @@
 
 accessKeyId: LTAI4G5zjJRkun2eRdzU8GhR
 accessKeySecret: 6EIRr9uZeRobvHBRqskyGwjTLKpHYv
-signName: 鏉窞鍒╂箹绉戞妧
\ No newline at end of file
+signName: 鏉窞鍒╂箹绉戞妧
+
+#鏅鸿兘鍛煎彨
+phoneIP: http://124.220.50.51:8001
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index f18d0ec..60eb4ad 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -71,13 +71,13 @@
       enabled: true
   # redis 閰嶇疆
   redis:
-    # 鍦板潃
-#    host: 127.0.0.1
-    # 绔彛锛岄粯璁や负6379
-#    port: 6379
-#    # 鍦板潃
+    #    # 鍦板潃锛堜箟涔屼簩闄級
+    #    host: 127.0.0.1
+    #    port: 6020
+
+
+    # 鍦板潃锛堝叕鍙革級
     host: 116.62.18.175
-#    # 绔彛锛岄粯璁や负6379
     port: 6020
     # 鏁版嵁搴撶储寮�
     database: 0
diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml
index 5207784..ec516c9 100644
--- a/ruoyi-admin/src/main/resources/logback.xml
+++ b/ruoyi-admin/src/main/resources/logback.xml
@@ -11,7 +11,7 @@
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 	</appender>
-	
+
 	<!-- 绯荤粺鏃ュ織杈撳嚭 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-info.log</file>
@@ -22,8 +22,8 @@
 			<!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
 			<maxHistory>60</maxHistory>
 		</rollingPolicy>
-		<encoder>
-			<pattern>${log.pattern}</pattern>
+		<encoder>l
+			<pattern>${og.pattern}</pattern>
 		</encoder>
 		<filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!-- 杩囨护鐨勭骇鍒� -->
@@ -34,7 +34,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
 	</appender>
-	
+
 	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-error.log</file>
         <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
@@ -56,7 +56,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-	
+
 	<!-- 鐢ㄦ埛璁块棶鏃ュ織杈撳嚭  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${log.path}/sys-user.log</file>
@@ -70,7 +70,7 @@
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
-	
+
 	<!-- 绯荤粺妯″潡鏃ュ織绾у埆鎺у埗  -->
 	<logger name="com.ruoyi" level="info" />
 	<!-- Spring鏃ュ織绾у埆鎺у埗  -->
@@ -79,15 +79,15 @@
 	<root level="info">
 		<appender-ref ref="console" />
 	</root>
-	
+
 	<!--绯荤粺鎿嶄綔鏃ュ織-->
     <root level="debug">
         <appender-ref ref="file_info" />
         <appender-ref ref="file_error" />
     </root>
-	
+
 	<!--绯荤粺鐢ㄦ埛鎿嶄綔鏃ュ織-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
-</configuration> 
\ No newline at end of file
+</configuration>
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 9319230..9299be2 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -186,6 +186,17 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.41</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/HttpRequestException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/HttpRequestException.java
new file mode 100644
index 0000000..59f86de
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/HttpRequestException.java
@@ -0,0 +1,34 @@
+package com.ruoyi.common.exception;
+
+public class HttpRequestException extends RuntimeException {
+    private static final long serialVersionUID = 1158312384059617619L;
+
+    private int code;
+
+    public HttpRequestException() {
+        super();
+    }
+
+    public HttpRequestException(int code, Throwable cause) {
+        super(cause);
+        this.code = code;
+    }
+
+    public HttpRequestException(int code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return super.getMessage();
+    }
+
+    @Override
+    public String getMessage() {
+        return "Error code is " + code + ", msg is " + super.getMessage();
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
index d0f8c69..53136cd 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
@@ -3,21 +3,17 @@
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
+import java.time.*;
 import java.util.Date;
+
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
  * 鏃堕棿宸ュ叿绫�
- * 
+ *
  * @author ruoyi
  */
-public class DateUtils extends org.apache.commons.lang3.time.DateUtils
-{
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String YYYY = "yyyy";
 
     public static String YYYY_MM = "yyyy-MM";
@@ -28,64 +24,50 @@
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
 
-    private static String[] parsePatterns = {
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
-            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
-            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+    private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
     /**
      * 鑾峰彇褰撳墠Date鍨嬫棩鏈�
-     * 
+     *
      * @return Date() 褰撳墠鏃ユ湡
      */
-    public static Date getNowDate()
-    {
+    public static Date getNowDate() {
         return new Date();
     }
 
     /**
      * 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-MM-dd
-     * 
+     *
      * @return String
      */
-    public static String getDate()
-    {
+    public static String getDate() {
         return dateTimeNow(YYYY_MM_DD);
     }
 
-    public static final String getTime()
-    {
+    public static final String getTime() {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
     }
 
-    public static final String dateTimeNow()
-    {
+    public static final String dateTimeNow() {
         return dateTimeNow(YYYYMMDDHHMMSS);
     }
 
-    public static final String dateTimeNow(final String format)
-    {
+    public static final String dateTimeNow(final String format) {
         return parseDateToStr(format, new Date());
     }
 
-    public static final String dateTime(final Date date)
-    {
+    public static final String dateTime(final Date date) {
         return parseDateToStr(YYYY_MM_DD, date);
     }
 
-    public static final String parseDateToStr(final String format, final Date date)
-    {
+    public static final String parseDateToStr(final String format, final Date date) {
         return new SimpleDateFormat(format).format(date);
     }
 
-    public static final Date dateTime(final String format, final String ts)
-    {
-        try
-        {
+    public static final Date dateTime(final String format, final String ts) {
+        try {
             return new SimpleDateFormat(format).parse(ts);
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             throw new RuntimeException(e);
         }
     }
@@ -93,8 +75,7 @@
     /**
      * 鏃ユ湡璺緞 鍗冲勾/鏈�/鏃� 濡�2018/08/08
      */
-    public static final String datePath()
-    {
+    public static final String datePath() {
         Date now = new Date();
         return DateFormatUtils.format(now, "yyyy/MM/dd");
     }
@@ -102,8 +83,7 @@
     /**
      * 鏃ユ湡璺緞 鍗冲勾/鏈�/鏃� 濡�20180808
      */
-    public static final String dateTime()
-    {
+    public static final String dateTime() {
         Date now = new Date();
         return DateFormatUtils.format(now, "yyyyMMdd");
     }
@@ -111,18 +91,13 @@
     /**
      * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈� 鏍煎紡
      */
-    public static Date parseDate(Object str)
-    {
-        if (str == null)
-        {
+    public static Date parseDate(Object str) {
+        if (str == null) {
             return null;
         }
-        try
-        {
+        try {
             return parseDate(str.toString(), parsePatterns);
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             return null;
         }
     }
@@ -130,8 +105,7 @@
     /**
      * 鑾峰彇鏈嶅姟鍣ㄥ惎鍔ㄦ椂闂�
      */
-    public static Date getServerStartDate()
-    {
+    public static Date getServerStartDate() {
         long time = ManagementFactory.getRuntimeMXBean().getStartTime();
         return new Date(time);
     }
@@ -139,16 +113,14 @@
     /**
      * 璁$畻鐩稿樊澶╂暟
      */
-    public static int differentDaysByMillisecond(Date date1, Date date2)
-    {
+    public static int differentDaysByMillisecond(Date date1, Date date2) {
         return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
     }
 
     /**
      * 璁$畻涓や釜鏃堕棿宸�
      */
-    public static String getDatePoor(Date endDate, Date nowDate)
-    {
+    public static String getDatePoor(Date endDate, Date nowDate) {
         long nd = 1000 * 24 * 60 * 60;
         long nh = 1000 * 60 * 60;
         long nm = 1000 * 60;
@@ -169,8 +141,7 @@
     /**
      * 澧炲姞 LocalDateTime ==> Date
      */
-    public static Date toDate(LocalDateTime temporalAccessor)
-    {
+    public static Date toDate(LocalDateTime temporalAccessor) {
         ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
@@ -178,10 +149,29 @@
     /**
      * 澧炲姞 LocalDate ==> Date
      */
-    public static Date toDate(LocalDate temporalAccessor)
-    {
+    public static Date toDate(LocalDate temporalAccessor) {
         LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    /**
+     * 寰�鍓嶆帹澶氬皯鍒嗛挓锛岃幏鍙栧線鍓嶆帹鐨勬椂闂寸偣
+     *
+     * @param minute     鍒嗛挓
+     * @param timeFormat 鏃堕棿鏍煎紡
+     * @return
+     */
+    public static String beforeTime(Long minute, String timeFormat) {
+        if (StringUtils.isEmpty(timeFormat)) {
+            timeFormat = YYYY_MM_DD_HH_MM_SS;
+        }
+        LocalDateTime now = LocalDateTime.now();
+        Duration tenMinutes = Duration.ofMinutes(minute);
+        LocalDateTime tenMinutesAgo = now.minus(tenMinutes);
+        Date date = Date.from(tenMinutesAgo.atZone(ZoneOffset.ofHours(8)).toInstant());
+        SimpleDateFormat dateFormat = new SimpleDateFormat(timeFormat);//鍙互鏂逛究鍦颁慨鏀规棩鏈熸牸寮�
+        String nowTime_10 = dateFormat.format(date);
+        return nowTime_10;
+    }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java
new file mode 100644
index 0000000..dfed36d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java
@@ -0,0 +1,358 @@
+package com.ruoyi.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.util.StringUtil;
+import com.ruoyi.common.exception.HttpRequestException;
+import com.ruoyi.common.utils.http.HttpEntity;
+import com.ruoyi.common.utils.json.JsonRequestBody;
+import com.ruoyi.common.utils.json.JsonResponseBody;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.Charsets;
+import org.apache.commons.httpclient.*;
+import org.apache.commons.httpclient.methods.*;
+import org.apache.commons.httpclient.params.HttpClientParams;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.Assert;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Slf4j
+public class HttpUtil {
+
+    protected static final int DEFAULT_STATUS_ERROR_CODE = 100001;//榛樿http寮傚父鐘舵�佺爜
+
+    protected static final String CONTENT_TYPE = "Content-Type";
+
+    protected static final String APPLICATION_JSON = "application/json";
+    protected static final String APPLICATION_JSON_UTF8 = "application/json; charset=utf-8";
+
+    protected static final String TEXT_XML = "text/xml";
+    protected static final String TEXT_XML_UTF8 = "text/xml; charset=utf-8";
+
+    protected static final int OK = 200;
+
+
+    /**
+     * 绌虹殑鎶ユ枃澶�
+     */
+    protected static final Map<String, String> EMPTY_HEADERS = new HashMap<String, String>(0);
+    /**
+     * 缂栫爜閿欒
+     */
+    protected static final int ENCODING_ERROR_CODE = 999997;
+    /**
+     * HTTP 閿欒: 姝婚攣銆佹枃浠惰繃澶х瓑鏂囦欢
+     */
+    protected static final int HTTP_ERROR_CODE = 999996;
+    /**
+     * IO 閿欒
+     */
+    protected static final int IO_ERROR_CODE = 999995;
+    /**
+     * 鍝嶅簲涓簄ull
+     */
+    protected static final int RESPONSE_NULL_ERROR_CODE = 999994;
+
+    protected static final String USER_IP_KEY = "x-remoteip";
+
+    protected static final String TEXT_NORMAL = "application/x-www-form-urlencoded; charset=utf-8";
+    protected static final HttpClient httpClient = getHttpClient();
+
+    private static final SimpleDateFormat formatHttpData = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
+
+
+    private static HttpClient getHttpClient() {
+        // 姝ゅ杩愮敤杩炴帴姹犳妧鏈��
+        MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager();
+
+        // 璁惧畾鍙傛暟锛氫笌姣忎釜涓绘満鐨勬渶澶ц繛鎺ユ暟
+        manager.getParams().setDefaultMaxConnectionsPerHost(100);
+        // 璁惧畾鍙傛暟锛氬鎴风鐨勬�昏繛鎺ユ暟
+        manager.getParams().setMaxTotalConnections(400);
+        // 璁剧疆杩炴帴瓒呮椂鏃堕棿,鍗曚綅锛氭绉�
+        manager.getParams().setConnectionTimeout(8000);
+        // 璁剧疆璇锋眰璇诲彇瓒呮椂鏃堕棿锛屽崟浣嶏細姣
+        manager.getParams().setSoTimeout(8000);
+        // 璁剧疆浠庤繛鎺ユ睜涓幏鍙栭摼鎺ユ椂闂达紝 鍗曚綅锛氭绉�
+        manager.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, 8000);
+        // 浣跨敤杩炴帴姹犳妧鏈垱寤篐ttpClient瀵硅薄
+        HttpClient httpClient = new HttpClient(manager);
+        return httpClient;
+    }
+
+    public static String postJsonRequest(String url, String request) throws HttpRequestException {
+        Assert.hasLength(url, "璇锋眰url涓嶈兘涓虹┖瀛楃涓层��");
+        EntityEnclosingMethod httpMethod = new PostMethod(url);
+
+        httpMethod.addRequestHeader("Content-Type", "application/json; charset=UTF-8");
+        setHeaderRequestId(httpMethod);
+        try {
+            RequestEntity entity = new StringRequestEntity(request, "application/json", "utf-8");
+            httpMethod.setRequestEntity(entity);
+
+            int resultCode = httpClient.executeMethod(httpMethod);
+            InputStream inputStream = httpMethod.getResponseBodyAsStream();
+            if (inputStream == null) {
+                throw new HttpRequestException(RESPONSE_NULL_ERROR_CODE, "鍝嶅簲涓簄ull");
+            }
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+            StringBuffer stringBuffer = new StringBuffer();
+            String str = "";
+            while ((str = reader.readLine()) != null) {
+                stringBuffer.append(str);
+            }
+            reader.close();
+            String respJson = stringBuffer.toString();
+            // String respJson = httpMethod.getResponseBodyAsString();
+            if (resultCode == OK) {
+                return respJson;
+            } else {
+                throw new HttpRequestException(resultCode, respJson);
+            }
+        } catch (UnsupportedEncodingException e) {
+            throw new HttpRequestException(ENCODING_ERROR_CODE, e);
+        } catch (HttpException e) {
+            throw new HttpRequestException(HTTP_ERROR_CODE, e);
+        } catch (IOException e) {
+            throw new HttpRequestException(IO_ERROR_CODE, e);
+        } finally {
+            if (httpMethod != null) {
+                httpMethod.releaseConnection();
+            }
+        }
+    }
+
+    /**
+     * json鐨刾ost璇锋眰
+     *
+     * @param url           璇锋眰url
+     * @param reqEntity     璇锋眰澶翠笌璇锋眰浣撶殑灏佽
+     * @param respBodyClass 鍝嶅簲浣撶被鍨�
+     * @return 杩斿洖鐨勫搷搴旂粨鏋�
+     */
+    @SuppressWarnings("unchecked")
+    public static <RESPBODY> HttpEntity<RESPBODY> postJsonRequestV2(String url, HttpEntity<?> reqEntity, Class<RESPBODY> respBodyClass) {
+        Assert.hasLength(url, "璇锋眰url涓嶈兘涓虹┖瀛楃涓层��");
+        Assert.notNull(reqEntity, "璇锋眰request涓嶈兘涓簄ull銆�");
+        Assert.notNull(reqEntity.getBody(), "Post璇锋眰body涓嶈兘涓簄ull銆�");
+
+        EntityEnclosingMethod httpMethod = new PostMethod(url);
+        //璁剧疆header淇℃伅
+        Map<String, String> headers = reqEntity.getHeaders();
+        //鑻ヤ紶鍏ユ姤鏂囧ご锛屽垯璁剧疆鍊�
+        if (headers != HttpEntity.EMPTY_HEADERS) {
+            setReqHeaders(headers, httpMethod);
+        }
+
+        //璁剧疆body淇℃伅
+        String reqJson = JSON.toJSONString(reqEntity.getBody());
+
+        String charset = com.google.common.base.Charsets.UTF_8.name();
+        // 鍙戦�佸惈xml娑堟伅浣撶殑瀵硅薄
+        try {
+            RequestEntity entity = new StringRequestEntity(reqJson, APPLICATION_JSON, charset);
+            httpMethod.setRequestEntity(entity);
+
+            // 鎵ц璇锋眰骞舵帴鏀跺搷搴旂爜
+            int resultCode = httpClient.executeMethod(httpMethod);
+            InputStream inputStream = httpMethod.getResponseBodyAsStream();
+            if (inputStream == null) {
+                throw new HttpRequestException(RESPONSE_NULL_ERROR_CODE, "鍝嶅簲涓簄ull");
+            }
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+            StringBuffer stringBuffer = new StringBuffer();
+            String str = "";
+            while ((str = reader.readLine()) != null) {
+                stringBuffer.append(str);
+            }
+            reader.close();
+            String respStr = stringBuffer.toString();
+            //String respStr = httpMethod.getResponseBodyAsString();
+            if (resultCode == OK) {
+                //鍝嶅簲澶�
+                Map<String, String> respHeaders = getRespHeaders(httpMethod);
+                //鍝嶅簲浣�
+                HttpEntity<RESPBODY> rep = null;
+                if (isNullOrEmpty(respStr) || null == respBodyClass) {
+                    rep = new HttpEntity<RESPBODY>(respHeaders, null);
+                    ;// 鏃犲搷搴�
+                } else {
+                    if (respBodyClass != String.class) {
+                        RESPBODY respBody = JSON.parseObject(respStr, respBodyClass);
+                        rep = new HttpEntity<RESPBODY>(respHeaders, respBody);
+                    } else {
+                        rep = new HttpEntity<RESPBODY>(respHeaders, (RESPBODY) respStr);
+                    }
+                }
+                return rep;
+            } else if (resultCode == DEFAULT_STATUS_ERROR_CODE) {
+                JSONObject model = JSON.parseObject(respStr);
+                throw new HttpRequestException(model.getIntValue("code"), model.getString("msg"));
+            } else {
+                throw new HttpRequestException(resultCode, respStr);
+            }
+        } catch (UnsupportedEncodingException e) {
+            throw new HttpRequestException(ENCODING_ERROR_CODE, e);
+        } catch (HttpException e) {
+            throw new HttpRequestException(HTTP_ERROR_CODE, e);
+        } catch (IOException e) {
+            throw new HttpRequestException(IO_ERROR_CODE, e);
+        } finally {
+            if (httpMethod != null) {
+                httpMethod.releaseConnection();
+            }
+        }
+    }
+
+    public static <RESPBODY extends JsonResponseBody> HttpEntity<RESPBODY> postJsonRequest(String url, HttpEntity<? extends JsonRequestBody> reqEntity, Class<RESPBODY> respBodyClass) {
+        Assert.hasLength(url, "璇锋眰url涓嶈兘涓虹┖瀛楃涓层��");
+        Assert.notNull(reqEntity, "璇锋眰request涓嶈兘涓簄ull銆�");
+        Assert.notNull(reqEntity.getBody(), "Post璇锋眰body涓嶈兘涓簄ull銆�");
+
+        EntityEnclosingMethod httpMethod = new PostMethod(url);
+        //璁剧疆header淇℃伅
+        Map<String, String> headers = reqEntity.getHeaders();
+        //鑻ヤ紶鍏ユ姤鏂囧ご锛屽垯璁剧疆鍊�
+        if (headers != HttpEntity.EMPTY_HEADERS) {
+            setReqHeaders(headers, httpMethod);
+        }
+
+        //璁剧疆body淇℃伅
+        String reqJson = JSON.toJSONString(reqEntity.getBody());
+
+        String charset = Charsets.UTF_8.name();
+        // 鍙戦�佸惈xml娑堟伅浣撶殑瀵硅薄
+        try {
+            RequestEntity entity = new StringRequestEntity(reqJson, APPLICATION_JSON, charset);
+            httpMethod.setRequestEntity(entity);
+
+            // 鎵ц璇锋眰骞舵帴鏀跺搷搴旂爜
+            int resultCode = httpClient.executeMethod(httpMethod);
+            InputStream inputStream = httpMethod.getResponseBodyAsStream();
+            if (inputStream == null) {
+                throw new HttpRequestException(RESPONSE_NULL_ERROR_CODE, "鍝嶅簲涓簄ull");
+            }
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+            StringBuffer stringBuffer = new StringBuffer();
+            String str = "";
+            while ((str = reader.readLine()) != null) {
+                stringBuffer.append(str);
+            }
+            reader.close();
+            String respStr = stringBuffer.toString();
+            if (resultCode == OK) {
+                //鍝嶅簲澶�
+                Map<String, String> respHeaders = getRespHeaders(httpMethod);
+                //鍝嶅簲浣�
+                HttpEntity<RESPBODY> rep = null;
+                if (isNullOrEmpty(respStr) || null == respBodyClass) {
+                    rep = new HttpEntity<RESPBODY>(respHeaders, null);
+                    ;// 鏃犲搷搴�
+                } else {
+                    RESPBODY respBody = JSON.parseObject(respStr, respBodyClass);
+                    rep = new HttpEntity<RESPBODY>(respHeaders, respBody);
+                }
+                return rep;
+            } else if (resultCode == DEFAULT_STATUS_ERROR_CODE) {
+                JSONObject model = JSON.parseObject(respStr);
+                throw new HttpRequestException(model.getIntValue("code"), model.getString("msg"));
+            } else {
+                throw new HttpRequestException(resultCode, respStr);
+            }
+        } catch (UnsupportedEncodingException e) {
+            throw new HttpRequestException(ENCODING_ERROR_CODE, e);
+        } catch (HttpException e) {
+            throw new HttpRequestException(HTTP_ERROR_CODE, e);
+        } catch (IOException e) {
+            throw new HttpRequestException(IO_ERROR_CODE, e);
+        } finally {
+            if (httpMethod != null) {
+                httpMethod.releaseConnection();
+            }
+        }
+    }
+
+    public static String postFormRequest(String url, Map<String, String> params) throws HttpRequestException {
+        Assert.hasLength(url, "璇锋眰url涓嶈兘涓虹┖瀛楃涓层��");
+        Assert.notNull(params, "璇锋眰params涓嶈兘涓虹┖銆�");
+
+        PostMethod httpMethod = new PostMethod(url);
+
+        httpMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+
+        try {
+            // 鍙戦�佽姹傚弬鏁�
+            StringBuilder param = new StringBuilder();
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                if (param.length() > 0) {
+                    param.append("&");
+                }
+                param.append(entry.getKey());
+                param.append("=");
+                param.append(entry.getValue());
+            }
+
+            RequestEntity entity = new StringRequestEntity(param.toString(), "application/json", "utf-8");
+            httpMethod.setRequestEntity(entity);
+            // 鎵ц璇锋眰骞舵帴鏀跺搷搴旂爜
+            int resultCode = httpClient.executeMethod(httpMethod);
+
+            String respJson = httpMethod.getResponseBodyAsString();
+            if (resultCode == OK) {
+                return respJson;
+            } else {
+                throw new HttpRequestException(resultCode, respJson);
+            }
+        } catch (UnsupportedEncodingException e) {
+            throw new HttpRequestException(ENCODING_ERROR_CODE, e);
+        } catch (HttpException e) {
+            throw new HttpRequestException(HTTP_ERROR_CODE, e);
+        } catch (IOException e) {
+            throw new HttpRequestException(IO_ERROR_CODE, e);
+        } finally {
+            if (httpMethod != null) {
+                httpMethod.releaseConnection();
+            }
+        }
+    }
+
+    private static Map<String, String> getRespHeaders(HttpMethodBase httpMethod) {
+        //寰楀埌鍝嶅簲澶�
+        Header[] respHeaders = httpMethod.getResponseHeaders();
+        Map<String, String> headers = new HashMap<String, String>(respHeaders.length);
+        for (Header header : respHeaders)
+            headers.put(header.getName(), header.getValue());
+        return headers;
+    }
+
+    protected static void setReqHeaders(Map<String, String> headers, HttpMethodBase httpMethod) {
+        //璁剧疆璇锋眰澶�
+        for (Map.Entry<String, String> header : headers.entrySet()) {
+            httpMethod.addRequestHeader(header.getKey(), header.getValue());
+        }
+    }
+
+    protected static void setHeaderRequestId(HttpMethodBase httpMethod) {
+        //璁剧疆璇锋眰澶�
+        ServletRequestAttributes req = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (null != req) {
+            String requestId = req.getRequest().getHeader("x-request-id");
+            if (StringUtil.isNotEmpty(requestId)) {
+                httpMethod.addRequestHeader("x-request-id", requestId);
+                log.info("header涓瓁-request-id鍊间负:{}", requestId);
+            }
+        }
+    }
+
+    private static boolean isNullOrEmpty(String obj) {
+        if (obj == null || obj.isEmpty()) {
+            return true;
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
index ed4cbc9..12f2798 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
@@ -11,6 +11,7 @@
 import java.nio.charset.StandardCharsets;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import com.ruoyi.common.config.RuoYiConfig;
@@ -21,44 +22,35 @@
 
 /**
  * 鏂囦欢澶勭悊宸ュ叿绫�
- * 
+ *
  * @author ruoyi
  */
-public class FileUtils
-{
+public class FileUtils {
     public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
 
     /**
      * 杈撳嚭鎸囧畾鏂囦欢鐨刡yte鏁扮粍
-     * 
+     *
      * @param filePath 鏂囦欢璺緞
-     * @param os 杈撳嚭娴�
+     * @param os       杈撳嚭娴�
      * @return
      */
-    public static void writeBytes(String filePath, OutputStream os) throws IOException
-    {
+    public static void writeBytes(String filePath, OutputStream os) throws IOException {
         FileInputStream fis = null;
-        try
-        {
+        try {
             File file = new File(filePath);
-            if (!file.exists())
-            {
+            if (!file.exists()) {
                 throw new FileNotFoundException(filePath);
             }
             fis = new FileInputStream(file);
             byte[] b = new byte[1024];
             int length;
-            while ((length = fis.read(b)) > 0)
-            {
+            while ((length = fis.read(b)) > 0) {
                 os.write(b, 0, length);
             }
-        }
-        catch (IOException e)
-        {
+        } catch (IOException e) {
             throw e;
-        }
-        finally
-        {
+        } finally {
             IOUtils.close(os);
             IOUtils.close(fis);
         }
@@ -71,33 +63,28 @@
      * @return 鐩爣鏂囦欢
      * @throws IOException IO寮傚父
      */
-    public static String writeImportBytes(byte[] data) throws IOException
-    {
+    public static String writeImportBytes(byte[] data) throws IOException {
         return writeBytes(data, RuoYiConfig.getImportPath());
     }
 
     /**
      * 鍐欐暟鎹埌鏂囦欢涓�
      *
-     * @param data 鏁版嵁
+     * @param data      鏁版嵁
      * @param uploadDir 鐩爣鏂囦欢
      * @return 鐩爣鏂囦欢
      * @throws IOException IO寮傚父
      */
-    public static String writeBytes(byte[] data, String uploadDir) throws IOException
-    {
+    public static String writeBytes(byte[] data, String uploadDir) throws IOException {
         FileOutputStream fos = null;
         String pathName = "";
-        try
-        {
+        try {
             String extension = getFileExtendName(data);
             pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
             File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName);
             fos = new FileOutputStream(file);
             fos.write(data);
-        }
-        finally
-        {
+        } finally {
             IOUtils.close(fos);
         }
         return FileUploadUtils.getPathFileName(uploadDir, pathName);
@@ -105,17 +92,15 @@
 
     /**
      * 鍒犻櫎鏂囦欢
-     * 
+     *
      * @param filePath 鏂囦欢
      * @return
      */
-    public static boolean deleteFile(String filePath)
-    {
+    public static boolean deleteFile(String filePath) {
         boolean flag = false;
         File file = new File(filePath);
         // 璺緞涓烘枃浠朵笖涓嶄负绌哄垯杩涜鍒犻櫎
-        if (file.isFile() && file.exists())
-        {
+        if (file.isFile() && file.exists()) {
             flag = file.delete();
         }
         return flag;
@@ -123,32 +108,28 @@
 
     /**
      * 鏂囦欢鍚嶇О楠岃瘉
-     * 
+     *
      * @param filename 鏂囦欢鍚嶇О
      * @return true 姝e父 false 闈炴硶
      */
-    public static boolean isValidFilename(String filename)
-    {
+    public static boolean isValidFilename(String filename) {
         return filename.matches(FILENAME_PATTERN);
     }
 
     /**
      * 妫�鏌ユ枃浠舵槸鍚﹀彲涓嬭浇
-     * 
+     *
      * @param resource 闇�瑕佷笅杞界殑鏂囦欢
      * @return true 姝e父 false 闈炴硶
      */
-    public static boolean checkAllowDownload(String resource)
-    {
+    public static boolean checkAllowDownload(String resource) {
         // 绂佹鐩綍涓婅烦绾у埆
-        if (StringUtils.contains(resource, ".."))
-        {
+        if (StringUtils.contains(resource, "..")) {
             return false;
         }
 
         // 妫�鏌ュ厑璁镐笅杞界殑鏂囦欢瑙勫垯
-        if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource)))
-        {
+        if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) {
             return true;
         }
 
@@ -158,33 +139,25 @@
 
     /**
      * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮�
-     * 
-     * @param request 璇锋眰瀵硅薄
+     *
+     * @param request  璇锋眰瀵硅薄
      * @param fileName 鏂囦欢鍚�
      * @return 缂栫爜鍚庣殑鏂囦欢鍚�
      */
-    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
-    {
+    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
         final String agent = request.getHeader("USER-AGENT");
         String filename = fileName;
-        if (agent.contains("MSIE"))
-        {
+        if (agent.contains("MSIE")) {
             // IE娴忚鍣�
             filename = URLEncoder.encode(filename, "utf-8");
             filename = filename.replace("+", " ");
-        }
-        else if (agent.contains("Firefox"))
-        {
+        } else if (agent.contains("Firefox")) {
             // 鐏嫄娴忚鍣�
             filename = new String(fileName.getBytes(), "ISO8859-1");
-        }
-        else if (agent.contains("Chrome"))
-        {
+        } else if (agent.contains("Chrome")) {
             // google娴忚鍣�
             filename = URLEncoder.encode(filename, "utf-8");
-        }
-        else
-        {
+        } else {
             // 鍏跺畠娴忚鍣�
             filename = URLEncoder.encode(filename, "utf-8");
         }
@@ -194,20 +167,14 @@
     /**
      * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮�
      *
-     * @param response 鍝嶅簲瀵硅薄
+     * @param response     鍝嶅簲瀵硅薄
      * @param realFileName 鐪熷疄鏂囦欢鍚�
      */
-    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
-    {
+    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
         String percentEncodedFileName = percentEncode(realFileName);
 
         StringBuilder contentDispositionValue = new StringBuilder();
-        contentDispositionValue.append("attachment; filename=")
-                .append(percentEncodedFileName)
-                .append(";")
-                .append("filename*=")
-                .append("utf-8''")
-                .append(percentEncodedFileName);
+        contentDispositionValue.append("attachment; filename=").append(percentEncodedFileName).append(";").append("filename*=").append("utf-8''").append(percentEncodedFileName);
 
         response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
         response.setHeader("Content-disposition", contentDispositionValue.toString());
@@ -220,36 +187,26 @@
      * @param s 闇�瑕佺櫨鍒嗗彿缂栫爜鐨勫瓧绗︿覆
      * @return 鐧惧垎鍙风紪鐮佸悗鐨勫瓧绗︿覆
      */
-    public static String percentEncode(String s) throws UnsupportedEncodingException
-    {
+    public static String percentEncode(String s) throws UnsupportedEncodingException {
         String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
         return encode.replaceAll("\\+", "%20");
     }
 
     /**
      * 鑾峰彇鍥惧儚鍚庣紑
-     * 
+     *
      * @param photoByte 鍥惧儚鏁版嵁
      * @return 鍚庣紑鍚�
      */
-    public static String getFileExtendName(byte[] photoByte)
-    {
+    public static String getFileExtendName(byte[] photoByte) {
         String strFileExtendName = "jpg";
-        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
-                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
-        {
+        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) {
             strFileExtendName = "gif";
-        }
-        else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
-        {
+        } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) {
             strFileExtendName = "jpg";
-        }
-        else if ((photoByte[0] == 66) && (photoByte[1] == 77))
-        {
+        } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
             strFileExtendName = "bmp";
-        }
-        else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
-        {
+        } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) {
             strFileExtendName = "png";
         }
         return strFileExtendName;
@@ -257,14 +214,12 @@
 
     /**
      * 鑾峰彇鏂囦欢鍚嶇О /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png
-     * 
+     *
      * @param fileName 璺緞鍚嶇О
      * @return 娌℃湁鏂囦欢璺緞鐨勫悕绉�
      */
-    public static String getName(String fileName)
-    {
-        if (fileName == null)
-        {
+    public static String getName(String fileName) {
+        if (fileName == null) {
             return null;
         }
         int lastUnixPos = fileName.lastIndexOf('/');
@@ -275,14 +230,12 @@
 
     /**
      * 鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О /profile/upload/2022/04/16/ruoyi.png -- ruoyi
-     * 
+     *
      * @param fileName 璺緞鍚嶇О
      * @return 娌℃湁鏂囦欢璺緞鍜屽悗缂�鐨勫悕绉�
      */
-    public static String getNameNotSuffix(String fileName)
-    {
-        if (fileName == null)
-        {
+    public static String getNameNotSuffix(String fileName) {
+        if (fileName == null) {
             return null;
         }
         String baseName = FilenameUtils.getBaseName(fileName);
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpBody.java
new file mode 100644
index 0000000..192036d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpBody.java
@@ -0,0 +1,6 @@
+package com.ruoyi.common.utils.http;
+
+
+public interface HttpBody {
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpEntity.java
new file mode 100644
index 0000000..3465070
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpEntity.java
@@ -0,0 +1,40 @@
+package com.ruoyi.common.utils.http;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class HttpEntity<T> {
+
+    /**
+     * 绌虹殑鎶ユ枃澶�
+     */
+    public static final Map<String, String> EMPTY_HEADERS = new HashMap<String, String>(0);
+
+    /**
+     * 鎶ユ枃澶�
+     */
+    private final Map<String, String> headers;
+
+    /**
+     * 鎶ユ枃浣�
+     */
+    private final T body;
+
+    public HttpEntity(Map<String, String> headers, T body) {
+        this.headers = headers;
+        this.body = body;
+    }
+
+    public HttpEntity(T body) {
+        this.headers = EMPTY_HEADERS;
+        this.body = body;
+    }
+
+    public Map<String, String> getHeaders() {
+        return headers;
+    }
+
+    public T getBody() {
+        return body;
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonRequestBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonRequestBody.java
new file mode 100644
index 0000000..5d4181f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonRequestBody.java
@@ -0,0 +1,11 @@
+package com.ruoyi.common.utils.json;
+
+
+import com.ruoyi.common.utils.http.HttpBody;
+
+/**
+ * Json鏍煎紡鐨刪ttp璇锋眰body
+*/
+public interface JsonRequestBody extends HttpBody {
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonResponseBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonResponseBody.java
new file mode 100644
index 0000000..c6e0e9f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/json/JsonResponseBody.java
@@ -0,0 +1,11 @@
+package com.ruoyi.common.utils.json;
+
+
+import com.ruoyi.common.utils.http.HttpBody;
+
+/**
+ * Json鏍煎紡鐨刪ttp鍝嶅簲body
+*/
+public interface JsonResponseBody extends HttpBody {
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlRequestBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlRequestBody.java
new file mode 100644
index 0000000..3a54d40
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlRequestBody.java
@@ -0,0 +1,10 @@
+package com.ruoyi.common.utils.xml;
+
+import com.ruoyi.common.utils.http.HttpBody;
+
+/**
+ * xml鏍煎紡鐨刪ttp璇锋眰浣�
+*/
+public interface XmlRequestBody extends HttpBody {
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlResponseBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlResponseBody.java
new file mode 100644
index 0000000..6bd1a49
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/xml/XmlResponseBody.java
@@ -0,0 +1,10 @@
+package com.ruoyi.common.utils.xml;
+
+import com.ruoyi.common.utils.http.HttpBody;
+
+/**
+ * xml鏍煎紡鐨刪ttp鍝嶅簲浣�
+*/
+public interface XmlResponseBody extends HttpBody {
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 6a0d547..c3883d0 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -108,7 +108,7 @@
                 // 杩囨护璇锋眰
                 .authorizeRequests()
                 // 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶
-                .antMatchers("/login", "/register", "/captchaImage", "/qrcode/generateStaticHtml", "/qrcode/getQRcode", "/qrcode/getFormDate", "/chat", "/system/file/admin/uploadFile", "/smartor/dingtalk/sendNotification", "/patient/read/patientInfo","/socket","/API_ESB_Service","/API_ESB_Service/Run","/magic/web/**").permitAll()
+                .antMatchers("/login", "/register", "/captchaImage", "/qrcode/generateStaticHtml", "/qrcode/getQRcode", "/qrcode/getFormDate", "/chat", "/system/file/admin/uploadFile", "/smartor/dingtalk/sendNotification", "/patient/read/patientInfo","/socket","/API_ESB_Service","/API_ESB_Service/Run","/magic/web/**","/smartor/taskcall/phoneCallBack").permitAll()
                 // 闈欐�佽祫婧愶紝鍙尶鍚嶈闂�
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                 // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇�
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
index 3c95c18..a4c600b 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
@@ -124,7 +124,7 @@
      */
     @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
+    @PostMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException {
         SysJob newJob = jobService.selectJobById(job.getJobId());
         newJob.setStatus(job.getStatus());
@@ -136,7 +136,7 @@
      */
     @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping("/run")
+    @PostMapping("/run")
     public AjaxResult run(@RequestBody SysJob job) throws SchedulerException {
         boolean result = jobService.run(job);
         return result ? success() : error("浠诲姟涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紒");
@@ -147,7 +147,7 @@
      */
     @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{jobIds}")
+    @GetMapping("/remove/{jobIds}")
     public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException {
         jobService.deleteJobByIds(jobIds);
         return success();
diff --git a/smartor/pom.xml b/smartor/pom.xml
index abede7c..cb88cb8 100644
--- a/smartor/pom.xml
+++ b/smartor/pom.xml
@@ -114,6 +114,12 @@
             <artifactId>json-simple</artifactId>
             <version>1.1.1</version>
         </dependency>
+
+        <!-- rabbitmq 渚濊禆-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
     </dependencies>
 
 
diff --git a/smartor/src/main/java/com/smartor/config/PhoneUtils.java b/smartor/src/main/java/com/smartor/config/PhoneUtils.java
new file mode 100644
index 0000000..a1ca8d3
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/config/PhoneUtils.java
@@ -0,0 +1,275 @@
+package com.smartor.config;
+
+import com.ruoyi.common.utils.HttpUtil;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.http.HttpEntity;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.mail.Multipart;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class PhoneUtils {
+
+    @Value("${phoneIP}")
+    private String phoneIP;
+
+    /**
+     * 娣诲姞鍒嗘満add_user
+     */
+    public String addUser(String user, String pwd) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", user);
+        map.put("password", pwd);
+        return sendReq(map, "/tel/ai_api/add_user");
+    }
+
+    /**
+     * 鍒犻櫎鍒嗘満delete_user
+     *
+     * @return
+     */
+    public String delUser(String user) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", user);
+        return sendReq(map, "/tel/ai_api/delete_user");
+    }
+
+    /**
+     * 3銆佹鏌ュ垎鏈烘槸鍚﹀瓨鍦╟heck_user
+     *
+     * @return
+     */
+    public String checkUser(String user) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", user);
+        return sendReq(map, "/tel/ai_api/check_user");
+    }
+
+
+    /**
+     * 鍒楀嚭鍏ㄩ儴鍧愬腑鎴栬�呮寚瀹氬潗甯� list_agent
+     *
+     * @param name
+     * @return
+     */
+    public String listAgent(String name) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        return sendReq(map, "/tel/ai_api/list_agent");
+    }
+
+    /**
+     * 娣诲姞鍧愬腑add_agent
+     * 鍚戠郴缁熶腑娣诲姞涓�涓潗甯紝鍚庣画闇�瑕乻et_agent_state,set_agent_status,set_agent_contact, tier_add 璁剧疆鍧愬腑鐘朵綋,sip_uri鍜屾妸鍧愬腑鍔犲叆/缁戝畾涓�涓懠鍙槦鍒�
+     *
+     * @param name
+     * @return
+     */
+    public String addAgent(String name, String type) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        if (StringUtils.isEmpty(type)) map.put("type", "callback");
+
+        return sendReq(map, "/tel/ai_api/add_agent");
+    }
+
+    /**
+     * 鍒犻櫎鍧愬腑del_agent
+     * 浠庡懠鍙槦鍒楀垹闄ゅ潗甯�
+     *
+     * @param name
+     * @return
+     */
+    public String delAgent(String name) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        return sendReq(map, "/tel/ai_api/del_agent");
+    }
+
+    /**
+     * 鑾峰彇鍧愬腑褰撳墠鎵�鍦ㄩ�氳瘽鐨剈uid
+     *
+     * @param name
+     * @return
+     */
+    public String getAgentUUID(String name) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        return sendReq(map, "/tel/ai_api/get_agent_uuid");
+    }
+
+    /**
+     * 娣诲姞鍧愬腑鍚�(add_agent)锛岄渶瑕佽缃潗甯湴鍧�(sip uri)锛屽潗甯墠鍙互琚闂埌
+     *
+     * @param name
+     * @param contact
+     * @return
+     */
+    public String setAgentUUID(String name, String contact) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        map.put("contact", contact);
+        return sendReq(map, "/tel/ai_api/set_agent_contact");
+    }
+
+    /**
+     * 璁剧疆鍧愬腑鐨剆tatus锛屾湁鍥哄畾鍑犱釜鐘舵��
+     *
+     * @param name
+     * @param status
+     * @return
+     */
+    public String setAgentStatus(String name, String status) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        map.put("status", status);
+        return sendReq(map, "/tel/ai_api/set_agent_status");
+    }
+
+    /**
+     * 鑾峰彇鍧愬腑鐘舵��
+     *
+     * @param name
+     * @return
+     */
+    public String getAgentStatus(String name) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        return sendReq(map, "/tel/ai_api/get_agent_status");
+    }
+
+
+    /**
+     * 璁捐缃潗甯�
+     *
+     * @param name
+     * @param state
+     * @return
+     */
+    public String setAgentState(String name, String state) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        map.put("state", state);
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+    /**
+     * 鑾峰彇鍧愬腑鐘舵��
+     *
+     * @param name
+     * @return
+     */
+    public String getAgentState(String name) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", name);
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+    /**
+     * 鎵嬪姩澶栧懠
+     *
+     * @return
+     */
+    public String manualOutbound(String kg_uuid, String kg_file, String data, String app_id, String ani, String special_ch, String sign, String extension, String dnis, Boolean force_call) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("kg_uuid", kg_uuid);
+        map.put("kg_file", kg_file);
+        map.put("data", data);
+        map.put("app_id", app_id);
+        map.put("ani", ani);
+        map.put("special_ch", special_ch);
+        map.put("sign", sign);
+        map.put("extension", extension);
+        map.put("dnis", dnis);
+        map.put("force_call", force_call);
+        if (force_call == null) map.put("force_call", true);
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+    /**
+     * tts鍚堟垚鍜屾挱鏀�
+     *
+     * @param fileText
+     * @param uuid
+     * @return
+     */
+    public String ttsPlayback(String fileText, String uuid) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("text", fileText);
+        map.put("uuid", uuid);
+
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+    /**
+     * wav鏂囦欢鎾斁鎺ュ彛
+     *
+     * @param wav_file
+     * @param uuid
+     * @return
+     */
+    public String manualOutbound(Multipart wav_file, String uuid) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("wav_file", wav_file);
+        map.put("uuid", uuid);
+
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+    /**
+     * 鏈哄櫒浜哄鍛� ob
+     *
+     * @return
+     */
+    public String ob(String kg_uuid, String kg_file, String data, String app_id, String ani, String special_ch, String sign, String extension, String dnis, Boolean call_uuid, Boolean force_call) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("kg_uuid", kg_uuid);
+        map.put("kg_file", kg_file);
+        map.put("data", data);
+        map.put("app_id", app_id);
+        map.put("ani", ani);
+        map.put("special_ch", special_ch);
+        map.put("sign", sign);
+        map.put("extension", extension);
+        map.put("dnis", dnis);
+        map.put("call_uuid", call_uuid);
+        map.put("force_call", force_call);
+        if (force_call == null) map.put("force_call", true);
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+
+    /**
+     * 鎸傛柇閫氳瘽
+     *
+     * @return
+     */
+    public String hangup(String kg_uuid, String dnis, String data, String app_id, String ani, String special_ch, String sign, Boolean call_uuid) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("kg_uuid", kg_uuid);
+        map.put("data", data);
+        map.put("app_id", app_id);
+        map.put("ani", ani);
+        map.put("special_ch", special_ch);
+        map.put("sign", sign);
+        map.put("dnis", dnis);
+        map.put("call_uuid", call_uuid);
+        return sendReq(map, "/tel/ai_api/set_agent_state");
+    }
+
+    private String sendReq(Map<String, Object> map, String path) {
+        HttpEntity<Map<String, Object>> req = new HttpEntity<>(getHead(), map);
+        HttpEntity<String> stringHttpEntity = HttpUtil.postJsonRequestV2(phoneIP + path, req, String.class);
+        return stringHttpEntity.getBody();
+    }
+
+    private Map<String, String> getHead() {
+        HashMap<String, String> header = new HashMap<>();
+        header.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko");
+        header.put("Content-Type", "application/json");
+        return header;
+    }
+}
diff --git a/smartor/src/main/java/com/smartor/config/RabbitMqConfig.java b/smartor/src/main/java/com/smartor/config/RabbitMqConfig.java
new file mode 100644
index 0000000..aab306a
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/config/RabbitMqConfig.java
@@ -0,0 +1,91 @@
+package com.smartor.config;
+
+import org.springframework.amqp.core.*;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class RabbitMqConfig {
+//    public static final String EXCHANGE_NAME = "phone_topic_exchange2";
+//    public static final String QUEUE_NAME = "phone_queue";
+    //
+//    /**
+//     * topic浜ゆ崲鏈�,骞舵寔涔呭寲
+//     */
+//    @Bean(EXCHANGE_NAME)
+//    public Exchange phoneExchange() {
+//        Map<String, Object> arguments = new HashMap<>();
+//        //鎸囧畾閫氫俊鏂瑰紡涓簍opic
+//        arguments.put("x-delayed-type", "topic");
+//        //浣跨敤CustomExchange绫诲垱寤猴紝绫诲瀷瑕佹寚瀹氫负鈥渪-delayed-message鈥濈被鍨�
+//        Exchange exchange = new CustomExchange(EXCHANGE_NAME, "x-delayed-message", true, false, arguments);
+//        return exchange;
+//
+////
+////        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
+//    }
+//
+//
+//    /**
+//     * 闃熷垪
+//     */
+//    @Bean(QUEUE_NAME)
+//    public Queue phoneQueue() {
+//        return QueueBuilder.durable(QUEUE_NAME).build();
+//    }
+//
+//    /**
+//     * 浜ゆ崲鏈轰笌闃熷垪鐨勭粦瀹�
+//     */
+//    @Bean
+//    public Binding bindQueueExchange(@Qualifier(QUEUE_NAME) Queue phoneQueue, @Qualifier(EXCHANGE_NAME) Exchange phoneExchange) {
+//        return BindingBuilder.bind(phoneQueue).to(phoneExchange).with(" phone.#").noargs();
+//    }
+//瀹氫箟寤惰繜闃熷垪
+    public static final String phone_queue = "phone_queue";
+    //瀹氫箟寤惰繜浜ゆ崲鏈�
+    public static final String phone_exchange = "phone_exchange";
+    //瀹氫箟璺敱閿�
+    public static final String routing_key = "phone.123";
+
+
+    /**
+     * 瀹氫箟寤惰繜闃熷垪
+     *
+     * @return
+     */
+    @Bean
+    public Queue delayQueue() {
+        return new Queue(phone_queue, true);
+    }
+
+    /**
+     * 寤舵椂闃熷垪浜ゆ崲鏈�
+     * 浜ゆ崲鏈虹被鍨嬶細CustomExchange
+     *
+     * @return
+     */
+    @Bean
+    public CustomExchange delayExchange() {
+        Map<String, Object> args = new HashMap<>();
+        args.put("x-delayed-type", "topic");
+        return new CustomExchange(phone_exchange, "x-delayed-message", true, false, args);
+    }
+
+    /**
+     * 涓哄欢杩熼槦鍒楃粦瀹氫氦鎹㈡満
+     *
+     * @param queue
+     * @param exchange
+     * @return
+     */
+    @Bean
+    public Binding delayBinding(Queue queue, CustomExchange exchange) {
+        return BindingBuilder.bind(queue).to(exchange).with(routing_key).noargs();
+    }
+
+}
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplate.java b/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplate.java
index 6f05635..e3561a6 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplate.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplate.java
@@ -27,7 +27,7 @@
      * 涓婚敭id
      */
     @ApiModelProperty("涓婚敭id")
-    private String ID;
+    private Long ID;
 
     /**
      * 妯$増鍚嶅瓧
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplatescript.java b/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplatescript.java
index 0bbc10d..728c4fc 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplatescript.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaExtemplatescript.java
@@ -1,6 +1,8 @@
 package com.smartor.domain;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -26,14 +28,14 @@
      * 涓婚敭id
      */
     @ApiModelProperty("涓婚敭id")
-    private String ID;
+    private Long ID;
 
     /**
      * 妯$増搴搃d
      */
     @Excel(name = "妯$増搴搃d")
     @ApiModelProperty("妯$増搴搃d")
-    private String extID;
+    private Long extID;
 
     /**
      * 搴忓彿id
@@ -57,12 +59,34 @@
     private String switchWav;
 
     /**
-     * 鍖归厤瑙勫垯
+     * 鍖归厤瑙勫垯(鍖呭惈鍏崇郴)
      */
-    @Excel(name = "鍖归厤瑙勫垯")
-    @ApiModelProperty("鍖归厤瑙勫垯")
+    @Excel(name = "鍖归厤瑙勫垯(鍖呭惈鍏崇郴)")
+    @ApiModelProperty("鍖归厤瑙勫垯(鍖呭惈鍏崇郴)")
     private String selfRegex;
 
+    /**
+     * 鍖归厤瑙勫垯(涓嶅寘鍚叧绯�)
+     */
+    @Excel(name = "鍖归厤瑙勫垯(涓嶅寘鍚叧绯�)")
+    @ApiModelProperty("鍖归厤瑙勫垯(涓嶅寘鍚叧绯�)")
+    private String selfRegex2;
+
+
+
+    @Excel(name = "姝e垯鍏抽敭瀛楅泦鍚�(鍚�)")
+    private String nodynamiccruxsJson;
+
+    @Excel(name = "姝e垯鍏抽敭瀛楅泦鍚�(涓嶅惈)")
+    private String dynamiccruxsJson;
+
+    @ApiModelProperty(value = "姝e垯鍏抽敭瀛�(鍚�)")
+    @Excel(name = "姝e垯鍏抽敭瀛�(鍚�)")
+    private List<String> nodynamiccruxs = new ArrayList<>();
+
+    @ApiModelProperty(value = "姝e垯鍏抽敭瀛�(涓嶅惈)")
+    @Excel(name = "姝e垯鍏抽敭瀛�(涓嶅惈)")
+    private List<String> dynamiccruxs = new ArrayList<>();
     /**
      * 鍚敤
      */
@@ -106,6 +130,13 @@
     private Long pid;
 
     /**
+     * 鏄惁缁撴潫 0锛氫笉缁撴潫   1锛氱粨鏉�
+     */
+    @Excel(name = "鏄惁缁撴潫 0锛氫笉缁撴潫   1锛氱粨鏉�")
+    @ApiModelProperty("鏄惁缁撴潫 0锛氫笉缁撴潫   1锛氱粨鏉�")
+    private Long isEnd;
+
+    /**
      * GUID
      */
     @Excel(name = "GUID")
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaScriptTargetoption.java b/smartor/src/main/java/com/smartor/domain/IvrLibaScriptTargetoption.java
index 3641da1..b122d5a 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaScriptTargetoption.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaScriptTargetoption.java
@@ -277,11 +277,7 @@
     }
 
     public void setNodynamiccruxsJson(String nodynamiccruxsJson) {
-        if (this.nodynamiccruxs != null) {
-            this.nodynamiccruxsJson = new Gson().toJson(this.nodynamiccruxs);
-        } else {
-            this.nodynamiccruxsJson = nodynamiccruxsJson;
-        }
+        this.nodynamiccruxsJson = nodynamiccruxsJson;
     }
 
     public String getDynamiccruxsJson() {
@@ -289,11 +285,7 @@
     }
 
     public void setDynamiccruxsJson(String dynamiccruxsJson) {
-        if (this.dynamiccruxs != null) {
-            this.dynamiccruxsJson = new Gson().toJson(this.dynamiccruxs);
-        } else {
-            this.dynamiccruxsJson = dynamiccruxsJson;
-        }
+        this.dynamiccruxsJson = dynamiccruxsJson;
     }
 
     public List<String> getNodynamiccruxs() {
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaTargetoption.java b/smartor/src/main/java/com/smartor/domain/IvrLibaTargetoption.java
index efa9a8b..d73bac6 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaTargetoption.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaTargetoption.java
@@ -69,12 +69,12 @@
     @ApiModelProperty(value = "姝e垯鍏抽敭瀛�(鍚�)")
     @Excel(name = "姝e垯鍏抽敭瀛�(鍚�)")
     @JsonFormat
-    private List<String> nodynamiccruxs=new ArrayList<>();
+    private List<String> nodynamiccruxs = new ArrayList<>();
 
     @ApiModelProperty(value = "姝e垯鍏抽敭瀛�(涓嶅惈)")
     @Excel(name = "姝e垯鍏抽敭瀛�(涓嶅惈)")
     @JsonFormat
-    private List<String> dynamiccruxs=new ArrayList<>();
+    private List<String> dynamiccruxs = new ArrayList<>();
 
     @ApiModelProperty(value = "閫夐」鎻忚堪")
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
@@ -235,11 +235,7 @@
     }
 
     public void setNodynamiccruxsJson(String nodynamiccruxsJson) {
-        if (this.nodynamiccruxs != null) {
-            this.nodynamiccruxsJson = new Gson().toJson(this.nodynamiccruxs);
-        } else {
-            this.nodynamiccruxsJson = nodynamiccruxsJson;
-        }
+        this.nodynamiccruxsJson = nodynamiccruxsJson;
     }
 
     public String getDynamiccruxsJson() {
@@ -247,11 +243,7 @@
     }
 
     public void setDynamiccruxsJson(String dynamiccruxsJson) {
-        if (this.dynamiccruxs != null) {
-            this.dynamiccruxsJson = new Gson().toJson(this.dynamiccruxs);
-        } else {
-            this.dynamiccruxsJson = dynamiccruxsJson;
-        }
+        this.dynamiccruxsJson = dynamiccruxsJson;
     }
 
     public List<String> getNodynamiccruxs() {
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplate.java b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplate.java
index 0659c20..bf0404d 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplate.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplate.java
@@ -1,6 +1,8 @@
 package com.smartor.domain;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -152,8 +154,8 @@
     /**
      * 閫氱敤鍖归厤璇濇湳id
      */
-    @Excel(name = "閫氱敤鍖归厤璇濇湳id")
-    @ApiModelProperty(value = "閫氱敤鍖归厤璇濇湳id")
+    @Excel(name = "閫氱敤鍖归厤璇濇湳id锛堥�氱敤妯℃澘ID锛�")
+    @ApiModelProperty(value = "閫氱敤鍖归厤璇濇湳id锛堥�氱敤妯℃澘ID锛�")
     private String submoduleID;
 
     /**
@@ -248,6 +250,13 @@
     private Long mateNum;
 
     /**
+     * 闈欓粯娆℃暟
+     */
+    @Excel(name = "闈欓粯娆℃暟")
+    @ApiModelProperty(value = "闈欓粯娆℃暟")
+    private Long noVoiceNum = 0L;
+
+    /**
      * GUID
      */
     @Excel(name = "GUID")
@@ -313,17 +322,18 @@
     private String otherdata;
 
     /**
-     * 闅忚鍓�
+     * 闅忚鍓嶈瘽鏈紙寮�鍦虹櫧锛�
      */
-    @Excel(name = "闅忚鍓�")
-    @ApiModelProperty(value = "闅忚鍓�")
+    @Excel(name = "闅忚鍓嶈瘽鏈紙寮�鍦虹櫧锛�")
+    @ApiModelProperty(value = "闅忚鍓嶈瘽鏈紙寮�鍦虹櫧锛�")
     private String revisitBefore;
 
     /**
      * 闅忚鍚�
      */
-    @Excel(name = "闅忚鍚�")
-    @ApiModelProperty(value = "闅忚鍚�")
+    @Excel(name = "闅忚鍚庤瘽鏈紙缁撴潫璇級")
+    @ApiModelProperty(value = "闅忚鍚庤瘽鏈紙缁撴潫璇級")
     private String revisitAfter;
 
+
 }
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java
index eaa6c19..c083778 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java
@@ -222,10 +222,16 @@
     private Integer targettype;
 
     /**
+     * 涓嬩竴棰�
+     */
+    @ApiModelProperty(value = "涓嬩竴棰�")
+    private Integer nextQuestion;
+
+    /**
      * 鏄惁瀛樺湪鎿嶄綔锛�1 鏂板 2淇敼 3鍒犻櫎
      */
     @ApiModelProperty(value = "鎸囨爣ID")
-    private Long targetid;
+    private Integer targetid;
 
 
     /**
@@ -233,4 +239,11 @@
      */
     @ApiModelProperty(value = "鎸囨爣鍊�")
     private Integer targetvalue;
+
+    /**
+     * 鏍囩
+     */
+    @Excel(name = "鍏跺畠鏁版嵁锛堝瓨鍌ㄥ彉閲忥級")
+    @ApiModelProperty(value = "鍏跺畠鏁版嵁锛堝瓨鍌ㄥ彉閲忥級")
+    private String otherdata;
 }
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java
index 1c2d09a..abcc5cf 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java
@@ -217,7 +217,7 @@
     /**
      * 鍩虹鎸囨爣id
      */
-    @ApiModelProperty(value = "鍩虹鎸囨爣id")
+    @ApiModelProperty(value = "鍩虹鎸囨爣id(鏆傛椂褰撴湰棰樺簭鍙�)")
     private Integer targetid;
 
 
@@ -235,6 +235,19 @@
     private String questiontitle;
 
     /**
+     * 涓嬩竴棰�
+     */
+    @ApiModelProperty(value = "涓嬩竴棰�")
+    private Integer nextQuestion;
+
+    /**
+     * 鏍囩
+     */
+    @Excel(name = "鍏跺畠鏁版嵁锛堝瓨鍌ㄥ彉閲忥級")
+    @ApiModelProperty(value = "鍏跺畠鏁版嵁锛堝瓨鍌ㄥ彉閲忥級")
+    private String otherdata;
+
+    /**
      * 璇濇湳閫夐」
      */
     @ApiModelProperty(value = "璇濇湳閫夐」")
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateTargetoption.java b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateTargetoption.java
index ec922fa..c07d1f1 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateTargetoption.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateTargetoption.java
@@ -1,18 +1,15 @@
 package com.smartor.domain;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.google.gson.Gson;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 妯℃澘鎸囨爣閫夐」搴撳璞� ivr_liba_template_targetoption
@@ -20,6 +17,7 @@
  * @author ruoyi
  * @date 2023-12-23
  */
+@Data
 @ApiModel(value = "IvrLibaTemplateTargetoption", description = "妯℃澘鎸囨爣閫夐」搴撳璞�")
 public class IvrLibaTemplateTargetoption extends BaseEntity {
     private static final long serialVersionUID = 1L;
@@ -204,235 +202,17 @@
     @ApiModelProperty(value = "鏄惁瀛樺湪鎿嶄綔锛�1 鏂板 2淇敼 3鍒犻櫎")
     private Integer isoperation;
 
-    public Long getId() {
-        return id;
-    }
+    /**
+     * 鏄惁鏄敤鎴烽�夋嫨鐨勯�夐」
+     */
+    @ApiModelProperty(value = "鏄惁鏄敤鎴烽�夋嫨鐨勯�夐」")
+    private Boolean isUserOperation = false;
 
-    public void setId(Long id) {
-        this.id = id;
-    }
 
-    public Long getTargetid() {
-        return targetid;
-    }
+    /**
+     * 涓嬩竴棰�
+     */
+    @ApiModelProperty(value = "涓嬩竴棰�")
+    private Integer nextQuestion;
 
-    public void setTargetid(Long targetid) {
-        this.targetid = targetid;
-    }
-
-    public String getTargetname() {
-        return targetname;
-    }
-
-    public void setTargetname(String targetname) {
-        this.targetname = targetname;
-    }
-
-    public Long getTemplateID() {
-        return templateID;
-    }
-
-    public void setTemplateID(Long templateID) {
-        this.templateID = templateID;
-    }
-
-    public Long getScriptid() {
-        return scriptid;
-    }
-
-    public void setScriptid(Long scriptid) {
-        this.scriptid = scriptid;
-    }
-
-    public String getTargettype() {
-        return targettype;
-    }
-
-    public void setTargettype(String targettype) {
-        this.targettype = targettype;
-    }
-
-    public String getCategoryName() {
-        return categoryName;
-    }
-
-    public void setCategoryName(String categoryName) {
-        this.categoryName = categoryName;
-    }
-
-    public String getTargetvalue() {
-        return targetvalue;
-    }
-
-    public void setTargetvalue(String targetvalue) {
-        this.targetvalue = targetvalue;
-    }
-
-    public String getTargetregex() {
-        return targetregex;
-    }
-
-    public void setTargetregex(String targetregex) {
-        this.targetregex = targetregex;
-    }
-
-    public String getTargetregex2() {
-        return targetregex2;
-    }
-
-    public void setTargetregex2(String targetregex2) {
-        this.targetregex2 = targetregex2;
-    }
-
-    public String getNodynamiccruxsJson() {
-        return nodynamiccruxsJson;
-    }
-
-    public void setNodynamiccruxsJson(String nodynamiccruxsJson) {
-        if (this.nodynamiccruxs != null) {
-            this.nodynamiccruxsJson = new Gson().toJson(this.nodynamiccruxs);
-        } else {
-            this.nodynamiccruxsJson = nodynamiccruxsJson;
-        }
-    }
-
-    public String getDynamiccruxsJson() {
-        return dynamiccruxsJson;
-    }
-
-    public void setDynamiccruxsJson(String dynamiccruxsJson) {
-        if (this.dynamiccruxs != null) {
-            this.dynamiccruxsJson = new Gson().toJson(this.dynamiccruxs);
-        } else {
-            this.dynamiccruxsJson = dynamiccruxsJson;
-        }
-    }
-
-    public List<String> getNodynamiccruxs() {
-        return nodynamiccruxs;
-    }
-
-    public void setNodynamiccruxs(List<String> nodynamiccruxs) {
-        this.nodynamiccruxs = nodynamiccruxs;
-    }
-
-    public List<String> getDynamiccruxs() {
-        return dynamiccruxs;
-    }
-
-    public void setDynamiccruxs(List<String> dynamiccruxs) {
-        this.dynamiccruxs = dynamiccruxs;
-    }
-
-    public String getOptiondesc() {
-        return optiondesc;
-    }
-
-    public void setOptiondesc(String optiondesc) {
-        this.optiondesc = optiondesc;
-    }
-
-    public String getLanguage() {
-        return language;
-    }
-
-    public void setLanguage(String language) {
-        this.language = language;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getGroupid() {
-        return groupid;
-    }
-
-    public void setGroupid(String groupid) {
-        this.groupid = groupid;
-    }
-
-    public Long getIsabnormal() {
-        return isabnormal;
-    }
-
-    public void setIsabnormal(Long isabnormal) {
-        this.isabnormal = isabnormal;
-    }
-
-    public Long getWarnup() {
-        return warnup;
-    }
-
-    public void setWarnup(Long warnup) {
-        this.warnup = warnup;
-    }
-
-    public Long getWarndown() {
-        return warndown;
-    }
-
-    public void setWarndown(Long warndown) {
-        this.warndown = warndown;
-    }
-
-    public String getDelFlag() {
-        return delFlag;
-    }
-
-    public void setDelFlag(String delFlag) {
-        this.delFlag = delFlag;
-    }
-
-    public Long getIsupload() {
-        return isupload;
-    }
-
-    public void setIsupload(Long isupload) {
-        this.isupload = isupload;
-    }
-
-    public Date getUploadTime() {
-        return uploadTime;
-    }
-
-    public void setUploadTime(Date uploadTime) {
-        this.uploadTime = uploadTime;
-    }
-
-    public String getOrgid() {
-        return orgid;
-    }
-
-    public void setOrgid(String orgid) {
-        this.orgid = orgid;
-    }
-
-    public Long getPid() {
-        return pid;
-    }
-
-    public void setPid(Long pid) {
-        this.pid = pid;
-    }
-
-    public String getGuid() {
-        return guid;
-    }
-
-    public void setGuid(String guid) {
-        this.guid = guid;
-    }
-
-    public Integer getIsoperation() {
-        return isoperation;
-    }
-
-    public void setIsoperation(Integer isoperation) {
-        this.isoperation = isoperation;
-    }
 }
diff --git a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateVO.java b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateVO.java
index 40b3849..f72fa81 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateVO.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrLibaTemplateVO.java
@@ -1,5 +1,6 @@
 package com.smartor.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
@@ -152,8 +153,8 @@
     /**
      * 閫氱敤鍖归厤璇濇湳id
      */
-    @Excel(name = "閫氱敤鍖归厤璇濇湳id")
-    @ApiModelProperty(value = "閫氱敤鍖归厤璇濇湳id")
+    @Excel(name = "閫氱敤鍖归厤璇濇湳id锛堥�氱敤妯℃澘ID锛�")
+    @ApiModelProperty(value = "閫氱敤鍖归厤璇濇湳id锛堥�氱敤妯℃澘ID锛�")
     private String submoduleID;
 
     /**
@@ -245,7 +246,7 @@
      */
     @Excel(name = "鏃犲尮閰嶆鏁�")
     @ApiModelProperty(value = "鏃犲尮閰嶆鏁�")
-    private Long mateNum;
+    private Long mateNum = 0L;
 
     /**
      * GUID
@@ -318,6 +319,20 @@
     private String suitway;
 
     /**
+     * 闈欓粯娆℃暟
+     */
+    @Excel(name = "闈欓粯娆℃暟")
+    @ApiModelProperty(value = "闈欓粯娆℃暟")
+    private Long noVoiceNum = 0L;
+
+    /**
+     * 鏍囩
+     */
+    @Excel(name = "鍏跺畠鏁版嵁锛堝瓨鍌ㄥ彉閲忥級")
+    @ApiModelProperty(value = "鍏跺畠鏁版嵁锛堝瓨鍌ㄥ彉閲忥級")
+    private String otherdata;
+
+    /**
      * 鏄惁瀛樺湪鎿嶄綔锛�1 鏂板 2淇敼 3鍒犻櫎
      */
     @ApiModelProperty(value = "鏄惁瀛樺湪鎿嶄綔锛�1 鏂板 2淇敼 3鍒犻櫎")
diff --git a/smartor/src/main/java/com/smartor/domain/IvrTaskcall.java b/smartor/src/main/java/com/smartor/domain/IvrTaskcall.java
index 031237d..18a690a 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrTaskcall.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrTaskcall.java
@@ -1,6 +1,7 @@
 package com.smartor.domain;
 
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,6 +27,12 @@
      */
     @ApiModelProperty(value = "涓婚敭")
     private Long id;
+
+    /**
+     *
+     */
+    @ApiModelProperty(value = "浠诲姟ID")
+    private Long taskid;
 
     /**
      * 鍙戦�佷汉
@@ -305,10 +312,10 @@
     private String textParam;
 
     /**
-     * 瀹f暀褰㈠紡 :鏂囨湰銆佸浘鐗囥�佽闊炽�佽棰戙�佹贩鍚�
+     * 瀹f暀褰㈠紡 : 1,鐭俊銆�2,绾夸笅銆�3,璇煶銆�4,瑙嗛銆�5,绾歌川  6.閾炬帴  7.閽夐拤   8.寰俊
      */
-    @Excel(name = " 瀹f暀褰㈠紡 :鏂囨湰銆佸浘鐗囥�佽闊炽�佽棰戙�佹贩鍚�")
-    @ApiModelProperty("瀹f暀褰㈠紡 : 1,鏂囨湰銆�2,鍥剧墖銆�3,璇煶銆�4,瑙嗛銆�5,娣峰悎")
+    @Excel(name = " 瀹f暀褰㈠紡 : 1,鐭俊銆�2,绾夸笅銆�3,璇煶銆�4,瑙嗛銆�5,绾歌川  6.浜岀淮鐮�  7.閽夐拤   8.寰俊")
+    @ApiModelProperty("瀹f暀褰㈠紡 :  1,鐭俊銆�2,绾夸笅銆�3,璇煶銆�4,瑙嗛銆�5,绾歌川  6.閾炬帴  7.閽夐拤  8.寰俊")
     private String serviceform;
 
     /**
@@ -353,4 +360,20 @@
     @ApiModelProperty(value = "pageSize")
     private Integer pageSize;
 
+
+    /**
+     * 鍙戦�佺被鍨�: 1 鏃堕棿娈�   2 鏃堕棿鐐�   3 鍗冲埢鍙戦��
+     */
+    @ApiModelProperty(value = "鍙戦�佺被鍨�: 1 鏃堕棿娈�   2 鏃堕棿鐐�   3 鍗冲埢鍙戦��")
+    private String sendType;
+
+
+
+    /**
+     * 鍙戦�佹椂闂存
+     */
+    @Excel(name = "鍙戦�佹椂闂存")
+    @ApiModelProperty(value = "鍙戦�佹椂闂存")
+    private String sendTimeSlot;
+
 }
diff --git a/smartor/src/main/java/com/smartor/domain/IvrTaskcallMQ.java b/smartor/src/main/java/com/smartor/domain/IvrTaskcallMQ.java
new file mode 100644
index 0000000..a638b83
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/domain/IvrTaskcallMQ.java
@@ -0,0 +1,60 @@
+package com.smartor.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * MQ浠诲姟
+ *
+ * @author ruoyi
+ * @date 2024-02-02
+ */
+@Data
+public class IvrTaskcallMQ extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 浠诲姟ID
+     */
+    @Excel(name = " 浠诲姟ID ")
+    @ApiModelProperty(value = "浠诲姟ID")
+    private Long taskid;
+
+    /**
+     * 妯℃澘ID
+     */
+    @Excel(name = "  妯℃澘ID")
+    @ApiModelProperty(value = "妯℃澘ID")
+    private String templateid;
+
+    /**
+     * 妯℃澘绫诲瀷
+     */
+    @Excel(name = "  妯℃澘绫诲瀷")
+    @ApiModelProperty(value = "妯℃澘绫诲瀷")
+    private String templateType;
+
+
+    /**
+     * 鍙戦�佺被鍨�: 1 鏃堕棿娈�   2 鏃堕棿鐐�   3 鍗冲埢鍙戦��
+     */
+    @ApiModelProperty(value = "鍙戦�佺被鍨�: 1 鏃堕棿娈�   2 鍗冲埢鍙戦��")
+    private String sendType;
+
+
+    /**
+     * 鍙戦�佹椂闂存
+     */
+    @ApiModelProperty(value = "鍙戦�佹椂闂存 ")
+    private List<TaskSendTimeVO> sendTimeslot;
+
+}
diff --git a/smartor/src/main/java/com/smartor/domain/IvrTaskcallVO.java b/smartor/src/main/java/com/smartor/domain/IvrTaskcallVO.java
index 08ffa1e..b24d03f 100644
--- a/smartor/src/main/java/com/smartor/domain/IvrTaskcallVO.java
+++ b/smartor/src/main/java/com/smartor/domain/IvrTaskcallVO.java
@@ -106,6 +106,12 @@
     private String templatename;
 
     /**
+     * 鍙戦�佺被鍨�: 1 鏃堕棿娈�   2 鏃堕棿鐐�   3 鍗冲埢鍙戦��
+     */
+    @ApiModelProperty(value = "鍙戦�佺被鍨�: 1 鏃堕棿娈�   2 鍗冲埢鍙戦��")
+    private String sendType;
+
+    /**
      * 鍙戦�佹棩鏈�
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
@@ -159,7 +165,7 @@
      * 鍙戦�佺姸鎬�
      */
     @Excel(name = " 鍙戦�佺姸鎬� ")
-    @ApiModelProperty(value = "鍙戦�佺姸鎬�")
+    @ApiModelProperty(value = "鍙戦�佺姸鎬� 锛�1 寮�濮�  2 涓  3 缁撴潫")
     private Long sendstate;
 
     /**
@@ -361,6 +367,13 @@
     private String preachcontent;
 
 
+    /**
+     * 鍙戦�佹椂闂存
+     */
+    @ApiModelProperty(value = "鍙戦�佹椂闂存 ")
+    private List<TaskSendTimeVO> sendTimeslot;
+
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("id", getId()).append("sendname", getSendname()).append("phone", getPhone()).append("sex", getSex()).append("age", getAge()).append("sfzh", getSfzh()).append("addr", getAddr()).append("senderdetail", getSenderdetail()).append("type", getType()).append("taskid", getTaskid()).append("templateid", getTemplateid()).append("templatename", getTemplatename()).append("senddate", getSenddate()).append("sendlimitabegin", getSendlimitabegin()).append("sendlimitaend", getSendlimitaend()).append("sendlimitpbegin", getSendlimitpbegin()).append("sendlimitpend", getSendlimitpend()).append("sendlimitnbegin", getSendlimitnbegin()).append("sendlimitnend", getSendlimitnend()).append("sendstate", getSendstate()).append("senduuid", getSenduuid()).append("result", getResult()).append("finishtime", getFinishtime()).append("userid", getUserid()).append("username", getUsername()).append("outbounduuid", getOutbounduuid()).append("recordid", getRecordid()).append("recallcount", getRecallcount()).append("exrecallcount", getExrecallcount()).append("pulltime", getPulltime()).append("bqsms", getBqsms()).append("bhsms", getBhsms()).append("deptcode", getDeptcode()).append("labelstatus", getLabelstatus()).append("delFlag", getDelFlag()).append("updateBy", getUpdateBy()).append("updateTime", getUpdateTime()).append("createBy", getCreateBy()).append("createTime", getCreateTime()).append("isupload", getIsupload()).append("uploadTime", getUploadTime()).append("orgid", getOrgid()).append("pid", getPid()).append("guid", getGuid()).append("textParam", getTextParam()).toString();
diff --git a/smartor/src/main/java/com/smartor/domain/QuestionMessage.java b/smartor/src/main/java/com/smartor/domain/QuestionMessage.java
new file mode 100644
index 0000000..108c686
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/domain/QuestionMessage.java
@@ -0,0 +1,28 @@
+package com.smartor.domain;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class QuestionMessage {
+    //    //棰樺彿targetId
+//    private Integer code;
+    //杩斿洖鐨勫唴瀹�
+    private String content;
+
+    //寮�鍦虹櫧
+    private String kcb = null;
+
+    //缁撴潫璇�
+    private String jsy = null;
+
+    //褰撳墠闂
+    private IvrLibaTemplateScriptVO nowQuestion = new IvrLibaTemplateScriptVO();
+
+    //闂娓呭崟
+    private List<IvrLibaTemplateScriptVO> questionList = new ArrayList();
+
+
+}
diff --git a/smartor/src/main/java/com/smartor/domain/SocketMessage.java b/smartor/src/main/java/com/smartor/domain/SocketMessage.java
index c502cb1..1a0435d 100644
--- a/smartor/src/main/java/com/smartor/domain/SocketMessage.java
+++ b/smartor/src/main/java/com/smartor/domain/SocketMessage.java
@@ -8,6 +8,11 @@
     private String type;
     //鍐呭锛堝彂閫佺殑鏂囨湰鍐呭锛�
     private String content;
+    //妯℃澘ID
+    private Long templateId;
+    //闂淇℃伅
+    private QuestionMessage questionMessage;
+
     //鐢ㄦ埛ID锛堟帴鏀舵斁锛�
     private String userId;
     //鍥剧墖
diff --git a/smartor/src/main/java/com/smartor/domain/TaskSendTimeVO.java b/smartor/src/main/java/com/smartor/domain/TaskSendTimeVO.java
new file mode 100644
index 0000000..5665bfb
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/domain/TaskSendTimeVO.java
@@ -0,0 +1,44 @@
+package com.smartor.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍗曚竴浠诲姟鍙戦�佹椂闂�
+ *
+ * @author ruoyi
+ * @date 2024-02-02
+ */
+@Data
+public class TaskSendTimeVO {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private String begantime;
+
+    /**
+     * 瀹f暀鍐呭
+     */
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private String endtime;
+
+    /**
+     * 搴忓彿
+     */
+    @ApiModelProperty(value = "搴忓彿")
+    private Integer xh;
+
+
+}
diff --git a/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplateMapper.java b/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplateMapper.java
index e9fc21a..f94cce9 100644
--- a/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplateMapper.java
+++ b/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplateMapper.java
@@ -36,7 +36,7 @@
      * @param ivrLibaExtemplate 閫氳繃妯℃澘
      * @return 缁撴灉
      */
-    public int insertIvrLibaExtemplate(IvrLibaExtemplate ivrLibaExtemplate);
+    public Boolean insertIvrLibaExtemplate(IvrLibaExtemplate ivrLibaExtemplate);
 
     /**
      * 淇敼閫氳繃妯℃澘
@@ -52,7 +52,7 @@
      * @param ID 閫氳繃妯℃澘涓婚敭
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplateByID(String ID);
+    public int deleteIvrLibaExtemplateByID(Long ID);
 
     /**
      * 鎵归噺鍒犻櫎閫氳繃妯℃澘
@@ -60,5 +60,5 @@
      * @param IDs 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplateByIDs(String[] IDs);
+    public int deleteIvrLibaExtemplateByIDs(Long[] IDs);
 }
diff --git a/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplatescriptMapper.java b/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplatescriptMapper.java
index a2478e1..61b512a 100644
--- a/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplatescriptMapper.java
+++ b/smartor/src/main/java/com/smartor/mapper/IvrLibaExtemplatescriptMapper.java
@@ -2,21 +2,21 @@
 
 import com.smartor.domain.IvrLibaExtemplatescript;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * 閫氱敤妯℃澘璇濇湳Mapper鎺ュ彛
- * 
+ *
  * @author ruoyi
  * @date 2023-12-27
  */
 @Mapper
-public interface IvrLibaExtemplatescriptMapper 
-{
+public interface IvrLibaExtemplatescriptMapper {
     /**
      * 鏌ヨ閫氱敤妯℃澘璇濇湳
-     * 
+     *
      * @param ID 閫氱敤妯℃澘璇濇湳涓婚敭
      * @return 閫氱敤妯℃澘璇濇湳
      */
@@ -24,15 +24,23 @@
 
     /**
      * 鏌ヨ閫氱敤妯℃澘璇濇湳鍒楄〃
-     * 
+     *
      * @param ivrLibaExtemplatescript 閫氱敤妯℃澘璇濇湳
      * @return 閫氱敤妯℃澘璇濇湳闆嗗悎
      */
     public List<IvrLibaExtemplatescript> selectIvrLibaExtemplatescriptList(IvrLibaExtemplatescript ivrLibaExtemplatescript);
 
     /**
+     * 鏌ヨ閫氱敤妯℃澘璇濇湳鍒楄〃
+     *
+     * @param IDs 閫氱敤妯℃澘璇濇湳閫氳繃ids
+     * @return 閫氱敤妯℃澘璇濇湳闆嗗悎
+     */
+    public List<IvrLibaExtemplatescript> queryIvrLibaExtemplatescriptList(@Param("IDs")List<Long> IDs);
+
+    /**
      * 鏂板閫氱敤妯℃澘璇濇湳
-     * 
+     *
      * @param ivrLibaExtemplatescript 閫氱敤妯℃澘璇濇湳
      * @return 缁撴灉
      */
@@ -40,7 +48,7 @@
 
     /**
      * 淇敼閫氱敤妯℃澘璇濇湳
-     * 
+     *
      * @param ivrLibaExtemplatescript 閫氱敤妯℃澘璇濇湳
      * @return 缁撴灉
      */
@@ -48,17 +56,17 @@
 
     /**
      * 鍒犻櫎閫氱敤妯℃澘璇濇湳
-     * 
+     *
      * @param ID 閫氱敤妯℃澘璇濇湳涓婚敭
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplatescriptByID(String ID);
+    public int deleteIvrLibaExtemplatescriptByID(Long ID);
 
     /**
      * 鎵归噺鍒犻櫎閫氱敤妯℃澘璇濇湳
-     * 
+     *
      * @param IDs 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplatescriptByIDs(String[] IDs);
+    public int deleteIvrLibaExtemplatescriptByIDs(Long[] IDs);
 }
diff --git a/smartor/src/main/java/com/smartor/mapper/IvrTaskcallMapper.java b/smartor/src/main/java/com/smartor/mapper/IvrTaskcallMapper.java
index f9aa728..abd9ebe 100644
--- a/smartor/src/main/java/com/smartor/mapper/IvrTaskcallMapper.java
+++ b/smartor/src/main/java/com/smartor/mapper/IvrTaskcallMapper.java
@@ -1,7 +1,9 @@
 package com.smartor.mapper;
 
 import com.smartor.domain.IvrTaskcall;
+import com.smartor.domain.IvrTaskcallVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -29,6 +31,8 @@
      */
     public List<IvrTaskcall> selectIvrTaskcallList(IvrTaskcall ivrTaskcall);
 
+    public IvrTaskcallVO queryTaskByCondition(IvrTaskcallVO ivrTaskcallVO);
+
     /**
      * 鏂板鍗曚竴浠诲姟锛堥殢璁匡級
      *
@@ -40,7 +44,6 @@
     /**
      * 淇敼鍗曚竴浠诲姟锛堥殢璁匡級
      *
-     * @param ivrTaskcall 鍗曚竴浠诲姟锛堥殢璁匡級
      * @return 缁撴灉
      */
     public int updateIvrTaskcall(IvrTaskcall ivrTaskcall);
@@ -53,4 +56,11 @@
      */
     public int deleteIvrTaskcallById(Long id);
 
+    /**
+     * 鍒犻櫎鍗曚竴浠诲姟锛堥殢璁匡級
+     *
+     * @return 缁撴灉
+     */
+    public List<IvrTaskcall> getDataByTime(@Param("beganTime") String beganTime, @Param("endTime") String endTime);
+
 }
diff --git a/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplateService.java b/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplateService.java
index 34b2627..bcf32b3 100644
--- a/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplateService.java
+++ b/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplateService.java
@@ -34,7 +34,7 @@
      * @param ivrLibaExtemplate 閫氳繃妯℃澘
      * @return 缁撴灉
      */
-    public int insertIvrLibaExtemplate(IvrLibaExtemplate ivrLibaExtemplate);
+    public IvrLibaExtemplate insertIvrLibaExtemplate(IvrLibaExtemplate ivrLibaExtemplate);
 
     /**
      * 淇敼閫氳繃妯℃澘
@@ -50,7 +50,7 @@
      * @param IDs 闇�瑕佸垹闄ょ殑閫氳繃妯℃澘涓婚敭闆嗗悎
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplateByIDs(String[] IDs);
+    public int deleteIvrLibaExtemplateByIDs(Long[] IDs);
 
     /**
      * 鍒犻櫎閫氳繃妯℃澘淇℃伅
@@ -58,5 +58,5 @@
      * @param ID 閫氳繃妯℃澘涓婚敭
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplateByID(String ID);
+    public int deleteIvrLibaExtemplateByID(Long ID);
 }
diff --git a/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplatescriptService.java b/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplatescriptService.java
index d5794a8..05c4020 100644
--- a/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplatescriptService.java
+++ b/smartor/src/main/java/com/smartor/service/IIvrLibaExtemplatescriptService.java
@@ -50,7 +50,7 @@
      * @param IDs 闇�瑕佸垹闄ょ殑閫氱敤妯℃澘璇濇湳涓婚敭闆嗗悎
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplatescriptByIDs(String[] IDs);
+    public int deleteIvrLibaExtemplatescriptByIDs(Long[] IDs);
 
     /**
      * 鍒犻櫎閫氱敤妯℃澘璇濇湳淇℃伅
@@ -58,5 +58,5 @@
      * @param ID 閫氱敤妯℃澘璇濇湳涓婚敭
      * @return 缁撴灉
      */
-    public int deleteIvrLibaExtemplatescriptByID(String ID);
+    public int deleteIvrLibaExtemplatescriptByID(Long ID);
 }
diff --git a/smartor/src/main/java/com/smartor/service/IIvrTaskcallService.java b/smartor/src/main/java/com/smartor/service/IIvrTaskcallService.java
index 27ecaf6..d95f55a 100644
--- a/smartor/src/main/java/com/smartor/service/IIvrTaskcallService.java
+++ b/smartor/src/main/java/com/smartor/service/IIvrTaskcallService.java
@@ -3,6 +3,7 @@
 import com.smartor.domain.HeTaskVO;
 import com.smartor.domain.IvrTaskcall;
 import com.smartor.domain.IvrTaskcallVO;
+import com.smartor.domain.PhoneCallBackVO;
 
 import java.util.List;
 
@@ -61,4 +62,20 @@
      */
     public int insertOrUpdateTask(IvrTaskcallVO ivrTaskcallVO);
 
+    /**
+     * 浠诲姟鍙戦�佹墽琛�
+     *
+     * @param ivrTaskcallVO
+     * @return 缁撴灉
+     */
+    public int heTaskSend(IvrTaskcallVO ivrTaskcallVO);
+
+    /**
+     * 浠诲姟鍙戦�佹墽琛�
+     *
+     * @param phoneCallBackVO
+     * @return 缁撴灉
+     */
+    public PhoneCallBackVO phoneCallBack(PhoneCallBackVO phoneCallBackVO);
+
 }
diff --git a/smartor/src/main/java/com/smartor/service/PersonVoiceService.java b/smartor/src/main/java/com/smartor/service/PersonVoiceService.java
index 59b7785..d431fa1 100644
--- a/smartor/src/main/java/com/smartor/service/PersonVoiceService.java
+++ b/smartor/src/main/java/com/smartor/service/PersonVoiceService.java
@@ -18,7 +18,7 @@
     /**
      * 涓�鍙ヨ瘽璇嗗埆
      */
-    public String texttospeech(String textspeech);
+    public String texttospeech(String textspeech, String filePath);
 
     public Boolean explainHTML();
 }
diff --git a/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplateServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplateServiceImpl.java
index a880710..99edbf1 100644
--- a/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplateServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplateServiceImpl.java
@@ -8,6 +8,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.UUID;
 
 /**
  * 閫氳繃妯℃澘Service涓氬姟灞傚鐞�
@@ -49,9 +50,13 @@
      * @return 缁撴灉
      */
     @Override
-    public int insertIvrLibaExtemplate(IvrLibaExtemplate ivrLibaExtemplate) {
+    public IvrLibaExtemplate insertIvrLibaExtemplate(IvrLibaExtemplate ivrLibaExtemplate) {
         ivrLibaExtemplate.setCreateTime(DateUtils.getNowDate());
-        return ivrLibaExtemplateMapper.insertIvrLibaExtemplate(ivrLibaExtemplate);
+        Boolean i = ivrLibaExtemplateMapper.insertIvrLibaExtemplate(ivrLibaExtemplate);
+        if (i) {
+            return ivrLibaExtemplate;
+        }
+        return null;
     }
 
     /**
@@ -73,7 +78,7 @@
      * @return 缁撴灉
      */
     @Override
-    public int deleteIvrLibaExtemplateByIDs(String[] IDs) {
+    public int deleteIvrLibaExtemplateByIDs(Long[] IDs) {
         return ivrLibaExtemplateMapper.deleteIvrLibaExtemplateByIDs(IDs);
     }
 
@@ -84,7 +89,7 @@
      * @return 缁撴灉
      */
     @Override
-    public int deleteIvrLibaExtemplateByID(String ID) {
+    public int deleteIvrLibaExtemplateByID(Long ID) {
         return ivrLibaExtemplateMapper.deleteIvrLibaExtemplateByID(ID);
     }
 }
diff --git a/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplatescriptServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplatescriptServiceImpl.java
index 70f4adb..8875b1f 100644
--- a/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplatescriptServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/IvrLibaExtemplatescriptServiceImpl.java
@@ -1,9 +1,14 @@
 package com.smartor.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.smartor.domain.IvrLibaExtemplatescript;
 import com.smartor.mapper.IvrLibaExtemplatescriptMapper;
 import com.smartor.service.IIvrLibaExtemplatescriptService;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -39,7 +44,26 @@
      */
     @Override
     public List<IvrLibaExtemplatescript> selectIvrLibaExtemplatescriptList(IvrLibaExtemplatescript ivrLibaExtemplatescript) {
-        return ivrLibaExtemplatescriptMapper.selectIvrLibaExtemplatescriptList(ivrLibaExtemplatescript);
+        List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.selectIvrLibaExtemplatescriptList(ivrLibaExtemplatescript);
+        ObjectMapper mapper = new ObjectMapper();
+        for (IvrLibaExtemplatescript ivrLibaExtemplatescript1 : ivrLibaExtemplatescripts) {
+            if (!StringUtils.isEmpty(ivrLibaExtemplatescript1.getDynamiccruxsJson())) {
+                try {
+                    ivrLibaExtemplatescript1.setDynamiccruxs(mapper.readValue(ivrLibaExtemplatescript1.getDynamiccruxsJson(), List.class));
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            if (!StringUtils.isEmpty(ivrLibaExtemplatescript1.getNodynamiccruxsJson())) {
+                try {
+                    ivrLibaExtemplatescript1.setNodynamiccruxs(mapper.readValue(ivrLibaExtemplatescript1.getNodynamiccruxsJson(), List.class));
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return ivrLibaExtemplatescripts;
     }
 
     /**
@@ -50,6 +74,10 @@
      */
     @Override
     public int insertIvrLibaExtemplatescript(IvrLibaExtemplatescript ivrLibaExtemplatescript) {
+        if (CollectionUtils.isNotEmpty(ivrLibaExtemplatescript.getDynamiccruxs()))
+            ivrLibaExtemplatescript.setDynamiccruxsJson(JSON.toJSONString(ivrLibaExtemplatescript.getDynamiccruxs()));
+        if (CollectionUtils.isNotEmpty(ivrLibaExtemplatescript.getNodynamiccruxs()))
+            ivrLibaExtemplatescript.setNodynamiccruxsJson(JSON.toJSONString(ivrLibaExtemplatescript.getNodynamiccruxs()));
         ivrLibaExtemplatescript.setCreateTime(DateUtils.getNowDate());
         return ivrLibaExtemplatescriptMapper.insertIvrLibaExtemplatescript(ivrLibaExtemplatescript);
     }
@@ -63,6 +91,10 @@
     @Override
     public int updateIvrLibaExtemplatescript(IvrLibaExtemplatescript ivrLibaExtemplatescript) {
         ivrLibaExtemplatescript.setUpdateTime(DateUtils.getNowDate());
+        if (CollectionUtils.isNotEmpty(ivrLibaExtemplatescript.getDynamiccruxs()))
+            ivrLibaExtemplatescript.setDynamiccruxsJson(JSON.toJSONString(ivrLibaExtemplatescript.getDynamiccruxs()));
+        if (CollectionUtils.isNotEmpty(ivrLibaExtemplatescript.getNodynamiccruxs()))
+            ivrLibaExtemplatescript.setNodynamiccruxsJson(JSON.toJSONString(ivrLibaExtemplatescript.getNodynamiccruxs()));
         return ivrLibaExtemplatescriptMapper.updateIvrLibaExtemplatescript(ivrLibaExtemplatescript);
     }
 
@@ -73,7 +105,7 @@
      * @return 缁撴灉
      */
     @Override
-    public int deleteIvrLibaExtemplatescriptByIDs(String[] IDs) {
+    public int deleteIvrLibaExtemplatescriptByIDs(Long[] IDs) {
         return ivrLibaExtemplatescriptMapper.deleteIvrLibaExtemplatescriptByIDs(IDs);
     }
 
@@ -84,7 +116,7 @@
      * @return 缁撴灉
      */
     @Override
-    public int deleteIvrLibaExtemplatescriptByID(String ID) {
+    public int deleteIvrLibaExtemplatescriptByID(Long ID) {
         return ivrLibaExtemplatescriptMapper.deleteIvrLibaExtemplatescriptByID(ID);
     }
 }
diff --git a/smartor/src/main/java/com/smartor/service/impl/IvrLibaScriptServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/IvrLibaScriptServiceImpl.java
index 81ab2cc..b3c4db6 100644
--- a/smartor/src/main/java/com/smartor/service/impl/IvrLibaScriptServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/IvrLibaScriptServiceImpl.java
@@ -1,8 +1,12 @@
 package com.smartor.service.impl;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DtoConversionUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.smartor.domain.*;
 import com.smartor.mapper.IvrLibaScriptMapper;
 import com.smartor.mapper.IvrLibaScriptTagMapper;
@@ -87,6 +91,19 @@
         IvrLibaScriptTargetoption ivrLibaScriptTargetoption = new IvrLibaScriptTargetoption();
         ivrLibaScriptTargetoption.setScriptid(ivrLibaScripts.get(0).getId());
         List<IvrLibaScriptTargetoption> ivrLibaScriptTargetoptions = ivrLibaScriptTargetoptionMapper.selectIvrLibaScriptTargetoptionList(ivrLibaScriptTargetoption);
+        for (IvrLibaScriptTargetoption ivrLibaScriptTargetoption1 : ivrLibaScriptTargetoptions) {
+            ObjectMapper objectMapper = new ObjectMapper();
+            try {
+                if (StringUtils.isNotEmpty(ivrLibaScriptTargetoption1.getDynamiccruxsJson()))
+                    ivrLibaScriptTargetoption1.setDynamiccruxs(objectMapper.readValue(ivrLibaScriptTargetoption1.getDynamiccruxsJson(), List.class));
+                if (StringUtils.isNotEmpty(ivrLibaScriptTargetoption1.getNodynamiccruxsJson()))
+                    ivrLibaScriptTargetoption1.setNodynamiccruxs(objectMapper.readValue(ivrLibaScriptTargetoption1.getNodynamiccruxsJson(), List.class));
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
+        }
+
+
         scriptVO.setIvrLibaScriptTargetoptionList(ivrLibaScriptTargetoptions);
 
 //        //鏌ヨ闂鎸囨爣鎺ュ彛
@@ -119,31 +136,17 @@
         if (ivrLibaScript.getId() == null) {
             throw new BaseException("璇濇湳ID涓虹┖,璇锋鏌ヨ瘽鏈叆鍙備俊鎭槸鍚﹀畬鏁�");
         }
-//        //瀵归棶棰樻寚鏍囪繘琛屽鐞�
-//        if (CollectionUtils.isNotEmpty(ivrLibaScriptVO.getIvrLibaScriptTargetList())) {
-//            for (IvrLibaScriptTarget ivrLibaScriptTarget : ivrLibaScriptVO.getIvrLibaScriptTargetList()) {
-//                if (ivrLibaScriptTarget.getIsoperation() != null && ivrLibaScriptTarget.getIsoperation() == 1) {
-//                    //鏂板
-//                    ivrLibaScriptTarget.setScriptid(ivrLibaScript.getId());
-//                    ivrLibaScriptTargetMapper.insertIvrLibaScriptTarget(ivrLibaScriptTarget);
-//                } else if (ivrLibaScriptTarget.getIsoperation() != null && ivrLibaScriptTarget.getIsoperation() == 2) {
-//                    //淇敼
-//                    ivrLibaScriptTarget.setScriptid(ivrLibaScript.getId());
-//                    ivrLibaScriptTargetMapper.updateIvrLibaScriptTarget(ivrLibaScriptTarget);
-//                } else if (ivrLibaScriptTarget.getIsoperation() != null && ivrLibaScriptTarget.getIsoperation() == 3) {
-//                    //鍒犻櫎
-//                    if (ivrLibaScriptTarget.getId() == null) {
-//                        log.info("鍒犻櫎澶辫触,闂鎸囨爣id涓虹┖");
-//                    } else {
-//                        ivrLibaScriptTargetMapper.deleteIvrLibaScriptTargetByQuestionTargetID(ivrLibaScriptTarget.getId());
-//                    }
-//                }
-//            }
-//        }
 
         //瀵归棶棰樻寚鏍囬�夐」杩涜澶勭悊
         if (CollectionUtils.isNotEmpty(ivrLibaScriptVO.getIvrLibaScriptTargetoptionList())) {
             for (IvrLibaScriptTargetoption ivrLibaScriptTargetoption : ivrLibaScriptVO.getIvrLibaScriptTargetoptionList()) {
+                if (CollectionUtils.isNotEmpty(ivrLibaScriptTargetoption.getNodynamiccruxs())) {
+                    ivrLibaScriptTargetoption.setNodynamiccruxsJson(new Gson().toJson(ivrLibaScriptTargetoption.getNodynamiccruxs()));
+                }
+                if (CollectionUtils.isNotEmpty(ivrLibaScriptTargetoption.getDynamiccruxs())) {
+                    ivrLibaScriptTargetoption.setDynamiccruxsJson(new Gson().toJson(ivrLibaScriptTargetoption.getDynamiccruxs()));
+                }
+
                 if (ivrLibaScriptTargetoption.getIsoperation() != null && ivrLibaScriptTargetoption.getIsoperation() == 1) {
                     //鏂板
                     ivrLibaScriptTargetoption.setScriptid(ivrLibaScript.getId());
diff --git a/smartor/src/main/java/com/smartor/service/impl/IvrLibaTargetServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/IvrLibaTargetServiceImpl.java
index a5d2db3..50b52cf 100644
--- a/smartor/src/main/java/com/smartor/service/impl/IvrLibaTargetServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/IvrLibaTargetServiceImpl.java
@@ -1,7 +1,11 @@
 package com.smartor.service.impl;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DtoConversionUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.smartor.domain.*;
 import com.smartor.mapper.IvrLibaTargetMapper;
 import com.smartor.mapper.IvrLibaTargetTagMapper;
@@ -66,6 +70,17 @@
             //鑾峰彇璇ユ寚鏍囩殑閫夐」
             List<IvrLibaTargetoption> ivrLibaTargetoptions = ivrLibaTargetoptionMapper.selectIvrLibaTargetoptionList(ivrLibaTargetoption);
             if (CollectionUtils.isNotEmpty(ivrLibaTargetoptions)) {
+                for (IvrLibaTargetoption ivrLibaTargetoption1 : ivrLibaTargetoptions) {
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    try {
+                        if (StringUtils.isNotEmpty(ivrLibaTargetoption1.getDynamiccruxsJson()))
+                            ivrLibaTargetoption1.setDynamiccruxs(objectMapper.readValue(ivrLibaTargetoption1.getDynamiccruxsJson(), List.class));
+                        if (StringUtils.isNotEmpty(ivrLibaTargetoption1.getNodynamiccruxsJson()))
+                            ivrLibaTargetoption1.setNodynamiccruxs(objectMapper.readValue(ivrLibaTargetoption1.getNodynamiccruxsJson(), List.class));
+                    } catch (JsonProcessingException e) {
+                        e.printStackTrace();
+                    }
+                }
                 ivrLibaTarget1.setTargetoptionList(ivrLibaTargetoptions);
             }
             //鑾峰彇璇ユ寚鏍囩殑鏍囩
@@ -152,6 +167,13 @@
         }
         if (CollectionUtils.isNotEmpty(ivrLibaTargetVO.getTargetoptionList())) {
             for (IvrLibaTargetoption ivrLibaTargetoption : ivrLibaTargetVO.getTargetoptionList()) {
+                if (CollectionUtils.isNotEmpty(ivrLibaTargetoption.getNodynamiccruxs())) {
+                    ivrLibaTargetoption.setNodynamiccruxsJson(new Gson().toJson(ivrLibaTargetoption.getNodynamiccruxs()));
+                }
+                if (CollectionUtils.isNotEmpty(ivrLibaTargetoption.getDynamiccruxs())) {
+                    ivrLibaTargetoption.setDynamiccruxsJson(new Gson().toJson(ivrLibaTargetoption.getDynamiccruxs()));
+                }
+
                 if (ivrLibaTargetoption.getIsoperation() != null && ivrLibaTargetoption.getIsoperation() == 1) {
                     //鏂板
                     ivrLibaTargetoption.setTargetid(ivrLibaTarget.getId());
@@ -174,7 +196,6 @@
     /**
      * 鎵归噺鍒犻櫎鎸囨爣閫夐」搴�
      *
-     * @param targetIDs 闇�瑕佸垹闄ょ殑鎸囨爣閫夐」搴撲富閿�
      * @return 缁撴灉
      */
     @Override
@@ -185,7 +206,6 @@
     /**
      * 鍒犻櫎鎸囨爣閫夐」搴撲俊鎭�
      *
-     * @param targetID 鎸囨爣閫夐」搴撲富閿�
      * @return 缁撴灉
      */
     @Override
diff --git a/smartor/src/main/java/com/smartor/service/impl/IvrLibaTemplateServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/IvrLibaTemplateServiceImpl.java
index 5cd0bb4..e3957bc 100644
--- a/smartor/src/main/java/com/smartor/service/impl/IvrLibaTemplateServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/IvrLibaTemplateServiceImpl.java
@@ -1,8 +1,13 @@
 package com.smartor.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DtoConversionUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.smartor.domain.*;
 import com.smartor.mapper.*;
 import com.smartor.service.IIvrLibaTemplateService;
@@ -11,8 +16,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * 妯℃澘搴揝ervice涓氬姟灞傚鐞�
@@ -227,11 +231,19 @@
                     //鏂板
                     ivrLibaTemplateTargetoption.setTemplateID(tmpID);
                     ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScript.getID());
+                    if (CollectionUtils.isNotEmpty(ivrLibaTemplateTargetoption.getDynamiccruxs()))
+                        ivrLibaTemplateTargetoption.setDynamiccruxsJson(JSON.toJSONString(ivrLibaTemplateTargetoption.getDynamiccruxs()));
+                    if (CollectionUtils.isNotEmpty(ivrLibaTemplateTargetoption.getNodynamiccruxs()))
+                        ivrLibaTemplateTargetoption.setNodynamiccruxsJson(JSON.toJSONString(ivrLibaTemplateTargetoption.getNodynamiccruxs()));
                     ivrLibaTemplateTargetOptionMapper.insertIvrLibaTemplateTargetoption(ivrLibaTemplateTargetoption);
                 } else if (ivrLibaTemplateTargetoption.getIsoperation() != null && ivrLibaTemplateTargetoption.getIsoperation() == 2) {
                     //淇敼
                     ivrLibaTemplateTargetoption.setTemplateID(tmpID);
                     ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScript.getID());
+                    if (CollectionUtils.isNotEmpty(ivrLibaTemplateTargetoption.getDynamiccruxs()))
+                        ivrLibaTemplateTargetoption.setDynamiccruxsJson(JSON.toJSONString(ivrLibaTemplateTargetoption.getDynamiccruxs()));
+                    if (CollectionUtils.isNotEmpty(ivrLibaTemplateTargetoption.getNodynamiccruxs()))
+                        ivrLibaTemplateTargetoption.setNodynamiccruxsJson(JSON.toJSONString(ivrLibaTemplateTargetoption.getNodynamiccruxs()));
                     ivrLibaTemplateTargetOptionMapper.updateIvrLibaTemplateTargetoption(ivrLibaTemplateTargetoption);
                 } else if (ivrLibaTemplateTargetoption.getIsoperation() != null && ivrLibaTemplateTargetoption.getIsoperation() == 3) {
                     //鍒犻櫎
@@ -280,9 +292,28 @@
             IvrLibaTemplateTargetoption ivrLibaTemplateTargetoption = new IvrLibaTemplateTargetoption();
             ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScriptVO.getID());
             List<IvrLibaTemplateTargetoption> ivrLibaTemplateTargetoptions = ivrLibaTemplateTargetOptionMapper.selectIvrLibaTemplateTargetoptionList(ivrLibaTemplateTargetoption);
+            for (IvrLibaTemplateTargetoption ivrLibaTemplateTargetoption1 : ivrLibaTemplateTargetoptions) {
+                ObjectMapper mapper = new ObjectMapper();
+                if (!StringUtils.isEmpty(ivrLibaTemplateTargetoption1.getDynamiccruxsJson())) {
+                    try {
+                        ivrLibaTemplateTargetoption1.setDynamiccruxs(mapper.readValue(ivrLibaTemplateTargetoption1.getDynamiccruxsJson(), List.class));
+                    } catch (JsonProcessingException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                if (!StringUtils.isEmpty(ivrLibaTemplateTargetoption1.getNodynamiccruxsJson())) {
+                    try {
+                        ivrLibaTemplateTargetoption1.setNodynamiccruxs(mapper.readValue(ivrLibaTemplateTargetoption1.getNodynamiccruxsJson(), List.class));
+                    } catch (JsonProcessingException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+            }
             ivrLibaTemplateScriptVO.setIvrLibaScriptTargetoptionList(ivrLibaTemplateTargetoptions);
         }
-
+        Collections.sort(ivrLibaTemplateScriptVOS, Comparator.comparing(IvrLibaTemplateScriptVO::getTargetid));
         //鏁版嵁缁勮
         templateVO.setIvrLibaTemplateTagList(ivrLibaTemplateTags);
         templateVO.setIvrLibaTemplateScriptVOList(ivrLibaTemplateScriptVOS);
diff --git a/smartor/src/main/java/com/smartor/service/impl/IvrTaskcallServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/IvrTaskcallServiceImpl.java
index 86c1ae2..6d4f7bf 100644
--- a/smartor/src/main/java/com/smartor/service/impl/IvrTaskcallServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/IvrTaskcallServiceImpl.java
@@ -1,21 +1,37 @@
 package com.smartor.service.impl;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DtoConversionUtils;
+//import com.smartor.config.PhoneUtils;
+import com.smartor.config.PhoneUtils;
+import com.smartor.config.RabbitMqConfig;
 import com.smartor.domain.*;
+import com.smartor.mapper.IvrLibaExtemplatescriptMapper;
+import com.smartor.mapper.IvrLibaTemplateTargetoptionMapper;
 import com.smartor.mapper.IvrTaskcallMapper;
-import com.smartor.mapper.PatTaskRelevanceMapper;
 import com.smartor.service.IIvrTaskcallService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.amqp.AmqpException;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessagePostProcessor;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 鍗曚竴浠诲姟锛堥殢璁匡級Service涓氬姟灞傚鐞�
@@ -30,7 +46,17 @@
     private IvrTaskcallMapper ivrTaskcallMapper;
 
     @Autowired
-    private PatTaskRelevanceMapper patTaskRelevanceMapper;
+    private IvrLibaTemplateTargetoptionMapper ivrLibaScriptTargetoptionMapper;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper;
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
 
     /**
      * 鏌ヨ鍗曚竴浠诲姟锛堥殢璁匡級
@@ -103,8 +129,8 @@
     @Override
     public int insertOrUpdateTask(IvrTaskcallVO ivrTaskcallVO) {
         if (ObjectUtils.isEmpty(ivrTaskcallVO)) {
-            log.info("瀹f暀浠诲姟鍏ュ弬涓虹┖锛岃妫�鏌ュ叆鍙�");
-            throw new BaseException("瀹f暀浠诲姟鍏ュ弬涓虹┖锛岃妫�鏌ュ叆鍙�");
+            log.info("浠诲姟鍏ュ弬涓虹┖锛岃妫�鏌ュ叆鍙�");
+            throw new BaseException("浠诲姟鍏ュ弬涓虹┖锛岃妫�鏌ュ叆鍙�");
         }
         Integer integer = 0;
         if (ivrTaskcallVO.getIsoperation() != null && ivrTaskcallVO.getIsoperation() == 1) {
@@ -120,6 +146,9 @@
                     ivrTaskcall.setAddr(patTaskRelevance.getAddr());
                     ivrTaskcall.setCreateTime(DateUtils.getNowDate());
                     ivrTaskcall.setTextParam(new Gson().toJson(ivrTaskcallVO.getTextParam()));
+                    if (CollectionUtils.isNotEmpty(ivrTaskcallVO.getSendTimeslot())) {
+                        ivrTaskcall.setSendTimeSlot(ivrTaskcallVO.getSendTimeslot().toString());
+                    }
                     ivrTaskcallMapper.insertIvrTaskcall(ivrTaskcall);
                     integer = ivrTaskcall.getId().intValue();
                 }
@@ -135,8 +164,10 @@
                     ivrTaskcall.setPhone(patTaskRelevance.getPhone());
                     ivrTaskcall.setAddr(patTaskRelevance.getAddr());
                     ivrTaskcall.setCreateTime(DateUtils.getNowDate());
+                    if (CollectionUtils.isNotEmpty(ivrTaskcallVO.getSendTimeslot())) {
+                        ivrTaskcall.setSendTimeSlot(ivrTaskcallVO.getSendTimeslot().toString());
+                    }
                     ivrTaskcall.setTextParam(new Gson().toJson(ivrTaskcallVO.getTextParam()));
-
                     ivrTaskcallMapper.updateIvrTaskcall(ivrTaskcall);
                     integer = ivrTaskcall.getId().intValue();
                 }
@@ -150,4 +181,307 @@
         return integer;
     }
 
+    /**
+     * 浠诲姟鍙戦��
+     *
+     * @return
+     */
+    @Override
+    public int heTaskSend(IvrTaskcallVO ivrTaskcallVO) {
+        //鍒ゆ柇浠诲姟鏄惁鏄珛鍗冲彂閫�
+        if (ivrTaskcallVO.getSendType().equals("2") && ivrTaskcallVO.getSendstate() == 1) {
+            IvrTaskcallMQ ivrTaskcallMQ = new IvrTaskcallMQ();
+            ivrTaskcallMQ.setTaskid(ivrTaskcallVO.getTaskid());
+            ivrTaskcallMQ.setSendType("1");
+            ivrTaskcallMQ.setTemplateid(ivrTaskcallVO.getTemplateid());
+
+            //绔嬪嵆鍙戦��
+            rabbitTemplate.convertAndSend(RabbitMqConfig.phone_exchange, RabbitMqConfig.routing_key, new Gson().toJson(ivrTaskcallMQ), message -> {
+                //娉ㄦ剰杩欓噷鏃堕棿鍙互浣縧ong锛岃�屼笖鏄缃甴eader
+                message.getMessageProperties().setHeader("x-delay", 0);
+                return message;
+            });
+        } else if (ivrTaskcallVO.getSendType().equals("2") && ivrTaskcallVO.getSendstate() == 1) {
+            //鏃堕棿娈靛彂閫�
+            if (CollectionUtils.isNotEmpty(ivrTaskcallVO.getSendTimeslot())) {
+                for (TaskSendTimeVO taskSendTimeVO : ivrTaskcallVO.getSendTimeslot()) {
+                    List<TaskSendTimeVO> list = new ArrayList<>();
+                    list.add(taskSendTimeVO);
+
+                    //鑾峰彇寮�濮嬪彂閫佹椂闂�
+                    String begantime = taskSendTimeVO.getBegantime();
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                    //璁板綍鐩墠鍒板彂閫佹椂闂寸殑姣鍊� 锛堝彂閫佹椂闂寸殑姣鍊� - 褰撳墠鏃堕棿鐨勬绉掑�硷級
+                    Long milliseconds = 1000L;
+                    try {
+                        Date date = sdf.parse(begantime);
+                        milliseconds = date.getTime() - System.currentTimeMillis();
+                        System.out.println("鏃ユ湡姣鏁帮細" + milliseconds);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    IvrTaskcallMQ ivrTaskcallMQ = new IvrTaskcallMQ();
+                    ivrTaskcallMQ.setTaskid(ivrTaskcallVO.getTaskid());
+                    ivrTaskcallMQ.setSendType("2");
+                    ivrTaskcallMQ.setTemplateid(ivrTaskcallVO.getTemplateid());
+                    ivrTaskcallMQ.setSendTimeslot(list);
+
+                    Long finalMilliseconds = milliseconds;
+                    rabbitTemplate.convertAndSend(RabbitMqConfig.phone_exchange, RabbitMqConfig.routing_key, new Gson().toJson(ivrTaskcallMQ), message -> {
+                        //娉ㄦ剰杩欓噷鏃堕棿鍙互浣縧ong锛岃�屼笖鏄缃甴eader
+                        message.getMessageProperties().setHeader("x-delay", finalMilliseconds);
+                        return message;
+                    });
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    @Override
+    public PhoneCallBackVO phoneCallBack(PhoneCallBackVO phoneCallBackVO) {
+        log.info("phoneCallBackVO鐨勫叆鍙傦細{},{},{},{},{},{},{}", phoneCallBackVO.getResultType(), phoneCallBackVO.getUuid(), phoneCallBackVO.getErrResult(), phoneCallBackVO.getTextResult(), phoneCallBackVO.getHangUpResult(), phoneCallBackVO.getEnumState(), phoneCallBackVO.getUint8());
+        //鑾峰彇鏁版嵁
+        Boolean aBoolean = redisCache.hasKey(phoneCallBackVO.getUuid());
+        if (!aBoolean) {
+            new BaseException("璇uid涓嶅瓨鍦�");
+        }
+        Integer hangupValue = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "hangup");
+        if (hangupValue != null && hangupValue == 1) {
+            //hangupValue == 1  闅忚缁撴潫锛岀洿鎺ュ彲浠ユ寕鐢佃瘽
+            PhoneUtils phoneUtils = new PhoneUtils();
+            phoneUtils.hangup(phoneCallBackVO.getUuid(), null, null, null, null, null, null, null);
+
+        }
+
+        String cacheObject = redisCache.getCacheObject(phoneCallBackVO.getUuid());
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> map = null;
+        try {
+            map = objectMapper.readValue(cacheObject, Map.class);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+        IvrTaskcall ivrTaskcall = (IvrTaskcall) map.get("ivrTaskcall");
+        List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOs = (List<IvrLibaTemplateScriptVO>) map.get("ivrLibaTemplateScriptVO");
+        //灏唘uid鏇存柊鍒版暟鎹簱涓�
+        ivrTaskcall.setSenduuid(phoneCallBackVO.getUuid());
+        ivrTaskcallMapper.updateIvrTaskcall(ivrTaskcall);
+
+        //鑾峰彇妯℃澘淇℃伅
+        IvrLibaTemplateVO ivrLibaTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "ivrLibaTemplateVO");
+
+
+        //棣栧厛鍒ゆ柇resultType
+        if (phoneCallBackVO.getResultType() == 1) {
+            //鍛煎彨缁撴灉鎺ュ彛: 1
+            if (phoneCallBackVO.getUint8() == 1) {
+                //鍛煎彨澶辫触锛屽幓redis涓褰曚竴涓嬪け璐ユ鏁帮紝杩涜鍐嶆鍛煎彨
+                Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "uint8");
+                if (integer != null) {
+                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", integer + 1, 120, TimeUnit.MINUTES);
+                } else {
+                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", 1, 120, TimeUnit.MINUTES);
+                }
+
+                if (integer != null && integer == ivrTaskcall.getRecallcount().intValue()) {
+                    log.info("鏃犱汉鎺ュ惉锛歿},   {}", phoneCallBackVO.getErrResult(), phoneCallBackVO.getUuid());
+                    //杩炵画鎵撹瀹氭锛屽鏋滆娌′汉鎺ワ紝閭e氨缁撴潫
+                    ivrTaskcall.setResult(phoneCallBackVO.getErrResult());
+                    ivrTaskcallMapper.updateIvrTaskcall(ivrTaskcall);
+                    redisCache.deleteObject(phoneCallBackVO.getUuid() + "uint8");
+                } else if (integer != null && integer < ivrTaskcall.getRecallcount().intValue()) {
+                    //杩涜閲嶆嫧
+                    PhoneUtils phoneUtils = new PhoneUtils();
+                    phoneUtils.ob(phoneCallBackVO.getUuid(), null, ivrTaskcall.getPhone(), null, null, null, null, null, null, null, null);
+                }
+            }
+
+        } else if (phoneCallBackVO.getResultType() == 2) {
+            //閫氳瘽鐘舵�佹洿鏂版帴鍙�: 2
+            if (phoneCallBackVO.getEnumState() == 0) {
+                // 0-鎸搩
+                Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "enumState");
+
+                if (integer != null && integer < ivrTaskcall.getRecallcount().intValue()) {
+                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", integer + 1, 120, TimeUnit.MINUTES);
+                } else if (integer == null) {
+                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", 1, 120, TimeUnit.MINUTES);
+                } else if (integer != null && integer == ivrTaskcall.getRecallcount().intValue()) {
+                    ivrTaskcall.setResult("鏃犱汉鎺ュ惉");
+                    ivrTaskcallMapper.updateIvrTaskcall(ivrTaskcall);
+                    redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
+                }
+            } else if (phoneCallBackVO.getEnumState() == 2) {
+                //鎮h�呮寕鏂數璇�
+                log.info("鎮h�呮寕鏂數璇濓細{}", phoneCallBackVO.getUuid());
+                ivrTaskcall.setResult(phoneCallBackVO.getHangUpResult());
+                ivrTaskcallMapper.updateIvrTaskcall(ivrTaskcall);
+                redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
+            }
+
+
+        } else if (phoneCallBackVO.getResultType() == 3) {
+            //璇煶璇嗗埆缁撴灉涓婃姤鎺ュ彛: 3
+            Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice");
+            QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
+            IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
+            PhoneUtils phoneUtils = new PhoneUtils();
+
+            if (StringUtils.isEmpty(phoneCallBackVO.getTextResult())) {
+                //鏃犲洖璇�
+                //鍒ゆ柇noVoice鏄惁宸茬粡鍒颁簡鏈�澶у��
+                if (noVoice == ivrLibaTemplateVO.getNoVoiceNum().intValue()) {
+                    //宸茬粡闂簡瀵瑰簲鐨勯亶鏁帮紝灏卞垽鏂槸鍚﹁繕鏈変笅涓�棰�
+                    if (nowQuestion.getTargetid() == ivrLibaTemplateScriptVOs.size()) {
+                        //娌℃湁涓嬩竴棰樹簡锛屽氨鎸傛柇鐢佃瘽锛屾挱鏀剧粨鏉熻
+                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
+                        phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
+                    } else {
+                        //鏈変笅涓�棰�
+                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
+                        IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
+                        // 闂锛�  鍘昏皟鐢ㄢ�渢ts鍚堟垚鍜屾挱鏀锯�濇帴鍙�
+                        phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
+                    }
+                } else {
+                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES);
+                    //璋冪敤ivrLibaTemplateScriptVO涓殑slienceText(闈欓粯璇濇湳)
+                    String slienceText = nowQuestion.getSlienceText();
+                    //闈欓粯璇濇湳  + 闂锛�  鍘昏皟鐢ㄢ�渢ts鍚堟垚鍜屾挱鏀锯�濇帴鍙�
+                    phoneUtils.ttsPlayback(slienceText + nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
+                    return new PhoneCallBackVO();
+                }
+
+            } else {
+                //鏈夊洖璇濓紝瀵瑰洖绛旂殑闂,杩涜姝e垯鍖归厤锛堣繖閲屽彧閽堝閫夋嫨棰橈紝鍏跺畠棰樺瀷涓嶈锛�
+                for (int j = 0; j < nowQuestion.getIvrLibaScriptTargetoptionList().size(); j++) {
+                    //鍖呭惈
+                    Matcher matcher = null;
+                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) {
+                        Pattern pattern = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex());
+                        matcher = pattern.matcher(phoneCallBackVO.getTextResult());
+                    }
+                    //涓嶅寘鍚�
+                    Matcher matcher2 = null;
+                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) {
+                        Pattern pattern2 = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
+                        matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult());
+                    }
+                    log.info("phoneCallBack--Targetregex鐨勫�间负锛歿}, phoneCallBack--Targetregex2鐨勫�间负锛歿}", nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
+                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
+                        //璇存槑鍖归厤姝g‘浜�
+                        //杩欓噷搴旇鍏堝垽鏂被鍨嬶紝鍘诲啀淇敼锛岃缃甀sUserOperation鏄崟閫夐鐨勬敼娉�
+                        nowQuestion.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true);
+                        ivrLibaScriptTargetoptionMapper.updateIvrLibaTemplateTargetoption(nowQuestion.getIvrLibaScriptTargetoptionList().get(j));
+
+
+                        //灏嗛潤榛樼疆涓�0
+                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
+                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
+                        //鑾峰彇涓嬩竴棰�
+                        Integer nextQuestion = nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion();
+                        for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOs) {
+                            if (script.getTargetid() == nextQuestion) {
+                                QuestionMessage questionMessage = new QuestionMessage();
+                                questionMessage.setNowQuestion(script);
+                                questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
+                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
+                                break;
+                            }
+                        }
+                        break;
+                    } else {
+                        //娌℃湁鍖归厤鍒�
+                        Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum");
+                        //鏃犲尮閰嶆鏁板幓鍒ゆ柇鏄惁鍒版渶澶ц闂鏁帮紝骞朵笖鎵�鏈夌殑閫夐」閮藉尮閰嶅畬浜�
+                        if (mateNum == ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
+                            //濡傛灉涓嬩竴棰樹负绌�.鍒欐柊鐨勬暟鎹繑鍥�,骞跺姞涓婃劅璋㈣
+                            if (nowQuestion.getTargetid() < ivrLibaTemplateScriptVOs.size()) {
+                                QuestionMessage questionMessage = new QuestionMessage();
+                                IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
+                                questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
+                                questionMessage.setNowQuestion(nextQuestion);
+                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
+                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
+                            } else {
+                                //灏卞彲浠ユ寕鏂數璇濅簡
+                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
+                                phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
+                                break;
+                            }
+                        } else if (mateNum < ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
+                            //娌℃湁闂埌瑙勫畾娆℃暟
+                            mateNum = mateNum + 1;
+                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES);
+                        }
+                    }
+
+                }
+                //閫夐」鍖归厤瀹屾垚鍚庯紝闇�瑕佸啀鍘婚�氳繃搴撳啀杩涜鍖归厤涓�娆�
+                String extemplateID = ivrLibaTemplateVO.getSubmoduleID();
+                String[] split = extemplateID.split(",");
+                List<String> list = Arrays.asList(split);
+                List<Long> list1 = new ArrayList<>();
+                if (StringUtils.isNotEmpty(extemplateID)) {
+                    for (String str : list) {
+                        list1.add(Long.valueOf(str));
+                    }
+                    List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
+                    for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
+                        Matcher matcher = null;
+                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
+                            Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
+                            matcher = pattern.matcher(returnQues.getContent());
+                        }
+
+                        Matcher matcher2 = null;
+                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
+                            Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
+                            matcher2 = pattern2.matcher(returnQues.getContent());
+                        }
+                        log.info("++++++++++++++++++++++++++閫氱敤搴撴槸鍚︿负绌猴細selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
+                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
+                            QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
+                            IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = returnQues.getNowQuestion();
+                            ivrLibaTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
+                            ivrLibaTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
+                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
+                            if (ivrLibaExtemplatescript.getIsEnd() == 1) {
+                                //灏嗛棶棰樼疆绌�
+                                IvrLibaTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion();
+                                nowQuestion1.setQuestionText(null);
+                                nowQuestion1.setQuestionVoice(null);
+                                questionMessage.setNowQuestion(nowQuestion1);
+                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
+
+                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES);
+                            }
+
+                            //璋冪敤鈥�15銆乼ts鍚堟垚鍜屾挱鏀撅紝 tts_playback鈥濆皢缁撴灉浼犲洖
+
+
+                        }
+                        break;
+                    }
+                }
+
+            }
+        }
+        return phoneCallBackVO;
+    }
+
+    private IvrLibaTemplateScriptVO getNextQuestion(List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList, IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO) {
+
+        for (int j = 0; j < ivrLibaTemplateScriptVOList.size(); j++) {
+            if (ivrLibaTemplateScriptVOList.get(j).getTargetid() == ivrLibaTemplateScriptVO.getTargetid() + 1) {
+                // 瀵硅鏉emplateScriptVO杩涜澶勭悊
+                return ivrLibaTemplateScriptVOList.get(j);
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/smartor/src/main/java/com/smartor/service/impl/PersonVoiceServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/PersonVoiceServiceImpl.java
index 9f71763..bb250b5 100644
--- a/smartor/src/main/java/com/smartor/service/impl/PersonVoiceServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/PersonVoiceServiceImpl.java
@@ -18,6 +18,7 @@
 import com.aliyun.teautil.Common;
 import com.aliyun.teautil.models.RuntimeOptions;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.smartor.domain.*;
 import com.smartor.mapper.*;
@@ -90,9 +91,9 @@
     }
 
     @Override
-    public String texttospeech(String textspeech) {
+    public String texttospeech(String textspeech, String filePath) {
         this.accessToken();
-        this.process2(textspeech);
+        this.process2(textspeech, filePath);
         client.shutdown();
         return returnResult;
     }
@@ -399,11 +400,15 @@
     }
 
 
-    private SpeechSynthesizerListener getSynthesizerListener() {
+    private SpeechSynthesizerListener getSynthesizerListener(String filePath) {
         SpeechSynthesizerListener listener = null;
         try {
+            if (StringUtils.isEmpty(filePath)) {
+                filePath = "tts_test.wav";
+            }
+            String finalFilePath = filePath;
             listener = new SpeechSynthesizerListener() {
-                File f = new File("tts_test.wav");
+                File f = new File(finalFilePath);
                 FileOutputStream fout = new FileOutputStream(f);
                 private boolean firstRecvBinary = true;
 
@@ -449,11 +454,11 @@
     }
 
 
-    public void process2(String text) {
+    public void process2(String text, String filePath) {
         SpeechSynthesizer synthesizer = null;
         try {
             //鍒涘缓瀹炰緥锛屽缓绔嬭繛鎺ャ��
-            synthesizer = new SpeechSynthesizer(client, getSynthesizerListener());
+            synthesizer = new SpeechSynthesizer(client, getSynthesizerListener(filePath));
             synthesizer.setAppKey(appKey);
             //璁剧疆杩斿洖闊抽鐨勭紪鐮佹牸寮�
             synthesizer.setFormat(OutputFormatEnum.WAV);
diff --git a/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplateMapper.xml b/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplateMapper.xml
index d485c90..7e4e9e1 100644
--- a/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplateMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplateMapper.xml
@@ -57,7 +57,6 @@
             keyProperty="ID">
         insert into ivr_liba_extemplate
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="ID != null">ID,</if>
             <if test="extName != null and extName != ''">extName,</if>
             <if test="language != null and language != ''">language,</if>
             <if test="note != null">note,</if>
@@ -76,7 +75,6 @@
             <if test="guid != null">guid,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="ID != null">#{ID},</if>
             <if test="extName != null and extName != ''">#{extName},</if>
             <if test="language != null and language != ''">#{language},</if>
             <if test="note != null">#{note},</if>
@@ -119,13 +117,13 @@
         where ID = #{ID}
     </update>
 
-    <delete id="deleteIvrLibaExtemplateByID" parameterType="String">
+    <delete id="deleteIvrLibaExtemplateByID" parameterType="Long">
         delete
         from ivr_liba_extemplate
         where ID = #{ID}
     </delete>
 
-    <delete id="deleteIvrLibaExtemplateByIDs" parameterType="String">
+    <delete id="deleteIvrLibaExtemplateByIDs" parameterType="Long">
         delete from ivr_liba_extemplate where ID in
         <foreach item="ID" collection="array" open="(" separator="," close=")">
             #{ID}
diff --git a/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplatescriptMapper.xml b/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplatescriptMapper.xml
index 009e649..ad8ca58 100644
--- a/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplatescriptMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/IvrLibaExtemplatescriptMapper.xml
@@ -11,6 +11,7 @@
         <result property="switchText" column="switchText"/>
         <result property="switchWav" column="switchWav"/>
         <result property="selfRegex" column="selfRegex"/>
+        <result property="selfRegex2" column="selfRegex2"/>
         <result property="isEnable" column="isEnable"/>
         <result property="delFlag" column="del_flag"/>
         <result property="updateBy" column="update_by"/>
@@ -21,7 +22,10 @@
         <result property="uploadTime" column="upload_time"/>
         <result property="orgid" column="orgid"/>
         <result property="pid" column="pid"/>
+        <result property="isEnd" column="is_end"/>
         <result property="guid" column="guid"/>
+        <result property="dynamiccruxsJson" column="dynamiccruxs"/>
+        <result property="nodynamiccruxsJson" column="nodynamiccruxs"/>
     </resultMap>
 
     <sql id="selectIvrLibaExtemplatescriptVo">
@@ -31,6 +35,7 @@
                switchText,
                switchWav,
                selfRegex,
+               selfRegex2,
                isEnable,
                del_flag,
                update_by,
@@ -41,6 +46,9 @@
                upload_time,
                orgid,
                pid,
+               is_end,
+               nodynamiccruxs,
+               dynamiccruxs,
                guid
         from ivr_liba_extemplatescript
     </sql>
@@ -49,17 +57,33 @@
             resultMap="IvrLibaExtemplatescriptResult">
         <include refid="selectIvrLibaExtemplatescriptVo"/>
         <where>
-            <if test="extID != null  and extID != ''">and extID = #{extID}</if>
+            <if test="extID != null">and extID = #{extID}</if>
             <if test="switchID != null ">and switchID = #{switchID}</if>
             <if test="switchText != null  and switchText != ''">and switchText = #{switchText}</if>
             <if test="switchWav != null  and switchWav != ''">and switchWav = #{switchWav}</if>
             <if test="selfRegex != null  and selfRegex != ''">and selfRegex = #{selfRegex}</if>
+            <if test="selfRegex2 != null  and selfRegex2 != ''">and selfRegex2 = #{selfRegex2}</if>
             <if test="isEnable != null ">and isEnable = #{isEnable}</if>
             <if test="isupload != null ">and isupload = #{isupload}</if>
             <if test="uploadTime != null ">and upload_time = #{uploadTime}</if>
             <if test="orgid != null  and orgid != ''">and orgid = #{orgid}</if>
             <if test="pid != null ">and pid = #{pid}</if>
             <if test="guid != null  and guid != ''">and guid = #{guid}</if>
+            <if test="isEnd != null">and is_end = #{isEnd}</if>
+        </where>
+    </select>
+
+    <select id="queryIvrLibaExtemplatescriptList" parameterType="com.smartor.domain.IvrLibaExtemplatescript"
+            resultMap="IvrLibaExtemplatescriptResult">
+        <include refid="selectIvrLibaExtemplatescriptVo"/>
+        <where>
+            del_flag = 0
+            <if test="IDs != null">
+                and extID in
+                <foreach collection="IDs" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
         </where>
     </select>
 
@@ -68,16 +92,17 @@
         where ID = #{ID}
     </select>
 
-    <insert id="insertIvrLibaExtemplatescript" parameterType="com.smartor.domain.IvrLibaExtemplatescript" useGeneratedKeys="true"
+    <insert id="insertIvrLibaExtemplatescript" parameterType="com.smartor.domain.IvrLibaExtemplatescript"
+            useGeneratedKeys="true"
             keyProperty="ID">
         insert into ivr_liba_extemplatescript
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="ID != null">ID,</if>
-            <if test="extID != null and extID != ''">extID,</if>
+            <if test="extID != null">extID,</if>
             <if test="switchID != null">switchID,</if>
             <if test="switchText != null">switchText,</if>
             <if test="switchWav != null">switchWav,</if>
             <if test="selfRegex != null">selfRegex,</if>
+            <if test="selfRegex2 != null">selfRegex2,</if>
             <if test="isEnable != null">isEnable,</if>
             <if test="delFlag != null and delFlag != ''">del_flag,</if>
             <if test="updateBy != null">update_by,</if>
@@ -89,14 +114,17 @@
             <if test="orgid != null">orgid,</if>
             <if test="pid != null">pid,</if>
             <if test="guid != null">guid,</if>
+            <if test="isEnd != null">is_end,</if>
+            <if test="dynamiccruxsJson != null">dynamiccruxs,</if>
+            <if test="nodynamiccruxsJson != null">nodynamiccruxs,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="ID != null">#{ID},</if>
-            <if test="extID != null and extID != ''">#{extID},</if>
+            <if test="extID != null ">#{extID},</if>
             <if test="switchID != null">#{switchID},</if>
             <if test="switchText != null">#{switchText},</if>
             <if test="switchWav != null">#{switchWav},</if>
             <if test="selfRegex != null">#{selfRegex},</if>
+            <if test="selfRegex2 != null">#{selfRegex2},</if>
             <if test="isEnable != null">#{isEnable},</if>
             <if test="delFlag != null and delFlag != ''">#{delFlag},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -108,17 +136,21 @@
             <if test="orgid != null">#{orgid},</if>
             <if test="pid != null">#{pid},</if>
             <if test="guid != null">#{guid},</if>
+            <if test="isEnd != null">#{isEnd},</if>
+            <if test="dynamiccruxsJson != null">#{dynamiccruxsJson},</if>
+            <if test="nodynamiccruxsJson != null">#{nodynamiccruxsJson},</if>
         </trim>
     </insert>
 
     <update id="updateIvrLibaExtemplatescript" parameterType="com.smartor.domain.IvrLibaExtemplatescript">
         update ivr_liba_extemplatescript
         <trim prefix="SET" suffixOverrides=",">
-            <if test="extID != null and extID != ''">extID = #{extID},</if>
+            <if test="extID != null ">extID = #{extID},</if>
             <if test="switchID != null">switchID = #{switchID},</if>
             <if test="switchText != null">switchText = #{switchText},</if>
             <if test="switchWav != null">switchWav = #{switchWav},</if>
             <if test="selfRegex != null">selfRegex = #{selfRegex},</if>
+            <if test="selfRegex2 != null">selfRegex2 = #{selfRegex2},</if>
             <if test="isEnable != null">isEnable = #{isEnable},</if>
             <if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
@@ -130,11 +162,14 @@
             <if test="orgid != null">orgid = #{orgid},</if>
             <if test="pid != null">pid = #{pid},</if>
             <if test="guid != null">guid = #{guid},</if>
+            <if test="isEnd != null">is_end = #{isEnd},</if>
+            <if test="dynamiccruxsJson != null">dynamiccruxs = #{dynamiccruxsJson},</if>
+            <if test="nodynamiccruxsJson != null">nodynamiccruxs = #{nodynamiccruxsJson},</if>
         </trim>
         where ID = #{ID}
     </update>
 
-    <delete id="deleteIvrLibaExtemplatescriptByID" parameterType="String">
+    <delete id="deleteIvrLibaExtemplatescriptByID" parameterType="Long">
         delete
         from ivr_liba_extemplatescript
         where ID = #{ID}
diff --git a/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateMapper.xml b/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateMapper.xml
index e354686..1aea316 100644
--- a/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateMapper.xml
@@ -52,6 +52,7 @@
         <result property="mateNum" column="mate_num"/>
         <result property="revisitBefore" column="revisit_before"/>
         <result property="revisitAfter" column="revisit_after"/>
+        <result property="noVoiceNum" column="no_voice_num"/>
     </resultMap>
 
     <sql id="selectIvrLibaTemplateVo">
@@ -72,6 +73,7 @@
                otherdata,
                suitway,
                mate_num,
+               no_voice_num,
                submodule, language, note, isEnable, addUserID, addTime, modifyUserID, modifyTime, groupID, label_info, submoduleID, playType, icd10code, icd10codename, atuoTaskDayOffset, deptIds, dept_names, F_KSDM, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid, assortid, parameter
         from ivr_liba_template
     </sql>
@@ -85,9 +87,10 @@
                 '%')
             </if>
             <if test="targetid != null ">and targetid = #{targetid}</if>
+            <if test="ID != null ">and id = #{ID}</if>
             <if test="revisitAfter != null ">and revisit_after = #{revisitAfter}</if>
             <if test="revisitBefore != null ">and revisit_before = #{revisitBefore}</if>
-            <if test="mateNum != null ">and mate_num = #{mateNum}</if>
+            <if test="mateNum != null and mateNum > 0">and mate_num = #{mateNum}</if>
             <if test="suitway != null ">and suitway = #{suitway}</if>
             <if test="targetname != null and targetname !='' ">and targetname = #{targetname}</if>
             <if test="version != null and version !='' ">and version = #{version}</if>
@@ -127,6 +130,7 @@
             <if test="assortid != null ">and assortid = #{assortid}</if>
             <if test="parameter != null  and parameter != ''">and parameter = #{parameter}</if>
             <if test="tag != null  and tag != ''">and tag = #{tag}</if>
+            <if test="noVoiceNum != null and noVoiceNum > 0">and no_voice_num = #{noVoiceNum}</if>
         </where>
     </select>
 
@@ -185,6 +189,7 @@
             <if test="mateNum != null ">mate_num</if>
             <if test="revisitAfter != null ">revisit_after</if>
             <if test="revisitBefore != null ">revisit_before</if>
+            <if test="noVoiceNum != null and noVoiceNum > 0 ">no_voice_num</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="templateName != null and templateName != ''">#{templateName},</if>
@@ -233,6 +238,7 @@
             <if test="mateNum != null ">#{mateNum}</if>
             <if test="revisitAfter != null ">#{revisitAfter}</if>
             <if test="revisitBefore != null ">#{revisitBefore}</if>
+            <if test="noVoiceNum != null and noVoiceNum > 0">#{noVoiceNum}</if>
         </trim>
     </insert>
 
@@ -282,9 +288,10 @@
             <if test="tag != null">tag = #{tag},</if>
             <if test="suitway != null">suitway = #{suitway},</if>
             <if test="otherdata != null">otherdata = #{otherdata},</if>
-            <if test="mateNum != null ">mate_num = #{mateNum}</if>
-            <if test="revisitAfter != null ">revisit_after = #{revisitAfter}</if>
-            <if test="revisitBefore != null ">revisit_before = #{revisitBefore}</if>
+            <if test="mateNum != null ">mate_num = #{mateNum},</if>
+            <if test="revisitAfter != null ">revisit_after = #{revisitAfter},</if>
+            <if test="revisitBefore != null ">revisit_before = #{revisitBefore},</if>
+            <if test="noVoiceNum != null and noVoiceNum > 0 ">no_voice_num = #{noVoiceNum}</if>
         </trim>
         where ID = #{ID}
     </update>
diff --git a/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml b/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml
index 0f8b3ca..e8f426b 100644
--- a/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml
@@ -39,6 +39,8 @@
         <result property="targettype" column="targettype"/>
         <result property="targetvalue" column="targettalue"/>
         <result property="questiontitle" column="questiontitle"/>
+        <result property="nextQuestion" column="next_question"/>
+        <result property="otherdata" column="otherdata"/>
     </resultMap>
 
     <sql id="selectIvrLibaTemplateScriptVo">
@@ -62,6 +64,8 @@
                targettype,
                targetvalue,
                questiontitle,
+               next_question,
+               otherdata,
                targetOptions, language, playWavOnly, isEnable, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid
         from ivr_liba_template_script
     </sql>
@@ -85,6 +89,7 @@
             <if test="noClearlyText != null  and noClearlyText != ''">and noClearlyText = #{noClearlyText}</if>
             <if test="noClearlyVoice != null  and noClearlyVoice != ''">and noClearlyVoice = #{noClearlyVoice}</if>
             <if test="questiontitle != null  and questiontitle != ''">and questiontitle = #{questiontitle}</if>
+            <if test="nextQuestion != null  and nextQuestion != ''">and next_question = #{nextQuestion}</if>
             <if test="categoryName != null  and categoryName != ''">and categoryName like concat('%', #{categoryName},
                 '%')
             </if>
@@ -146,6 +151,8 @@
             <if test="targettype != null">targettype,</if>
             <if test="targetid != null">targetid,</if>
             <if test="questiontitle != null">questiontitle,</if>
+            <if test="nextQuestion != null">next_question,</if>
+            <if test="otherdata != null">otherdata,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="templateQuestionNum != null">#{templateQuestionNum},</if>
@@ -181,6 +188,8 @@
             <if test="targettype != null">#{targettype},</if>
             <if test="targetid != null">#{targetid},</if>
             <if test="questiontitle != null">#{questiontitle},</if>
+            <if test="nextQuestion != null">#{nextQuestion},</if>
+            <if test="otherdata != null">#{otherdata},</if>
         </trim>
     </insert>
 
@@ -220,6 +229,8 @@
             <if test="targettype != null">targettype = #{targettype},</if>
             <if test="targetid != null">targetid = #{targetid},</if>
             <if test="questiontitle != null">questiontitle = #{questiontitle},</if>
+            <if test="nextQuestion != null">next_question = #{nextQuestion},</if>
+            <if test="otherdata != null">otherdata = #{otherdata},</if>
         </trim>
         where ID = #{ID}
     </update>
diff --git a/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateTargetoptionMapper.xml b/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateTargetoptionMapper.xml
index c571d49..1a9ba0b 100644
--- a/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateTargetoptionMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/IvrLibaTemplateTargetoptionMapper.xml
@@ -34,6 +34,7 @@
         <result property="pid" column="pid"/>
         <result property="guid" column="guid"/>
         <result property="scriptid" column="scriptid"/>
+        <result property="nextQuestion" column="next_question"/>
     </resultMap>
 
     <sql id="selectIvrLibaTemplateTargetoptionVo">
@@ -49,6 +50,8 @@
                targetregex2,
                nodynamiccruxs,
                dynamiccruxs,
+               targetid,
+               next_question,
                optiondesc, language, version, groupid, isabnormal, warnup, warndown, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid
         from ivr_liba_template_targetoption
     </sql>
@@ -122,6 +125,7 @@
             <if test="orgid != null">orgid,</if>
             <if test="pid != null">pid,</if>
             <if test="guid != null">guid,</if>
+            <if test="nextQuestion != null">next_question,</if>
             <if test="nodynamiccruxsJson != null ">nodynamiccruxs,</if>
             <if test="dynamiccruxsJson != null ">dynamiccruxs,</if>
         </trim>
@@ -152,6 +156,7 @@
             <if test="orgid != null">#{orgid},</if>
             <if test="pid != null">#{pid},</if>
             <if test="guid != null">#{guid},</if>
+            <if test="nextQuestion != null">#{nextQuestion},</if>
             <if test="nodynamiccruxsJson != null ">#{nodynamiccruxsJson},</if>
             <if test="dynamiccruxsJson != null ">#{dynamiccruxsJson},</if>
         </trim>
@@ -163,7 +168,7 @@
             <if test="targetid != null">targetid = #{targetid},</if>
             <if test="scriptid != null">scriptid = #{scriptid},</if>
             <if test="targetname != null">targetname = #{targetname},</if>
-            <if test="templateid != null">templateID = #{templateid},</if>
+            <if test="templateID != null">templateID = #{templateID},</if>
             <if test="targettype != null and targettype != ''">targettype = #{targettype},</if>
             <if test="categoryName != null and categoryName != ''">categoryName = #{categoryName},</if>
             <if test="targetvalue != null">targetvalue = #{targetvalue},</if>
@@ -186,6 +191,7 @@
             <if test="orgid != null">orgid = #{orgid},</if>
             <if test="pid != null">pid = #{pid},</if>
             <if test="guid != null">guid = #{guid},</if>
+            <if test="nextQuestion != null">next_question = #{nextQuestion},</if>
             <if test="nodynamiccruxsJson != null ">nodynamiccruxs = #{nodynamiccruxsJson},</if>
             <if test="dynamiccruxsJson != null ">dynamiccruxs = #{dynamiccruxsJson},</if>
         </trim>
diff --git a/smartor/src/main/resources/mapper/smartor/IvrTaskcallMapper.xml b/smartor/src/main/resources/mapper/smartor/IvrTaskcallMapper.xml
index 2fb37cd..c3222e9 100644
--- a/smartor/src/main/resources/mapper/smartor/IvrTaskcallMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/IvrTaskcallMapper.xml
@@ -55,6 +55,8 @@
         <result property="icdName" column="icd_name"/>
         <result property="medicalRecordNo" column="medical_record_no"/>
         <result property="preachcontent" column="preachcontent"/>
+        <result property="sendType" column="send_type"/>
+        <result property="sendTimeSlot" column="send_time_slot"/>
     </resultMap>
 
     <sql id="selectIvrTaskcallVo">
@@ -104,9 +106,11 @@
                guid,
                text_param,
                serviceform,
-               badNo,
-               icdName,
-               medicalRecordNo,
+               bad_no,
+               icd_name,
+               send_type,
+               medical_record_no,
+               send_time_slot,
                preachcontent
         from ivr_taskcall
     </sql>
@@ -153,13 +157,15 @@
             <if test="uploadTime != null ">and upload_time = #{uploadTime}</if>
             <if test="orgid != null  and orgid != ''">and orgid = #{orgid}</if>
             <if test="pid != null ">and pid = #{pid}</if>
-            <if test="piserviceformd != null ">and serviceform = #{serviceform}</if>
+            <if test="serviceform != null ">and serviceform = #{serviceform}</if>
             <if test="guid != null  and guid != ''">and guid = #{guid}</if>
             <if test="textParam != null  and textParam != ''">and text_param = #{textParam}</if>
             <if test="badNo != null">and bad_no = #{badNo}</if>
             <if test="icdName != null  and icdName != ''">and icd_name = #{icdName}</if>
-            <if test="medicalRecordNo != null  and medicalRecordNo != ''">and medical_record_no = #{medicalRecordNo}</if>
+            <if test="medicalRecordNo != null  and medicalRecordNo != ''">and medical_record_no = #{medicalRecordNo}
+            </if>
             <if test="preachcontent != null  and preachcontent != ''">and preachcontent = #{preachcontent}</if>
+            <if test="sendType != null  and sendType != ''">and send_type = #{sendType}</if>
         </where>
     </select>
 
@@ -168,10 +174,9 @@
         where id = #{id}
     </select>
 
-    <insert id="insertIvrTaskcall" parameterType="com.smartor.domain.IvrTaskcall">
+    <insert id="insertIvrTaskcall" parameterType="com.smartor.domain.IvrTaskcall"  useGeneratedKeys="true" keyProperty="id">
         insert into ivr_taskcall
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="id != null">id,</if>
             <if test="sendname != null">sendname,</if>
             <if test="phone != null">phone,</if>
             <if test="sex != null">sex,</if>
@@ -221,9 +226,9 @@
             <if test="icdName != null  and icdName != ''">icd_name,</if>
             <if test="medicalRecordNo != null  and medicalRecordNo != ''">medical_record_no,</if>
             <if test="preachcontent != null  and preachcontent != ''">preachcontent,</if>
+            <if test="sendType != null  and sendType != ''">send_type,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="id != null">#{id},</if>
             <if test="sendname != null">#{sendname},</if>
             <if test="phone != null">#{phone},</if>
             <if test="sex != null">#{sex},</if>
@@ -273,6 +278,7 @@
             <if test="icdName != null  and icdName != ''">#{icdName},</if>
             <if test="medicalRecordNo != null  and medicalRecordNo != ''">#{medicalRecordNo},</if>
             <if test="preachcontent != null  and preachcontent != ''">#{preachcontent},</if>
+            <if test="sendType != null  and sendType != ''">#{sendType},</if>
         </trim>
     </insert>
 
@@ -328,6 +334,7 @@
             <if test="icdName != null  and icdName != ''">icd_name = #{icdName},</if>
             <if test="medicalRecordNo != null  and medicalRecordNo != ''">medical_record_no = #{medicalRecordNo},</if>
             <if test="preachcontent != null  and preachcontent != ''">preachcontent = #{preachcontent},</if>
+            <if test="sendType != null  and sendType != ''">send_type = #{sendType},</if>
         </trim>
         where id = #{id}
     </update>
@@ -340,4 +347,69 @@
         where id = #{id}
     </update>
 
+    <select id="getDataByTime" resultMap="IvrTaskcallResult">
+
+        select id,
+               sendname,
+               phone,
+               sex,
+               age,
+               sfzh,
+               addr,
+               senderdetail,
+               type,
+               taskid,
+               templateid,
+               templatename,
+               senddate,
+               sendlimitabegin,
+               sendlimitaend,
+               sendlimitpbegin,
+               sendlimitpend,
+               sendlimitnbegin,
+               sendlimitnend,
+               sendstate,
+               senduuid,
+               result,
+               finishtime,
+               userid,
+               username,
+               outbounduuid,
+               recordid,
+               recallcount,
+               exrecallcount,
+               pulltime,
+               bqsms,
+               bhsms,
+               deptcode,
+               labelstatus,
+               del_flag,
+               update_by,
+               update_time,
+               create_by,
+               create_time,
+               isupload,
+               upload_time,
+               orgid,
+               pid,
+               guid,
+               text_param,
+               serviceform,
+               bad_no,
+               icd_name,
+               send_type,
+               medical_record_no,
+               preachcontent,
+               send_time_slot
+        FROM ivr_taskcall,
+             JSON_TABLE(send_time_slot, '$[*]' COLUMNS (
+        begantime DATETIME PATH '$.begantime',
+        endtime DATETIME PATH '$.endtime'
+        )) AS jt
+        WHERE jt.begantime > #{beganTime}
+          AND jt.begantime &lt;= #{endTime}
+          AND sendstate IS NULL
+    </select>
+
+
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3