PaperBasicInfo

dev-tmp1
luotaiqian 2026-08-21 10:38:23 +08:00
parent 1e8386f7c4
commit 4817abfde5
8 changed files with 149 additions and 10 deletions

View File

@ -2,18 +2,21 @@ package org.qinan.cedu.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.qinan.cedu.model.dto.PaperQuestionDeleteDTO;
import org.qinan.cedu.model.dto.PaperQuestionRelUpdateDTO;
import org.qinan.cedu.model.dto.PaperQuestionSaveDTO;
import org.qinan.cedu.model.dto.QuestionUpdateDTO;
import org.qinan.cedu.model.vo.PaperQuestionDetailVO;
import org.qinan.cedu.service.PaperQuestionRelService;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
@ -41,6 +44,17 @@ public class PaperQuestionRelController {
return SingleResponse.success();
}
/**
*
*/
@ApiOperation("查询试卷习题详情")
@GetMapping("/find")
public SingleResponse<PaperQuestionDetailVO> find(@RequestParam @ApiParam(value = "试卷id", required = true) Long paperId,
@RequestParam @ApiParam(value = "试题id", required = true) Long questionId) {
PaperQuestionDetailVO detailVO = paperQuestionRelService.findPaperQuestion(paperId, questionId);
return SingleResponse.success(detailVO);
}
@ApiOperation("编辑试卷习题")
@PostMapping("/modify")
public SingleResponse<Void> modify(@Validated @RequestBody PaperQuestionRelUpdateDTO dto) {

View File

@ -1,6 +1,8 @@
package org.qinan.cedu.convertor;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.qinan.cedu.model.dto.PaperCopyDTO;
import org.qinan.cedu.model.entity.PaperDO;
import org.qinan.cedu.model.vo.PaperBasicInfoVO;
import org.qinan.cedu.model.vo.PaperPageVO;
@ -21,4 +23,21 @@ public interface PaperConvertor {
* @return VO
*/
PaperBasicInfoVO convertEToBasicVo(PaperDO entity);
/**
* /////沿
*
* @param dto
* @param source
* @return id
*/
@Mapping(target = "id", ignore = true)
@Mapping(target = "paperName", expression = "java(dto.getPaperName().trim())")
@Mapping(target = "paperTotalScore", source = "dto.paperTotalScore")
@Mapping(target = "paperPassScore", source = "dto.paperPassScore")
@Mapping(target = "status", source = "source.status")
@Mapping(target = "paperType", source = "source.paperType")
@Mapping(target = "configRule", source = "source.configRule")
@Mapping(target = "examTime", source = "source.examTime")
PaperDO convertCopyDtoToE(PaperCopyDTO dto, PaperDO source);
}

View File

@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
import org.qinan.cedu.model.dto.PaperQuestionPageQueryDTO;
import org.qinan.cedu.model.dto.QuestionTypeCountQueryDTO;
import org.qinan.cedu.model.entity.QuestionDO;
import org.qinan.cedu.model.vo.PaperQuestionDetailVO;
import org.qinan.cedu.model.vo.PaperQuestionVO;
import org.qinan.cedu.model.vo.QuestionTypeCountVO;
import org.qinan.cedu.model.vo.QuestionVO;
@ -36,6 +37,15 @@ public interface QuestionMapper extends BaseMapper<QuestionDO> {
*/
QuestionVO findQuestion(@Param("questionId") Long questionId);
/**
*
*
* @param paperId id
* @param questionId id
* @return
*/
PaperQuestionDetailVO findPaperQuestion(@Param("paperId") Long paperId, @Param("questionId") Long questionId);
/**
*
*

View File

@ -0,0 +1,60 @@
package org.qinan.cedu.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
*
*/
@Data
public class PaperQuestionDetailVO {
@ApiModelProperty("主键")
@JsonSerialize(using = ToStringSerializer.class)
private String id;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@ApiModelProperty("题目内容")
private String title;
@ApiModelProperty("题型single单选/multiple多选/judge判断/fill填空/short简答")
private String questionType;
@ApiModelProperty("参考答案:逗号隔开")
private String answer;
@ApiModelProperty("答案选项id 多个逗号隔开")
private String answerQuestionOptionIds;
@ApiModelProperty("子题 多个逗号分割")
private String childrenQuestionIds;
@ApiModelProperty("分值(取自试卷试题关系)")
private BigDecimal score;
@ApiModelProperty("答案解析")
private String analysis;
@ApiModelProperty("标签类型")
private String tagType;
@ApiModelProperty("关联课件管理id")
@JsonSerialize(using = ToStringSerializer.class)
private Long coursewareManagementId;
@ApiModelProperty("试题选项信息")
private List<QuestionOptionVO> questionOptionVOList;
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import org.qinan.cedu.model.dto.PaperQuestionRelUpdateDTO;
import org.qinan.cedu.model.dto.PaperQuestionSaveDTO;
import org.qinan.cedu.model.entity.PaperQuestionRelDO;
import org.qinan.cedu.model.vo.PaperQuestionDetailVO;
import javax.validation.constraints.NotNull;
@ -27,6 +28,15 @@ public interface PaperQuestionRelService extends IService<PaperQuestionRelDO> {
*/
void deletePaperQuestion(@NotNull Long paperId, @NotNull Long questionId);
/**
*
*
* @param paperId id
* @param questionId id
* @return
*/
PaperQuestionDetailVO findPaperQuestion(Long paperId, Long questionId);
/**
* modify
* @param dto dto

View File

@ -21,6 +21,7 @@ import org.qinan.cedu.model.entity.PaperDO;
import org.qinan.cedu.model.entity.PaperQuestionRelDO;
import org.qinan.cedu.model.entity.QuestionDO;
import org.qinan.cedu.model.entity.QuestionOptionDO;
import org.qinan.cedu.model.vo.PaperQuestionDetailVO;
import org.qinan.cedu.service.PaperQuestionRelService;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
import org.springframework.stereotype.Service;
@ -94,6 +95,7 @@ public class PaperQuestionRelServiceImpl extends ServiceImpl<PaperQuestionRelMap
PaperQuestionRelDO rel = new PaperQuestionRelDO();
rel.setPaperId(dto.getPaperId());
rel.setQuestionId(question.getId());
rel.setScore(dto.getScore());
InsertFieldDefaults.applyIgnoreOrgId(rel);
this.save(rel);
}
@ -134,6 +136,25 @@ public class PaperQuestionRelServiceImpl extends ServiceImpl<PaperQuestionRelMap
}
}
@Override
public PaperQuestionDetailVO findPaperQuestion(Long paperId, Long questionId) {
PaperQuestionDetailVO detailVO = questionMapper.findPaperQuestion(paperId, questionId);
if (detailVO == null) {
throw new IllegalArgumentException("试卷试题不存在");
}
// 查询选项信息仅查询VO需要的字段
List<QuestionOptionDO> options = questionOptionMapper.selectList(new LambdaQueryWrapper<QuestionOptionDO>()
.select(QuestionOptionDO::getId, QuestionOptionDO::getQuestionId,
QuestionOptionDO::getOptionKey, QuestionOptionDO::getOptionName,
QuestionOptionDO::getOptionText, QuestionOptionDO::getIsCorrect,
QuestionOptionDO::getSortOrder)
.eq(QuestionOptionDO::getQuestionId, questionId)
.eq(QuestionOptionDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
.orderByAsc(QuestionOptionDO::getSortOrder));
detailVO.setQuestionOptionVOList(questionConvertor.convertOptionEListToVoList(options));
return detailVO;
}
@Override
public void modify(PaperQuestionRelUpdateDTO dto) {
// 校验试题存在且未删除

View File

@ -152,15 +152,8 @@ public class PaperServiceImpl extends ServiceImpl<PaperMapper, PaperDO> implemen
.in(QuestionOptionDO::getQuestionId, existQuestionIds)
.eq(QuestionOptionDO::getDeleteEnum, DeleteEnum.FALSE.getCode()));
// 新增试卷(使用请求中的名称/总分/合格分数)
PaperDO target = new PaperDO();
target.setPaperName(copyDTO.getPaperName().trim());
target.setPaperTotalScore(copyDTO.getPaperTotalScore());
target.setPaperPassScore(copyDTO.getPaperPassScore());
target.setStatus(source.getStatus());
target.setPaperType(source.getPaperType());
target.setConfigRule(source.getConfigRule());
target.setExamTime(source.getExamTime());
// 新增试卷(名称/总分/合格分数取请求,其余属性沿用源试卷)
PaperDO target = paperConvertor.convertCopyDtoToE(copyDTO, source);
InsertFieldDefaults.applyIgnoreOrgId(target);
this.savePaper(target);

View File

@ -32,6 +32,18 @@
AND q.delete_enum = 'false'
</select>
<select id="findPaperQuestion" resultType="org.qinan.cedu.model.vo.PaperQuestionDetailVO">
SELECT q.id, q.create_time, q.title, q.question_type, q.answer
, q.answer_question_option_ids, q.children_question_ids
, pqr.score, q.analysis, q.tag_type, q.courseware_management_id
FROM paper_question_rel pqr
JOIN question q ON pqr.question_id = q.id
WHERE pqr.paper_id = #{paperId}
AND pqr.question_id = #{questionId}
AND pqr.delete_enum = 'false'
AND q.delete_enum = 'false'
</select>
<select id="listPaperQuestions" resultType="org.qinan.cedu.model.vo.QuestionVO">
SELECT q.id, q.title, q.question_type, q.answer, q.answer_question_option_ids
, q.score, q.analysis, q.tag_type, q.courseware_management_id