1 changed files with 103 additions and 0 deletions
@ -0,0 +1,103 @@ |
|||
package com.project.classicpaper.domain.service.impl; |
|||
|
|||
import com.project.classicpaper.domain.service.ClassicPaperQuestionGenerator; |
|||
import com.project.information.domain.entity.KnowledgePointEntity; |
|||
import com.project.interaction.domain.dto.GenerateQuestionRequestDTO; |
|||
import com.project.interaction.domain.dto.GenerateQuestionResponseDTO; |
|||
import com.project.question.domain.entity.QuestionEntity; |
|||
import com.project.task.domain.enums.QuestionTypeEnum; |
|||
import jakarta.annotation.Resource; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|||
import org.springframework.stereotype.Component; |
|||
import org.springframework.web.reactive.function.client.WebClient; |
|||
import org.springframework.web.reactive.function.client.WebClientResponseException; |
|||
import reactor.core.publisher.Mono; |
|||
|
|||
import java.nio.charset.StandardCharsets; |
|||
import java.time.Duration; |
|||
import java.util.*; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 算法服务实现:经典套卷生题 |
|||
* 发送请求到算法服务,算法接受后异步回调 /api/milvus/insert |
|||
*/ |
|||
@Component |
|||
@ConditionalOnProperty(value = "classicpaper.algorithm.enabled", havingValue = "true") |
|||
@Slf4j |
|||
public class AlgorithmClassicPaperQuestionGenerator implements ClassicPaperQuestionGenerator { |
|||
|
|||
@Resource(name = "algorithmWebClient") |
|||
private WebClient algorithmWebClient; |
|||
|
|||
/** 算法服务生题 URL(待确认) */ |
|||
@Value("${algo.classicPaperGenerateUrl:/v1/generate/questions_from_cluster}") |
|||
private String generateUrl; |
|||
|
|||
@Value("${algo.apiUrl:http://172.16.25.174:8000}") |
|||
private String apiUrl; |
|||
|
|||
@Override |
|||
public List<QuestionEntity> generate(List<KnowledgePointEntity> knowledgePoints, |
|||
QuestionTypeEnum questionType, int count) throws Exception { |
|||
// 同步生题暂不支持,走降级
|
|||
throw new UnsupportedOperationException("请使用 generateAsync 异步方式"); |
|||
} |
|||
|
|||
@Override |
|||
public String generateAsync(Long paperQuestionId, |
|||
List<KnowledgePointEntity> knowledgePoints, |
|||
QuestionTypeEnum questionType, |
|||
int count) throws Exception { |
|||
List<String> sourceTexts = knowledgePoints.stream() |
|||
.map(kp -> kp.getContent() != null ? kp.getContent() : "") |
|||
.collect(Collectors.toList()); |
|||
List<Long> sourceIds = knowledgePoints.stream() |
|||
.map(KnowledgePointEntity::getId) |
|||
.collect(Collectors.toList()); |
|||
|
|||
GenerateQuestionRequestDTO request = GenerateQuestionRequestDTO.builder() |
|||
.bizKey("PQ:" + paperQuestionId) |
|||
.numQuestions(count) |
|||
.questionTypes(Collections.singletonList(questionType.name().toLowerCase())) |
|||
.cluster(GenerateQuestionRequestDTO.ClusterInfo.builder() |
|||
.sourceText(sourceTexts) |
|||
.sourceId(sourceIds) |
|||
.products(knowledgePoints.get(0).getParseName()) |
|||
.build()) |
|||
.build(); |
|||
|
|||
log.info(">>> [经典套题-算法] 发送生题请求, paperQuestionId={}, 题型={}, 数量={}", |
|||
paperQuestionId, questionType, count); |
|||
|
|||
try { |
|||
GenerateQuestionResponseDTO response = algorithmWebClient.post() |
|||
.uri(apiUrl + generateUrl) |
|||
.bodyValue(request) |
|||
.retrieve() |
|||
.onStatus( |
|||
status -> !status.is2xxSuccessful(), |
|||
resp -> resp.bodyToMono(String.class) |
|||
.flatMap(body -> Mono.error(WebClientResponseException.create( |
|||
resp.statusCode().value(), "", |
|||
resp.headers().asHttpHeaders(), |
|||
body.getBytes(), StandardCharsets.UTF_8 |
|||
))) |
|||
) |
|||
.bodyToMono(GenerateQuestionResponseDTO.class) |
|||
.timeout(Duration.ofSeconds(30)) |
|||
.block(); |
|||
|
|||
String taskId = response != null ? response.getTaskId() : UUID.randomUUID().toString(); |
|||
log.info(">>> [经典套题-算法] 请求已接受, paperQuestionId={}, taskId={}", |
|||
paperQuestionId, taskId); |
|||
return taskId; |
|||
|
|||
} catch (Exception e) { |
|||
log.error(">>> [经典套题-算法] 请求失败, paperQuestionId={}", paperQuestionId, e); |
|||
throw e; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue