Selaa lähdekoodia

关联查询考试信息和试题

yangfeng 2 vuotta sitten
vanhempi
commit
4f8e5ba0ca

+ 0 - 6
web/src/main/java/com/yntravelsky/buss/exam/exam/dto/UserExamDTO.java

@@ -1,7 +1,6 @@
 package com.yntravelsky.buss.exam.exam.dto;
 
 import com.yntravelsky.buss.exam.userexam.entity.UserExam;
-import com.yntravelsky.buss.exam.userexamquestion.entity.UserExamQuestion;
 import lombok.Data;
 
 import java.util.List;
@@ -16,9 +15,4 @@ public class UserExamDTO extends UserExam {
      */
     private List<Map<String, AnswerCardDTO>> answerCardList;
 
-    /**
-     * 用户考题
-     */
-    private List<UserExamQuestion> userExamQuestionList;
-
 }

+ 7 - 5
web/src/main/java/com/yntravelsky/buss/exam/exam/service/impl/ExamServiceImpl.java

@@ -252,12 +252,12 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
 
     public UserExamDTO examDetail(String userExamId, boolean needAnswerFlag, boolean needAnalysis) {
         UserExamDTO dto = new UserExamDTO();
-        UserExam userExam = userExamService.getById(userExamId);
+        UserExam userExam = userExamService.listUserExam(userExamId);
         if (Objects.isNull(userExam)) {
             throw new JeecgBootException("考试不存在!");
         }
         BeanUtils.copyProperties(userExam, dto);
-        List<UserExamQuestion> userExamQuestionList = userExamQuestionService.listByUserExamId(userExamId);
+        List<UserExamQuestion> userExamQuestionList = dto.getUserExamQuestionList();
         List<Map<String, AnswerCardDTO>> answerCardList = new ArrayList<>();
         if (!CollectionUtils.isEmpty(userExamQuestionList)) {
             //获取题目和答案
@@ -270,7 +270,6 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
             setAnswerCard(userExamQuestionList, answerCardList);
         }
         dto.setAnswerCardList(answerCardList);
-        dto.setUserExamQuestionList(userExamQuestionList);
         return dto;
     }
 
@@ -365,11 +364,14 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
         if (StringUtils.isEmpty(dto.getUserExamId())) {
             throw new JeecgBootException("考试ID不能为空");
         }
-        UserExam userExam = userExamService.getById(dto.getUserExamId());
+        UserExam userExam = userExamService.listUserExam(dto.getUserExamId());
         if (Objects.isNull(userExam)) {
             throw new JeecgBootException("考试记录不存在");
         }
-        List<UserExamQuestion> userExamQuestionList = userExamQuestionService.listByUserExamId(dto.getUserExamId());
+        if (userExam.getState().intValue() == PaperState.FINISHED) {
+            throw new JeecgBootException("该考试已经交卷,不允许重复交卷");
+        }
+        List<UserExamQuestion> userExamQuestionList = userExam.getUserExamQuestionList();
         if (CollectionUtils.isEmpty(userExamQuestionList)) {
             throw new JeecgBootException("考题查询失败");
         }

+ 0 - 3
web/src/main/java/com/yntravelsky/buss/exam/paperquestion/service/impl/PaperQuestionServiceImpl.java

@@ -50,9 +50,6 @@ public class PaperQuestionServiceImpl extends ServiceImpl<PaperQuestionMapper, P
                 pq.setSort(sort);
                 sort++;
             }
-            //保存试卷试题
-            //remove(paperId);
-            //saveBatch(paperQuestions);
         }
         return paperQuestions;
     }

+ 124 - 124
web/src/main/java/com/yntravelsky/buss/exam/userexam/controller/UserExamController.java

@@ -21,142 +21,142 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Arrays;
 
