From 18f876d637cf1e9b0b264a4586e4a676a21f8166 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期五, 13 十一月 2026 10:30:46 +0800
Subject: [PATCH] 代码提交

---
 ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java |   96 +++++++++++++++++++++++++++++++++++++----------
 1 files changed, 75 insertions(+), 21 deletions(-)

diff --git a/ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java b/ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java
index 33123ee..a09ba77 100644
--- a/ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java
+++ b/ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java
@@ -18,9 +18,8 @@
 import com.ruoyi.phone.domain.QuestionMessage;
 import com.ruoyi.phone.service.IPhoneService;
 import com.ruoyi.task.api.TaskSubtaskApi;
-import com.ruoyi.task.api.spi.TaskFtpPort;
-import com.ruoyi.task.api.spi.TaskPreachformPort;
-import com.ruoyi.task.api.spi.TaskSysConfigPort;
+import com.ruoyi.common.utils.FtpService;
+import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
 import com.ruoyi.task.domain.IvrTaskVisitResult;
 import com.ruoyi.task.domain.ServiceSubTaskDetailReq;
 import com.ruoyi.task.domain.ServiceSubtask;
@@ -60,6 +59,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import com.ruoyi.system.service.ISysConfigService;
 
 /**
  * 鐢佃瘽涓氬姟Service瀹炵幇锛堝師 {@code ruoyi-task} 閲� {@code ServiceSubtaskServiceImpl} 鐨勭數璇濋儴鍒嗭級銆�
@@ -110,19 +110,21 @@
      * 璇ヨ〃褰� ruoyi-inhospvisit锛岀敱 smartor 渚ч�傞厤瀹炵幇鏈鍙c��
      */
     @Autowired
-    private TaskPreachformPort taskPreachformPort;
+    private ServiceSubtaskPreachformMapper taskPreachformPort;
 
     /**
      * 褰曢煶鏂囦欢涓嬭浇锛堥洦缁�氳瘽璁板綍鍥炶皟閲屾妸褰撳ぉ褰曢煶浠� FTP 鎷夊洖鏈湴锛�
+     * <p>2026-11锛歿@code FtpService} 宸蹭粠 smartor 涓嬫矇鍒� {@code ruoyi-common}锛�
+     * 鍘熸潵鐨勮繃娓$鍙� {@code TaskFtpPort} 闅忎箣鍒犻櫎锛岃繖閲岀洿鎺ユ敞鍏ラ�氱敤宸ュ叿銆�
      */
     @Autowired
-    private TaskFtpPort taskFtpPort;
+    private FtpService ftpService;
 
     /**
      * 鍙傛暟閰嶇疆璇诲彇锛坽@code sys.voice.match.ai.url}锛欰I 閫夐」鍖归厤鏈嶅姟鍦板潃锛屾寜鏈烘瀯閰嶇疆锛�
      */
     @Autowired
