xiangpei
2024-06-17 99701274f83bc7c54beedfe7e18577e9d6b7198e
阅卷、bug
9个文件已修改
2个文件已添加
249 ■■■■■ 已修改文件
src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/admin/ExamController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/entity/ExamSubmitTemp.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/vo/MarkPaperVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/vo/StudentExamInfoVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/ExamService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ClassesUserMapper.xml 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ExamMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 != ''">