diff --git a/src/main/java/com/supervision/controller/MatchToolController.java b/src/main/java/com/supervision/controller/MatchToolController.java new file mode 100644 index 0000000..a9c06d0 --- /dev/null +++ b/src/main/java/com/supervision/controller/MatchToolController.java @@ -0,0 +1,35 @@ +package com.supervision.controller; + +import com.supervision.dto.MatchQuestionAnswerDTO; +import com.supervision.service.MatchToolService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@Api(tags = "相似度匹配工具") +@RestController +@RequestMapping("matchTool") +@RequiredArgsConstructor +public class MatchToolController { + + private final MatchToolService matchToolService; + + @ApiOperation("刷新匹配工具知识库") + @GetMapping("refreshMatchToolLibrary") + public void refreshMatchToolLibrary() { + matchToolService.refreshMatchToolLibrary(); + } + + @ApiOperation("进行问答") + @GetMapping("execMatch") + public List execMatch(String question) { + return matchToolService.execMatch(question); + } +} diff --git a/src/main/java/com/supervision/domain/IrKnowledge.java b/src/main/java/com/supervision/domain/IrKnowledge.java index d54bae7..f848126 100644 --- a/src/main/java/com/supervision/domain/IrKnowledge.java +++ b/src/main/java/com/supervision/domain/IrKnowledge.java @@ -24,11 +24,6 @@ public class IrKnowledge implements Serializable { @TableId private String id; - /** - * 问题编码(和代码问题枚举对应) - */ - private Integer questionCode; - /** * 标准问题 */ diff --git a/src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java b/src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java new file mode 100644 index 0000000..912aa2a --- /dev/null +++ b/src/main/java/com/supervision/dto/MatchQuestionAnswerDTO.java @@ -0,0 +1,13 @@ +package com.supervision.dto; + +import lombok.Data; + +@Data +public class MatchQuestionAnswerDTO { + + private String matchQuestion; + + private String matchQuestionCode; + + private Double matchScore; +} diff --git a/src/main/java/com/supervision/dto/MatchToolQuestionDTO.java b/src/main/java/com/supervision/dto/MatchToolQuestionDTO.java new file mode 100644 index 0000000..1c81375 --- /dev/null +++ b/src/main/java/com/supervision/dto/MatchToolQuestionDTO.java @@ -0,0 +1,13 @@ +package com.supervision.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class MatchToolQuestionDTO { + + private String questionId; + + private List questionList; +} diff --git a/src/main/java/com/supervision/dto/QuestionReqDTO.java b/src/main/java/com/supervision/dto/QuestionReqDTO.java new file mode 100644 index 0000000..98bca44 --- /dev/null +++ b/src/main/java/com/supervision/dto/QuestionReqDTO.java @@ -0,0 +1,11 @@ +package com.supervision.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class QuestionReqDTO { + + private String question; +} diff --git a/src/main/java/com/supervision/service/MatchToolService.java b/src/main/java/com/supervision/service/MatchToolService.java new file mode 100644 index 0000000..155045c --- /dev/null +++ b/src/main/java/com/supervision/service/MatchToolService.java @@ -0,0 +1,12 @@ +package com.supervision.service; + +import com.supervision.dto.MatchQuestionAnswerDTO; + +import java.util.List; + +public interface MatchToolService { + + void refreshMatchToolLibrary(); + + List execMatch(String question); +} diff --git a/src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java b/src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java new file mode 100644 index 0000000..0e28b29 --- /dev/null +++ b/src/main/java/com/supervision/service/impl/MatchToolServiceImpl.java @@ -0,0 +1,103 @@ +package com.supervision.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.supervision.config.domain.GlobalResult; +import com.supervision.domain.IrKnowledge; +import com.supervision.domain.IrKnowledgeSimilar; +import com.supervision.dto.MatchQuestionAnswerDTO; +import com.supervision.dto.MatchToolQuestionDTO; +import com.supervision.dto.QuestionReqDTO; +import com.supervision.exception.BusinessException; +import com.supervision.service.IrKnowledgeService; +import com.supervision.service.IrKnowledgeSimilarService; +import com.supervision.service.MatchToolService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Type; +import java.net.HttpURLConnection; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class MatchToolServiceImpl implements MatchToolService { + + private final IrKnowledgeService irKnowledgeService; + + private final IrKnowledgeSimilarService irKnowledgeSimilarService; + + @Value("${matchTool.url}") + private String matchToolUrl; + + @Override + public void refreshMatchToolLibrary() { + // 获取所有的问题 + List knowledgeList = irKnowledgeService.list(); + // 获取相似问题 + List similarList = irKnowledgeSimilarService.list(); + Map> similarKnowledgeMap = similarList.stream().collect(Collectors.groupingBy(IrKnowledgeSimilar::getKnowledgeId)); + Map> questionLibrary = knowledgeList.stream().collect(Collectors.toMap(IrKnowledge::getId, e -> CollUtil.newArrayList(e.getStandardQuestion()))); + List matchToolQuestionDTOList = new ArrayList<>(); + + for (Map.Entry> entry : questionLibrary.entrySet()) { + String questionId = entry.getKey(); + List similarKnowledgeList = similarKnowledgeMap.get(questionId); + if (CollUtil.isNotEmpty(similarKnowledgeList)) { + Set similarQuestionSet = similarKnowledgeList.stream().map(IrKnowledgeSimilar::getSimilarQuestion).collect(Collectors.toSet()); + entry.getValue().addAll(similarQuestionSet); + } + MatchToolQuestionDTO matchToolQuestionDTO = new MatchToolQuestionDTO(); + matchToolQuestionDTO.setQuestionId(questionId); + matchToolQuestionDTO.setQuestionList(entry.getValue()); + matchToolQuestionDTOList.add(matchToolQuestionDTO); + } + // 调用tool服务进行更新操作 + submitRefresh(matchToolQuestionDTOList); + } + + @Override + public List execMatch(String question) { + log.info("开始调用talkQaSimilarity,问题:{}", question); + try { + String post = HttpUtil.post(matchToolUrl + "/matchQuestion", JSONUtil.toJsonStr(new QuestionReqDTO(question))); + log.info("相似度匹配答案:{}", post); + TypeReference>> globalResultTypeReference = new TypeReference>>() { + }; + GlobalResult> result = JSONUtil.toBean(post, globalResultTypeReference.getType(), true); + if (result.getCode() != 200) { + throw new BusinessException("匹配失败"); + } + + return result.getData(); + } catch (Exception e) { + log.error("调用talkQaSimilarity error ", e); + return null; + } + } + + private void submitRefresh(List matchToolQuestionDTOList) { + log.info("开始调用matchTool服务进行更新操作"); + try { + String post = HttpUtil.post(matchToolUrl + "/updateDatabase", JSONUtil.toJsonStr(matchToolQuestionDTOList)); + log.info(post); + if (!JSONUtil.isTypeJSON(post)) { + throw new BusinessException("更新失败"); + } + } catch (Exception e) { + log.error("调用matchTool服务更新失败", e); + throw new BusinessException("更新失败"); + } + log.info("成功调用matchTool服务更新数据库"); + + + } + + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b7fb565..137bc90 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,4 +40,6 @@ spring: enabled: true log-slow-sql: true slow-sql-millis: 5000 - merge-sql: false \ No newline at end of file + merge-sql: false +matchTool: + url: http://192.168.10.137:8080 \ No newline at end of file diff --git a/src/test/java/com/supervision/CaseAskApplicationTests.java b/src/test/java/com/supervision/CaseAskApplicationTests.java index 0ac7521..3d2094e 100644 --- a/src/test/java/com/supervision/CaseAskApplicationTests.java +++ b/src/test/java/com/supervision/CaseAskApplicationTests.java @@ -1,15 +1,26 @@ package com.supervision; +import com.supervision.domain.IrKnowledge; +import com.supervision.domain.IrKnowledgeSimilar; +import com.supervision.service.IrKnowledgeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -@MapperScan(basePackages = {"com.supervision.**.mapper"}) -@SpringBootTest +@Slf4j +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@RunWith(SpringJUnit4ClassRunner.class) +@RequiredArgsConstructor class AskApplicationTests { - @Test - void contextLoads() { - } + @Autowired + private IrKnowledgeService irKnowledgeService; + + }