diff --git a/src/main/java/com/supervision/domain/IrSessionParam.java b/src/main/java/com/supervision/domain/IrSessionParam.java index a74754d..34260f5 100644 --- a/src/main/java/com/supervision/domain/IrSessionParam.java +++ b/src/main/java/com/supervision/domain/IrSessionParam.java @@ -1,6 +1,5 @@ package com.supervision.domain; -import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -37,7 +36,7 @@ public class IrSessionParam implements Serializable { private String paramValue; /** - * 参数类型 + * 参数类型 类型参考 @see ParamTypeConverter.typeMap */ private String paramType; diff --git a/src/main/java/com/supervision/domain/IrSqlParam.java b/src/main/java/com/supervision/domain/IrSqlParam.java index 3bac3eb..b0668bd 100644 --- a/src/main/java/com/supervision/domain/IrSqlParam.java +++ b/src/main/java/com/supervision/domain/IrSqlParam.java @@ -1,6 +1,5 @@ package com.supervision.domain; -import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -24,7 +23,7 @@ public class IrSqlParam implements Serializable { /** * 知识库ID */ - private Integer knowledgeId; + private String knowledgeId; /** * 参数名称 diff --git a/src/main/java/com/supervision/service/QueryTemplateProcessor.java b/src/main/java/com/supervision/service/QueryTemplateProcessor.java index 68f10dc..de53fbf 100644 --- a/src/main/java/com/supervision/service/QueryTemplateProcessor.java +++ b/src/main/java/com/supervision/service/QueryTemplateProcessor.java @@ -1,24 +1,23 @@ package com.supervision.service; -import java.util.Map; +import freemarker.template.TemplateException; + +import java.io.IOException; /** * 通过问询模板查询数据,并返回结果模板 */ public interface QueryTemplateProcessor { - /** - * 根据模板id查询结果 - * @param templateId 模板id - * @return 回答结果 - */ - String query(String templateId); /** - * 根据模板id和输入参数查询结果 + * 根据会话id和模板id获取查询数据 * @param templateId 模板id - * @param input 入参 - * @return 回答结果 + * @param sessionId 会话id + * @return 经过模板处理后的结果 + * @throws TemplateException + * @throws IOException */ - String query(String templateId, Map input); + String process(String templateId,String sessionId) throws TemplateException, IOException; + } diff --git a/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java b/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java index cd897c7..8b48a2a 100644 --- a/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java +++ b/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java @@ -9,19 +9,14 @@ import com.supervision.service.IrSessionParamService; import com.supervision.service.IrSqlParamService; import com.supervision.service.QueryTemplateProcessor; import com.supervision.util.ParamTypeConverter; +import com.supervision.util.freemark.StringTemplateConfig; import com.supervision.util.mybatis.RowSqlMapper; -import freemarker.cache.StringTemplateLoader; -import freemarker.template.Configuration; -import freemarker.template.Template; import freemarker.template.TemplateException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.swing.tree.RowMapper; import java.io.IOException; -import java.io.StringWriter; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -38,79 +33,33 @@ public class QueryTemplateProcessorImpl implements QueryTemplateProcessor { private final IrSessionParamService sessionParamService; - private final freemarker.template.Configuration databaseFreemarkerConfiguration; - private final RowSqlMapper rowSqlMapper; @Override - public String query(String templateId) { + public String process(String templateId,String sessionId) throws TemplateException, IOException { Assert.notEmpty(templateId, "模板ID不能为空"); + // 根据模板ID查询查询sql模板和结果模板 IrKnowledge knowledge = knowledgeService.getById(templateId); Assert.notNull(knowledge, "知识不存在!"); Assert.notEmpty(knowledge.getSqlTemplate(), "模板内容不能为空"); Assert.notEmpty(knowledge.getResultTemplate(), "结果模板不能为空"); + // 查询必填的参数 List paramsList = sqlParamService.lambdaQuery().eq(IrSqlParam::getKnowledgeId, templateId).eq(IrSqlParam::getParamRequire, 1).list(); // 校验必填参数 - List sessionParams = sessionParamService.lambdaQuery().eq(IrSessionParam::getSessionId, templateId).list(); + List sessionParams = sessionParamService.lambdaQuery().eq(IrSessionParam::getSessionId, sessionId).list(); Set sessionParamsNames = sessionParams.stream().map(IrSessionParam::getParamName).collect(Collectors.toSet()); - paramsList.forEach(param -> Assert.isTrue(sessionParamsNames.contains(param.getId()))); + paramsList.forEach(param -> Assert.isTrue(sessionParamsNames.contains(param.getParamName()), "参数["+param.getParamName()+"]未设置!")); - - // 获取执行sql + // 执行查询sql ParamTypeConverter converter = ParamTypeConverter.getInstance(); - Map params = sessionParams.stream().collect(Collectors.toMap(IrSessionParam::getParamName, v->converter.convert(v.getParamValue(),v.getParamType()), (v1, v2) -> v1)); - String query = query(templateId, params); - + Map params = sessionParams.stream().collect(Collectors.toMap(IrSessionParam::getParamName, v->converter.convert(v.getParamType(),v.getParamValue()), (v1, v2) -> v1)); List> maps = rowSqlMapper.selectList(knowledge.getSqlTemplate(), params); - // 组装返回结果 - - //templateProcess(maps, knowledge.getResultTemplate()) - return null; - } - - @Override - public String query(String templateId, Map input) { - - Template template = null; - try { - template = databaseFreemarkerConfiguration.getTemplate(templateId); - } catch (IOException e) { - log.error("加载模板失败:模板id:{}",templateId,e); - return null; - } - //databaseFreemarkerConfiguration.gett - StringWriter writer = new StringWriter(); - try { - template.process(input, writer); - } catch (TemplateException | IOException e) { - log.error("模板执行失败",e); - return null; - }finally { - try { - writer.close(); - } catch (IOException e) { - log.error("关闭流失败", e); - } - } - return writer.toString(); - } - - private String templateProcess(String templateId,String context, Map input) throws IOException, TemplateException { - Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); - - StringTemplateLoader stringLoader = new StringTemplateLoader(); - stringLoader.putTemplate(templateId, context); - cfg.setTemplateLoader(stringLoader); - Template template = cfg.getTemplate(templateId); - StringWriter output = new StringWriter(); - template.process(input, output); - - return output.toString(); + return StringTemplateConfig.getInstance().process(knowledge.getResultTemplate(), maps); } diff --git a/src/main/java/com/supervision/util/freemark/StringTemplateConfig.java b/src/main/java/com/supervision/util/freemark/StringTemplateConfig.java index 3c5d6ae..5926656 100644 --- a/src/main/java/com/supervision/util/freemark/StringTemplateConfig.java +++ b/src/main/java/com/supervision/util/freemark/StringTemplateConfig.java @@ -1,5 +1,6 @@ package com.supervision.util.freemark; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.MD5; import freemarker.cache.StringTemplateLoader; @@ -10,6 +11,7 @@ import freemarker.template.TemplateException; import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -54,7 +56,7 @@ public class StringTemplateConfig { return true; } - public String process(String content, Map data) throws IOException, TemplateException { + public String process(String content, List> data) throws IOException, TemplateException { if (StrUtil.isEmpty(content)) { return null; } @@ -64,7 +66,14 @@ public class StringTemplateConfig { } Template template = this.getTemplate(name); StringWriter out = new StringWriter(); - template.process(data, out); + + Map dataModel = new HashMap<>(); + if (CollUtil.size(data) > 1){ + dataModel.put("list", data); + }else { + dataModel= CollUtil.getFirst(data); + } + template.process(dataModel, out); return out.toString(); } diff --git a/src/main/java/com/supervision/util/mybatis/RowMapperStatementBuilder.java b/src/main/java/com/supervision/util/mybatis/RowMapperStatementBuilder.java index 1a0af28..a78c988 100644 --- a/src/main/java/com/supervision/util/mybatis/RowMapperStatementBuilder.java +++ b/src/main/java/com/supervision/util/mybatis/RowMapperStatementBuilder.java @@ -1,5 +1,6 @@ package com.supervision.util.mybatis; +import cn.hutool.crypto.digest.MD5; import org.apache.ibatis.builder.StaticSqlSource; import org.apache.ibatis.mapping.*; import org.apache.ibatis.scripting.LanguageDriver; @@ -28,7 +29,7 @@ public class RowMapperStatementBuilder { * @return */ private String generateMappedStatementId(String sql, SqlCommandType sqlCommandType) { - return sqlCommandType.toString() + "." + sql.hashCode(); + return sqlCommandType.toString() + "." + MD5.create().digestHex(sql); } /** @@ -94,7 +95,7 @@ public class RowMapperStatementBuilder { } public String selectDynamic(String sql, Class parameterType) { - String msId = generateMappedStatementId(sql + parameterType, SqlCommandType.SELECT); + String msId = generateMappedStatementId(sql , SqlCommandType.SELECT); if (hasMappedStatement(msId)) { return msId; } diff --git a/src/main/resources/mapper/IrSqlParamMapper.xml b/src/main/resources/mapper/IrSqlParamMapper.xml index 8f62880..66f043a 100644 --- a/src/main/resources/mapper/IrSqlParamMapper.xml +++ b/src/main/resources/mapper/IrSqlParamMapper.xml @@ -6,7 +6,7 @@ - + diff --git a/src/test/java/com/supervision/AskApplicationTests.java b/src/test/java/com/supervision/AskApplicationTests.java index dcca2d7..a6ded4b 100644 --- a/src/test/java/com/supervision/AskApplicationTests.java +++ b/src/test/java/com/supervision/AskApplicationTests.java @@ -1,6 +1,7 @@ package com.supervision; import com.supervision.service.IrKnowledgeService; +import com.supervision.service.QueryTemplateProcessor; import com.supervision.util.mybatis.RowSqlMapper; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; @@ -92,5 +93,16 @@ class AskApplicationTests { } + @Autowired + private QueryTemplateProcessor queryTemplateProcessor; + @Test + void QueryTemplateProcessorProcessTest() throws IOException, TemplateException { + + String process = queryTemplateProcessor.process("1770984442920292354","123"); + + System.out.println(process); + } + + }