From ac331ce04a2516af6ce100d8a4c93328bbebd93d Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期一, 17 六月 2024 13:51:42 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java | 6 src/main/java/com/ycl/jxkg/service/ExamService.java | 8 + src/main/java/com/ycl/jxkg/domain/vo/MarkPaperVO.java | 42 ++++++++ src/main/java/com/ycl/jxkg/domain/entity/ExamSubmitTemp.java | 6 + src/main/resources/mapper/ExamMapper.xml | 4 src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java | 10 ++ src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java | 66 +++++++++++- src/main/java/com/ycl/jxkg/controller/admin/ExamController.java | 9 + src/main/resources/mapper/ClassesUserMapper.xml | 46 +++++++- src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java | 14 ++ src/main/java/com/ycl/jxkg/domain/vo/StudentExamInfoVO.java | 38 +++++++ 11 files changed, 225 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java b/src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java index 10eeea8..4f1977a 100644 --- a/src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java +++ b/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 diff --git a/src/main/java/com/ycl/jxkg/controller/admin/ExamController.java b/src/main/java/com/ycl/jxkg/controller/admin/ExamController.java index 3532a3d..02aacdb 100644 --- a/src/main/java/com/ycl/jxkg/controller/admin/ExamController.java +++ b/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); + } } diff --git a/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java b/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java index 9cc7334..d455f65 100644 --- a/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java +++ b/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); } diff --git a/src/main/java/com/ycl/jxkg/domain/entity/ExamSubmitTemp.java b/src/main/java/com/ycl/jxkg/domain/entity/ExamSubmitTemp.java index 8d2a018..0135a9b 100644 --- a/src/main/java/com/ycl/jxkg/domain/entity/ExamSubmitTemp.java +++ b/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; } diff --git a/src/main/java/com/ycl/jxkg/domain/vo/MarkPaperVO.java b/src/main/java/com/ycl/jxkg/domain/vo/MarkPaperVO.java new file mode 100644 index 0000000..cfddf6a --- /dev/null +++ b/src/main/java/com/ycl/jxkg/domain/vo/MarkPaperVO.java @@ -0,0 +1,42 @@ +package com.ycl.jxkg.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 闃呭嵎鏁版嵁 + * + * @author锛歺p + * @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; + +} diff --git a/src/main/java/com/ycl/jxkg/domain/vo/StudentExamInfoVO.java b/src/main/java/com/ycl/jxkg/domain/vo/StudentExamInfoVO.java new file mode 100644 index 0000000..c6a76fa --- /dev/null +++ b/src/main/java/com/ycl/jxkg/domain/vo/StudentExamInfoVO.java @@ -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锛歺p + * @date锛�2024/6/14 11:44 + */ +@Data +public class StudentExamInfoVO { + + private Integer userId; + + /** 瀛﹀憳濮撳悕 */ + private String realName; + + /** 瀛﹀憳鐢佃瘽 */ + private String phone; + + /** 绛斿嵎鏁版嵁 */ + private Integer doTime; + + /** 绛斿嵎鍐呭锛屽簭鍒楀寲瀵硅薄锛歀ist<DoQuestionVO> */ + private String examSubmit; + + private Date updateTime; + + /** 鍙嶅簭鍒楀寲鍚庣殑棰� */ + private List<DoQuestionVO> questionList; + + /** 鎻愪氦鐘舵�� */ + private ExamSubmitTempStatusEnum status; + +} diff --git a/src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java b/src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java index 8442500..9922c55 100644 --- a/src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java +++ b/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); } diff --git a/src/main/java/com/ycl/jxkg/service/ExamService.java b/src/main/java/com/ycl/jxkg/service/ExamService.java index a8e154b..36c0af8 100644 --- a/src/main/java/com/ycl/jxkg/service/ExamService.java +++ b/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); } diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java index 921cff5..438aff3 100644 --- a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java +++ b/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); + } } diff --git a/src/main/resources/mapper/ClassesUserMapper.xml b/src/main/resources/mapper/ClassesUserMapper.xml index 9fc5347..f981e6d 100644 --- a/src/main/resources/mapper/ClassesUserMapper.xml +++ b/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> diff --git a/src/main/resources/mapper/ExamMapper.xml b/src/main/resources/mapper/ExamMapper.xml index 62d1c81..cdc7dd3 100644 --- a/src/main/resources/mapper/ExamMapper.xml +++ b/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 != ''"> -- Gitblit v1.8.0