src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java
@@ -51,6 +51,20 @@ } /** * Handler rest response. * * @param e the e * @return the rest response */ @ExceptionHandler(RuntimeException.class) @ResponseBody public Result handler(RuntimeException e, HttpServletRequest request) { String errMsg = String.format("系统异常-%s", e.getMessage()); this.printExceptionLocation(e, request, errMsg); return new Result<>(SystemCode.InnerError.getCode(), e.getMessage()); } /** * JSON传参数据校验异常 * * @param e src/main/java/com/ycl/jxkg/controller/admin/ExamController.java
@@ -27,7 +27,7 @@ @RequiredArgsConstructor @Api(value = "考试", tags = "考试管理") @RestController @RequestMapping("/api/exam") @RequestMapping("/api/admin/exam") public class ExamController { private final ExamService examService; @@ -80,4 +80,11 @@ public Result list() { return examService.all(); } @GetMapping("/mark/paper/{id}") @PreAuthorize("hasAuthority('exam:markPaper')") @ApiOperation(value = "获取阅卷信息", notes = "获取阅卷信息") public Result getMarkPaperInfo(@PathVariable("id") Integer id) { return examService.getMarkPaperInfo(id); } } src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java
@@ -16,7 +16,7 @@ */ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/student/exampaper/answer") @RequestMapping(value = "/api/student/exam") public class StudentExamController { private final ExamService examService; @@ -27,7 +27,7 @@ * @param submitData * @return */ @PostMapping("/exam/submit") @PostMapping("/submit") public Result examSubmit(@RequestBody @Validated ExamSubmitVO submitData) { return examService.examSubmit(submitData); } @@ -38,7 +38,7 @@ * @param submitData * @return */ @PostMapping("/exam/timing") @PostMapping("/timing") public Result timingExamSubmit(@RequestBody @Validated ExamSubmitVO submitData) { return examService.timingSubmit(submitData); } src/main/java/com/ycl/jxkg/domain/entity/ExamSubmitTemp.java
@@ -1,5 +1,6 @@ package com.ycl.jxkg.domain.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -41,6 +42,9 @@ /** 状态:临时、保存 */ private ExamSubmitTempStatusEnum status; @TableField("create_time") @TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Date updateTime; } src/main/java/com/ycl/jxkg/domain/vo/MarkPaperVO.java
New file @@ -0,0 +1,42 @@ package com.ycl.jxkg.domain.vo; import lombok.Data; import java.util.List; /** * 阅卷数据 * * @author:xp * @date:2024/6/14 11:38 */ @Data public class MarkPaperVO { private Integer examId; /** 考试名称 */ private String examName; /** 考试试卷名称 */ private String examPaperName; /** 试卷考试时间 */ private Integer suggestTime; /** 应考人数 */ private Integer shouldJoinNum; /** 参考人数 */ private Integer joinNum; /** 缺考人数 */ private Integer missJoinNum; /** 参考但是未完成考试(未完成指的是网页关闭,没有时间到自动提交或者自主提交) */ private Integer joinButNotFinishNum; /** 学生的考试情况 */ private List<StudentExamInfoVO> studentExamInfoVOList; } src/main/java/com/ycl/jxkg/domain/vo/StudentExamInfoVO.java
New file @@ -0,0 +1,38 @@ package com.ycl.jxkg.domain.vo; import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum; import lombok.Data; import java.util.Date; import java.util.List; /** * @author:xp * @date:2024/6/14 11:44 */ @Data public class StudentExamInfoVO { private Integer userId; /** 学员姓名 */ private String realName; /** 学员电话 */ private String phone; /** 答卷数据 */ private Integer doTime; /** 答卷内容,序列化对象:List<DoQuestionVO> */ private String examSubmit; private Date updateTime; /** 反序列化后的题 */ private List<DoQuestionVO> questionList; /** 提交状态 */ private ExamSubmitTempStatusEnum status; } src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java
@@ -3,10 +3,13 @@ import com.ycl.jxkg.domain.entity.ClassesUser; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.jxkg.domain.entity.User; import com.ycl.jxkg.domain.query.ClassesUserQuery; import com.ycl.jxkg.domain.vo.ClassesUserVO; import com.ycl.jxkg.domain.form.ClassesUserForm; import java.util.List; import com.ycl.jxkg.domain.vo.StudentExamInfoVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -31,4 +34,11 @@ */ IPage getPage(IPage page, @Param("query") ClassesUserQuery query); /** * 获取班级学生 * * @param classesId * @return */ List<StudentExamInfoVO> getClassesUserList(@Param("classesId") Integer classesId); } src/main/java/com/ycl/jxkg/service/ExamService.java
@@ -80,4 +80,12 @@ * @return */ Result timingSubmit(ExamSubmitVO submitData); /** * 获取阅卷信息 * * @param id * @return */ Result getMarkPaperInfo(Integer id); } src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
@@ -4,28 +4,23 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.jxkg.context.WebContext; import com.ycl.jxkg.domain.entity.Exam; import com.ycl.jxkg.domain.entity.ExamSubmitTemp; import com.ycl.jxkg.domain.entity.Question; import com.ycl.jxkg.domain.vo.DoQuestionVO; import com.ycl.jxkg.domain.vo.ExamSubmitVO; import com.ycl.jxkg.domain.entity.*; import com.ycl.jxkg.domain.vo.*; import com.ycl.jxkg.enums.QuestionTypeEnum; import com.ycl.jxkg.enums.general.ExamStatusEnum; import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum; import com.ycl.jxkg.mapper.ExamMapper; import com.ycl.jxkg.mapper.ExamSubmitTempMapper; import com.ycl.jxkg.mapper.QuestionMapper; import com.ycl.jxkg.mapper.*; import com.ycl.jxkg.service.ExamService; import com.ycl.jxkg.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.jxkg.domain.form.ExamForm; import com.ycl.jxkg.domain.vo.ExamVO; import com.ycl.jxkg.domain.query.ExamQuery; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.ycl.jxkg.utils.PageUtil; import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import java.util.Date; import java.util.List; @@ -47,6 +42,8 @@ private final WebContext webContext; private final QuestionMapper questionMapper; private final ExamSubmitTempMapper examSubmitTempMapper; private final ClassesUserMapper classesUserMapper; private final ExamPaperMapper examPaperMapper; /** * 添加 @@ -114,6 +111,16 @@ public Result page(ExamQuery query) { IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class); baseMapper.getPage(page, query); page.getRecords().stream().forEach(item -> { if (! StringUtils.hasText(item.getClassName())) { item.setClassName("班级不存在或被删除"); item.setClassesId(null); } if (! StringUtils.hasText(item.getExamPaperName())) { item.setExamPaperName("试卷不存在或被删除"); item.setExamPaperId(null); } }); return Result.ok().data(page.getRecords()).total(page.getTotal()); } @@ -215,4 +222,45 @@ examSubmitTempMapper.insert(examSubmitTemp); } } @Override public Result getMarkPaperInfo(Integer id) { Exam exam = baseMapper.selectById(id); if (Objects.isNull(exam)) { throw new RuntimeException("该考试不存在"); } ExamPaper examPaper = examPaperMapper.selectById(exam.getExamPaperId()); if (Objects.isNull(examPaper)) { throw new RuntimeException("考试试卷不存在"); } List<ExamSubmitTemp> examSubmitTempList = new LambdaQueryChainWrapper<>(examSubmitTempMapper) .eq(ExamSubmitTemp::getExamId, id) .list(); // 参考人数 Integer joinExamNum = examSubmitTempList.size(); // 参考但未完成提交人数 Integer joinButNotFinishedNum = Math.toIntExact(examSubmitTempList.stream().filter(item -> ExamSubmitTempStatusEnum.TEMP.equals(item.getStatus())).count()); List<StudentExamInfoVO> studentExamList = classesUserMapper.getClassesUserList(exam.getClassesId()); // 应考人数 Integer shouldUserNum = studentExamList.size(); studentExamList.stream().forEach(item -> { if (StringUtils.hasText(item.getExamSubmit())) { item.setQuestionList(JSON.parseArray(item.getExamSubmit(), DoQuestionVO.class)); } }); MarkPaperVO markPaperVO = new MarkPaperVO(); markPaperVO.setExamName(exam.getExamName()); markPaperVO.setExamId(exam.getId()); markPaperVO.setJoinButNotFinishNum(joinButNotFinishedNum); markPaperVO.setShouldJoinNum(shouldUserNum); markPaperVO.setStudentExamInfoVOList(studentExamList); markPaperVO.setMissJoinNum(shouldUserNum - joinExamNum); markPaperVO.setJoinNum(joinExamNum); markPaperVO.setExamPaperName(examPaper.getName()); markPaperVO.setSuggestTime(examPaper.getSuggestTime()); return Result.ok().data(markPaperVO); } } src/main/resources/mapper/ClassesUserMapper.xml
@@ -12,6 +12,17 @@ <result column="create_time" property="createTime"/> </resultMap> <resultMap id="ResultMap" type="com.ycl.jxkg.domain.vo.StudentExamInfoVO"> <result column="id" property="userId"/> <result column="phone" property="phone"/> <result column="real_name" property="realName"/> <result column="do_time" property="doTime"/> <result column="exam_submit" property="examSubmit"/> <result column="status" property="status" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/> <result column="phone" property="phone"/> <result column="update_time" property="updateTime"/> </resultMap> <select id="getById" resultMap="BaseResultMap"> SELECT TCU.classes_id, @@ -26,16 +37,35 @@ <select id="getPage" resultMap="BaseResultMap"> SELECT TCU.classes_id, TCU.user_id, TCU.create_time, TCU.id, TU.real_name, TU.sex, TU.phone TCU.user_id, TCU.create_time, TCU.id, TU.real_name, TU.sex, TU.phone FROM t_classes_user TCU LEFT JOIN t_user TU ON TU.id = TCU.user_id LEFT JOIN t_user TU ON TU.id = TCU.user_id WHERE TCU.deleted = 0 <if test="query.studentName != null and query.studentName != ''">AND TU.real_name like concat('%', #{query.studentName}, '%')</if> <if test="query.studentName != null and query.studentName != ''">AND TU.real_name like concat('%', #{query.studentName}, '%') </if> </select> <select id="getClassesUserList" resultMap="ResultMap"> SELECT TU.id, TU.real_name, TU.phone, EST.do_time, EST.status, EST.exam_submit FROM t_classes_user TCU INNER JOIN t_user TU ON TU.id = TCU.user_id AND TCU.classes_id = #{classesId} LEFT JOIN t_exam_submit_temp EST ON EST.user_id = TU.id WHERE TCU.deleted = 0 </select> </mapper> src/main/resources/mapper/ExamMapper.xml
@@ -62,8 +62,8 @@ FROM t_exam TE INNER JOIN t_user TU ON TU.id = TE.teacher_id AND TU.deleted = 0 INNER JOIN t_classes TC ON TC.id = TE.classes_id AND TC.deleted = 0 INNER JOIN t_exam_paper TEP ON TEP.id = TE.exam_paper_id AND TEP.deleted = 0 LEFT JOIN t_classes TC ON TC.id = TE.classes_id AND TC.deleted = 0 LEFT JOIN t_exam_paper TEP ON TEP.id = TE.exam_paper_id AND TEP.deleted = 0 WHERE TE.deleted = 0 <if test="query.examName != null and query.examName != ''">