-/**
-* @Description: 用户考试
-* @Author: jeecg-boot
-* @Date:   2023-03-05
-* @Version: V1.0
-*/
+ /**
+ * @Description: 用户考试
+ * @Author: jeecg-boot
+ * @Date:   2023-03-05
+ * @Version: V1.0
+ */
 @Api(tags="用户考试")
 @RestController
 @RequestMapping("/userExam")
 @Slf4j
 public class UserExamController extends JeecgController<UserExam, IUserExamService> {
-   @Autowired
-   private IUserExamService userExamService;
+	@Autowired
+	private IUserExamService userExamService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param userExam
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="用户考试-分页列表查询", notes="用户考试-分页列表查询")
+	@RequiresPermissions("userExam:list")
+	@GetMapping(value = "/list")
+	public Result<IPage<UserExam>> queryPageList(UserExam userExam,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<UserExam> queryWrapper = QueryGenerator.initQueryWrapper(userExam, req.getParameterMap());
+		Page<UserExam> page = new Page<UserExam>(pageNo, pageSize);
+		IPage<UserExam> pageList = userExamService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param userExam
+	 * @return
+	 */
+	@AutoLog(value = "用户考试-添加")
+	@ApiOperation(value="用户考试-添加", notes="用户考试-添加")
+	//@RequiresPermissions("userExam:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody UserExam userExam) {
+		userExamService.save(userExam);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param userExam
+	 * @return
+	 */
+	@AutoLog(value = "用户考试-编辑")
+	@ApiOperation(value="用户考试-编辑", notes="用户考试-编辑")
+	//@RequiresPermissions("userExam:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody UserExam userExam) {
+		userExamService.updateById(userExam);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "用户考试-通过id删除")
+	@ApiOperation(value="用户考试-通过id删除", notes="用户考试-通过id删除")
+	//@RequiresPermissions("userExam:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		userExamService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "用户考试-批量删除")
+	@ApiOperation(value="用户考试-批量删除", notes="用户考试-批量删除")
+	//@RequiresPermissions("userExam:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.userExamService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "用户考试-通过id查询")
+	@ApiOperation(value="用户考试-通过id查询", notes="用户考试-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<UserExam> queryById(@RequestParam(name="id",required=true) String id) {
+		UserExam userExam = userExamService.getById(id);
+		if(userExam==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(userExam);
+	}
 
-   /**
-    * 分页列表查询
+    /**
+    * 导出excel
     *
+    * @param request
     * @param userExam
-    * @param pageNo
-    * @param pageSize
-    * @param req
-    * @return
-    */
-   @ApiOperation(value="用户考试-分页列表查询", notes="用户考试-分页列表查询")
-   @RequiresPermissions("userExam:list")
-   @GetMapping(value = "/list")
-   public Result<IPage<UserExam>> queryPageList(UserExam userExam,
-                                  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-                                  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-                                  HttpServletRequest req) {
-       QueryWrapper<UserExam> queryWrapper = QueryGenerator.initQueryWrapper(userExam, req.getParameterMap());
-       Page<UserExam> page = new Page<UserExam>(pageNo, pageSize);
-       IPage<UserExam> pageList = userExamService.page(page, queryWrapper);
-       return Result.OK(pageList);
-   }
-
-   /**
-    *   添加
-    *
-    * @param userExam
-    * @return
-    */
-   @AutoLog(value = "用户考试-添加")
-   @ApiOperation(value="用户考试-添加", notes="用户考试-添加")
-   //@RequiresPermissions("userExam:add")
-   @PostMapping(value = "/add")
-   public Result<String> add(@RequestBody UserExam userExam) {
-       userExamService.save(userExam);
-       return Result.OK("添加成功!");
-   }
-
-   /**
-    *  编辑
-    *
-    * @param userExam
-    * @return
     */
-   @AutoLog(value = "用户考试-编辑")
-   @ApiOperation(value="用户考试-编辑", notes="用户考试-编辑")
-   //@RequiresPermissions("userExam:edit")
-   @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
-   public Result<String> edit(@RequestBody UserExam userExam) {
-       userExamService.updateById(userExam);
-       return Result.OK("编辑成功!");
-   }
+    //@RequiresPermissions("userExam:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, UserExam userExam) {
+        return super.exportXls(request, userExam, UserExam.class, "用户考试表");
+    }
 
-   /**
-    *   通过id删除
+    /**
+      * 通过excel导入数据
     *
-    * @param id
+    * @param request
+    * @param response
     * @return
     */
