@startuml 
 | 
start 
 | 
:入参,userid,socketMessage; 
 | 
    note right 
 | 
           //发送内空的类型(text,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获取模板信息,并将信息放到redis中, 
 | 
            key为userId + "ivrLibaTemplateVO1",过期时间2小时; 
 | 
            note left 
 | 
                直接调用ivrLibaTemplateService.selectInfoByCondition 
 | 
                获取到“模板信息”、“问题话术”、“话术选项” 
 | 
             end note 
 | 
            :从返回的模板信息中获取问题话术集合 
 | 
            并将集合放到redis中,key为userId + "ivrLibaTemplateScriptVOList"; 
 | 
            note left 
 | 
                  List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList 
 | 
                  根据IvrLibaTemplateScriptVO中的Targetid(暂时当一个问题的序号) 
 | 
                  排序一下 
 | 
             end note 
 | 
            :定义一些redis,这里之所以大量用redis,是用来进行多进程隔离; 
 | 
            note left 
 | 
                   userId + "backQuset" 用来返回调查的总结果 
 | 
                   userId + "noVoice"   用来记录无声响应次数 
 | 
                   userId + "mateNum"   用来记录无匹配次数 
 | 
                   userId + "isOver"    用来记录整个问卷是否结束 0 :未结束     1:结束 
 | 
            end note 
 | 
             :从ivrLibaTemplateScriptVOList中获取到targetid为1的题 
 | 
             放到QuestionMessage中; 
 | 
             note left 
 | 
               QuestionMessage的字段为 
 | 
                        String content 返回的内容 
 | 
                        String kcb 开场白 
 | 
                        String jsy 结束语 
 | 
                        IvrLibaTemplateScriptVO nowQuestion 当前问题 
 | 
              end note 
 | 
             :定义“开场白”, 
 | 
             和 userId + "returnQues" 的redis; 
 | 
    } 
 | 
  
 | 
  
 | 
else (为空) 
 | 
    :获取前端返回的questionMessage“问题信息”; 
 | 
    :去redis中获取到“话术问题集合” 
 | 
    List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOList; 
 | 
    :获取到当前的要问题的问题从questionMessage中, 
 | 
     IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO; 
 | 
    :去redis中获取模板信息,IvrLibaTemplateVO ivrLibaTemplateVO1; 
 | 
    if(questionMessage的content为空,说明对方没有回答) then(true) 
 | 
      partition "静默话术" { 
 | 
           :先去redis中,获取当前用户的对该题的实际静默次数 Integer noVoice; 
 | 
           if(实际静默次数是否等于模板中配置的次数,noVoice == ivrLibaTemplateVO1.getNoVoiceNum().intValue()) then(true) 
 | 
                 :该题记录到调查的总结果中,即backQuset中,更新redis中的userId + "backQuset"; 
 | 
                 if(本题的targetid 等于 题目数量的最大值,即ivrLibaTemplateScriptVO.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(不等于) 
 | 
                     :则还有下一题,就根据当前teagetID+1 获取下一题 
 | 
                      并将下一题的信息放到reids中,key为userId + "returnQues", returnQues 
 | 
                      将userId + "noVoice"清零; 
 | 
                 endif 
 | 
           else(实际静默次数是否 不等于 模板中配置的次数) then(false) 
 | 
                 :进行再将询问; 
 | 
                 :去redis中获取userId + "noVoice"(实际的静默次数),得到Integer noVoice2 
 | 
                  对实际静默次数加1,再放回reids中; 
 | 
             endif 
 | 
     } 
 | 
    else (对方有回答) then(false) 
 | 
         partition "循环本题的选项,ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList()" { 
 | 
               :获取循环,获取到选项的正则匹配, 
 | 
                再获取到用户的回答信息,进行正则匹配; 
 | 
                note right 
 | 
                        Pattern pattern = Pattern.compile(ivrLibaTemplateScriptVO.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()); 
 | 
                        Matcher matcher = pattern.matcher(questionMessage.getContent()); 
 | 
                end note 
 | 
                if(匹配到了) then(matcher.matches()为true) 
 | 
                        :则将该选项中的IsUserOperation,设置成true(前端会根据这个拿值); 
 | 
                        :去redis中获取userId + "backQuset",得到 List<IvrLibaTemplateScriptVO> backQuset; 
 | 
                        :将该题的信息放到backQuset中; 
 | 
                        :更新redis中的userId + "backQuset",并将userId + "noVoice"置为0; 
 | 
                        :结束当前循环; 
 | 
                        :通过当前正确选项的nextQeestion,获取下一题的targetID,再去ivrLibaTemplateScriptVOList, 
 | 
                        进行匹配,获取IvrLibaTemplateScriptVO(下一题的信息); 
 | 
                        :将获取到的题信息放到redis中,key为userId + "returnQues"; 
 | 
                else(没匹配到) 
 | 
                        :去redis中获取userId + "mateNum",得到Integer mateNum(无匹配次数); 
 | 
                        :无匹配次数去判断是否到最大询问次数,并且是否所有的选项都匹配完了; 
 | 
                        if(无匹配次数“等于”最大询问次数,并且所有的选项都匹配完了) then(true) 
 | 
                             :去redis中获取userId + "backQuset",得到 List<IvrLibaTemplateScriptVO> backQuset; 
 | 
                             :将该题的信息放到backQuset中,更新redis中的userId + "backQuset"; 
 | 
                             :判断是否还有下一题; 
 | 
                             if(本题的targetid < 总题数) then(有下一题) 
 | 
                                    :则还有下一题,就根据当前teagetID+1 获取下一题 
 | 
                                     并将下一题的信息放到reids中,key为userId + "returnQues", 
 | 
                                     将userId + "mateNum"清零; 
 | 
                             else(没有题了) 
 | 
                                    :定义一个空的QuestionMessage returnQues2(用于返参); 
 | 
                                    :去reids中获取userId + "backQuset",放到returnQues2的content中; 
 | 
                                    :给returnQues2设置结束语; 
 | 
                                    :更新redis中的userId + "returnQues"; 
 | 
                                    :将redis中的userId + "isOver"值,设置为1(表示整个流程结束); 
 | 
                              endif 
 | 
  
 | 
                        else(无匹配次数“小于”最大询问次数,并且所有的选项都匹配完了) 
 | 
                            :无匹配次数+1,更新redis中的userId + "mateNum"; 
 | 
                         endif 
 | 
                 endif 
 | 
         } 
 | 
         :选项匹配完成后,需要再去通过库再进行匹配一次; 
 | 
         :去模板信息中获取通过库模板ID集合; 
 | 
         note right 
 | 
            String extemplateID = ivrLibaTemplateVO1.getSubmoduleID(); 
 | 
         end note 
 | 
         if(通用库模板ID集合不为空) then(true) 
 | 
             :通过通用库模板ID获取通过话术信息集合; 
 | 
             note right 
 | 
                     List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1); 
 | 
             end note 
 | 
             partition "循环通用话术集合List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts" { 
 | 
                 :通过正则将前端传回的结果,和遍历出来的话术正则进行匹配; 
 | 
                 :匹配到后,去redis中获取userId + "returnQues",将答案放到问题对象中的submoduleText中; 
 | 
                  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 
 | 
:去redis中获取userId + "returnQues",将结果返回给前端; 
 | 
:清空redis所有的变量; 
 | 
  
 | 
note left 
 | 
      //整个流程是否结束,将redis中的该userId下的数据删除; 
 | 
      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 
 |