diff --git a/docker/web/Dockerfile b/docker/web/Dockerfile index d816637..6f75c6f 100644 --- a/docker/web/Dockerfile +++ b/docker/web/Dockerfile @@ -1,5 +1,13 @@ # 设置基础镜像 -FROM registry.cn-beijing.aliyuncs.com/longbei/jdk:latest +FROM openjdk:8u201-jre-alpine +ENV TZ=Asia/Shanghai +ENV LANG=zh_CN.UTF-8 + +RUN apk --no-cache add tzdata msttcorefonts-installer fontconfig \ + && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone \ + && update-ms-fonts \ + && fc-cache -vf WORKDIR /data/intro-robot/ # 复制java jar 到容器中 @@ -8,7 +16,6 @@ COPY interro_robot-0.0.1-SNAPSHOT.jar /data/intro-robot/interro_robot-0.0.1-SN COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh RUN chmod 777 /usr/local/bin/docker-entrypoint.sh - # 暴漏服务端口 EXPOSE 8891 diff --git a/src/main/java/com/supervision/dto/QueryProcessDTO.java b/src/main/java/com/supervision/dto/QueryProcessDTO.java index bf94e3f..656c81c 100644 --- a/src/main/java/com/supervision/dto/QueryProcessDTO.java +++ b/src/main/java/com/supervision/dto/QueryProcessDTO.java @@ -2,7 +2,7 @@ package com.supervision.dto; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import lombok.AllArgsConstructor; +import com.supervision.dto.robot.ParamCheckDTO; import lombok.Builder; import lombok.Data; @@ -89,33 +89,10 @@ public class QueryProcessDTO { public <T extends CharSequence> void notEmptyParam(String paramName, T value, String errorMsgTemplate){ if(StrUtil.isEmpty(value)){ this.state = 1; - this.paramCheckList.add(new ParamCheckDTO(paramName, errorMsgTemplate,2)); - } - } - - - @Data - @AllArgsConstructor - static class ParamCheckDTO { - private String paramName; - private String paramDesc; - - /** - * 错误类型 1:参数缺失 2:参数值错误 3:参数类型错误 - */ - private Integer errorType; - - public String toMessage(){ - if (Integer.valueOf(1).equals(errorType)){ - return String.format("参数%s缺失",paramName); - } - if (Integer.valueOf(2).equals(errorType)){ - return String.format("参数%s值错误",paramName); - } - if (Integer.valueOf(3).equals(errorType)){ - return String.format("参数%s类型错误",paramName); + if (null == paramCheckList){ + paramCheckList = new ArrayList<>(); } - return ""; + this.paramCheckList.add(new ParamCheckDTO(paramName, errorMsgTemplate,2)); } } } diff --git a/src/main/java/com/supervision/dto/robot/AskInfo.java b/src/main/java/com/supervision/dto/robot/AskInfo.java index 987dd50..cfec221 100644 --- a/src/main/java/com/supervision/dto/robot/AskInfo.java +++ b/src/main/java/com/supervision/dto/robot/AskInfo.java @@ -20,11 +20,6 @@ public class AskInfo { */ private String message; - /** - * 回答内容类型:1-文本,2-音频,3-文件,4-图片,5-视频 6-确认弹框 - */ - /*private Integer answerContentType;*/ - /** * 语音长度 diff --git a/src/main/java/com/supervision/dto/robot/ParamCheckDTO.java b/src/main/java/com/supervision/dto/robot/ParamCheckDTO.java new file mode 100644 index 0000000..b57ba1c --- /dev/null +++ b/src/main/java/com/supervision/dto/robot/ParamCheckDTO.java @@ -0,0 +1,29 @@ +package com.supervision.dto.robot; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ParamCheckDTO { + private String paramName; + private String paramDesc; + + /** + * 错误类型 1:参数缺失 2:参数值错误 3:参数类型错误 + */ + private Integer errorType; + + public String toMessage(){ + if (Integer.valueOf(1).equals(errorType)){ + return String.format("参数%s缺失",paramName); + } + if (Integer.valueOf(2).equals(errorType)){ + return String.format("参数%s值错误",paramName); + } + if (Integer.valueOf(3).equals(errorType)){ + return String.format("参数%s类型错误",paramName); + } + return ""; + } +} diff --git a/src/main/java/com/supervision/service/QueryTemplateProcessor.java b/src/main/java/com/supervision/service/QueryTemplateProcessor.java index 62833ca..6f0376d 100644 --- a/src/main/java/com/supervision/service/QueryTemplateProcessor.java +++ b/src/main/java/com/supervision/service/QueryTemplateProcessor.java @@ -2,6 +2,7 @@ package com.supervision.service; import com.supervision.domain.IrSessionParam; import com.supervision.dto.QueryProcessDTO; +import com.supervision.dto.robot.ParamCheckDTO; import java.util.List; import java.util.function.Supplier; @@ -23,4 +24,7 @@ public interface QueryTemplateProcessor { */ QueryProcessDTO process(String templateId, String sessionId, Supplier<List<IrSessionParam>> sessionParamSupplier); + + List<ParamCheckDTO> paramCheck(String templateId, String sessionId, List<IrSessionParam> sessionParams); + } diff --git a/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java b/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java index 900e8c4..a2b708d 100644 --- a/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java +++ b/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java @@ -10,6 +10,7 @@ import com.supervision.domain.IrKnowledge; import com.supervision.domain.IrSessionParam; import com.supervision.domain.IrSqlParam; import com.supervision.dto.QueryProcessDTO; +import com.supervision.dto.robot.ParamCheckDTO; import com.supervision.service.IrKnowledgeService; import com.supervision.service.IrSessionParamService; import com.supervision.service.IrSqlParamService; @@ -114,6 +115,22 @@ public class QueryTemplateProcessorImpl implements QueryTemplateProcessor { return queryProcessDTO; } + @Override + public List<ParamCheckDTO> paramCheck(String templateId, String sessionId, List<IrSessionParam> sessionParams) { + // 查询知识查询sql需要的参数 + List<IrSqlParam> paramsList = sqlParamService.lambdaQuery().eq(IrSqlParam::getKnowledgeId, templateId).list(); + + // 校验知识查询sql必填参数 + Set<String> sessionParamsNames = sessionParams.stream().filter(param->StrUtil.isNotEmpty(param.getParamValue())).map(IrSessionParam::getParamName).collect(Collectors.toSet()); + + return paramsList.stream().filter(param -> Integer.valueOf(1).equals(param.getParamRequire())).map(param -> { + if (!sessionParamsNames.contains(param.getParamName())) { + return new ParamCheckDTO(param.getParamName(), param.getParamDesc(), 1); + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList()); + } + public void generateZip(File targetZipFile, List<File> sourceFiles, boolean dirWithFlag) { if (CollUtil.isNotEmpty(sourceFiles)) { File[] fileArr = sourceFiles.toArray(new File[]{}); @@ -199,10 +216,12 @@ public class QueryTemplateProcessorImpl implements QueryTemplateProcessor { if (StrUtil.isNotEmpty(rootPath)){ path = StrUtil.join(File.separator, rootPath, path); } + log.info("定位到的本地文件路径:{}",path); // 判断文件是否存在 if (FileUtil.exist(path)){ return path; } + log.info("文件路径:{}不存在...",path); return null; } diff --git a/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java b/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java index 49921e7..1e797e0 100644 --- a/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java +++ b/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java @@ -76,6 +76,9 @@ public class RobotTalkServiceImpl implements RobotTalkService { .answerInfo(AnswerInfo.builder().contentType(robotTalkReq.getAnswerType()).build()) .build(); + // 获取机器人配置 + IrRobotConfig config = irRobotConfigService.lambdaQuery().one(); + // 确认弹框信息 if (StrUtil.isNotEmpty(robotTalkReq.getAskId())){ IrSessionHistory sessionHistory = sessionService.lambdaQuery().eq(IrSessionHistory::getId, robotTalkReq.getAskId()).one(); @@ -86,15 +89,32 @@ public class RobotTalkServiceImpl implements RobotTalkService { } } - // 提取信息中的关键信息 - if (Boolean.FALSE.equals(robotTalkReq.isConfirmFlag())){ - extractInformation(sessionId, robotTalkReq.getMessage(), robotTalkDTO); - } // 匹配问题意图 - MatchQuestionAnswerDTO matchQuestionAnswerDTO = robotTalkDTO.isDoNext() ? matchQuestionAnswer(robotTalkReq.getMessage()) : null; + MatchQuestionAnswerDTO matchQuestionAnswerDTO = matchQuestionAnswer(robotTalkReq.getMessage()); + if (Objects.nonNull(matchQuestionAnswerDTO)){ + List<ParamCheckDTO> paramCheckDTOS = queryTemplateProcessor.paramCheck(matchQuestionAnswerDTO.getMatchQuestionCode(), sessionId, + suspectInfo2IrSessionParam(sessionId, null)); + // 匹配到意图,但是参数校验不通过,尝试提取消息中的信息 + if (CollUtil.isNotEmpty(paramCheckDTOS) && !Boolean.TRUE.equals(robotTalkReq.isConfirmFlag())){ + String paramsJoin = paramCheckDTOS.stream().map(ParamCheckDTO::getParamName).collect(Collectors.joining(",")); + log.info("匹配到的问题:{} ,需要参数:{} ,尝试抽取问题:{} 中的参数。",matchQuestionAnswerDTO.getMatchQuestionCode(),paramsJoin,robotTalkReq.getMessage()); + extractInformation(sessionId, robotTalkReq.getMessage(), robotTalkDTO); + robotTalkDTO.getAnswerInfo().setContentType(6); + } + }else { + if (!Boolean.TRUE.equals(robotTalkReq.isConfirmFlag())){ + log.info("问题:{},未匹配到意图,且confirmFlag标识不为true,抽取问题中的关键属性",robotTalkReq.getMessage()); + // 未匹配到意图,且不是关键信息确认操作则提取信息中的关键信息 + extractInformation(sessionId, robotTalkReq.getMessage(), robotTalkDTO); + robotTalkDTO.getAnswerInfo().setContentType(6); + }else { + // 未匹配到意图,是关键信息确认操作,不做问题响应,只做默认回答 + log.info("问题:{},未匹配到意图,且confirmFlag标识为true,设置默认回答:{}",robotTalkReq.getMessage(),config.getUnrecognizedTwo()); + robotTalkDTO.getAnswerInfo().setMessage(config.getUnrecognizedTwo()); + robotTalkDTO.setDoNext(false); + } + } - // 获取机器人配置 - IrRobotConfig config = irRobotConfigService.lambdaQuery().one(); if (Objects.isNull(matchQuestionAnswerDTO) && robotTalkDTO.isDoNext()){ // 未匹配到查询意图,设置默认错误语 log.info("问题:{}未匹配到意图",robotTalkReq.getMessage()); @@ -225,7 +245,7 @@ public class RobotTalkServiceImpl implements RobotTalkService { if (Objects.isNull(sessionParam) || StrUtil.isEmpty(sessionParam.getParamValue())) { // 案件id为空,需要设置案件id answerInfo.setContentType(2); - answerInfo.setMessage("请先设置案件id"); + answerInfo.setMessage("请先设置案件信息"); robotTalkDTO.setDoNext(false); } else { Integer caseNo = StrUtil.isEmpty(sessionParam.getParamValue()) ? null : Integer.valueOf(sessionParam.getParamValue()); diff --git a/src/main/java/com/supervision/vo/talk/RobotTalkReq.java b/src/main/java/com/supervision/vo/talk/RobotTalkReq.java index 2a41752..3562774 100644 --- a/src/main/java/com/supervision/vo/talk/RobotTalkReq.java +++ b/src/main/java/com/supervision/vo/talk/RobotTalkReq.java @@ -21,6 +21,9 @@ public class RobotTalkReq { */ private Integer answerType; + /** + * 关键内容确认标识 + */ private boolean confirmFlag; // ========方便前端好传参=======>>>>>>