-   @AutoLog(value = "用户考试-通过id删除")
-   @ApiOperation(value="用户考试-通过id删除", notes="用户考试-通过id删除")
-   //@RequiresPermissions("userExam:delete")
-   @DeleteMapping(value = "/delete")
-   public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-       userExamService.removeById(id);
-       return Result.OK("删除成功!");
-   }
-
-   /**
-    *  批量删除
-    *
-    * @param ids
-    * @return
-    */
-   @AutoLog(value = "用户考试-批量删除")
-   @ApiOperation(value="用户考试-批量删除", notes="用户考试-批量删除")
-   //@RequiresPermissions("userExam:deleteBatch")
-   @DeleteMapping(value = "/deleteBatch")
-   public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-       this.userExamService.removeByIds(Arrays.asList(ids.split(",")));
-       return Result.OK("批量删除成功!");
-   }
-
-   /**
-    * 通过id查询
-    *
-    * @param id
-    * @return
-    */
-   //@AutoLog(value = "用户考试-通过id查询")
-   @ApiOperation(value="用户考试-通过id查询", notes="用户考试-通过id查询")
-   @GetMapping(value = "/queryById")
-   public Result<UserExam> queryById(@RequestParam(name="id",required=true) String id) {
-       UserExam userExam = userExamService.getById(id);
-       if(userExam==null) {
-           return Result.error("未找到对应数据");
-       }
-       return Result.OK(userExam);
-   }
-
-   /**
-   * 导出excel
-   *
-   * @param request
-   * @param userExam
-   */
-   //@RequiresPermissions("userExam:exportXls")
-   @RequestMapping(value = "/exportXls")
-   public ModelAndView exportXls(HttpServletRequest request, UserExam userExam) {
-       return super.exportXls(request, userExam, UserExam.class, "用户考试表");
-   }
-
-   /**
-     * 通过excel导入数据
-   *
-   * @param request
-   * @param response
-   * @return
-   */
-   //@RequiresPermissions("userExam:importExcel")
-   @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-   public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-       return super.importExcel(request, response, UserExam.class);
-   }
+    //@RequiresPermissions("userExam:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, UserExam.class);
+    }
 
 }

+ 16 - 10
web/src/main/java/com/yntravelsky/buss/exam/userexam/entity/UserExam.java

@@ -1,20 +1,23 @@
 package com.yntravelsky.buss.exam.userexam.entity;
 
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.util.Date;
-import java.math.BigDecimal;
-
-import com.baomidou.mybatisplus.annotation.*;
-import lombok.Data;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.jeecgframework.poi.excel.annotation.Excel;
-import org.jeecg.common.aspect.annotation.Dict;
+import com.yntravelsky.buss.exam.userexamquestion.entity.UserExamQuestion;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
 
 /**
  * @Description: 用户考试表
@@ -134,4 +137,7 @@ public class UserExam implements Serializable {
     @ApiModelProperty(value = "是否通过")
     @Dict(dicCode = "exam_result")
     private Integer passed;
+
+    @TableField(exist = false)
+    private List<UserExamQuestion> userExamQuestionList;
 }

+ 10 - 5
web/src/main/java/com/yntravelsky/buss/exam/userexam/mapper/UserExamMapper.java

@@ -1,17 +1,22 @@
 package com.yntravelsky.buss.exam.userexam.mapper;
 
-import java.util.List;
-
-import com.yntravelsky.buss.exam.userexam.entity.UserExam;
-import org.apache.ibatis.annotations.Param;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yntravelsky.buss.exam.userexam.entity.UserExam;
 
 /**
  * @Description: 用户考试表
  * @Author: jeecg-boot
- * @Date:   2023-03-05
+ * @Date: 2023-03-05
  * @Version: V1.0
  */
 public interface UserExamMapper extends BaseMapper<UserExam> {
 
+    /**
+     * 查询用户考试信息及试题
+     *
+     * @param id
+     * @return
+     */
+    UserExam listUserExam(String id);
+
 }

+ 63 - 0
web/src/main/java/com/yntravelsky/buss/exam/userexam/mapper/xml/UserExamMapper.xml

@@ -1,5 +1,68 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yntravelsky.buss.exam.userexam.mapper.UserExamMapper">
+    <resultMap id="userExamMap" type="com.yntravelsky.buss.exam.userexam.entity.UserExam">
+        <id column="id" property="id" jdbcType="VARCHAR"/>
+        <result column="user_id" property="userId" jdbcType="VARCHAR"/>
+        <result column="exam_id" property="examId" jdbcType="VARCHAR"/>
+        <result column="paper_id" property="paperId" jdbcType="VARCHAR"/>
+        <result column="user_time" property="userTime" jdbcType="INTEGER"/>
+        <result column="user_score" property="userScore" jdbcType="INTEGER"/>
+        <result column="commit_time" property="commitTime" jdbcType="TIMESTAMP"/>
+        <result column="state" property="state" jdbcType="INTEGER"/>
+        <result column="limit_time" property="limitTime" jdbcType="TIMESTAMP"/>
+        <result column="qualify_score" property="qualifyScore" jdbcType="INTEGER"/>
+        <result column="total_score" property="totalScore" jdbcType="INTEGER"/>
+        <result column="passed" property="passed" jdbcType="INTEGER"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
 