-    private TaskSysConfigPort taskSysConfigPort;
+    private ISysConfigService sysConfigService;
 
     /**
      * AI 閫夐」鍖归厤濂戠害锛坮uoyi-common锛屽疄鐜板湪 ruoyi-task锛屽嵆鍘� {@code matchOptionIndex}锛�
@@ -327,6 +329,8 @@
                             ServiceSubtask ss = new ServiceSubtask();
                             ss.setId(serviceSubtask.getId());
                             ss.setSendstate(6L);
+                            //鐢佃瘽宸茬瓟瀹岋紙瀹屾垚锛夛細鐘舵�佷笌瀹屾垚鏃堕棿涓�璧峰啓锛岄伩鍏�"宸插畬鎴愬嵈鏃犲畬鎴愭椂闂�"
+                            ss.setFinishtime(new Date());
                             taskSubtaskApi.updateSubtask(ss);
                             String date = simpleDateFormat1.format(new Date());
                             log.error("娌℃湁涓嬩竴棰樹簡锛屽氨缁撴潫浜�: {},uuid涓猴細{}", date, phoneCallBackVO.getUuid());
@@ -372,6 +376,8 @@
                         ServiceSubtask ss = new ServiceSubtask();
                         ss.setId(serviceSubtask.getId());
                         ss.setSendstate(6L);
+                        //鐢佃瘽宸茬瓟瀹岋紙瀹屾垚锛夛細鐘舵�佷笌瀹屾垚鏃堕棿涓�璧峰啓锛岄伩鍏�"宸插畬鎴愬嵈鏃犲畬鎴愭椂闂�"
+                        ss.setFinishtime(new Date());
                         taskSubtaskApi.updateSubtask(ss);
 
                         String date = simpleDateFormat1.format(new Date());
@@ -605,12 +611,21 @@
                 //鍘籸edis涓紝鎶婅瀛愪换鍔D鍒犻櫎
                 Long id = serviceSubtask.getId();
                 //鍏堟洿鏂颁竴涓嬪垎鏁�
+                //鈿狅笍 闈欓粯鎸傛満 = 鐢佃瘽娌℃帴閫� / 鎮h�呬竴鐩存病搴旂瓟锛屽睘浜�"鏈��"锛屼笉鏄�"瀹屾垚"锛�
+                //   鈶� 涓嶅啓 finishtime 鈥斺�� 杩欐潯鍗曞瓙鎺ヤ笅鏉ヨ浜ょ粰琛ュ伩浠诲姟锛坰etFailPreachForm 缃� 5 鎴� 3锛�
+                //      鍐嶇敱 compensateTask 鎹炶捣鏉ョ户缁彂涓嬩竴绉嶆柟寮� / 鍒よ秴鏃讹級锛涗竴鏃﹀啓浜嗗畬鎴愭椂闂达紝
+                //      鍚庨潰琚疆鎴�"瓒呮椂(7)"鏃跺氨浼氱暀涓�"瓒呮椂鍗存湁瀹屾垚鏃堕棿"鐨勮剰鏁版嵁锛�
+                //      鍙婃椂鐜囥�佸畬鎴愮巼锛圫erviceSubtaskMapper#selectTimelyRateBatch 璁� finishtime 闈炵┖锛変篃浼氳铏氶珮锛�
+                //   鈶� 涓嶆暣琛屽洖鍐� serviceSubtask 鈥斺�� 閭d細鎶婁笂闈㈠垰鍐欑殑 sendstate=5锛堢數璇濋潤榛橈級瑕嗙洊鍥炴煡搴撴椂鐨勬棫鍊硷紝
+                //      鎵�浠ヨ繖閲屽彧鍥炲啓 id + 鍒嗘暟 + 鏇存柊鏃堕棿锛岀姸鎬佷氦缁欎笅闈㈢殑 setFailPreachForm 鍐冲畾
+                //      锛堟渶鍚庝竴绉嶆柟寮� 鈫� 5 鍙戦�佸け璐ワ紱杩樻湁涓嬩竴绉� 鈫� 3 宸插彂閫侊紝涓よ�呴兘浼氳琛ュ伩浠诲姟鎹炶捣鏉ワ級銆�
                 double score = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE");
-                serviceSubtask.setScore(String.valueOf(score));
-                serviceSubtask.setFinishtime(new Date());
-                serviceSubtask.setUpdateTime(new Date());
-                log.error("鍏堟洿鏂颁竴涓嬪垎鏁�,鐢佃瘽鐨剆erviceSubtask鐨勫�间负锛歿}", serviceSubtask);
-                taskSubtaskApi.updateSubtask(serviceSubtask);
+                ServiceSubtask scoreUpdate = new ServiceSubtask();
+                scoreUpdate.setId(id);
+                scoreUpdate.setScore(String.valueOf(score));
+                scoreUpdate.setUpdateTime(new Date());
+                log.error("鍏堟洿鏂颁竴涓嬪垎鏁�,鐢佃瘽鐨剆coreUpdate鐨勫�间负锛歿}", scoreUpdate);
+                taskSubtaskApi.updateSubtask(scoreUpdate);
                 //璁板綍鐘舵��
                 setFailPreachForm(serviceSubtask, "3", "闈欓粯娆℃暟杈惧埌" + num + "娆�", "4");
 
@@ -667,6 +682,8 @@
                         ss.setId(serviceSubtask.getId());
                         ss.setSendstate(6L);
                         ss.setRemark("鐢佃瘽鎷ㄦ墦宸插畬鎴�");
+                        //鐢佃瘽宸茬瓟瀹岋紙瀹屾垚锛夛細鐘舵�佷笌瀹屾垚鏃堕棿涓�璧峰啓锛岄伩鍏�"宸插畬鎴愬嵈鏃犲畬鎴愭椂闂�"
+                        ss.setFinishtime(new Date());
                         taskSubtaskApi.updateSubtask(ss);
                         //璁板綍鐘舵��
                         setFailPreachForm(serviceSubtask, "3", "鐢佃瘽鎷ㄦ墦宸插畬鎴�", "9");
@@ -700,7 +717,7 @@
                 //鐢ㄦ潵鏍囪锛屾槸鍚︽湁鍖归厤涓婄殑
                 Integer flag = 0;
                 //1-AI璇嗗埆
-                String url = taskSysConfigPort.selectConfigValue("sys.voice.match.ai.url", phoneCallReqYQVO.getOrgid());
+                String url = sysConfigService.selectConfigByKey("sys.voice.match.ai.url", phoneCallReqYQVO.getOrgid());
 
                 if (ObjectUtils.isNotEmpty(url)) {
                     PhoneCallBackYQVO aiMatchResult = AiMatch(url, phoneCallReqYQVO, phoneCallBackYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate, ivrTaskTemplateScripts, scriptId, flag, phoneCallReqYQVO.getUuid());
@@ -852,6 +869,8 @@
                                     ss.setId(serviceSubtask.getId());
                                     ss.setSendstate(6L);
                                     ss.setRemark("鐢佃瘽鎷ㄦ墦宸插畬鎴�");
+                                    //鐢佃瘽宸茬瓟瀹岋紙瀹屾垚锛夛細鐘舵�佷笌瀹屾垚鏃堕棿涓�璧峰啓锛岄伩鍏�"宸插畬鎴愬嵈鏃犲畬鎴愭椂闂�"
+                                    ss.setFinishtime(new Date());
                                     taskSubtaskApi.updateSubtask(ss);
                                     //璁板綍鐘舵��
                                     setFailPreachForm(serviceSubtask, "3", "鐢佃瘽鎷ㄦ墦宸插畬鎴�", "9");
@@ -1234,7 +1253,7 @@
     }
 
     private List<PullTaskVO> getPullTaskList(List<String> subIds, String cacheName) {
-        log.error("浠诲姟鎷夊彇subIds鐨勫�兼槸澶氬皯锛歿}", subIds);
+        log.info("浠诲姟鎷夊彇subIds鐨勫�兼槸澶氬皯锛歿}", subIds);
         //pullTaskVOList鐢ㄤ簬鏁版嵁杩斿洖
         List<PullTaskVO> pullTaskVOList = new ArrayList<>();
         //newValue0鐢ㄤ簬淇濆瓨娌℃湁澶勭悊鐨勫瓙 浠诲姟
@@ -1259,14 +1278,18 @@
                     taskSubtaskApi.updateSubtask(serviceSubtask);
                     continue;
                 }
+                log.info("serviceSubtask.getTaskid()鏈夊�煎悧锛燂紵锛焮}",serviceSubtask.getTaskid());
                 ServiceTask serviceTask = taskSubtaskApi.getTask(serviceSubtask.getTaskid());
+                log.info("serviceTask鏈夊�煎悧锛燂紵锛焮}",serviceTask);
                 IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid());
+                log.info("ivrTaskTemplate鏈夊�煎悧锛燂紵锛焮}",ivrTaskTemplate);
                 if (ObjectUtils.isEmpty(ivrTaskTemplate)) continue;
                 //閫氳繃浠诲姟妯℃澘涓殑"绗竴娆¢棶棰樼紪鍙�"鑾峰彇绗竴涓棶棰�;
                 IvrTaskTemplateScript ivrTaskTemplateScript = null;
                 IvrTaskTemplateScript ivrTaskTemplateScript1 = new IvrTaskTemplateScript();
                 ivrTaskTemplateScript1.setTemplateID(ivrTaskTemplate.getId());
                 List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript1);
+                log.info("ivrTaskTemplateScripts鏈夊�煎悧锛燂紵锛焮}",ivrTaskTemplateScripts.size());
                 aa:
                 for (IvrTaskTemplateScript ivrTaskTemplateScript2 : ivrTaskTemplateScripts) {
                     if (ivrTaskTemplate.getFirstQuestionNum() == Long.valueOf(ivrTaskTemplateScript2.getSort())) {
@@ -1276,7 +1299,7 @@
                 }
                 //濡傛灉ivrTaskTemplateScript涓虹┖锛屼篃灏辨病鏈夊線涓嬫墽琛岀殑蹇呰浜�
                 if (ObjectUtils.isEmpty(ivrTaskTemplateScript)) {
-                    log.error("---------杩欎釜ivrTaskTemplate.getId()鐨勯棶棰樹负绌猴細{}", ivrTaskTemplate.getId());
+                    log.info("---------杩欎釜ivrTaskTemplate.getId()鐨勯棶棰樹负绌猴細{}", ivrTaskTemplate.getId());
                     continue;
                 }
                 //鑾峰彇閫氶厤绗﹀尮閰嶈繃鍚庣殑闂
@@ -1284,7 +1307,7 @@
                 if (StringUtils.isEmpty(scriptContent)) scriptContent = ivrTaskTemplateScript.getScriptContent();
                 String scrContent = getObject(serviceSubtask, scriptContent);
                 String kcb = serviceTask.getKcb() + "," + scrContent;
-
+                log.info("---------杩欎釜kcb鏄暐锛歿}", kcb);
                 //灏佽杩斿洖鏁版嵁
                 //taskId = 瀛愪换鍔D + 闂ID +闂搴忓彿
                 pullTaskVO.setTaskid(subId);
@@ -1295,13 +1318,14 @@
                 if (cacheName.equals("cache-0")) pullTaskVO.setDisplayNo("2");
                 else pullTaskVO.setDisplayNo("2");
                 pullTaskVOList.add(pullTaskVO);
+                log.info("---------杩欎釜pullTaskVO鏄暐锛歿}", pullTaskVO);
                 redisCache.setCacheObject(subId.trim() + "-" + serviceSubtask.getPhone().trim(), ivrTaskTemplateScript.getId().toString(), 120, TimeUnit.MINUTES);
             } else {
                 newValue0.add(subIds.get(i));
                 redisCache.setCacheListRight(cacheName, newValue0);
             }
         }
-
+        log.info("111111111浠诲姟鎷夊彇pullTaskVOList鐨勫�兼槸澶氬皯锛歿}", pullTaskVOList);
         return pullTaskVOList;
     }
 
@@ -1410,7 +1434,7 @@
             taskSubtaskApi.updateSubtask(serviceSubtask);
             setFailPreachForm(serviceSubtask, StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) ? serviceSubtask.getCurrentPreachform() : "3", "鐢佃瘽鎷ㄦ墦宸插畬鎴�", "9");
             //涓嬭浇鏂囦欢
-            taskFtpPort.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
+            ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
             redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
         } else {
             //鎮h�呮嫆缁濋殢璁�
@@ -1559,12 +1583,13 @@
                 serviceSubtask.setCurrentPreachform(preachform);
                 serviceSubtask.setSendstate(5L);
                 serviceSubtask.setRemark(remark + ";鎵�鏈夋墽琛屾柟寮忓潎鏈幏鍙栫粨鏋滐紝浠诲姟澶辫触");
-                taskSubtaskApi.updateSubtask(serviceSubtask);
+                //鍙洖鍐欐湰娆¤鏀圭殑鍒楋紙涓嶅啀鏁磋鍥炲啓锛岄伩鍏嶆妸搴撻噷鐨勬棫 finishtime 绛変竴璧峰甫鍥炴潵锛�
+                updateSubtaskState(serviceSubtask, 5L, preachform, serviceSubtask.getRemark(), null);
                 return true;
             } else {
                 //鍔犲叆鐩墠琛ュ伩閲岀殑 remark
                 serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + remark : remark);
-                taskSubtaskApi.updateSubtask(serviceSubtask);
+                updateSubtaskState(serviceSubtask, null, null, serviceSubtask.getRemark(), null);
             }
         }
 
@@ -1574,8 +1599,35 @@
         //濡傛灉绛変簬9锛屽垯璇存槑鐢佃瘽姝e父缁撴潫浜�
         if (failSendstate.equals("9")) serviceSubtask.setSendstate(6L);
         serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime()));
-        taskSubtaskApi.updateSubtask(serviceSubtask);
+        updateSubtaskState(serviceSubtask, serviceSubtask.getSendstate(), preachform, null, serviceSubtask.getVisitTime());
         return true;
+    }
+
+    /**
+     * 鍙洖鍐欐湰娆$湡姝h鏀圭殑鍒楋紙鏇夸唬"鏁磋鍥炲啓 serviceSubtask"锛夈��
+     * <p>
+     * 涓轰粈涔堝繀椤绘敹绐勶細mapper 鐨� updateServiceSubtask 鏄�&lt;if test="xx != null"&gt;鍔ㄦ�� SET锛�
+     * 鏁磋鍥炲啓浼氭妸搴撻噷宸叉湁鐨� finishtime / visit_time / score 绛夋棫鍊煎師鏍峰啀鍐欎竴閬� 鈥斺�� 鏃㈠彲鑳借鐩�
+     * 骞跺彂鍐欏叆锛屼篃鏄�"鐘舵�� 3/5/7 鍗村甫鐫�瀹屾垚鏃堕棿"杩欑被鑴忔暟鎹殑鎼繍宸ャ��
+     * <p>
+     * 瀹屾垚鏃堕棿鍙e緞锛歴endstate=6锛堝畬鎴愶級鏃惰ˉ瀹屾垚鏃堕棿锛�3 宸插彂閫� / 5 鍙戦�佸け璐� / 7 瓒呮椂绛夐潪瀹屾垚鐘舵��
+     * 涓�寰嬩笉鍐欙紝Mapper 渚х殑"瀹屾垚鏃堕棿涓嶅彉閲�"浼氶『鎵嬫妸鏃у�兼竻鎺夈��
+     */
+    private void updateSubtaskState(ServiceSubtask source, Long sendstate, String currentPreachform,
+                                    String remark, Date visitTime) {
+        if (source == null || source.getId() == null) {
+            return;
+        }
+        ServiceSubtask update = new ServiceSubtask();
+        update.setId(source.getId());
+        update.setSendstate(sendstate);
+        update.setCurrentPreachform(currentPreachform);
+        update.setRemark(remark);
+        update.setVisitTime(visitTime);
+        if (sendstate != null && sendstate == 6L) {
+            update.setFinishtime(source.getFinishtime() != null ? source.getFinishtime() : new Date());
+        }
+        taskSubtaskApi.updateSubtask(update);
     }
 
     private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) {
@@ -1647,7 +1699,7 @@
     public PhoneCallBackSHVO processResust(PhoneCallResultYQVO phoneCallResultYQVO) {
         PhoneCallBackSHVO phoneCallBackSHVO = new PhoneCallBackSHVO();
         //閫氳繃scriptid锛岃幏鍙栨墍鏈夌殑缁撴灉
-        String url = taskSysConfigPort.selectConfigValue("sys.voice.match.ai.url", phoneCallResultYQVO.getOrgid());
+        String url = sysConfigService.selectConfigByKey("sys.voice.match.ai.url", phoneCallResultYQVO.getOrgid());
         ServiceSubtask serviceSubtask = taskSubtaskApi.getSubtask(phoneCallResultYQVO.getSubId());
         IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid());
         IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = iIvrTaskTemplateScriptService.getTaskTempScriptInfoByid(Long.valueOf(phoneCallResultYQVO.getScriptId()));
@@ -1886,6 +1938,8 @@
                     ss.setId(serviceSubtask.getId());
                     ss.setSendstate(6L);
                     ss.setRemark("鐢佃瘽鎷ㄦ墦宸插畬鎴�");
+                    //鐢佃瘽宸茬瓟瀹岋紙瀹屾垚锛夛細鐘舵�佷笌瀹屾垚鏃堕棿涓�璧峰啓锛岄伩鍏�"宸插畬鎴愬嵈鏃犲畬鎴愭椂闂�"
+                    ss.setFinishtime(new Date());
                     taskSubtaskApi.updateSubtask(ss);
                     //璁板綍鐘舵��
                     setFailPreachForm(serviceSubtask, "3", "鐢佃瘽鎷ㄦ墦宸插畬鎴�", "9");

--
Gitblit v1.9.3