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