+        <collection property="userExamQuestionList" ofType="com.yntravelsky.buss.exam.userexamquestion.entity.UserExamQuestion">
+            <id column="ueq_id" property="id" jdbcType="VARCHAR"/>
+            <result column="user_exam_id" property="userExamId" jdbcType="VARCHAR"/>
+            <result column="question_id" property="questionId" jdbcType="VARCHAR"/>
+            <result column="question_type" property="questionType" jdbcType="INTEGER"/>
+            <result column="sort" property="sort" jdbcType="INTEGER"/>
+            <result column="question_score" property="questionScore" jdbcType="INTEGER"/>
+            <result column="answered" property="answered" jdbcType="BOOLEAN"/>
+            <result column="is_right" property="isRight" jdbcType="BOOLEAN"/>
+            <result column="answer" property="answer" jdbcType="VARCHAR"/>
+            <result column="question_index" property="questionIndex" jdbcType="INTEGER"/>
+            <result column="actual_score" property="actualScore" jdbcType="INTEGER"/>
+        </collection>
+    </resultMap>
+    <select id="listUserExam" resultMap="userExamMap">
+        SELECT
+            ue.id,
+            ue.user_id,
+            ue.exam_id,
+            ue.paper_id,
+            ue.user_time,
+            ue.user_score,
+            ue.commit_time,
+            ue.state,
+            ue.limit_time,
+            ue.qualify_score,
+            ue.total_score,
+            ue.passed,
+            ue.create_time,
+            ueq.ID as ueq_id,
+            ueq.user_exam_id,
+            ueq.question_id,
+            ueq.question_type,
+            ueq.sort,
+            ueq.question_score,
+            ueq.answered,
+            ueq.is_right,
+            ueq.answer,
+            ueq.question_index,
+            ueq.actual_score
+        FROM
+            user_exam ue
+        LEFT JOIN user_exam_question ueq ON ue.ID = ueq.user_exam_id
+        WHERE
+            ue.id =  #{id}
+        ORDER BY
+            ueq.question_type,
+            ueq.sort
+    </select>
 </mapper>

+ 8 - 0
web/src/main/java/com/yntravelsky/buss/exam/userexam/service/IUserExamService.java

@@ -36,4 +36,12 @@ public interface IUserExamService extends IService<UserExam> {
      * @return
      */
     long countUserExam(String userId, String examId);
+
+    /**
+     * 查询用户考试信息及试题
+     *
+     * @param id
+     * @return
+     */
+    UserExam listUserExam(String id);
 }

+ 15 - 4
web/src/main/java/com/yntravelsky/buss/exam/userexam/service/impl/UserExamServiceImpl.java

@@ -1,15 +1,13 @@
 package com.yntravelsky.buss.exam.userexam.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yntravelsky.buss.exam.exam.enums.PaperState;
-import com.yntravelsky.buss.exam.paper.entity.Paper;
 import com.yntravelsky.buss.exam.userexam.entity.UserExam;
 import com.yntravelsky.buss.exam.userexam.mapper.UserExamMapper;
 import com.yntravelsky.buss.exam.userexam.service.IUserExamService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
@@ -22,6 +20,8 @@ import java.util.List;
  */
 @Service
 public class UserExamServiceImpl extends ServiceImpl<UserExamMapper, UserExam> implements IUserExamService {
+    @Autowired
+    private UserExamMapper userExamMapper;
 
     /**
      * 检查是否有正在进行中的考试
@@ -63,4 +63,15 @@ public class UserExamServiceImpl extends ServiceImpl<UserExamMapper, UserExam> i
         wrapper.eq(UserExam::getUserId, userId).eq(UserExam::getExamId, examId);
         return this.count(wrapper);
     }
+
+    /**
+     * 查询用户考试信息及试题
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public UserExam listUserExam(String id) {
+        return userExamMapper.listUserExam(id);
+    }
 }