user paper exam
parent
b1c38109b1
commit
425d3a5e6b
|
|
@ -40,6 +40,13 @@ public class PaperController {
|
||||||
return PageResponse.of(page.getRecords(), page.getTotal());
|
return PageResponse.of(page.getRecords(), page.getTotal());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation("机构分页查询试卷")
|
||||||
|
@GetMapping("/org/page")
|
||||||
|
public PageResponse<PaperPageVO> orgPage(@Validated PaperOrgPageQueryDTO query) {
|
||||||
|
IPage<PaperPageVO> page = paperService.pageQueryByOrg(query);
|
||||||
|
return PageResponse.of(page.getRecords(), page.getTotal());
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation("修改试卷基本信息")
|
@ApiOperation("修改试卷基本信息")
|
||||||
@PutMapping("/update/basic")
|
@PutMapping("/update/basic")
|
||||||
public SingleResponse<Void> update(@Validated @RequestBody PaperUpdateDTO updateDTO) {
|
public SingleResponse<Void> update(@Validated @RequestBody PaperUpdateDTO updateDTO) {
|
||||||
|
|
@ -93,24 +100,13 @@ public class PaperController {
|
||||||
return SingleResponse.success(pageInfo);
|
return SingleResponse.success(pageInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据试卷id查询试卷基本信息(不含试题列表)
|
|
||||||
*
|
|
||||||
* @param paperId 试卷id
|
|
||||||
* @return 试卷基础信息
|
|
||||||
*/
|
|
||||||
@ApiOperation("试卷基本信息查询")
|
@ApiOperation("试卷基本信息查询")
|
||||||
@GetMapping("/paper/basic/info")
|
@GetMapping("/paper/basic/info")
|
||||||
public SingleResponse<PaperBasicInfoVO> paperBasicInfo(@RequestParam("paperId") @ApiParam(value = "试卷id", required = true) Long paperId) {
|
public SingleResponse<PaperBasicInfoVO> paperBasicInfo(@RequestParam("paperId") @ApiParam(value = "试卷id", required = true) Long paperId) {
|
||||||
return SingleResponse.success(paperService.paperBasicInfo(paperId));
|
return SingleResponse.success(paperService.paperBasicInfo(paperId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 下载试卷PDF:查询试卷考试信息(同paperExamInfo)后渲染为PDF文件流,浏览器直接访问即触发下载
|
|
||||||
*
|
|
||||||
* @param paperId 试卷id
|
|
||||||
* @return PDF文件字节流(文件名为试卷名称)
|
|
||||||
*/
|
|
||||||
@ApiOperation("下载试卷PDF")
|
@ApiOperation("下载试卷PDF")
|
||||||
@GetMapping(value = "/paper/exam/download", produces = MediaType.APPLICATION_PDF_VALUE)
|
@GetMapping(value = "/paper/exam/download", produces = MediaType.APPLICATION_PDF_VALUE)
|
||||||
public ResponseEntity<byte[]> downloadPaperPdf(@RequestParam("paperId") @ApiParam(value = "试卷id", required = true) Long paperId) throws IOException {
|
public ResponseEntity<byte[]> downloadPaperPdf(@RequestParam("paperId") @ApiParam(value = "试卷id", required = true) Long paperId) throws IOException {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import io.swagger.annotations.ApiParam;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.qinan.cedu.model.dto.PaperCoursewarePageQueryDTO;
|
import org.qinan.cedu.model.dto.PaperCoursewarePageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.QuestionAddDTO;
|
import org.qinan.cedu.model.dto.QuestionAddDTO;
|
||||||
|
import org.qinan.cedu.model.dto.QuestionBatchDeleteDTO;
|
||||||
import org.qinan.cedu.model.dto.QuestionTypeCountQueryDTO;
|
import org.qinan.cedu.model.dto.QuestionTypeCountQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.QuestionUpdateDTO;
|
import org.qinan.cedu.model.dto.QuestionUpdateDTO;
|
||||||
import org.qinan.cedu.model.vo.QuestionCoursewareVO;
|
import org.qinan.cedu.model.vo.QuestionCoursewareVO;
|
||||||
|
|
@ -45,6 +46,16 @@ public class QuestionController {
|
||||||
return SingleResponse.success();
|
return SingleResponse.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除习题
|
||||||
|
*/
|
||||||
|
@ApiOperation("批量删除习题")
|
||||||
|
@PostMapping("/del/batch")
|
||||||
|
public SingleResponse<Void> delBatch(@Validated @RequestBody QuestionBatchDeleteDTO dto) {
|
||||||
|
questionService.deleteByIds(dto.getQuestionIds());
|
||||||
|
return SingleResponse.success();
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation("编辑习题")
|
@ApiOperation("编辑习题")
|
||||||
@PostMapping("/modify")
|
@PostMapping("/modify")
|
||||||
public SingleResponse<Void> modify(@Validated @RequestBody QuestionUpdateDTO dto) {
|
public SingleResponse<Void> modify(@Validated @RequestBody QuestionUpdateDTO dto) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package org.qinan.cedu.model.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 试卷机构分页查询请求
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ApiModel(value = "PaperOrgPageQueryDTO", description = "试卷机构分页查询请求")
|
||||||
|
public class PaperOrgPageQueryDTO extends PaperPageQueryDTO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "机构id", required = true)
|
||||||
|
@NotNull(message = "机构id不能为空")
|
||||||
|
private Long orgId;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.qinan.cedu.model.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除习题请求
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "QuestionBatchDeleteDTO", description = "批量删除习题请求")
|
||||||
|
public class QuestionBatchDeleteDTO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "试题id列表", required = true)
|
||||||
|
@NotEmpty(message = "试题id列表不能为空")
|
||||||
|
private List<Long> questionIds;
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.qinan.cedu.model.dto.PaperCopyDTO;
|
import org.qinan.cedu.model.dto.PaperCopyDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperCoursewareQuestionRuleDTO;
|
import org.qinan.cedu.model.dto.PaperCoursewareQuestionRuleDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperImportDTO;
|
import org.qinan.cedu.model.dto.PaperImportDTO;
|
||||||
|
import org.qinan.cedu.model.dto.PaperOrgPageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperPageQueryDTO;
|
import org.qinan.cedu.model.dto.PaperPageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperUpdateDTO;
|
import org.qinan.cedu.model.dto.PaperUpdateDTO;
|
||||||
import org.qinan.cedu.model.entity.PaperDO;
|
import org.qinan.cedu.model.entity.PaperDO;
|
||||||
|
|
@ -28,6 +29,14 @@ public interface PaperService extends IService<PaperDO> {
|
||||||
*/
|
*/
|
||||||
IPage<PaperPageVO> pageQuery(PaperPageQueryDTO query);
|
IPage<PaperPageVO> pageQuery(PaperPageQueryDTO query);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机构分页查询试卷(在分页查询条件基础上按机构id过滤)
|
||||||
|
*
|
||||||
|
* @param query 查询条件(机构id、试卷名称、试卷类型、创建时间范围)
|
||||||
|
* @return 分页结果
|
||||||
|
*/
|
||||||
|
IPage<PaperPageVO> pageQueryByOrg(PaperOrgPageQueryDTO query);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增试卷
|
* 新增试卷
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,14 @@ public interface QuestionService extends IService<QuestionDO> {
|
||||||
*/
|
*/
|
||||||
boolean deleteById(Long id);
|
boolean deleteById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量逻辑删除试题(同时逻辑删除其选项)
|
||||||
|
*
|
||||||
|
* @param ids 试题id列表
|
||||||
|
* @return 是否成功
|
||||||
|
*/
|
||||||
|
boolean deleteByIds(List<Long> ids);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param query query
|
* @param query query
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
public boolean savePaperExam(PaperExamDTO dto) {
|
public boolean savePaperExam(PaperExamDTO dto) {
|
||||||
PaperExamDO entity = paperExamConvertor.convertDtoToE(dto);
|
PaperExamDO entity = paperExamConvertor.convertDtoToE(dto);
|
||||||
// paper_exam 表无 org_id 列,插入前不填充机构id
|
// paper_exam 表无 org_id 列,插入前不填充机构id
|
||||||
InsertFieldDefaults.applyIgnoreOrgId(entity);
|
InsertFieldDefaults.apply(entity);
|
||||||
return this.save(entity);
|
return this.save(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
throw new IllegalArgumentException("主键id不能为空");
|
throw new IllegalArgumentException("主键id不能为空");
|
||||||
}
|
}
|
||||||
PaperExamDO entity = paperExamConvertor.convertDtoToE(dto);
|
PaperExamDO entity = paperExamConvertor.convertDtoToE(dto);
|
||||||
InsertFieldDefaults.applyForUpdateIgnoreOrgId(entity);
|
InsertFieldDefaults.apply(entity);
|
||||||
return this.updateById(entity);
|
return this.updateById(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -303,7 +303,7 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
paperExam.setPassed(0);
|
paperExam.setPassed(0);
|
||||||
paperExam.setPaperExamStatus(PaperExamStatusEnum.DOING.getValue());
|
paperExam.setPaperExamStatus(PaperExamStatusEnum.DOING.getValue());
|
||||||
// paper_exam 表无 org_id 列,插入前不填充机构id
|
// paper_exam 表无 org_id 列,插入前不填充机构id
|
||||||
InsertFieldDefaults.applyIgnoreOrgId(paperExam);
|
InsertFieldDefaults.apply(paperExam);
|
||||||
return paperExam;
|
return paperExam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import org.qinan.cedu.model.dto.PaperConfigRuleDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperCopyDTO;
|
import org.qinan.cedu.model.dto.PaperCopyDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperCoursewareQuestionRuleDTO;
|
import org.qinan.cedu.model.dto.PaperCoursewareQuestionRuleDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperImportDTO;
|
import org.qinan.cedu.model.dto.PaperImportDTO;
|
||||||
|
import org.qinan.cedu.model.dto.PaperOrgPageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperPageQueryDTO;
|
import org.qinan.cedu.model.dto.PaperPageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperUpdateDTO;
|
import org.qinan.cedu.model.dto.PaperUpdateDTO;
|
||||||
import org.qinan.cedu.model.entity.PaperDO;
|
import org.qinan.cedu.model.entity.PaperDO;
|
||||||
|
|
@ -102,6 +103,28 @@ public class PaperServiceImpl extends ServiceImpl<PaperMapper, PaperDO> implemen
|
||||||
return page.convert(paperConvertor::convertEToVo);
|
return page.convert(paperConvertor::convertEToVo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPage<PaperPageVO> pageQueryByOrg(PaperOrgPageQueryDTO query) {
|
||||||
|
LambdaQueryWrapper<PaperDO> wrapper = new LambdaQueryWrapper<PaperDO>()
|
||||||
|
.eq(PaperDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
|
||||||
|
.eq(PaperDO::getOrgId, query.getOrgId());
|
||||||
|
if (StringUtils.hasText(query.getPaperName())) {
|
||||||
|
wrapper.like(PaperDO::getPaperName, query.getPaperName());
|
||||||
|
}
|
||||||
|
if (query.getCreateTimeStart() != null) {
|
||||||
|
wrapper.ge(PaperDO::getCreateTime, query.getCreateTimeStart().atStartOfDay());
|
||||||
|
}
|
||||||
|
if (query.getCreateTimeEnd() != null) {
|
||||||
|
wrapper.lt(PaperDO::getCreateTime, query.getCreateTimeEnd().plusDays(1).atStartOfDay());
|
||||||
|
}
|
||||||
|
if (StringUtils.hasText(query.getPaperType())) {
|
||||||
|
wrapper.eq(PaperDO::getPaperType, query.getPaperType());
|
||||||
|
}
|
||||||
|
wrapper.orderByDesc(PaperDO::getId);
|
||||||
|
IPage<PaperDO> page = this.page(new Page<>(query.getCurrent(), query.getSize()), wrapper);
|
||||||
|
return page.convert(paperConvertor::convertEToVo);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean savePaper(PaperDO paperEntity) {
|
public boolean savePaper(PaperDO paperEntity) {
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,26 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, QuestionDO>
|
||||||
return deleted;
|
return deleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteByIds(List<Long> ids) {
|
||||||
|
if (CollectionUtils.isEmpty(ids)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean deleted = this.lambdaUpdate()
|
||||||
|
.set(QuestionDO::getDeleteEnum, DeleteEnum.TRUE.getCode())
|
||||||
|
.set(QuestionDO::getUpdateTime, LocalDateTime.now())
|
||||||
|
.in(QuestionDO::getId, ids)
|
||||||
|
.eq(QuestionDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
|
||||||
|
.update();
|
||||||
|
if (deleted) {
|
||||||
|
questionOptionMapper.update(new LambdaUpdateWrapper<QuestionOptionDO>()
|
||||||
|
.set(QuestionOptionDO::getDeleteEnum, DeleteEnum.TRUE.getCode())
|
||||||
|
.set(QuestionOptionDO::getUpdateTime, LocalDateTime.now())
|
||||||
|
.in(QuestionOptionDO::getQuestionId, ids));
|
||||||
|
}
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<QuestionCoursewareVO> pageCourseware(PaperCoursewarePageQueryDTO query) {
|
public IPage<QuestionCoursewareVO> pageCourseware(PaperCoursewarePageQueryDTO query) {
|
||||||
return this.baseMapper.pageCourseware(new Page<>(query.getCurrent(), query.getSize()), query);
|
return this.baseMapper.pageCourseware(new Page<>(query.getCurrent(), query.getSize()), query);
|
||||||
|
|
|
||||||
|
|
@ -328,7 +328,7 @@ public class QuestionExcelImporter {
|
||||||
question.setAnalysis(row.getAnalysis().trim());
|
question.setAnalysis(row.getAnalysis().trim());
|
||||||
question.setTagType(row.getTagType().trim());
|
question.setTagType(row.getTagType().trim());
|
||||||
question.setCoursewareManagementId(coursewareManagementId);
|
question.setCoursewareManagementId(coursewareManagementId);
|
||||||
InsertFieldDefaults.applyIgnoreOrgId(question);
|
InsertFieldDefaults.apply(question);
|
||||||
return question;
|
return question;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -381,7 +381,7 @@ public class QuestionExcelImporter {
|
||||||
question.setTagType(row.getTagType().trim());
|
question.setTagType(row.getTagType().trim());
|
||||||
question.setCoursewareManagementId(coursewareManagementId);
|
question.setCoursewareManagementId(coursewareManagementId);
|
||||||
parseResult.getQuestionNumByQuestionId().put(question.getId(), rowIndex - HEAD_ROW_NUMBER);
|
parseResult.getQuestionNumByQuestionId().put(question.getId(), rowIndex - HEAD_ROW_NUMBER);
|
||||||
InsertFieldDefaults.applyIgnoreOrgId(question);
|
InsertFieldDefaults.apply(question);
|
||||||
Map<String, String> optionTexts = new LinkedHashMap<>();
|
Map<String, String> optionTexts = new LinkedHashMap<>();
|
||||||
optionTexts.put(OPTION_KEY_A, JUDGE_CORRECT_OPTION_TEXT);
|
optionTexts.put(OPTION_KEY_A, JUDGE_CORRECT_OPTION_TEXT);
|
||||||
optionTexts.put(OPTION_KEY_B, JUDGE_WRONG_OPTION_TEXT);
|
optionTexts.put(OPTION_KEY_B, JUDGE_WRONG_OPTION_TEXT);
|
||||||
|
|
@ -414,7 +414,7 @@ public class QuestionExcelImporter {
|
||||||
option.setOptionText(entry.getValue());
|
option.setOptionText(entry.getValue());
|
||||||
option.setIsCorrect(answerLetters.contains(entry.getKey()));
|
option.setIsCorrect(answerLetters.contains(entry.getKey()));
|
||||||
option.setSortOrder(sortOrder++);
|
option.setSortOrder(sortOrder++);
|
||||||
InsertFieldDefaults.applyIgnoreOrgId(option);
|
InsertFieldDefaults.apply(option);
|
||||||
options.add(option);
|
options.add(option);
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue