Commit f091929b authored by alex yao's avatar alex yao

feat: 智能出题

parent f86af426
package cn.com.poc.writing.aggregate; package cn.com.poc.writing.aggregate;
import cn.com.poc.writing.entity.ExaminationConfigItemEntity; import cn.com.poc.writing.entity.ExaminationConfigItemEntity;
import cn.com.poc.writing.entity.ExaminationDetailEntity;
import cn.com.poc.writing.entity.ExaminationEntity; import cn.com.poc.writing.entity.ExaminationEntity;
import cn.com.poc.writing.entity.GenerateExaminationEntity; import cn.com.poc.writing.entity.GenerateExaminationEntity;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
...@@ -37,7 +35,7 @@ public interface ExaminationService { ...@@ -37,7 +35,7 @@ public interface ExaminationService {
* @param examinationId 查询 * @param examinationId 查询
* @param userId 用户ID * @param userId 用户ID
*/ */
Collection<ExaminationDetailEntity> getExaminations(String examinationId, Long userId); ExaminationEntity getExaminations(String examinationId, Long userId);
/** /**
* 获取历史记录 * 获取历史记录
......
...@@ -3,7 +3,6 @@ package cn.com.poc.writing.aggregate.impl; ...@@ -3,7 +3,6 @@ package cn.com.poc.writing.aggregate.impl;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity; import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService; import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.common.constant.CommonConstant; import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.constant.FmxParamConfigConstant;
import cn.com.poc.common.utils.*; import cn.com.poc.common.utils.*;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message; import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
...@@ -23,7 +22,6 @@ import org.apache.commons.collections4.CollectionUtils; ...@@ -23,7 +22,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -106,7 +104,7 @@ public class ExaminationServiceImpl implements ExaminationService { ...@@ -106,7 +104,7 @@ public class ExaminationServiceImpl implements ExaminationService {
BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse); BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse);
SSEUtil sseUtil = new SSEUtil(); SSEUtil sseUtil = new SSEUtil();
List<ExaminationDetailEntity> examinationDetailEntities = outputExaminationBuffer(bufferedReader, sseUtil, examinationId); List<ExaminationDetail> examinationDetailEntities = outputExaminationBuffer(bufferedReader, sseUtil, examinationId);
if (CollectionUtils.isEmpty(examinationDetailEntities)) { if (CollectionUtils.isEmpty(examinationDetailEntities)) {
throw new BusinessException("生成试卷题目失败,联系管理员"); throw new BusinessException("生成试卷题目失败,联系管理员");
} }
...@@ -154,24 +152,33 @@ public class ExaminationServiceImpl implements ExaminationService { ...@@ -154,24 +152,33 @@ public class ExaminationServiceImpl implements ExaminationService {
} }
@Override @Override
public Collection<ExaminationDetailEntity> getExaminations(String examinationId, Long userId) { public ExaminationEntity getExaminations(String examinationId, Long userId) {
ExaminationEntity result = new ExaminationEntity();
BizExaminationEntity bizExaminationEntity = new BizExaminationEntity(); BizExaminationEntity bizExaminationEntity = new BizExaminationEntity();
bizExaminationEntity.setExaminationId(examinationId); bizExaminationEntity.setExaminationId(examinationId);
bizExaminationEntity.setMemberId(userId); bizExaminationEntity.setMemberId(userId);
bizExaminationEntity.setIsDeleted(CommonConstant.IsDeleted.N); bizExaminationEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizExaminationEntity> bizExaminationEntities = bizExaminationService.findByExample(bizExaminationEntity, null); List<BizExaminationEntity> bizExaminationEntities = bizExaminationService.findByExample(bizExaminationEntity, null);
if (CollectionUtils.isEmpty(bizExaminationEntities)) { if (CollectionUtils.isEmpty(bizExaminationEntities)) {
return Collections.emptyList(); return result;
} }
BizExaminationEntity examinationEntity = bizExaminationEntities.get(0); BizExaminationEntity examinationEntity = bizExaminationEntities.get(0);
String examinationDetail = examinationEntity.getExaminationDetail(); String examinationDetail = examinationEntity.getExaminationDetail();
if (StringUtils.isBlank(examinationDetail)) { if (StringUtils.isBlank(examinationDetail)) {
return Collections.emptyList(); return result;
} }
List<ExaminationDetail> examinationDetailEntities = JsonUtils.deSerialize(examinationDetail, new TypeReference<List<ExaminationDetail>>() {
return JsonUtils.<List<ExaminationDetailEntity>>deSerialize(examinationDetail, new TypeReference<List<ExaminationDetailEntity>>() {
}.getType()); }.getType());
result.setExaminationDetails(examinationDetailEntities);
result.setExaminationId(examinationEntity.getExaminationId());
result.setTitle(examinationEntity.getTitle());
result.setN(examinationEntity.getN());
result.setLevel(examinationEntity.getLevel());
result.setDate(examinationEntity.getModifiedTime());
return result;
} }
@Override @Override
...@@ -204,6 +211,7 @@ public class ExaminationServiceImpl implements ExaminationService { ...@@ -204,6 +211,7 @@ public class ExaminationServiceImpl implements ExaminationService {
} }
String content = prompt.replace("${file_content}", fileContent) String content = prompt.replace("${file_content}", fileContent)
.replace("${content}", generateExaminationEntity.getContent())
.replace("${number}", generateExaminationEntity.getN().toString()) .replace("${number}", generateExaminationEntity.getN().toString())
.replace("${total_score}", generateExaminationEntity.getTotalScore().toString()) .replace("${total_score}", generateExaminationEntity.getTotalScore().toString())
.replace("${level}", generateExaminationEntity.getLevel()) .replace("${level}", generateExaminationEntity.getLevel())
...@@ -217,13 +225,13 @@ public class ExaminationServiceImpl implements ExaminationService { ...@@ -217,13 +225,13 @@ public class ExaminationServiceImpl implements ExaminationService {
} }
private List<ExaminationDetailEntity> outputExaminationBuffer(BufferedReader bufferedReader, SSEUtil sseUtil, String examinationId) throws IOException { private List<ExaminationDetail> outputExaminationBuffer(BufferedReader bufferedReader, SSEUtil sseUtil, String examinationId) throws IOException {
String res = ""; String res = "";
StringBuilder output = new StringBuilder(); StringBuilder output = new StringBuilder();
StringBuilder reasoningContent = new StringBuilder(); StringBuilder reasoningContent = new StringBuilder();
StringBuilder examinationRecordBuilder = new StringBuilder(); StringBuilder examinationRecordBuilder = new StringBuilder();
sseUtil.send("{\"examinationId\":\"" + examinationId + "\"}"); sseUtil.send("{\"examinationId\":\"" + examinationId + "\"}");
List<ExaminationDetailEntity> examinationDetailEntities = new ArrayList<>(); List<ExaminationDetail> examinationDetailEntities = new ArrayList<>();
try { try {
while ((res = bufferedReader.readLine()) != null) { while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
...@@ -252,10 +260,10 @@ public class ExaminationServiceImpl implements ExaminationService { ...@@ -252,10 +260,10 @@ public class ExaminationServiceImpl implements ExaminationService {
int endIndex = examinationRecordBuilder.indexOf(endXML, contentStart); int endIndex = examinationRecordBuilder.indexOf(endXML, contentStart);
if (endIndex != -1) { if (endIndex != -1) {
String subStr = examinationRecordBuilder.substring(contentStart, endIndex); String subStr = examinationRecordBuilder.substring(contentStart, endIndex);
ExaminationDetailEntity examinationDetailEntity = JsonUtils.deSerialize(subStr, ExaminationDetailEntity.class); ExaminationDetail examinationDetail = JsonUtils.deSerialize(subStr, ExaminationDetail.class);
if (examinationDetailEntity != null) { if (examinationDetail != null) {
sseUtil.send(JsonUtils.serialize(examinationDetailEntity)); sseUtil.send(JsonUtils.serialize(examinationDetail));
examinationDetailEntities.add(examinationDetailEntity); examinationDetailEntities.add(examinationDetail);
examinationRecordBuilder = new StringBuilder(examinationRecordBuilder.substring(endIndex)); examinationRecordBuilder = new StringBuilder(examinationRecordBuilder.substring(endIndex));
} }
} }
......
package cn.com.poc.writing.dto; package cn.com.poc.writing.dto;
import cn.com.poc.writing.entity.ExaminationDetail;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @author 52747 * @author 52747
* @date 2025/8/14 * @date 2025/8/14
*/ */
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ExaminationDto { public class ExaminationDto {
private String examinationId; private String examinationId;
...@@ -18,6 +25,16 @@ public class ExaminationDto { ...@@ -18,6 +25,16 @@ public class ExaminationDto {
private Date date; private Date date;
private List<ExaminationDetail> examinationDetails;
public List<ExaminationDetail> getExaminationDetails() {
return examinationDetails;
}
public void setExaminationDetails(List<ExaminationDetail> examinationDetails) {
this.examinationDetails = examinationDetails;
}
public String getExaminationId() { public String getExaminationId() {
return examinationId; return examinationId;
} }
......
...@@ -52,6 +52,19 @@ public class GenerateExaminationDto { ...@@ -52,6 +52,19 @@ public class GenerateExaminationDto {
*/ */
private String fileUrl; private String fileUrl;
/**
* 出题内容
*/
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFileUrl() { public String getFileUrl() {
return fileUrl; return fileUrl;
} }
......
...@@ -6,7 +6,7 @@ import java.util.List; ...@@ -6,7 +6,7 @@ import java.util.List;
* @author 52747 * @author 52747
* @date 2025/8/14 * @date 2025/8/14
*/ */
public class ExaminationDetailEntity { public class ExaminationDetail {
private String questionType; private String questionType;
private Integer score; private Integer score;
......
package cn.com.poc.writing.entity; package cn.com.poc.writing.entity;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @author 52747 * @author 52747
...@@ -18,6 +19,16 @@ public class ExaminationEntity { ...@@ -18,6 +19,16 @@ public class ExaminationEntity {
private Date date; private Date date;
private List<ExaminationDetail> examinationDetails;
public List<ExaminationDetail> getExaminationDetails() {
return examinationDetails;
}
public void setExaminationDetails(List<ExaminationDetail> examinationDetails) {
this.examinationDetails = examinationDetails;
}
public String getExaminationId() { public String getExaminationId() {
return examinationId; return examinationId;
} }
......
...@@ -26,6 +26,15 @@ public class GenerateExaminationEntity { ...@@ -26,6 +26,15 @@ public class GenerateExaminationEntity {
private String fileUrl; private String fileUrl;
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public List<String> getQuestionType() { public List<String> getQuestionType() {
return questionType; return questionType;
......
...@@ -44,7 +44,7 @@ public interface ExaminationRest extends BaseRest { ...@@ -44,7 +44,7 @@ public interface ExaminationRest extends BaseRest {
* *
* @param examinationId 试卷ID * @param examinationId 试卷ID
*/ */
List<ExaminationDetailDto> getExaminations(@RequestParam(value = "examinationId") String examinationId); ExaminationDto getExaminations(@RequestParam(value = "examinationId") String examinationId);
/** /**
* 获取历史记录 * 获取历史记录
......
...@@ -5,11 +5,9 @@ import cn.com.poc.common.utils.BlContext; ...@@ -5,11 +5,9 @@ import cn.com.poc.common.utils.BlContext;
import cn.com.poc.support.security.oauth.entity.UserBaseEntity; import cn.com.poc.support.security.oauth.entity.UserBaseEntity;
import cn.com.poc.writing.aggregate.ExaminationService; import cn.com.poc.writing.aggregate.ExaminationService;
import cn.com.poc.writing.dto.ExaminationConfigItemDto; import cn.com.poc.writing.dto.ExaminationConfigItemDto;
import cn.com.poc.writing.dto.ExaminationDetailDto;
import cn.com.poc.writing.dto.ExaminationDto; import cn.com.poc.writing.dto.ExaminationDto;
import cn.com.poc.writing.dto.GenerateExaminationDto; import cn.com.poc.writing.dto.GenerateExaminationDto;
import cn.com.poc.writing.entity.ExaminationConfigItemEntity; import cn.com.poc.writing.entity.ExaminationConfigItemEntity;
import cn.com.poc.writing.entity.ExaminationDetailEntity;
import cn.com.poc.writing.entity.ExaminationEntity; import cn.com.poc.writing.entity.ExaminationEntity;
import cn.com.poc.writing.entity.GenerateExaminationEntity; import cn.com.poc.writing.entity.GenerateExaminationEntity;
import cn.com.poc.writing.rest.ExaminationRest; import cn.com.poc.writing.rest.ExaminationRest;
...@@ -19,7 +17,6 @@ import org.springframework.stereotype.Component; ...@@ -19,7 +17,6 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -60,24 +57,13 @@ public class ExaminationRestImpl implements ExaminationRest { ...@@ -60,24 +57,13 @@ public class ExaminationRestImpl implements ExaminationRest {
} }
@Override @Override
public List<ExaminationDetailDto> getExaminations(String examinationId) { public ExaminationDto getExaminations(String examinationId) {
Assert.notBlank(examinationId); Assert.notBlank(examinationId);
UserBaseEntity currentUser = BlContext.getCurrentUser(); UserBaseEntity currentUser = BlContext.getCurrentUser();
Collection<ExaminationDetailEntity> detailEntities = examinationService.getExaminations(examinationId, currentUser.getUserId()); ExaminationEntity examinationEntity = examinationService.getExaminations(examinationId, currentUser.getUserId());
List<ExaminationDetailDto> result = new ArrayList<>(); ExaminationDto dto = new ExaminationDto();
if (CollectionUtils.isNotEmpty(detailEntities)) { BeanUtil.copyProperties(examinationEntity, dto);
result = detailEntities.stream().map(entity -> {
ExaminationDetailDto dto = new ExaminationDetailDto();
dto.setQuestionType(entity.getQuestionType());
dto.setScore(entity.getScore());
dto.setQuestion(entity.getQuestion());
dto.setChoice(entity.getChoice());
dto.setRightAnswers(entity.getRightAnswers());
dto.setRightAnswersAnalysis(entity.getRightAnswersAnalysis());
return dto; return dto;
}).collect(Collectors.toList());
}
return result;
} }
@Override @Override
......
package cn.com.poc.examination; package cn.com.poc.examination;
import cn.com.poc.common.utils.JsonUtils; import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.SSEUtil;
import cn.com.poc.law.entity.Agent;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message; import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult; import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
...@@ -11,16 +9,12 @@ import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.Thinking; ...@@ -11,16 +9,12 @@ import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.Thinking;
import cn.com.poc.thirdparty.service.LLMService; import cn.com.poc.thirdparty.service.LLMService;
import cn.com.poc.writing.aggregate.ExaminationService; import cn.com.poc.writing.aggregate.ExaminationService;
import cn.com.poc.writing.entity.ExaminationConfigItemEntity; import cn.com.poc.writing.entity.ExaminationConfigItemEntity;
import cn.com.poc.writing.entity.ExaminationDetailEntity; import cn.com.poc.writing.entity.ExaminationDetail;
import cn.com.poc.writing.entity.ExaminationEntity;
import cn.com.poc.writing.entity.GenerateExaminationEntity;
import cn.com.yict.framemax.core.exception.BusinessException; import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.core.spring.SingleContextInitializer; import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebAppConfiguration;
...@@ -28,11 +22,7 @@ import org.springframework.test.context.web.WebAppConfiguration; ...@@ -28,11 +22,7 @@ import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
...@@ -135,7 +125,7 @@ public class ExaminationTest { ...@@ -135,7 +125,7 @@ public class ExaminationTest {
StringBuilder output = new StringBuilder(); StringBuilder output = new StringBuilder();
StringBuilder reasoningContent = new StringBuilder(); StringBuilder reasoningContent = new StringBuilder();
List<ExaminationDetailEntity> list = new ArrayList<>(); List<ExaminationDetail> list = new ArrayList<>();
try { try {
while ((res = bufferedReader.readLine()) != null) { while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
...@@ -156,7 +146,7 @@ public class ExaminationTest { ...@@ -156,7 +146,7 @@ public class ExaminationTest {
int endIndex = output.indexOf(endXML, contentStart); int endIndex = output.indexOf(endXML, contentStart);
if (endIndex != -1) { if (endIndex != -1) {
String extracted = output.substring(contentStart, endIndex); String extracted = output.substring(contentStart, endIndex);
ExaminationDetailEntity generateExaminationEntity = JsonUtils.deSerialize(extracted, ExaminationDetailEntity.class); ExaminationDetail generateExaminationEntity = JsonUtils.deSerialize(extracted, ExaminationDetail.class);
System.out.println(JsonUtils.serialize(generateExaminationEntity)); System.out.println(JsonUtils.serialize(generateExaminationEntity));
list.add(generateExaminationEntity); list.add(generateExaminationEntity);
output = new StringBuilder(output.substring(endIndex)); output = new StringBuilder(output.substring(endIndex));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment