From fdf1b9c1e4489a0c2615fa596268b2f71fad7b4c Mon Sep 17 00:00:00 2001 From: liusheng <337615773@qq.com> Date: 星期一, 15 四月 2024 09:08:10 +0800 Subject: [PATCH] 代码提交 --- ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/ChatWebSocketHandler.java | 281 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 275 insertions(+), 6 deletions(-) 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 +} -- Gitblit v1.9.3