Sfoglia il codice sorgente

fix 模考做题记录与错题记录

tanzh 3 anni fa
parent
commit
881da9c3e0
19 ha cambiato i file con 1831 aggiunte e 0 eliminazioni
  1. 165 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserMockRecordController.java
  2. 79 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockRecordAddBo.java
  3. 97 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockRecordEditBo.java
  4. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockRecordQueryBo.java
  5. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockWrongRecordAddBo.java
  6. 50 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockWrongRecordEditBo.java
  7. 56 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockWrongRecordQueryBo.java
  8. 74 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserMockRecord.java
  9. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserMockWrongRecord.java
  10. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMockRecordMapper.java
  11. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMockWrongRecordMapper.java
  12. 75 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserMockRecordService.java
  13. 59 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserMockWrongRecordService.java
  14. 200 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockRecordServiceImpl.java
  15. 132 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockWrongRecordServiceImpl.java
  16. 112 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockRecordVo.java
  17. 120 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockWrongRecordVo.java
  18. 264 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMockRecordMapper.xml
  19. 143 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMockWrongRecordMapper.xml

+ 165 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserMockRecordController.java

@@ -0,0 +1,165 @@
+package com.zhongzheng.controller.user;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.bo.UserMockRecordAddBo;
+import com.zhongzheng.modules.user.bo.UserMockRecordEditBo;
+import com.zhongzheng.modules.user.bo.UserMockRecordQueryBo;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserMockRecordService;
+import com.zhongzheng.modules.user.vo.UserMockRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户的题库试卷做题历史Controller
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Api(value = "用户模考做题历史控制器", tags = {"用户模考做题历史控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/mock/record")
+public class UserMockRecordController extends BaseController {
+
+    private final IUserMockRecordService iUserMockRecordService;
+    private final WxTokenService wxTokenService;
+
+
+    /**
+     * 查询用户模考做题历史列表
+     */
+    @ApiOperation("查询用户模考做题历史列表")
+    @GetMapping("/list")
+    public TableDataInfo<UserMockRecordVo> list(UserMockRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserMockRecordVo> list = iUserMockRecordService.selectList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询用户模考做题历史列表
+     */
+    @ApiOperation("查询用户模考做题历史分组列表")
+    @GetMapping("/group_list")
+    public TableDataInfo<UserMockRecordVo> groupList(UserMockRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserMockRecordVo> list = iUserMockRecordService.selectGroupList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询用户模考做题历史列表
+     */
+    @ApiOperation("查询用户模考做题历史次数")
+    @GetMapping("/count")
+    public AjaxResult<Integer> recordNum(UserMockRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        Integer num = iUserMockRecordService.recordNum(bo);
+        return AjaxResult.success(num);
+    }
+
+    /**
+     * 导出用户模考做题历史列表
+     */
+   /* @ApiOperation("导出用户的题库试卷做题历史列表")
+    @PreAuthorize("@ss.hasPermi('system:record:export')")
+    @Log(title = "用户的题库试卷做题历史", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<UserMockRecordVo> export(UserMockRecordQueryBo bo) {
+        List<UserMockRecordVo> list = iUserMockRecordService.queryList(bo);
+        ExcelUtil<UserMockRecordVo> util = new ExcelUtil<UserMockRecordVo>(UserMockRecordVo.class);
+        return util.exportExcel(list, "用户的题库试卷做题历史");
+    }*/
+
+    /**
+     * 获取用户模考做题历史详细信息
+     */
+    @ApiOperation("获取用户模考做题历史详细信息")
+    @GetMapping("/{recordId}")
+    public AjaxResult<UserMockRecordVo> getInfo(@PathVariable("recordId" ) Long recordId) {
+        UserMockRecordQueryBo bo = new UserMockRecordQueryBo();
+        bo.setRecordId(recordId);
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserMockRecordService.selectDetail(bo));
+    }
+
+    /**
+     * 新增用户模考做题历史
+     */
+    @ApiOperation("新增用户模考做题历史")
+    @Log(title = "用户模考做题历史", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Long> add(@RequestBody UserMockRecordAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserMockRecordService.insertByAddBo(bo));
+    }
+
+    /**
+     * 修改用户的题库试卷做题历史
+     */
+    @ApiOperation("修改用户模考做题历史")
+    @Log(title = "用户模考做题历史", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody UserMockRecordEditBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserMockRecordService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除用户模考做题历史
+     */
+    /*@ApiOperation("删除用户的题库试卷做题历史")
+    @PreAuthorize("@ss.hasPermi('system:record:remove')")
+    @Log(title = "用户的题库试卷做题历史" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{recordIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] recordIds) {
+        return toAjax(iUserMockRecordService.deleteWithValidByIds(Arrays.asList(recordIds), true) ? 1 : 0);
+    }*/
+
+    /**
+     * 试卷详情做对题目列表
+     */
+    @ApiOperation("试卷详情做对题目列表")
+    @GetMapping("/right_list")
+    public TableDataInfo<UserMockWrongRecordVo> right_list(UserMockRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserMockWrongRecordVo> list = iUserMockRecordService.getMockRecordRightList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 试卷详情做错题目列表
+     */
+    @ApiOperation("试卷详情做错题目列表")
+    @GetMapping("/wrong_list")
+    public TableDataInfo<UserMockWrongRecordVo> wrong_list(UserMockRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserMockWrongRecordVo> list = iUserMockRecordService.getMockRecordWrongList(bo);
+        return getDataTable(list);
+    }
+}

+ 79 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockRecordAddBo.java

@@ -0,0 +1,79 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 用户模考做题历史添加对象 user_mock_record
+ *
+ * @author tzh
+ * @date 2022-5-23
+ */
+@Data
+@ApiModel("用户模考做题历史添加对象")
+public class UserMockRecordAddBo {
+
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 是否完成 1完成 0未完成 */
+    @ApiModelProperty("是否完成 1完成 0未完成")
+    private Integer status;
+    /** 1及格 0不及格 */
+    @ApiModelProperty("1及格 0不及格")
+    private Integer reportStatus;
+    /** 分数 */
+    @ApiModelProperty("分数")
+    private BigDecimal performance;
+
+    /** 历史做题JSON */
+    @ApiModelProperty("历史做题JSON")
+    private String historyExamJson;
+    /** 试卷总题数 */
+    @ApiModelProperty("试卷总题数")
+    private Long totalQuestionNum;
+    /** 做的题目数 */
+    @ApiModelProperty("做的题目数")
+    private Long doQuestionNum;
+    /** 模块卷ID */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /** 章卷ID */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /** 做题时长(秒数) */
+    @ApiModelProperty("做题时长(秒数)")
+    private Long doTime;
+    /** 试卷总做题时长(秒数) */
+    @ApiModelProperty("试卷总做题时长(秒数)")
+    private Long examTime;
+    /** 总分 */
+    @ApiModelProperty("总分")
+    private BigDecimal totalScore;
+    /** 做的题目id拼接 */
+    @ApiModelProperty("做的题目id拼接")
+    private String doQuestionIds;
+    /** 做对总题目id拼接 */
+    @ApiModelProperty("做对总题目id拼接")
+    private String rightQuestionIds;
+    /** 主观题得分 */
+    @ApiModelProperty("主观题得分")
+    private BigDecimal score;
+    /** 试卷总题数(含主观) */
+    @ApiModelProperty("试卷总题数(含主观)")
+    private Long allQuestionNum;
+    private Long lessQuestionNum;
+}

+ 97 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockRecordEditBo.java

@@ -0,0 +1,97 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 用户模考做题历史编辑对象 user_mock_record
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Data
+@ApiModel("用户模考做题历史编辑对象")
+public class UserMockRecordEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long recordId;
+
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+
+    /** 是否完成 1完成 0未完成 */
+    @ApiModelProperty("是否完成 1完成 0未完成")
+    private Integer status;
+
+    /** 1及格 0不及格 */
+    @ApiModelProperty("1及格 0不及格")
+    private Integer reportStatus;
+
+    /** 分数 */
+    @ApiModelProperty("分数")
+    private BigDecimal performance;
+
+    /** 历史做题JSON */
+    @ApiModelProperty("历史做题JSON")
+    private String historyExamJson;
+
+    /** 试卷总题数 */
+    @ApiModelProperty("试卷总题数")
+    private Long totalQuestionNum;
+    /** 做对总题数 */
+    @ApiModelProperty("做对总题数")
+    private Long rightQuestionNum;
+
+    /** 做的题目数 */
+    @ApiModelProperty("做的题目数")
+    private Long doQuestionNum;
+
+    /** 模块卷ID */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+
+    /** 章卷ID */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+
+    /** 做题时长(秒数) */
+    @ApiModelProperty("做题时长(秒数)")
+    private Long doTime;
+
+    /** 试卷总做题时长(秒数) */
+    @ApiModelProperty("试卷总做题时长(秒数)")
+    private Long examTime;
+    /** 总分 */
+    @ApiModelProperty("总分")
+    private BigDecimal totalScore;
+
+    /** 做的题目id拼接 */
+    @ApiModelProperty("做的题目id拼接")
+    private String doQuestionIds;
+
+    /** 做对总题目id拼接 */
+    @ApiModelProperty("做对总题目id拼接")
+    private String rightQuestionIds;
+    /** 主观题得分 */
+    @ApiModelProperty("主观题得分")
+    private BigDecimal score;
+    /** 试卷总题数(含主观) */
+    @ApiModelProperty("试卷总题数(含主观)")
+    private Long allQuestionNum;
+    private Long lessQuestionNum;
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockRecordQueryBo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.user.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户模考做题历史分页查询对象 user_mock_record
+ *
+ * @author hjl
+ * @date 2021-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户模考做题历史分页查询对象")
+public class UserMockRecordQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+	@ApiModelProperty("记录ID")
+	private Long recordId;
+
+	/** 试卷ID */
+	@ApiModelProperty("试卷ID")
+	private Long examId;
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 是否完成 1完成 0未完成 */
+	@ApiModelProperty("是否完成 1完成 0未完成")
+	private Integer status;
+	/** 1及格 0不及格 */
+	@ApiModelProperty("1及格 0不及格")
+	private Integer reportStatus;
+	/** 分数 */
+	@ApiModelProperty("分数")
+	private Long performance;
+	@ApiModelProperty("试卷类型ID")
+	private Long paperId;
+	@ApiModelProperty("模块卷ID")
+	private Long moduleExamId;
+	@ApiModelProperty("章卷ID")
+	private Long chapterExamId;
+
+}

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockWrongRecordAddBo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 用户模考错题记录添加对象 user_mock_wrong_record
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Data
+@ApiModel("用户模考错题记录添加对象")
+public class UserMockWrongRecordAddBo {
+
+    /** 做题记录ID */
+    @ApiModelProperty("做题记录ID")
+    private Long recordId;
+    /** 错误题目ID */
+    @ApiModelProperty("错误题目ID")
+    private List<Long> questionIds;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Integer examId;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 模块卷ID */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /** 章卷ID */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /** 科目ID */
+    @ApiModelProperty("科目ID")
+    private Long subjectId;
+}

+ 50 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockWrongRecordEditBo.java

@@ -0,0 +1,50 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 用户模考错题记录编辑对象 user_mock_wrong_record
+ *
+ * @author hjl
+ * @date 2021-12-15
+ */
+@Data
+@ApiModel("用户模考错题记录编辑对象")
+public class UserMockWrongRecordEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long wrongId;
+
+    /** 做题记录ID */
+    @ApiModelProperty("做题记录ID")
+    private Long recordId;
+
+    /** 错误题目ID */
+    @ApiModelProperty("错误题目ID")
+    private Long questionId;
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Integer examId;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** 模块卷ID */
+    @ApiModelProperty("模块卷ID")
+    private Long moduleExamId;
+    /** 章卷ID */
+    @ApiModelProperty("章卷ID")
+    private Long chapterExamId;
+    /** 科目ID */
+    @ApiModelProperty("科目ID")
+    private Long subjectId;
+}

+ 56 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockWrongRecordQueryBo.java

@@ -0,0 +1,56 @@
+package com.zhongzheng.modules.user.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户模考错题记录分页查询对象 user_mock_wrong_record
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户模考错题记录分页查询对象")
+public class UserMockWrongRecordQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 做题记录ID */
+	@ApiModelProperty("做题记录ID")
+	private Long recordId;
+	/** 错误题目ID */
+	@ApiModelProperty("错误题目ID")
+	private Long questionId;
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 试卷ID */
+	@ApiModelProperty("试卷ID")
+	private Integer examId;
+
+	/** 类型 1单选 2多选 3判断题  4案列题  5简答题*/
+	@ApiModelProperty("类型 1单选 2多选 3判断题 4案列题  5简答题")
+	private Integer type;
+
+	@ApiModelProperty("试卷类型ID")
+	private Integer paperId;
+	/** 科目ID */
+	@ApiModelProperty("科目ID")
+	private Long subjectId;
+}

+ 74 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserMockRecord.java

@@ -0,0 +1,74 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 用户模考做题历史对象 user_mock_record
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_mock_record")
+public class UserMockRecord implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "record_id")
+    private Long recordId;
+    /** 试卷ID */
+    private Long examId;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 用户ID */
+    private Long userId;
+    /** 是否完成 1完成 0未完成 */
+    private Integer status;
+    /** 1及格 0不及格 */
+    private Integer reportStatus;
+    /** 分数 */
+    private BigDecimal performance;
+    /** 历史做题JSON */
+    private String historyExamJson;
+    /** 试卷总题数 */
+    private Long totalQuestionNum;
+    /** 做对总题数 */
+    private Long rightQuestionNum;
+    /** 做的题目数 */
+    private Long doQuestionNum;
+    /** 模块卷ID */
+    private Long moduleExamId;
+    /** 章卷ID */
+    private Long chapterExamId;
+    /** 做题时长(秒数) */
+    private Long doTime;
+    /** 试卷总做题时长(秒数) */
+    private Long examTime;
+    /** 总分 */
+    private BigDecimal totalScore;
+    /** 做的题目id拼接 */
+    private String doQuestionIds;
+    /** 做对总题目id拼接 */
+    private String rightQuestionIds;
+    /** 主观题得分 */
+    private BigDecimal score;
+    /** 试卷总题数(含主观) */
+    private Long allQuestionNum;
+    private Long lessQuestionNum;
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserMockWrongRecord.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 用户模考错题记录对象 user_mock_wrong_record
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_mock_wrong_record")
+public class UserMockWrongRecord implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "wrong_id")
+    private Long wrongId;
+    /** 做题记录ID */
+    private Long recordId;
+    /** 错误题目ID */
+    private Long questionId;
+    /** 用户ID */
+    private Long userId;
+    /** 试卷ID */
+    private Integer examId;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 模块卷ID */
+    private Long moduleExamId;
+    /** 章卷ID */
+    private Long chapterExamId;
+    /** 科目ID */
+    private Long subjectId;
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMockRecordMapper.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.bo.UserMockRecordQueryBo;
+import com.zhongzheng.modules.user.domain.UserMockRecord;
+import com.zhongzheng.modules.user.vo.UserMockRecordVo;
+import com.zhongzheng.modules.user.vo.UserExamWrongRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+
+import java.util.List;
+
+/**
+ * 用户模考做题历史Mapper接口
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+public interface UserMockRecordMapper extends BaseMapper<UserMockRecord> {
+    List<UserMockRecordVo> selectList(UserMockRecordQueryBo bo);
+    Long selectDoNum(UserMockRecordQueryBo bo);
+    Long selectRightNum(UserMockRecordQueryBo bo);
+    UserMockRecordVo selectDetail(UserMockRecordQueryBo bo);
+    List<UserMockRecordVo> selectExamList(UserMockRecordQueryBo bo);
+    List<UserMockWrongRecordVo> getMockRecordRightList(UserMockRecordQueryBo bo);
+    List<UserMockWrongRecordVo> getMockRecordWrongList(UserMockRecordQueryBo bo);
+    Long getUserDoQuestionNum(UserMockRecordQueryBo bo);
+    List<UserMockRecordVo> selectGroupList(UserMockRecordQueryBo bo);
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMockWrongRecordMapper.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo;
+import com.zhongzheng.modules.user.domain.UserMockWrongRecord;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+
+import java.util.List;
+
+/**
+ * 用户模考错题记录Mapper接口
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+public interface UserMockWrongRecordMapper extends BaseMapper<UserMockWrongRecord> {
+    List<UserMockWrongRecordVo> selectList(UserMockWrongRecordQueryBo bo);
+    List<UserMockWrongRecordVo> selectQuestionList(UserMockWrongRecordQueryBo bo);
+    List<UserMockWrongRecordVo> selectTypeNum(UserMockWrongRecordQueryBo bo);
+    List<UserMockWrongRecordVo> selectTypeQuestionList(UserMockWrongRecordQueryBo bo);
+    Long recordNum(UserMockWrongRecordQueryBo bo);
+}

+ 75 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserMockRecordService.java

@@ -0,0 +1,75 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.domain.UserMockRecord;
+import com.zhongzheng.modules.user.domain.UserMockRecord;
+import com.zhongzheng.modules.user.vo.UserMockRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 用户模考历史Service接口
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+public interface IUserMockRecordService extends IService<UserMockRecord> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	UserMockRecordVo queryById(Long recordId);
+
+	UserMockRecordVo selectDetail(UserMockRecordQueryBo bo);
+
+	List<UserMockRecordVo> selectExamList(UserMockRecordQueryBo bo);
+
+	List<UserMockWrongRecordVo> getMockRecordRightList(UserMockRecordQueryBo bo);
+
+	List<UserMockWrongRecordVo> getMockRecordWrongList(UserMockRecordQueryBo bo);
+
+	Long getUserDoQuestionNum(UserMockRecordQueryBo bo);
+
+	Boolean delUserBankHistory(Long userId,Long goodsId,Long orderGoodsId);
+
+	/**
+	 * 查询列表
+	 */
+	List<UserMockRecordVo> queryList(UserMockRecordQueryBo bo);
+
+	Integer recordNum(UserMockRecordQueryBo bo);
+
+	Long selectDoNum(UserMockRecordQueryBo bo);
+
+	Long selectRightNum(UserMockRecordQueryBo bo);
+
+	List<UserMockRecordVo> selectList(UserMockRecordQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入用户的题库试卷做题历史
+	 * @param bo 用户的题库试卷做题历史新增业务对象
+	 * @return
+	 */
+	Long insertByAddBo(UserMockRecordAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改用户的题库试卷做题历史
+	 * @param bo 用户的题库试卷做题历史编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(UserMockRecordEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+	List<UserMockRecordVo> selectGroupList(UserMockRecordQueryBo bo);
+
+}

+ 59 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserMockWrongRecordService.java

@@ -0,0 +1,59 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordAddBo;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordEditBo;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo;
+import com.zhongzheng.modules.user.domain.UserMockWrongRecord;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 用户模考错题记录Service接口
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+public interface IUserMockWrongRecordService extends IService<UserMockWrongRecord> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	UserMockWrongRecordVo queryById(Long wrongId);
+
+	Long recordNum(UserMockWrongRecordQueryBo bo);
+
+	/**
+	 * 查询列表
+	 */
+	List<UserMockWrongRecordVo> queryList(UserMockWrongRecordQueryBo bo);
+
+	List<UserMockWrongRecordVo> selectList(UserMockWrongRecordQueryBo bo);
+
+	List<UserMockWrongRecordVo> selectTypeNum(UserMockWrongRecordQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入用户我的题库错题记录
+	 * @param bo 用户我的题库错题记录新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(UserMockWrongRecordAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改用户我的题库错题记录
+	 * @param bo 用户我的题库错题记录编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(UserMockWrongRecordEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+}

+ 200 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockRecordServiceImpl.java

@@ -0,0 +1,200 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.collect.domain.CollectQuestion;
+import com.zhongzheng.modules.collect.service.ICollectQuestionService;
+import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.order.vo.OrderGoodsVo;
+import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.domain.UserMockRecord;
+import com.zhongzheng.modules.user.domain.UserMockWrongRecord;
+import com.zhongzheng.modules.user.domain.UserMockRecord;
+import com.zhongzheng.modules.user.domain.UserMockWrongRecord;
+import com.zhongzheng.modules.user.mapper.UserMockRecordMapper;
+import com.zhongzheng.modules.user.mapper.UserMockRecordMapper;
+import com.zhongzheng.modules.user.service.IUserMockWrongRecordService;
+import com.zhongzheng.modules.user.service.IUserMockRecordService;
+import com.zhongzheng.modules.user.service.IUserMockWrongRecordService;
+import com.zhongzheng.modules.user.vo.UserMockRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockRecordVo;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户模考做题历史Service业务层处理
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Service
+public class UserMockRecordServiceImpl extends ServiceImpl<UserMockRecordMapper, UserMockRecord> implements IUserMockRecordService {
+
+    @Autowired
+    private UserMockRecordMapper UserMockRecordMapper;
+
+    @Autowired
+    private IUserMockWrongRecordService iUserMockWrongRecordService;
+    @Autowired
+    private ICollectQuestionService iCollectQuestionService;
+
+    @Autowired
+    private IOrderGoodsService iOrderGoodsService;
+
+    @Override
+    public UserMockRecordVo queryById(Long recordId){
+        UserMockRecord db = this.baseMapper.selectById(recordId);
+        return BeanUtil.toBean(db, UserMockRecordVo.class);
+    }
+
+    @Override
+    public UserMockRecordVo selectDetail(UserMockRecordQueryBo bo) {
+        return this.baseMapper.selectDetail(bo);
+    }
+
+    @Override
+    public List<UserMockRecordVo> selectExamList(UserMockRecordQueryBo bo) {
+        return this.baseMapper.selectExamList(bo);
+    }
+
+    @Override
+    public List<UserMockWrongRecordVo> getMockRecordRightList(UserMockRecordQueryBo bo) {
+        return this.baseMapper.getMockRecordRightList(bo);
+    }
+
+    @Override
+    public List<UserMockWrongRecordVo> getMockRecordWrongList(UserMockRecordQueryBo bo) {
+        return this.baseMapper.getMockRecordWrongList(bo);
+    }
+
+    @Override
+    public Long getUserDoQuestionNum(UserMockRecordQueryBo bo) {
+        return this.baseMapper.getUserDoQuestionNum(bo);
+    }
+
+    @Override
+    public Boolean delUserBankHistory(Long userId, Long goodsId,Long orderGoodsId) {
+        //删除做题历史
+        LambdaQueryWrapper<UserMockRecord> lqw = Wrappers.lambdaQuery();
+        lqw.eq( UserMockRecord::getUserId, userId);
+        remove(lqw);
+        //删除错题历史
+        LambdaQueryWrapper<UserMockWrongRecord> lqw1 = Wrappers.lambdaQuery();
+        lqw1.eq( UserMockWrongRecord::getUserId, userId);
+        iUserMockWrongRecordService.remove(lqw1);
+        //删除收藏
+        LambdaQueryWrapper<CollectQuestion> lqw2 = Wrappers.lambdaQuery();
+        lqw2.eq(CollectQuestion::getGoodsId, goodsId);
+        lqw2.eq( CollectQuestion::getUserId, userId);
+        lqw2.eq( CollectQuestion::getOrderGoodsId, orderGoodsId);
+        iCollectQuestionService.remove(lqw2);
+        return true;
+    }
+
+    @Override
+    public List<UserMockRecordVo> queryList(UserMockRecordQueryBo bo) {
+        LambdaQueryWrapper<UserMockRecord> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getExamId() != null, UserMockRecord::getExamId, bo.getExamId());
+        lqw.eq(bo.getUserId() != null, UserMockRecord::getUserId, bo.getUserId());
+        lqw.eq(bo.getStatus() != null, UserMockRecord::getStatus, bo.getStatus());
+        lqw.eq(bo.getReportStatus() != null, UserMockRecord::getReportStatus, bo.getReportStatus());
+        lqw.eq(bo.getPerformance() != null, UserMockRecord::getPerformance, bo.getPerformance());
+        return entity2Vo(this.list(lqw));
+    }
+
+    @Override
+    public Integer recordNum(UserMockRecordQueryBo bo) {
+        LambdaQueryWrapper<UserMockRecord> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getExamId() != null, UserMockRecord::getExamId, bo.getExamId());
+        lqw.eq(bo.getUserId() != null, UserMockRecord::getUserId, bo.getUserId());
+        lqw.eq(bo.getStatus() != null, UserMockRecord::getStatus, bo.getStatus());
+        return this.count(lqw);
+    }
+
+    @Override
+    public Long selectDoNum(UserMockRecordQueryBo bo) {
+        return UserMockRecordMapper.selectDoNum(bo);
+    }
+
+    @Override
+    public Long selectRightNum(UserMockRecordQueryBo bo) {
+        return UserMockRecordMapper.selectRightNum(bo);
+    }
+
+    @Override
+    public List<UserMockRecordVo> selectList(UserMockRecordQueryBo bo) {
+        return UserMockRecordMapper.selectList(bo);
+    }
+
+    /**
+     * 实体类转化成视图对象
+     *
+     * @param collection 实体类集合
+     * @return
+     */
+    private List<UserMockRecordVo> entity2Vo(Collection<UserMockRecord> collection) {
+        List<UserMockRecordVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, UserMockRecordVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<UserMockRecord> page = (Page<UserMockRecord>)collection;
+            Page<UserMockRecordVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Long insertByAddBo(UserMockRecordAddBo bo) {
+        UserMockRecord add = BeanUtil.toBean(bo, UserMockRecord.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        this.save(add);
+        return add.getRecordId();
+    }
+
+    @Override
+    public Boolean updateByEditBo(UserMockRecordEditBo bo) {
+        UserMockRecord update = BeanUtil.toBean(bo, UserMockRecord.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(UserMockRecord entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    @Override
+    public List<UserMockRecordVo> selectGroupList(UserMockRecordQueryBo bo) {
+        return this.baseMapper.selectGroupList(bo);
+    }
+}

+ 132 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockWrongRecordServiceImpl.java

@@ -0,0 +1,132 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordAddBo;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordEditBo;
+import com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo;
+import com.zhongzheng.modules.user.domain.UserMockWrongRecord;
+import com.zhongzheng.modules.user.mapper.UserMockWrongRecordMapper;
+import com.zhongzheng.modules.user.service.IUserMockWrongRecordService;
+import com.zhongzheng.modules.user.vo.UserMockWrongRecordVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户模考记录Service业务层处理
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Service
+public class UserMockWrongRecordServiceImpl extends ServiceImpl<UserMockWrongRecordMapper, UserMockWrongRecord> implements IUserMockWrongRecordService {
+
+    @Autowired
+    private UserMockWrongRecordMapper UserMockWrongRecordMapper;
+
+    @Override
+    public UserMockWrongRecordVo queryById(Long wrongId){
+        UserMockWrongRecord db = this.baseMapper.selectById(wrongId);
+        return BeanUtil.toBean(db, UserMockWrongRecordVo.class);
+    }
+
+    @Override
+    public Long recordNum(UserMockWrongRecordQueryBo bo) {
+        return this.baseMapper.recordNum(bo);
+    }
+
+    @Override
+    public List<UserMockWrongRecordVo> queryList(UserMockWrongRecordQueryBo bo) {
+        LambdaQueryWrapper<UserMockWrongRecord> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getRecordId() != null, UserMockWrongRecord::getRecordId, bo.getRecordId());
+        lqw.eq(bo.getQuestionId() != null, UserMockWrongRecord::getQuestionId, bo.getQuestionId());
+        lqw.eq(bo.getUserId() != null, UserMockWrongRecord::getUserId, bo.getUserId());
+        lqw.eq(bo.getExamId() != null, UserMockWrongRecord::getExamId, bo.getExamId());
+        lqw.eq(bo.getSubjectId() != null, UserMockWrongRecord::getSubjectId, bo.getSubjectId());
+        return entity2Vo(this.list(lqw));
+    }
+
+    @Override
+    public List<UserMockWrongRecordVo> selectList(UserMockWrongRecordQueryBo bo) {
+        return UserMockWrongRecordMapper.selectList(bo);
+    }
+
+    @Override
+    public List<UserMockWrongRecordVo> selectTypeNum(UserMockWrongRecordQueryBo bo) {
+        return UserMockWrongRecordMapper.selectTypeNum(bo);
+    }
+
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<UserMockWrongRecordVo> entity2Vo(Collection<UserMockWrongRecord> collection) {
+        List<UserMockWrongRecordVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, UserMockWrongRecordVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<UserMockWrongRecord> page = (Page<UserMockWrongRecord>)collection;
+            Page<UserMockWrongRecordVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(UserMockWrongRecordAddBo bo) {
+        if(bo.getQuestionIds()==null||bo.getQuestionIds().size()==0){
+            throw new CustomException("题目数组错误");
+        }
+        boolean result = false;
+        for (Long questionId : bo.getQuestionIds()) {
+            UserMockWrongRecord add = BeanUtil.toBean(bo, UserMockWrongRecord.class);
+            validEntityBeforeSave(add);
+            add.setCreateTime(DateUtils.getNowTime());
+            add.setUpdateTime(DateUtils.getNowTime());
+            add.setQuestionId(questionId);
+            result = this.save(add);
+        }
+
+        return result;
+    }
+
+    @Override
+    public Boolean updateByEditBo(UserMockWrongRecordEditBo bo) {
+        UserMockWrongRecord update = BeanUtil.toBean(bo, UserMockWrongRecord.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(UserMockWrongRecord entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 112 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockRecordVo.java

@@ -0,0 +1,112 @@
+package com.zhongzheng.modules.user.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 用户模考做题历史视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2021-12-15
+ */
+@Data
+@ApiModel("用户模考做题历史视图对象")
+public class UserMockRecordVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long recordId;
+
+	/** 试卷ID */
+	@Excel(name = "试卷ID")
+	@ApiModelProperty("试卷ID")
+	private Long examId;
+	/** 用户ID */
+	@Excel(name = "用户ID")
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 是否完成 1完成 0未完成 */
+	@Excel(name = "是否完成 1完成 0未完成")
+	@ApiModelProperty("是否完成 1完成 0未完成")
+	private Integer status;
+	/** 1及格 0不及格 */
+	@Excel(name = "1及格 0不及格")
+	@ApiModelProperty("1及格 0不及格")
+	private Integer reportStatus;
+	/** 分数 */
+	@Excel(name = "分数")
+	@ApiModelProperty("分数")
+	private BigDecimal performance;
+	/** 历史做题JSON */
+	@Excel(name = "历史做题JSON")
+	@ApiModelProperty("历史做题JSON")
+	private String historyExamJson;
+
+	@ApiModelProperty("试卷名")
+	private String examName;
+
+	@ApiModelProperty("试卷类型")
+	private String paperName;
+
+	/** 更新时间 */
+	@ApiModelProperty("更新时间")
+	private Long updateTime;
+	@Excel(name = "试卷总题数")
+	@ApiModelProperty("试卷总题数")
+	private Long totalQuestionNum;
+
+	/** 做对总题数 */
+	@Excel(name = "做对总题数")
+	@ApiModelProperty("做对总题数")
+	private Long rightQuestionNum;
+
+	/** 做的题目数 */
+	@Excel(name = "做的题目数")
+	@ApiModelProperty("做的题目数")
+	private Long doQuestionNum;
+	/** 模块卷ID */
+	@Excel(name = "模块卷ID")
+	@ApiModelProperty("模块卷ID")
+	private Long moduleExamId;
+	/** 章卷ID */
+	@Excel(name = "章卷ID")
+	@ApiModelProperty("章卷ID")
+	private Long chapterExamId;
+	/** 做题时长(秒数) */
+	@Excel(name = "做题时长" , readConverterExp = "秒=数")
+	@ApiModelProperty("做题时长(秒数)")
+	private Long doTime;
+	/** 试卷总做题时长(秒数) */
+	@Excel(name = "试卷总做题时长(秒数)")
+	@ApiModelProperty("试卷总做题时长(秒数)")
+	private Long examTime;
+	/** 总分 */
+	@Excel(name = "总分")
+	@ApiModelProperty("总分")
+	private BigDecimal totalScore;
+	/** 做的题目id拼接 */
+	@Excel(name = "做的题目id拼接")
+	@ApiModelProperty("做的题目id拼接")
+	private String doQuestionIds;
+	/** 做对总题目id拼接 */
+	@Excel(name = "做对总题目id拼接")
+	@ApiModelProperty("做对总题目id拼接")
+	private String rightQuestionIds;
+	/** 主观题得分 */
+	@Excel(name = "主观题得分")
+	@ApiModelProperty("主观题得分")
+	private BigDecimal score;
+	@ApiModelProperty("做卷类型  1练习 2考试")
+	private Integer doType;
+	/** 试卷总题数(含主观) */
+	@Excel(name = "试卷总题数(含主观)")
+	@ApiModelProperty("试卷总题数(含主观)")
+	private Long allQuestionNum;
+	private Long lessQuestionNum;
+}

+ 120 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserMockWrongRecordVo.java

@@ -0,0 +1,120 @@
+package com.zhongzheng.modules.user.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 用户模考错题记录视图对象 mall_package
+ *
+ * @author tzh
+ * @date 2022-5-31
+ */
+@Data
+@ApiModel("用户模考错题记录视图对象")
+public class UserMockWrongRecordVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long wrongId;
+
+	/** 做题记录ID */
+	@Excel(name = "做题记录ID")
+	@ApiModelProperty("做题记录ID")
+	private Long recordId;
+	/** 错误题目ID */
+	@Excel(name = "错误题目ID")
+	@ApiModelProperty("错误题目ID")
+	private Long questionId;
+	/** 用户ID */
+	@Excel(name = "用户ID")
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 试卷ID */
+	@Excel(name = "试卷ID")
+	@ApiModelProperty("试卷ID")
+	private Integer examId;
+
+	@ApiModelProperty("试卷名")
+	private String examName;
+
+	@ApiModelProperty("错题题数")
+	private Long wrongQuestionNum;
+
+
+
+	@ApiModelProperty("类型数量")
+	private Integer num;
+
+	/** 题目正文 */
+	@Excel(name = "题目正文")
+	@ApiModelProperty("题目正文")
+	private String content;
+	/** 类型 1单选 2多选 3判断题 4简答题 5案列题 */
+	@Excel(name = "类型 1单选 2多选 3判断题 4简答题 5案列题")
+	@ApiModelProperty("类型 1单选 2多选 3判断题 4简答题 5案列题")
+	private Integer type;
+	/** 答案  判断题1正确 0错误; 单选为数字; 多选数字用,拼接; 从1坐标开始; */
+	@Excel(name = "答案  判断题1正确 0错误; 单选为数字; 多选数字用,拼接; 从1坐标开始;")
+	@ApiModelProperty("答案  判断题1正确 0错误; 单选为数字; 多选数字用,拼接; 从1坐标开始;")
+	private String answerQuestion;
+	/**  状态 1正常 0关闭 */
+	@Excel(name = " 状态 1正常 0关闭")
+	@ApiModelProperty(" 状态 1正常 0关闭")
+	private Integer status;
+	/** 解析文本 */
+	@Excel(name = "解析文本")
+	@ApiModelProperty("解析文本")
+	private String analysisContent;
+	/** 图片地址,多个,拼接 */
+	@Excel(name = "图片地址,多个,拼接")
+	@ApiModelProperty("图片地址,多个,拼接")
+	private String imgUrl;
+	/** 问题内容 */
+	@Excel(name = "问题内容")
+	@ApiModelProperty("问题内容")
+	private String jsonStr;
+	/** 前缀名称 */
+	@Excel(name = "前缀名称")
+	@ApiModelProperty("前缀名称")
+	private String prefixName;
+	/** 知识点id用,拼接 */
+	@Excel(name = "知识点id用,拼接")
+	@ApiModelProperty("知识点id用,拼接")
+	private String knowledgeIds;
+	/** 发布状态 1发布 0未发布 */
+	@Excel(name = "发布状态 1发布 0未发布")
+	@ApiModelProperty("发布状态 1发布 0未发布")
+	private Integer publishStatus;
+	/** 教育类型ID */
+	@Excel(name = "教育类型ID")
+	@ApiModelProperty("教育类型ID")
+	private Long educationTypeId;
+	/** 业务层次id */
+	@Excel(name = "业务层次id")
+	@ApiModelProperty("业务层次id")
+	private Long businessId;
+	/** 科目id */
+	@Excel(name = "科目id")
+	@ApiModelProperty("科目id")
+	private Long subjectId;
+	/** 项目ID */
+	@Excel(name = "项目ID")
+	@ApiModelProperty("项目ID")
+	private Long projectId;
+	/** 编码 */
+	@Excel(name = "编码")
+	@ApiModelProperty("编码")
+	private String code;
+	/** 模块卷ID */
+	@Excel(name = "模块卷ID")
+	@ApiModelProperty("模块卷ID")
+	private Long moduleExamId;
+	/** 章卷ID */
+	@Excel(name = "章卷ID")
+	@ApiModelProperty("章卷ID")
+	private Long chapterExamId;
+}

+ 264 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserMockRecordMapper.xml

@@ -0,0 +1,264 @@
+<?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.zhongzheng.modules.user.mapper.UserMockRecordMapper">
+
+    <resultMap type="com.zhongzheng.modules.user.domain.UserMockRecord" id="UserMockRecordResult">
+        <result property="recordId" column="record_id"/>
+        <result property="examId" column="exam_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="userId" column="user_id"/>
+        <result property="status" column="status"/>
+        <result property="reportStatus" column="report_status"/>
+        <result property="performance" column="performance"/>
+        <result property="historyExamJson" column="history_exam_json"/>
+        <result property="totalQuestionNum" column="total_question_num"/>
+        <result property="rightQuestionNum" column="right_question_num"/>
+        <result property="doQuestionNum" column="do_question_num"/>
+        <result property="moduleExamId" column="module_exam_id"/>
+        <result property="chapterExamId" column="chapter_exam_id"/>
+        <result property="doTime" column="do_time"/>
+        <result property="examTime" column="exam_time"/>
+        <result property="totalScore" column="total_score"/>
+        <result property="doQuestionIds" column="do_question_ids"/>
+        <result property="rightQuestionIds" column="right_question_ids"/>
+        <result property="score" column="score"/>
+        <result property="allQuestionNum" column="all_question_num"/>
+        <result property="lessQuestionNum" column="less_question_num"/>
+    </resultMap>
+
+    <resultMap type="com.zhongzheng.modules.user.vo.UserMockRecordVo" id="UserMockRecordVoResult">
+        <result property="recordId" column="record_id"/>
+        <result property="examId" column="exam_id"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="userId" column="user_id"/>
+        <result property="status" column="status"/>
+        <result property="reportStatus" column="report_status"/>
+        <result property="performance" column="performance"/>
+        <result property="historyExamJson" column="history_exam_json"/>
+        <result property="totalQuestionNum" column="total_question_num"/>
+        <result property="rightQuestionNum" column="right_question_num"/>
+        <result property="doQuestionNum" column="do_question_num"/>
+        <result property="moduleExamId" column="module_exam_id"/>
+        <result property="chapterExamId" column="chapter_exam_id"/>
+        <result property="doQuestionIds" column="do_question_ids"/>
+        <result property="rightQuestionIds" column="right_question_ids"/>
+        <result property="doType" column="do_type"/>
+        <result property="allQuestionNum" column="all_question_num"/>
+
+        <result property="examName" column="exam_name"/>
+        <result property="paperName" column="paper_name"/>
+        <result property="doTime" column="do_time"/>
+        <result property="examTime" column="exam_time"/>
+        <result property="totalScore" column="total_score"/>
+        <result property="score" column="score"/>
+    </resultMap>
+
+    <resultMap type="com.zhongzheng.modules.user.vo.UserMockWrongRecordVo" id="UserMockRecordQuestionVoResult">
+        <result property="wrongId" column="wrong_id"/>
+        <result property="recordId" column="record_id"/>
+        <result property="questionId" column="question_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="examId" column="exam_id"/>
+
+
+        <result property="examName" column="exam_name"/>
+        <result property="wrongQuestionNum" column="wrong_question_num"/>
+        <result property="type" column="type"/>
+        <result property="num" column="num"/>
+
+        <result property="content" column="content"/>
+        <result property="type" column="type"/>
+        <result property="answerQuestion" column="answer_question"/>
+        <result property="status" column="status"/>
+        <result property="analysisContent" column="analysis_content"/>
+        <result property="imgUrl" column="img_url"/>
+        <result property="jsonStr" column="json_str"/>
+        <result property="prefixName" column="prefix_name"/>
+        <result property="knowledgeIds" column="knowledge_ids"/>
+        <result property="publishStatus" column="publish_status"/>
+        <result property="code" column="code"/>
+
+    </resultMap>
+
+    <select id="selectList" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultMap="UserMockRecordVoResult">
+        SELECT
+            ue.*,
+            e.exam_name,
+            ep.paper_name
+        FROM
+            user_exam_record ue
+                LEFT JOIN exam e ON ue.exam_id = e.exam_id
+                LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id
+        WHERE
+            ue.user_id = #{userId}
+        <if test="paperId != null and paperId != ''">
+            AND ep.paper_id = #{paperId}
+        </if>
+        <if test="examId != null and examId != ''">
+            AND ue.exam_id = #{examId}
+        </if>
+        <if test="moduleExamId != null and moduleExamId != ''">
+            AND ue.module_exam_id = #{moduleExamId}
+        </if>
+        <if test="chapterExamId != null and chapterExamId != ''">
+            AND ue.chapter_exam_id = #{chapterExamId}
+        </if>
+        ORDER by ue.record_id DESC
+    </select>
+
+    <select id="selectGroupList" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultMap="UserMockRecordVoResult">
+        SELECT
+        ue.*,
+        e.exam_name,
+        ep.paper_name
+        FROM
+        (
+        SELECT
+        ue.exam_id,
+        ue.module_exam_id,
+        ue.chapter_exam_id,
+        MAX( UE.record_id ) record_id
+        FROM
+        user_exam_record ue
+        LEFT JOIN exam e ON ue.exam_id = e.exam_id
+        LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id
+        WHERE
+        ue.user_id = #{userId}
+        GROUP BY
+        ue.exam_id,
+        ue.module_exam_id,
+        ue.chapter_exam_id
+        ) t
+        LEFT JOIN user_exam_record ue ON t.record_id = ue.record_id
+        LEFT JOIN exam e ON ue.exam_id = e.exam_id
+        LEFT JOIN exam_paper ep ON e.exam_paper_id = ep.paper_id
+        WHERE
+        ue.user_id = #{userId}
+        <if test="paperId != null and paperId != ''">
+            AND ep.paper_id = #{paperId}
+        </if>
+        <if test="examId != null and examId != ''">
+            AND ue.exam_id = #{examId}
+        </if>
+        ORDER by ue.record_id DESC
+    </select>
+
+    <select id="selectDoNum" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultType="Long">
+        SELECT
+            IFNULL( COUNT(*), 0 ) num
+        FROM
+            (
+                SELECT
+                    e.exam_id,
+                    q.*
+                FROM
+                    ( SELECT exam_id, group_concat( do_question_ids ) AS ids FROM user_exam_record WHERE user_id = #{userId} and do_question_ids is not null and `status` = 1 GROUP BY exam_id ) e
+                        LEFT JOIN question q ON FIND_IN_SET( q.question_id, e.ids )) AS eq
+    </select>
+
+    <select id="selectRightNum" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultType="Long">
+        SELECT
+            IFNULL( COUNT( DISTINCT question_id ), 0 ) num
+        FROM
+            question
+        WHERE
+            FIND_IN_SET(
+                    question_id,(
+                SELECT
+                    group_concat( uer.right_question_ids ) AS ids
+                FROM
+                    user_exam_record uer
+                WHERE
+                        record_id IN ( SELECT MAX( record_id ) record_id FROM user_exam_record WHERE user_id = #{userId} and `status` = 1 GROUP BY exam_id )))
+
+    </select>
+
+    <select id="selectDetail" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultMap="UserMockRecordVoResult">
+        SELECT
+            uer.*,
+            e.exam_name
+        FROM
+            user_exam_record uer
+                LEFT JOIN exam e ON uer.exam_id = e.exam_id
+        WHERE
+            uer.record_id = #{recordId}
+          AND uer.user_id = #{userId}
+    </select>
+
+    <select id="selectExamList" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultMap="UserMockRecordVoResult">
+        SELECT
+            e.exam_id,
+            e.exam_name,
+            e.do_type,
+            uer.total_question_num
+        FROM
+            ( SELECT
+                  COUNT( question_id ) total_question_num,
+                  eq.exam_id
+              FROM
+                  exam_question eq
+              WHERE
+                      eq.exam_id IN ( SELECT DISTINCT exam_id FROM user_exam_record WHERE user_id = #{userId})
+              GROUP BY
+                  eq.exam_id ) uer
+                LEFT JOIN exam e ON e.exam_id = uer.exam_id
+
+    </select>
+
+    <select id="getMockRecordRightList" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultMap="UserMockRecordQuestionVoResult">
+        SELECT
+            *
+        FROM
+            question
+        WHERE
+            FIND_IN_SET(
+                    question_id,(
+                SELECT
+                    right_question_ids
+                FROM
+                    user_exam_record uer
+                WHERE
+                    uer.user_id = #{userId}
+                  AND uer.exam_id = #{examId}
+                ORDER BY
+                    record_id DESC
+                LIMIT 1 ))
+
+    </select>
+
+    <select id="getMockRecordWrongList" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultMap="UserMockRecordQuestionVoResult">
+        SELECT
+            q.*
+        FROM
+            (
+                SELECT
+                    question_id
+                FROM
+                    user_exam_wrong_record
+                WHERE
+                        record_id = ( SELECT record_id FROM user_exam_record uer WHERE uer.user_id = #{userId} AND uer.exam_id = #{examId} ORDER BY record_id DESC LIMIT 1 )) uewr
+	LEFT JOIN question q ON q.question_id = uewr.question_id
+
+    </select>
+
+    <select id="getUserDoQuestionNum" parameterType="com.zhongzheng.modules.user.bo.UserMockRecordQueryBo" resultType="Long">
+        SELECT
+            IFNULL(count(*),0)
+        FROM
+            question q
+        WHERE
+            FIND_IN_SET(
+                    q.question_id,(
+                SELECT
+                    GROUP_CONCAT( uer.do_question_ids )
+                FROM
+                    user_exam_record uer
+                WHERE
+                    uer.user_id = #{userId}
+                  AND uer.do_question_ids IS NOT NULL
+            ))
+    </select>
+</mapper>

+ 143 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserMockWrongRecordMapper.xml

@@ -0,0 +1,143 @@
+<?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.zhongzheng.modules.user.mapper.UserMockWrongRecordMapper">
+
+    <resultMap type="com.zhongzheng.modules.user.domain.UserMockWrongRecord" id="UserMockWrongRecordResult">
+        <result property="wrongId" column="wrong_id"/>
+        <result property="recordId" column="record_id"/>
+        <result property="questionId" column="question_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="examId" column="exam_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="moduleExamId" column="module_exam_id"/>
+        <result property="chapterExamId" column="chapter_exam_id"/>
+        <result property="subjectId" column="subject_id"/>
+    </resultMap>
+
+    <resultMap type="com.zhongzheng.modules.user.vo.UserMockWrongRecordVo" id="UserMockWrongRecordVoResult">
+        <result property="wrongId" column="wrong_id"/>
+        <result property="recordId" column="record_id"/>
+        <result property="questionId" column="question_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="examId" column="exam_id"/>
+
+
+        <result property="examName" column="exam_name"/>
+        <result property="wrongQuestionNum" column="wrong_question_num"/>
+        <result property="type" column="type"/>
+        <result property="num" column="num"/>
+
+        <result property="content" column="content"/>
+        <result property="type" column="type"/>
+        <result property="answerQuestion" column="answer_question"/>
+        <result property="status" column="status"/>
+        <result property="analysisContent" column="analysis_content"/>
+        <result property="imgUrl" column="img_url"/>
+        <result property="jsonStr" column="json_str"/>
+        <result property="prefixName" column="prefix_name"/>
+        <result property="knowledgeIds" column="knowledge_ids"/>
+        <result property="publishStatus" column="publish_status"/>
+        <result property="code" column="code"/>
+        <result property="moduleExamId" column="module_exam_id"/>
+        <result property="chapterExamId" column="chapter_exam_id"/>
+        <result property="subjectId" column="subject_id"/>
+    </resultMap>
+
+
+
+    <select id="selectList" parameterType="com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo" resultMap="UserMockWrongRecordVoResult">
+        SELECT
+        e.exam_name,
+        e.exam_id,
+        COUNT( DISTINCT uew.question_id ) AS wrong_question_num
+        FROM
+        user_exam_wrong_record uew
+        LEFT JOIN exam e ON uew.exam_id = e.exam_id
+        LEFT JOIN exam_paper ep ON ep.paper_id = e.exam_paper_id
+        WHERE
+        uew.user_id = #{userId}
+        <if test="paperId != null and paperId != ''">
+            AND e.exam_paper_id = #{paperId}
+        </if>
+        GROUP BY
+        e.exam_id
+        ORDER BY
+        e.create_time desc
+    </select>
+
+    <select id="selectQuestionList" parameterType="com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo" resultMap="UserMockWrongRecordVoResult">
+        SELECT DISTINCT
+        q.*,
+        uew.exam_id
+        FROM
+        user_exam_wrong_record uew
+        LEFT JOIN question q ON q.question_id = uew.question_id
+        WHERE
+        uew.user_id = #{userId}
+        <if test="type != null and type != ''">
+            AND q.type = #{type}
+        </if>
+        <if test="examId != null and examId != ''">
+            AND uew.exam_id = #{examId}
+        </if>
+        <if test="recordId != null and recordId != ''">
+            AND uew.record_id = #{recordId}
+        </if>
+    </select>
+
+    <select id="selectTypeNum" parameterType="com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo"  resultMap="UserMockWrongRecordVoResult">
+        SELECT
+            q.type,
+            count(DISTINCT q.question_id ) AS num
+        FROM
+                ( SELECT ue.* FROM user_exam_wrong_record ue
+        LEFT JOIN exam e ON ue.exam_id = e.exam_id
+        LEFT JOIN exam_paper ep ON ep.paper_id = e.exam_paper_id
+                WHERE user_id = #{userId}
+        <if test="paperId != null and paperId != ''">
+            AND e.exam_paper_id = #{paperId}
+        </if>) uew
+                    LEFT JOIN question q ON uew.question_id = q.question_id
+        GROUP BY
+            q.type
+    </select>
+
+    <select id="selectTypeQuestionList" parameterType="com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo"  resultMap="UserMockWrongRecordVoResult">
+        SELECT DISTINCT
+        q.*,
+        uew.exam_id
+        FROM
+        user_exam_wrong_record uew
+        LEFT JOIN question q ON uew.question_id = q.question_id
+        WHERE
+        1 = 1
+        AND uew.user_id =  #{userId}
+        <if test="type != null and type != ''">
+            AND q.type = #{type}
+        </if>
+    </select>
+
+    <select id="recordNum" parameterType="com.zhongzheng.modules.user.bo.UserMockWrongRecordQueryBo"  resultType="Long">
+        SELECT
+        IFNULL(SUM( uewr.num ),0)
+        FROM
+        (
+        SELECT
+        exam_id,
+        count( DISTINCT question_id ) AS num
+        FROM
+        user_exam_wrong_record
+        WHERE
+        1 = 1
+        AND user_id = #{userId}
+        <if test="recordId != null and recordId != ''">
+            AND record_id = #{recordId}
+        </if>
+        GROUP BY
+        exam_id
+        ) uewr
+    </select>
+</mapper>