瀏覽代碼

3.4.4 update-20250224,表结构调整

xiaofei 3 月之前
父節點
當前提交
4aff8df1fa
共有 36 個文件被更改,包括 819 次插入147 次删除
  1. 62 0
      distributed-print/install/mysql/upgrade/3.4.4.sql
  2. 0 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java
  3. 5 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserGroupController.java
  4. 82 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java
  5. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ScorePolicy.java
  6. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupDto.java
  7. 11 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArbitrateHistory.java
  8. 1 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java
  9. 173 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkHeaderHistory.java
  10. 18 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java
  11. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkProblemHistory.java
  12. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkRejectHistory.java
  13. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkSubjectiveScore.java
  14. 61 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java
  15. 83 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserPaper.java
  16. 25 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserQuestion.java
  17. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkHeaderHistoryMapper.java
  18. 3 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserGroupMapper.java
  19. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserPaperMapper.java
  20. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkHeaderHistoryService.java
  21. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  22. 3 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSyncService.java
  23. 7 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserGroupService.java
  24. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserPaperService.java
  25. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java
  26. 12 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java
  27. 20 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderHistoryServiceImpl.java
  28. 16 17
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  29. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSyncServiceImpl.java
  30. 2 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  31. 63 63
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserGroupServiceImpl.java
  32. 20 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserPaperServiceImpl.java
  33. 22 0
      teachcloud-mark/src/main/resources/mapper/MarkHeaderHistoryMapper.xml
  34. 1 1
      teachcloud-mark/src/main/resources/mapper/MarkUserGroupMapper.xml
  35. 14 0
      teachcloud-mark/src/main/resources/mapper/MarkUserPaperMapper.xml
  36. 3 3
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

+ 62 - 0
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -20,3 +20,65 @@ ALTER TABLE `sys_user_role` ADD INDEX `idx_1` (`role_id` ASC, `user_id` ASC);
 ALTER TABLE `t_f_flow_log` DROP INDEX `flow_log_idx` , ADD INDEX `flow_log_idx` USING BTREE (`flow_id`);
 ALTER TABLE `exam_task` ADD INDEX `idx_1` (`flow_id` ASC);
 
+-- 2025-02-21
+ALTER TABLE `mark_paper`
+    ADD COLUMN `merge_marker` TINYINT(1) NULL COMMENT '填空题是否合并设置评卷员' AFTER `double_mark`,
+CHANGE COLUMN `open_double_marking` `double_mark` TINYINT(1) NULL DEFAULT '0' COMMENT '是否开启双评:true-开启,false-关闭' ;
+
+ALTER TABLE `mark_question`
+    ADD COLUMN `pic_list` MEDIUMTEXT NULL COMMENT '评卷区坐标' AFTER `update_time`,
+    ADD COLUMN `double_rate` DOUBLE NULL COMMENT '双评比例' AFTER `pic_list`,
+    ADD COLUMN `arbitrate_threshold` DOUBLE NULL COMMENT '仲裁阈值' AFTER `double_rate`,
+    ADD COLUMN `score_policy` VARCHAR(10) NULL COMMENT '合分策略' AFTER `arbitrate_threshold`,
+    ADD COLUMN `task_count` INT NULL COMMENT '任务总量' AFTER `score_policy`,
+    ADD COLUMN `marked_count` INT NULL COMMENT '已评数量' AFTER `task_count`,
+    ADD COLUMN `left_count` INT NULL COMMENT '剩余数量' AFTER `marked_count`;
+
+ALTER TABLE `mark_user_group`
+    ADD COLUMN `question_id` BIGINT(20) NULL COMMENT '题目ID' AFTER `paper_number`,
+ADD COLUMN `enable` TINYINT(1) NULL DEFAULT 1 COMMENT '是否启用' AFTER `reject_count`, RENAME TO  `mark_user_question` ;
+
+ALTER TABLE `mark_task`
+    ADD COLUMN `question_id` BIGINT(1) NULL COMMENT '题目ID' AFTER `paper_number`,
+ADD COLUMN `marker_track_list` MEDIUMTEXT NULL COMMENT '评卷分数轨迹' AFTER `marker_score_list`,
+ADD COLUMN `marker_tag_list` MEDIUMTEXT NULL COMMENT '评卷特殊标记' AFTER `marker_track_list`,
+ADD COLUMN `header_track_list` MEDIUMTEXT NULL COMMENT '复核轨迹' AFTER `header_score_list`,
+ADD COLUMN `header_tag_list` MEDIUMTEXT NULL COMMENT '复核特殊标记' AFTER `header_track_list`;
+
+ALTER TABLE `mark_subjective_score`
+    ADD COLUMN `question_id` BIGINT(20) NULL COMMENT '题目ID' AFTER `paper_number`;
+
+CREATE TABLE `mark_user_paper` (
+      `id` BIGINT(20) NOT NULL,
+      `exam_id` BIGINT(20) NULL,
+      `paper_number` VARCHAR(100) NULL,
+      `user_id` BIGINT(20) NULL COMMENT '用户ID',
+      `question_model` VARCHAR(10) NULL COMMENT '评卷模式(SINGLE:单题阅,MULTI:多题阅)',
+      PRIMARY KEY (`id`))
+    COMMENT = '试卷评卷员设置';
+
+ALTER TABLE `mark_problem_history`
+    ADD COLUMN `question_id` BIGINT(20) NULL COMMENT '题目ID' AFTER `paper_number`;
+
+ALTER TABLE `mark_arbitrate_history`
+    ADD COLUMN `question_id` BIGINT(20) NULL COMMENT '题目ID' AFTER `paper_number`;
+
+ALTER TABLE `mark_reject_history`
+    ADD COLUMN `question_id` BIGINT(20) NULL COMMENT '题目ID' AFTER `paper_number`;
+
+CREATE TABLE `mark_header_history` (
+          `id` BIGINT(20) NOT NULL,
+          `exam_id` BIGINT(20) NULL COMMENT '考试ID',
+          `paper_number` VARCHAR(100) NULL COMMENT '试卷编号',
+          `student_id` BIGINT(20) NULL COMMENT '考生ID',
+          `question_id` BIGINT(20) NULL COMMENT '题目ID',
+          `main_number` INT NULL COMMENT '大题号',
+          `sub_number` INT NULL COMMENT '小题号',
+          `user_id` BIGINT(20) NULL COMMENT '用户ID',
+          `score` DOUBLE NULL COMMENT '分数',
+          `track_list` MEDIUMTEXT NULL COMMENT '轨迹',
+          `original_score` DOUBLE NULL COMMENT '原分数',
+          `original_track_list` MEDIUMTEXT NULL COMMENT '原轨迹',
+          `create_time` BIGINT(20) NULL COMMENT '创建时间',
+          PRIMARY KEY (`id`))
+    COMMENT = '复核历史表';

+ 0 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java

@@ -8,7 +8,6 @@ import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.service.MarkService;
 import com.qmth.teachcloud.mark.service.MarkUserGroupService;

+ 5 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserGroupController.java

@@ -10,7 +10,7 @@ import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.service.MarkUserGroupService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -90,7 +90,7 @@ public class MarkUserGroupController extends BaseController {
     @RequestMapping(value = "/reset", method = RequestMethod.POST)
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "重置评卷员操作,用户分组ID:{{markUserGroupId}}")
     public Result resetMarker(@ApiParam(value = "用户分组ID", required = true) @RequestParam Long markUserGroupId) {
-        MarkUserGroup markUserGroup = markUserGroupService.getById(markUserGroupId);
+        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupId);
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
@@ -105,7 +105,7 @@ public class MarkUserGroupController extends BaseController {
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "解绑评卷员操作,用户分组ID:{{markUserGroupId}}")
     public Result deleteMarker(@ApiParam(value = "用户分组ID", required = true) @RequestParam Long markUserGroupId) {
-        MarkUserGroup markUserGroup = markUserGroupService.getById(markUserGroupId);
+        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupId);
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
@@ -121,7 +121,7 @@ public class MarkUserGroupController extends BaseController {
     @RequestMapping(value = "/release", method = RequestMethod.POST)
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "回收正在评卷的试卷操作,用户分组ID集合:{{markUserGroupIds}}")
     public Result releaseMarker(@ApiParam(value = "用户分组ID集合", required = true) @RequestParam List<Long> markUserGroupIds) {
-        MarkUserGroup markUserGroup = markUserGroupService.getById(markUserGroupIds.get(0));
+        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupIds.get(0));
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
@@ -138,7 +138,7 @@ public class MarkUserGroupController extends BaseController {
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "设置评卷任务操作,用户分组ID集合:{{markUserGroupIds}}、评卷任务数:{{topCount}}")
     public Result setTaskCount(@ApiParam(value = "用户分组ID集合", required = true) @RequestParam List<Long> markUserGroupIds,
                                @ApiParam(value = "评卷任务数", required = true) @RequestParam Integer topCount) {
-        MarkUserGroup markUserGroup = markUserGroupService.getById(markUserGroupIds.get(0));
+        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupIds.get(0));
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }

+ 82 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java

@@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.enums.ObjectivePolicy;
 
+import com.qmth.teachcloud.common.enums.ScorePolicy;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -86,6 +87,30 @@ public class MarkQuestion extends BaseEntity implements Serializable {
 
     private String name;
 
+    @ApiModelProperty(value = "小图配置")
+    private String picList;
+
+    @ApiModelProperty(value = "双评比例")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Double doubleRate;
+
+    @ApiModelProperty(value = "仲裁阈值")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Double arbitrateThreshold;
+
+    @ApiModelProperty(value = "合分策略")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private ScorePolicy scorePolicy;
+
+    @ApiModelProperty(value = "任务总量")
+    private Integer taskCount;
+
+    @ApiModelProperty(value = "已评数量")
+    private Integer markedCount;
+
+    @ApiModelProperty(value = "剩余数量")
+    private Integer leftCount;
+
     public Long getExamId() {
         return examId;
     }
@@ -216,7 +241,63 @@ public class MarkQuestion extends BaseEntity implements Serializable {
 		this.pageIndex = pageIndex;
 	}
 
-	@Override
+    public String getPicList() {
+        return picList;
+    }
+
+    public void setPicList(String picList) {
+        this.picList = picList;
+    }
+
+    public Double getDoubleRate() {
+        return doubleRate;
+    }
+
+    public void setDoubleRate(Double doubleRate) {
+        this.doubleRate = doubleRate;
+    }
+
+    public Double getArbitrateThreshold() {
+        return arbitrateThreshold;
+    }
+
+    public void setArbitrateThreshold(Double arbitrateThreshold) {
+        this.arbitrateThreshold = arbitrateThreshold;
+    }
+
+    public ScorePolicy getScorePolicy() {
+        return scorePolicy;
+    }
+
+    public void setScorePolicy(ScorePolicy scorePolicy) {
+        this.scorePolicy = scorePolicy;
+    }
+
+    public Integer getTaskCount() {
+        return taskCount;
+    }
+
+    public void setTaskCount(Integer taskCount) {
+        this.taskCount = taskCount;
+    }
+
+    public Integer getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Integer markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public Integer getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(Integer leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    @Override
     public String toString() {
         return "MarkQuestion{" +
             ", examId=" + examId +

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/ScorePolicy.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ScorePolicy.java

@@ -1,4 +1,4 @@
-package com.qmth.teachcloud.mark.enums;
+package com.qmth.teachcloud.common.enums;
 
 /**
  * 多评情况下的合分策略

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupDto.java

@@ -3,7 +3,7 @@ package com.qmth.teachcloud.mark.dto.mark.setting;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
 import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.mark.enums.ScorePolicy;
+import com.qmth.teachcloud.common.enums.ScorePolicy;
 
 import java.util.List;
 

+ 11 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArbitrateHistory.java

@@ -43,6 +43,9 @@ public class MarkArbitrateHistory implements Serializable {
     @ApiModelProperty(value = "大题号")
     private Integer groupNumber;
 
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
     @ApiModelProperty(value = "准考证号")
     private String studentCode;
 
@@ -104,6 +107,14 @@ public class MarkArbitrateHistory implements Serializable {
         this.groupNumber = groupNumber;
     }
 
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
     public String getStudentCode() {
         return studentCode;
     }

+ 1 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java

@@ -2,7 +2,6 @@ package com.qmth.teachcloud.mark.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
@@ -10,7 +9,7 @@ import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.bean.mark.MarkConfigItem;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
-import com.qmth.teachcloud.mark.enums.ScorePolicy;
+import com.qmth.teachcloud.common.enums.ScorePolicy;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.StringUtils;

+ 173 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkHeaderHistory.java

@@ -0,0 +1,173 @@
+package com.qmth.teachcloud.mark.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 复核历史表
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+@TableName("mark_header_history")
+@ApiModel(value="MarkHeaderHistory对象", description="复核历史表")
+public class MarkHeaderHistory implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty(value = "考试ID")
+    private Long examId;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "考生ID")
+    private Long studentId;
+
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
+    @ApiModelProperty(value = "大题号")
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "小题号")
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long userId;
+
+    @ApiModelProperty(value = "分数")
+    private Double score;
+
+    @ApiModelProperty(value = "轨迹")
+    private String trackList;
+
+    @ApiModelProperty(value = "原分数")
+    private Double originalScore;
+
+    @ApiModelProperty(value = "原轨迹")
+    private String originalTrackList;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+    public String getTrackList() {
+        return trackList;
+    }
+
+    public void setTrackList(String trackList) {
+        this.trackList = trackList;
+    }
+    public Double getOriginalScore() {
+        return originalScore;
+    }
+
+    public void setOriginalScore(Double originalScore) {
+        this.originalScore = originalScore;
+    }
+    public String getOriginalTrackList() {
+        return originalTrackList;
+    }
+
+    public void setOriginalTrackList(String originalTrackList) {
+        this.originalTrackList = originalTrackList;
+    }
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String toString() {
+        return "MarkHeaderHistory{" +
+            "id=" + id +
+            ", examId=" + examId +
+            ", paperNumber=" + paperNumber +
+            ", studentId=" + studentId +
+            ", questionId=" + questionId +
+            ", mainNumber=" + mainNumber +
+            ", subNumber=" + subNumber +
+            ", userId=" + userId +
+            ", score=" + score +
+            ", trackList=" + trackList +
+            ", originalScore=" + originalScore +
+            ", originalTrackList=" + originalTrackList +
+            ", createTime=" + createTime +
+        "}";
+    }
+}

+ 18 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java

@@ -125,7 +125,10 @@ public class MarkPaper implements Serializable {
     private Boolean openMarkClass;
 
     @ApiModelProperty(value = "是否开启双评")
-    private Boolean openDoubleMarking;
+    private Boolean doubleMark;
+
+    @ApiModelProperty(value = "填空题是否合并设置评卷员")
+    private Boolean mergeMarker;
 
     private MarkPaperStatus status;
     @ApiModelProperty(value = "命题老师ID")
@@ -162,7 +165,8 @@ public class MarkPaper implements Serializable {
         this.questionStatus = false;
         this.groupStatus = false;
         this.openMarkClass = false;
-        this.openDoubleMarking = false;
+        this.doubleMark = false;
+        this.mergeMarker = true;
         this.status = MarkPaperStatus.FORMAL;
         this.passScore = 60D;
         this.excellentScore = 80D;
@@ -420,12 +424,20 @@ public class MarkPaper implements Serializable {
         this.openMarkClass = openMarkClass;
     }
 
-    public Boolean getOpenDoubleMarking() {
-        return openDoubleMarking;
+    public Boolean getDoubleMark() {
+        return doubleMark;
+    }
+
+    public void setDoubleMark(Boolean doubleMark) {
+        this.doubleMark = doubleMark;
+    }
+
+    public Boolean getMergeMarker() {
+        return mergeMarker;
     }
 
-    public void setOpenDoubleMarking(Boolean openDoubleMarking) {
-        this.openDoubleMarking = openDoubleMarking;
+    public void setMergeMarker(Boolean mergeMarker) {
+        this.mergeMarker = mergeMarker;
     }
 
     public MarkPaperStatus getStatus() {

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkProblemHistory.java

@@ -41,6 +41,9 @@ public class MarkProblemHistory implements Serializable {
     @ApiModelProperty(value = "大题号")
     private Integer groupNumber;
 
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
     @ApiModelProperty(value = "学号")
     private String studentCode;
 
@@ -109,6 +112,15 @@ public class MarkProblemHistory implements Serializable {
     public void setGroupNumber(Integer groupNumber) {
         this.groupNumber = groupNumber;
     }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
     public String getStudentCode() {
         return studentCode;
     }

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkRejectHistory.java

@@ -40,6 +40,9 @@ public class MarkRejectHistory implements Serializable {
     @ApiModelProperty(value = "分组号")
     private Integer groupNumber;
 
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "任务ID")
     private Long taskId;
@@ -130,6 +133,15 @@ public class MarkRejectHistory implements Serializable {
     public void setGroupNumber(Integer groupNumber) {
         this.groupNumber = groupNumber;
     }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
     public Long getTaskId() {
         return taskId;
     }

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkSubjectiveScore.java

@@ -47,6 +47,9 @@ public class MarkSubjectiveScore implements Serializable {
     @ApiModelProperty(value = "分组序号")
     private Integer groupNumber;
 
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
     @ApiModelProperty(value = "分组得分")
     private Double groupScore;
 
@@ -104,6 +107,15 @@ public class MarkSubjectiveScore implements Serializable {
     public void setGroupNumber(Integer groupNumber) {
         this.groupNumber = groupNumber;
     }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
     public Double getGroupScore() {
         return groupScore;
     }

+ 61 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java

@@ -47,9 +47,12 @@ public class MarkTask implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
-    @ApiModelProperty(value = "大题号")
+    @ApiModelProperty(value = "分组号")
     private Integer groupNumber;
 
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "考生ID")
     private Long studentId;
@@ -86,6 +89,14 @@ public class MarkTask implements Serializable {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String markerScoreList;
 
+    @ApiModelProperty(value = "评卷分数轨迹")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String markerTrackList;
+
+    @ApiModelProperty(value = "评卷特殊标记")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String markerTagList;
+
     @ApiModelProperty(value = "评卷时长")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer markerSpent;
@@ -107,10 +118,19 @@ public class MarkTask implements Serializable {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String headerScoreList;
 
+    @ApiModelProperty(value = "复核轨迹")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String headerTrackList;
+
+    @ApiModelProperty(value = "复核特殊标记")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String headerTagList;
+
     @ApiModelProperty(value = "打回原因")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String rejectReason;
 
+
     public Long getId() {
         return id;
     }
@@ -280,6 +300,46 @@ public class MarkTask implements Serializable {
         this.rejectReason = rejectReason;
     }
 
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
+    public String getMarkerTrackList() {
+        return markerTrackList;
+    }
+
+    public void setMarkerTrackList(String markerTrackList) {
+        this.markerTrackList = markerTrackList;
+    }
+
+    public String getMarkerTagList() {
+        return markerTagList;
+    }
+
+    public void setMarkerTagList(String markerTagList) {
+        this.markerTagList = markerTagList;
+    }
+
+    public String getHeaderTrackList() {
+        return headerTrackList;
+    }
+
+    public void setHeaderTrackList(String headerTrackList) {
+        this.headerTrackList = headerTrackList;
+    }
+
+    public String getHeaderTagList() {
+        return headerTagList;
+    }
+
+    public void setHeaderTagList(String headerTagList) {
+        this.headerTagList = headerTagList;
+    }
+
     public List<ScoreItem> getScoreList() {
         List<ScoreItem> list = new LinkedList<ScoreItem>();
         String scoreList = null;

+ 83 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserPaper.java

@@ -0,0 +1,83 @@
+package com.qmth.teachcloud.mark.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 试卷评卷员设置
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+@TableName("mark_user_paper")
+@ApiModel(value="MarkUserPaper对象", description="试卷评卷员设置")
+public class MarkUserPaper implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    private Long examId;
+
+    private String paperNumber;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long userId;
+
+    @ApiModelProperty(value = "评卷模式(SINGLE:单题阅,MULTI:多题阅)")
+    private String questionModel;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    public String getQuestionModel() {
+        return questionModel;
+    }
+
+    public void setQuestionModel(String questionModel) {
+        this.questionModel = questionModel;
+    }
+
+    @Override
+    public String toString() {
+        return "MarkUserPaper{" +
+            "id=" + id +
+            ", examId=" + examId +
+            ", paperNumber=" + paperNumber +
+            ", userId=" + userId +
+            ", questionModel=" + questionModel +
+        "}";
+    }
+}

+ 25 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserGroup.java → teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserQuestion.java

@@ -21,7 +21,7 @@ import io.swagger.annotations.ApiModelProperty;
  */
 @TableName("mark_user_group")
 @ApiModel(value="MarkUserGroup对象", description="评卷员表")
-public class MarkUserGroup implements Serializable {
+public class MarkUserQuestion implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -40,6 +40,9 @@ public class MarkUserGroup implements Serializable {
     @ApiModelProperty(value = "分组编号")
     private Integer groupNumber;
 
+    @ApiModelProperty(value = "题目ID")
+    private Long questionId;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "用户ID")
     private Long userId;
@@ -82,10 +85,13 @@ public class MarkUserGroup implements Serializable {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer rejectCount;
 
-    public MarkUserGroup() {
+    @ApiModelProperty(value = "是否启用")
+    private Boolean enable;
+
+    public MarkUserQuestion() {
     }
 
-    public MarkUserGroup(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+    public MarkUserQuestion(Long examId, String paperNumber, Integer groupNumber, Long userId) {
         this.id = SystemConstant.getDbUuid();
         this.examId = examId;
         this.paperNumber = paperNumber;
@@ -118,6 +124,14 @@ public class MarkUserGroup implements Serializable {
         return groupNumber;
     }
 
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
     public void setGroupNumber(Integer groupNumber) {
         this.groupNumber = groupNumber;
     }
@@ -213,6 +227,14 @@ public class MarkUserGroup implements Serializable {
         this.rejectCount = rejectCount;
     }
 
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
     @Override
     public String toString() {
         return "MarkUserGroup{" +

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkHeaderHistoryMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.mapper;
+
+import com.qmth.teachcloud.mark.entity.MarkHeaderHistory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 复核历史表 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+public interface MarkHeaderHistoryMapper extends BaseMapper<MarkHeaderHistory> {
+
+}

+ 3 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserGroupMapper.java

@@ -2,12 +2,11 @@ package com.qmth.teachcloud.mark.mapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -21,9 +20,9 @@ import java.util.List;
  * @author xf
  * @since 2023-09-22
  */
-public interface MarkUserGroupMapper extends BaseMapper<MarkUserGroup> {
+public interface MarkUserGroupMapper extends BaseMapper<MarkUserQuestion> {
 
-    IPage<MarkEntranceDto> listEntranceGroup(@Param("page") Page<MarkUserGroup> page, @Param("examId") Long examId, @Param("openCollegeId") Long openCollegeId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("status") String status);
+    IPage<MarkEntranceDto> listEntranceGroup(@Param("page") Page<MarkUserQuestion> page, @Param("examId") Long examId, @Param("openCollegeId") Long openCollegeId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("status") String status);
 
     List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("className") String className);
 

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserPaperMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.mapper;
+
+import com.qmth.teachcloud.mark.entity.MarkUserPaper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 试卷评卷员设置 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+public interface MarkUserPaperMapper extends BaseMapper<MarkUserPaper> {
+
+}

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkHeaderHistoryService.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.service;
+
+import com.qmth.teachcloud.mark.entity.MarkHeaderHistory;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 复核历史表 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+public interface MarkHeaderHistoryService extends IService<MarkHeaderHistory> {
+
+}

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java

@@ -26,15 +26,15 @@ public interface MarkService {
      * @param submitResult  评卷结果
      * @param markUserGroup 评卷员
      */
-    void releaseTask(SubmitResult submitResult, MarkUserGroup markUserGroup);
+    void releaseTask(SubmitResult submitResult, MarkUserQuestion markUserGroup);
 
     int applyCurrentCount(MarkGroup markGroup);
 
-    void releaseByMarkUserGroup(MarkUserGroup markUserGroup);
+    void releaseByMarkUserGroup(MarkUserQuestion markUserGroup);
 
     int applyCurrentCount(MarkGroup markGroup, Long markUserGroupId);
 
-    void resetMarker(MarkUserGroup markUserGroup);
+    void resetMarker(MarkUserQuestion markUserGroup);
 
     void updateMarkedCount(Long examId, String paperNumber, Integer groupNumber);
 
@@ -42,9 +42,9 @@ public interface MarkService {
 
     String getGroupKey(MarkGroup markGroup);
 
-    void updateQuality(MarkUserGroup markUserGroup);
+    void updateQuality(MarkUserQuestion markUserGroup);
 
-    boolean needUpdateQuality(MarkUserGroup marker, int expireMinutes);
+    boolean needUpdateQuality(MarkUserQuestion marker, int expireMinutes);
 
     void processArbitrate(MarkResult markResult, Long userId);
 

+ 3 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSyncService.java

@@ -2,7 +2,7 @@ package com.qmth.teachcloud.mark.service;
 
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -12,9 +12,9 @@ public interface MarkSyncService {
 
     public static Logger log = LoggerFactory.getLogger(MarkSyncService.class);
 
-    void markerResetSync(MarkUserGroup markUserGroup);
+    void markerResetSync(MarkUserQuestion markUserGroup);
 
-    void updateQuality(List<MarkUserGroup> markUserGroups, String lockKey);
+    void updateQuality(List<MarkUserQuestion> markUserGroups, String lockKey);
 
     void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo);
 

+ 7 - 7
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserGroupService.java

@@ -8,7 +8,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityChartDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
@@ -21,7 +21,7 @@ import java.util.List;
  * @author xf
  * @since 2023-09-22
  */
-public interface MarkUserGroupService extends IService<MarkUserGroup> {
+public interface MarkUserGroupService extends IService<MarkUserQuestion> {
 
     IPage<MarkEntranceDto> listEntranceGroup(Long examId, Long openCollegeId, Long courseCode, String paperNumber,
             Integer pageNumber, Integer pageSize);
@@ -36,14 +36,14 @@ public interface MarkUserGroupService extends IService<MarkUserGroup> {
 
     void setTopCount(List<Long> markUserGroupIds, Integer topCount);
 
-    MarkUserGroup getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber,
-            Long userId);
+    MarkUserQuestion getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber,
+                                                                      Long userId);
 
     void deleteMarker(Long markUserGroupId);
 
     void releaseMarker(List<Long> markUserGroupIds);
 
-    boolean resetMarker(MarkUserGroup markUserGroup);
+    boolean resetMarker(MarkUserQuestion markUserGroup);
 
     void resetById(Long id);
 
@@ -51,14 +51,14 @@ public interface MarkUserGroupService extends IService<MarkUserGroup> {
 
     void updateQuality(Long examId, String paperNumber, Integer groupNumber);
 
-    List<MarkUserGroup> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    List<MarkUserQuestion> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 
     void updateQualityById(Long markUserGroupId, int finishCount, int headerFinishCount, int validCount, double v,
             double avgScore, double stdevScore, double maxScore, double minScore);
 
     List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Integer groupNumber);
 
-    List<MarkUserGroup> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
+    List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
 
     void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserPaperService.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.service;
+
+import com.qmth.teachcloud.mark.entity.MarkUserPaper;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 试卷评卷员设置 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+public interface MarkUserPaperService extends IService<MarkUserPaper> {
+
+}

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java

@@ -105,7 +105,7 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
         List<MarkArbitrateMarkerDto> markArbitrateMarkerDtoList = new ArrayList<>();
         for (MarkTask markTask : markTaskList) {
             MarkArbitrateMarkerDto markArbitrateMarkerDto = new MarkArbitrateMarkerDto();
-            MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(markTask.getExamId(), markTask.getPaperNumber(), markTask.getGroupNumber(), markTask.getUserId());
+            MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(markTask.getExamId(), markTask.getPaperNumber(), markTask.getGroupNumber(), markTask.getUserId());
             if (markUserGroup != null) {
                 markArbitrateMarkerDto.setUserId(markTask.getUserId());
                 SysUser sysUser = sysUserService.getById(markTask.getUserId());

+ 12 - 15
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java

@@ -11,7 +11,6 @@ import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
 import com.qmth.teachcloud.common.bean.params.mark.group.GroupPictureConfigParams;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.mark.bean.answercard.CardFile;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupDto;
@@ -20,14 +19,13 @@ import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkTask;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
-import com.qmth.teachcloud.mark.enums.ScorePolicy;
+import com.qmth.teachcloud.common.enums.ScorePolicy;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkGroupMapper;
 import com.qmth.teachcloud.mark.service.*;
-import com.qmth.teachcloud.mark.utils.BigDecimalUtils;
 import com.qmth.teachcloud.mark.utils.Calculator;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -35,7 +33,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -105,7 +102,7 @@ public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGr
         // 分班阅参数
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
         markGroupTaskDto.setOpenMarkClass(markPaper != null && markPaper.getOpenMarkClass());
-        markGroupTaskDto.setOpenDoubleMarking(markPaper != null && markPaper.getOpenDoubleMarking());
+        markGroupTaskDto.setOpenDoubleMarking(markPaper != null && markPaper.getDoubleMark());
         return markGroupTaskDto;
     }
 
@@ -236,7 +233,7 @@ public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGr
                 List<MarkUser> markUserList = markUserClassService.listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, groupNumber, markGroupClassProgressDto.getClassName());
                 int count = 0;
                 for (MarkUser markUser : markUserList) {
-                    MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, markUser.getUserId());
+                    MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, markUser.getUserId());
                     if (markUserGroup != null) {
                         int markerCount = markService.applyCurrentCount(markGroup, markUserGroup.getId());
                         count += markerCount;
@@ -336,17 +333,17 @@ public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGr
         if (CollectionUtils.isEmpty(markers)) {
             throw ExceptionResultEnum.ERROR.exception("请选择评卷员");
         }
-        List<MarkUserGroup> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
+        List<MarkUserQuestion> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
         List<Long> userIds = new ArrayList<>();
         if (CollectionUtils.isNotEmpty(markUserGroupList)) {
-            userIds = markUserGroupList.stream().map(MarkUserGroup::getUserId).collect(Collectors.toList());
+            userIds = markUserGroupList.stream().map(MarkUserQuestion::getUserId).collect(Collectors.toList());
         }
-        List<MarkUserGroup> markUserGroups = new ArrayList<>();
+        List<MarkUserQuestion> markUserGroups = new ArrayList<>();
         for (MarkUser marker : markGroupDto.getMarkers()) {
             if (userIds.contains(marker.getUserId())) {
                 continue;
             }
-            markUserGroups.add(new MarkUserGroup(examId, paperNumber, markGroupDto.getGroupNumber(), marker.getUserId()));
+            markUserGroups.add(new MarkUserQuestion(examId, paperNumber, markGroupDto.getGroupNumber(), marker.getUserId()));
         }
         if (CollectionUtils.isNotEmpty(markUserGroups)) {
             markUserGroupService.saveBatch(markUserGroups);
@@ -431,11 +428,11 @@ public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGr
         if (CollectionUtils.isEmpty(markUserList)) {
             throw ExceptionResultEnum.ERROR.exception("请选择评卷员");
         }
-        List<MarkUserGroup> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
+        List<MarkUserQuestion> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
         if (CollectionUtils.isEmpty(markUserGroupList)) {
             markUserGroupList = new ArrayList<>();
         }
-        List<Long> oldUserIds = markUserGroupList.stream().map(MarkUserGroup::getUserId).collect(Collectors.toList());
+        List<Long> oldUserIds = markUserGroupList.stream().map(MarkUserQuestion::getUserId).collect(Collectors.toList());
         List<Long> userIds = markUserList.stream().map(MarkUser::getUserId).collect(Collectors.toList());
 
         // 需要删除的用户
@@ -447,10 +444,10 @@ public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGr
         }
 
         // 需要新增的用户
-        List<MarkUserGroup> markUserGroups = new ArrayList<>();
+        List<MarkUserQuestion> markUserGroups = new ArrayList<>();
         Collection<Long> addUserIds = CollectionUtils.subtract(userIds, oldUserIds);
         for (Long addUserId : addUserIds) {
-            markUserGroups.add(new MarkUserGroup(examId, paperNumber, markGroupDto.getGroupNumber(), addUserId));
+            markUserGroups.add(new MarkUserQuestion(examId, paperNumber, markGroupDto.getGroupNumber(), addUserId));
         }
         if (CollectionUtils.isNotEmpty(markUserGroups)) {
             markUserGroupService.saveBatch(markUserGroups);

+ 20 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderHistoryServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.mark.service.impl;
+
+import com.qmth.teachcloud.mark.entity.MarkHeaderHistory;
+import com.qmth.teachcloud.mark.mapper.MarkHeaderHistoryMapper;
+import com.qmth.teachcloud.mark.service.MarkHeaderHistoryService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 复核历史表 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+@Service
+public class MarkHeaderHistoryServiceImpl extends ServiceImpl<MarkHeaderHistoryMapper, MarkHeaderHistory> implements MarkHeaderHistoryService {
+
+}

+ 16 - 17
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -15,7 +15,6 @@ import com.qmth.teachcloud.common.service.BasicOperationLogService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import com.qmth.teachcloud.mark.bean.archivescore.MarkStudentScoreVo;
 import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
@@ -27,7 +26,7 @@ import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.ExamType;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
-import com.qmth.teachcloud.mark.enums.ScorePolicy;
+import com.qmth.teachcloud.common.enums.ScorePolicy;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
@@ -130,7 +129,7 @@ public class MarkServiceImpl implements MarkService {
      * @param markUserGroup 评卷员
      */
     @Override
-    public void releaseTask(SubmitResult submitResult, MarkUserGroup markUserGroup) {
+    public void releaseTask(SubmitResult submitResult, MarkUserQuestion markUserGroup) {
         if (submitResult.getMarkLibrary() != null) {
             TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(markUserGroup));
             taskLock.remove(submitResult.getMarkLibrary().getStudentId(), submitResult.getMarkLibrary().getTaskNumber(),
@@ -170,7 +169,7 @@ public class MarkServiceImpl implements MarkService {
      * @param markUserGroup
      */
     @Override
-    public void releaseByMarkUserGroup(MarkUserGroup markUserGroup) {
+    public void releaseByMarkUserGroup(MarkUserQuestion markUserGroup) {
         TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(markUserGroup));
         taskLock.clear(markUserGroup.getId());
     }
@@ -186,7 +185,7 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public void resetMarker(MarkUserGroup markUserGroup) {
+    public void resetMarker(MarkUserQuestion markUserGroup) {
         Long examId = markUserGroup.getExamId();
         String paperNumber = markUserGroup.getPaperNumber();
         Integer groupNumber = markUserGroup.getGroupNumber();
@@ -269,7 +268,7 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public void updateQuality(MarkUserGroup markUserGroup) {
+    public void updateQuality(MarkUserQuestion markUserGroup) {
         List<MarkTask> list = markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(
                 markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber(),
                 markUserGroup.getUserId(), null);
@@ -327,7 +326,7 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public boolean needUpdateQuality(MarkUserGroup markUserGroup, int expireMinutes) {
+    public boolean needUpdateQuality(MarkUserQuestion markUserGroup, int expireMinutes) {
         if (markUserGroup == null) {
             return false;
         }
@@ -388,11 +387,11 @@ public class MarkServiceImpl implements MarkService {
                 markGroupService.getByExamIdAndPaperNumberAndGroupNumber(markArbitrateHistory.getExamId(),
                         markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber()));
         // 评卷质量重新统计
-        List<MarkUserGroup> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber());
+        List<MarkUserQuestion> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber());
         markUserGroups.forEach(m -> this.updateQuality(m));
     }
 
-    private String getGroupKey(MarkUserGroup markUserGroup) {
+    private String getGroupKey(MarkUserQuestion markUserGroup) {
         return markUserGroup.getExamId() + "_" + markUserGroup.getPaperNumber() + "_" + markUserGroup.getGroupNumber();
     }
 
@@ -775,7 +774,7 @@ public class MarkServiceImpl implements MarkService {
 
     @Override
     public MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber, Integer groupNumber) {
-        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
+        MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
                 paperNumber, groupNumber, user.getId());
         user = sysUserService.getById(user.getId());
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
@@ -839,10 +838,10 @@ public class MarkServiceImpl implements MarkService {
 
     @Override
     public List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber) {
-        List<MarkUserGroup> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndUserId(examId,
+        List<MarkUserQuestion> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndUserId(examId,
                 paperNumber, userId);
         List<MarkGroupDto> list = new ArrayList<MarkGroupDto>();
-        for (MarkUserGroup markUserGroup : markUserGroups) {
+        for (MarkUserQuestion markUserGroup : markUserGroups) {
             MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber,
                     markUserGroup.getGroupNumber());
             markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId,
@@ -864,7 +863,7 @@ public class MarkServiceImpl implements MarkService {
     public void clear(Long userId, Long examId, String paperNumber, Integer groupNumber) {
         String key = examId + "_" + paperNumber + "_" + groupNumber;
         TaskLock taskLock = TaskLockUtil.getFormalTask(key);
-        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
+        MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
                 paperNumber, groupNumber, userId);
         if (markUserGroup != null) {
             taskLock.clear(markUserGroup.getId());
@@ -1087,7 +1086,7 @@ public class MarkServiceImpl implements MarkService {
         if (group == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷大题不存在");
         }
-        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
+        MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
                 paperNumber, groupNumber, userId);
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷任务被重置,请点击右上角返回按钮,重新在评卷入口菜单点击评卷");
@@ -1187,7 +1186,7 @@ public class MarkServiceImpl implements MarkService {
 
     @Override
     public SubmitResult saveTask(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkResult result) {
-        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
+        MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
                 paperNumber, groupNumber, userId);
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员未绑定该评卷任务");
@@ -1224,7 +1223,7 @@ public class MarkServiceImpl implements MarkService {
         return sr;
     }
 
-    private SubmitResult submitResult(MarkUserGroup markUserGroup, MarkGroup group, Long userId, MarkResult result) {
+    private SubmitResult submitResult(MarkUserQuestion markUserGroup, MarkGroup group, Long userId, MarkResult result) {
 
         MarkTask task = markTaskService.getById(result.getTaskId());
         if (task != null && task.getExamId().equals(group.getExamId())
@@ -1282,7 +1281,7 @@ public class MarkServiceImpl implements MarkService {
     }
 
     private boolean submitTask(MarkTask task, Long userId, MarkGroup group, MarkResult result) {
-        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(
+        MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(
                 group.getExamId(), group.getPaperNumber(), group.getNumber(), userId);
         // 非本人领取的待评任务
         if ((task.getStatus() == MarkTaskStatus.WAITING || task.getStatus() == MarkTaskStatus.REJECTED)

+ 4 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSyncServiceImpl.java

@@ -2,7 +2,7 @@ package com.qmth.teachcloud.mark.service.impl;
 
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.service.MarkService;
@@ -29,7 +29,7 @@ public class MarkSyncServiceImpl implements MarkSyncService {
      */
     @Async
     @Override
-    public void markerResetSync(MarkUserGroup markUserGroup) {
+    public void markerResetSync(MarkUserQuestion markUserGroup) {
         try {
             if (markUserGroup != null) {
                 lockService.waitlock(LockType.EXAM_SUBJECT, markUserGroup.getExamId(), markUserGroup.getPaperNumber());
@@ -49,9 +49,9 @@ public class MarkSyncServiceImpl implements MarkSyncService {
 
     @Async
     @Override
-    public void updateQuality(List<MarkUserGroup> markUserGroups, String lockKey) {
+    public void updateQuality(List<MarkUserQuestion> markUserGroups, String lockKey) {
         if (CollectionUtils.isNotEmpty(markUserGroups)) {
-            for (MarkUserGroup markUserGroup : markUserGroups) {
+            for (MarkUserQuestion markUserGroup : markUserGroups) {
                 try {
                     markService.updateQuality(markUserGroup);
                 } catch (Exception e) {

+ 2 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java

@@ -17,9 +17,8 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDetailDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDto;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
-import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.MarkUserClass;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.mapper.MarkUserClassMapper;
 import com.qmth.teachcloud.mark.service.*;
 import org.apache.commons.collections4.CollectionUtils;
@@ -104,7 +103,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
             for (MarkGroup markGroup : markGroupList) {
                 markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber(), false));
                 Set<String> groupBindClassSet = new HashSet<>();
-                List<MarkUserGroup> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber());
+                List<MarkUserQuestion> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber());
                 for (MarkGroupClassUserParams groupUserClassInfo : markClassUserParams.getGroupMarkerClass()) {
                     if (markUserGroupList.stream().filter(m -> m.getUserId().equals(groupUserClassInfo.getMarker().getUserId())).count() > 0) {
                         groupBindClassSet.addAll(groupUserClassInfo.getMarkerClassList());

+ 63 - 63
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserGroupServiceImpl.java

@@ -44,7 +44,7 @@ import java.util.stream.Collectors;
  * @since 2023-09-22
  */
 @Service
-public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, MarkUserGroup> implements MarkUserGroupService {
+public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, MarkUserQuestion> implements MarkUserGroupService {
 
     @Resource
     private MarkQuestionService markQuestionService;
@@ -68,7 +68,7 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     @Override
     public IPage<MarkEntranceDto> listEntranceGroup(Long examId, Long openCollegeId, Long courseId, String paperNumber, Integer pageNumber, Integer pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        Page<MarkUserGroup> page = new Page<>(pageNumber, pageSize);
+        Page<MarkUserQuestion> page = new Page<>(pageNumber, pageSize);
         IPage<MarkEntranceDto> markEntranceDtoIPage = this.baseMapper.listEntranceGroup(page, examId, openCollegeId, courseId, paperNumber, sysUser.getId(), MarkPaperStatus.FORMAL.name());
         for (MarkEntranceDto record : markEntranceDtoIPage.getRecords()) {
             int taskCount = record.getTaskCount();
@@ -123,11 +123,11 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     @Override
     public void addMarkUserGroup(Long examId, String paperNumber, Integer groupNumber, List<Long> userIds) {
         if (CollectionUtils.isNotEmpty(userIds)) {
-            List<MarkUserGroup> markUserGroups = new ArrayList<>();
+            List<MarkUserQuestion> markUserGroups = new ArrayList<>();
             for (Long userId : userIds) {
-                MarkUserGroup markUserGroup = this.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
+                MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
                 if (markUserGroup == null) {
-                    markUserGroups.add(new MarkUserGroup(examId, paperNumber, groupNumber, userId));
+                    markUserGroups.add(new MarkUserQuestion(examId, paperNumber, groupNumber, userId));
                 }
             }
             if (CollectionUtils.isNotEmpty(markUserGroups)) {
@@ -139,7 +139,7 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     @Override
     public void setTopCount(List<Long> markUserGroupIds, Integer topCount) {
         for (Long markUserGroupId : markUserGroupIds) {
-            MarkUserGroup markUserGroup = this.getById(markUserGroupId);
+            MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
             if (markUserGroup != null) {
                 markUserGroup.setTopCount(topCount);
                 this.updateById(markUserGroup);
@@ -148,18 +148,18 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public MarkUserGroup getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
-        QueryWrapper<MarkUserGroup> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkUserGroup::getExamId, examId)
-                .eq(MarkUserGroup::getPaperNumber, paperNumber)
-                .eq(MarkUserGroup::getGroupNumber, groupNumber)
-                .eq(MarkUserGroup::getUserId, userId);
+    public MarkUserQuestion getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+        QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
+                .eq(MarkUserQuestion::getPaperNumber, paperNumber)
+                .eq(MarkUserQuestion::getGroupNumber, groupNumber)
+                .eq(MarkUserQuestion::getUserId, userId);
         return this.getOne(queryWrapper);
     }
 
     @Override
     public void deleteMarker(Long markUserGroupId) {
-        MarkUserGroup markUserGroup = this.getById(markUserGroupId);
+        MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
@@ -176,7 +176,7 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     @Override
     public void releaseMarker(List<Long> markUserGroupIds) {
         for (Long markUserGroupId : markUserGroupIds) {
-            MarkUserGroup markUserGroup = this.getById(markUserGroupId);
+            MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
             if (markUserGroup != null) {
                 try {
                     lockService.waitlock(LockType.MARK_USER_GROUP, markUserGroupId);
@@ -191,7 +191,7 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public boolean resetMarker(MarkUserGroup markUserGroup) {
+    public boolean resetMarker(MarkUserQuestion markUserGroup) {
         if (markUserGroup != null) {
             if (lockService.trylock(LockType.MARKER_RESET, markUserGroup.getId())) {
                 markSyncService.markerResetSync(markUserGroup);
@@ -205,16 +205,16 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
 
     @Override
     public void resetById(Long id) {
-        UpdateWrapper<MarkUserGroup> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkUserGroup::getFinishCount, null)
-                .set(MarkUserGroup::getHeaderFinishCount, null)
-                .set(MarkUserGroup::getValidCount, null)
-                .set(MarkUserGroup::getAvgScore, null)
-                .set(MarkUserGroup::getAvgSpeed, null)
-                .set(MarkUserGroup::getStdevScore, null)
-                .set(MarkUserGroup::getMaxScore, null)
-                .set(MarkUserGroup::getMinScore, null)
-                .eq(MarkUserGroup::getId, id);
+        UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkUserQuestion::getFinishCount, null)
+                .set(MarkUserQuestion::getHeaderFinishCount, null)
+                .set(MarkUserQuestion::getValidCount, null)
+                .set(MarkUserQuestion::getAvgScore, null)
+                .set(MarkUserQuestion::getAvgSpeed, null)
+                .set(MarkUserQuestion::getStdevScore, null)
+                .set(MarkUserQuestion::getMaxScore, null)
+                .set(MarkUserQuestion::getMinScore, null)
+                .eq(MarkUserQuestion::getId, id);
         this.update(updateWrapper);
     }
 
@@ -253,27 +253,27 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public List<MarkUserGroup> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        QueryWrapper<MarkUserGroup> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkUserGroup::getExamId, examId)
-                .eq(MarkUserGroup::getPaperNumber, paperNumber)
-                .eq(MarkUserGroup::getGroupNumber, groupNumber)
-                .orderByAsc(MarkUserGroup::getId);
+    public List<MarkUserQuestion> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
+                .eq(MarkUserQuestion::getPaperNumber, paperNumber)
+                .eq(MarkUserQuestion::getGroupNumber, groupNumber)
+                .orderByAsc(MarkUserQuestion::getId);
         return this.list(queryWrapper);
     }
 
     @Override
     public void updateQualityById(Long markUserGroupId, int finishCount, int headerFinishCount, int validCount, double avgSpeed, double avgScore, double stdevScore, double maxScore, double minScore) {
-        UpdateWrapper<MarkUserGroup> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkUserGroup::getFinishCount, finishCount)
-                .set(MarkUserGroup::getHeaderFinishCount, headerFinishCount)
-                .set(MarkUserGroup::getValidCount, validCount)
-                .set(MarkUserGroup::getAvgSpeed, avgSpeed)
-                .set(MarkUserGroup::getAvgScore, avgScore)
-                .set(MarkUserGroup::getStdevScore, stdevScore)
-                .set(MarkUserGroup::getMaxScore, maxScore)
-                .set(MarkUserGroup::getMinScore, minScore)
-                .eq(MarkUserGroup::getId, markUserGroupId);
+        UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkUserQuestion::getFinishCount, finishCount)
+                .set(MarkUserQuestion::getHeaderFinishCount, headerFinishCount)
+                .set(MarkUserQuestion::getValidCount, validCount)
+                .set(MarkUserQuestion::getAvgSpeed, avgSpeed)
+                .set(MarkUserQuestion::getAvgScore, avgScore)
+                .set(MarkUserQuestion::getStdevScore, stdevScore)
+                .set(MarkUserQuestion::getMaxScore, maxScore)
+                .set(MarkUserQuestion::getMinScore, minScore)
+                .eq(MarkUserQuestion::getId, markUserGroupId);
         this.update(updateWrapper);
     }
 
@@ -283,9 +283,9 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
             throw ExceptionResultEnum.ERROR.exception("请选择对应的科目及分组,再查看给分曲线");
         }
         List<MarkQualityChartDto> markQualityChartDtoList = new ArrayList<>();
-        List<MarkUserGroup> markUserGroupList = this.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-        Double totalAvgScore = markUserGroupList.stream().filter(m -> m.getAvgScore() != null).collect(Collectors.averagingDouble(MarkUserGroup::getAvgScore));
-        for (MarkUserGroup markUserGroup : markUserGroupList) {
+        List<MarkUserQuestion> markUserGroupList = this.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+        Double totalAvgScore = markUserGroupList.stream().filter(m -> m.getAvgScore() != null).collect(Collectors.averagingDouble(MarkUserQuestion::getAvgScore));
+        for (MarkUserQuestion markUserGroup : markUserGroupList) {
             MarkQualityChartDto markQualityChartDto = new MarkQualityChartDto();
             markQualityChartDto.setUserId(markUserGroup.getUserId());
             SysUser sysUser = sysUserService.getById(markUserGroup.getUserId());
@@ -301,46 +301,46 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public List<MarkUserGroup> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId) {
-        QueryWrapper<MarkUserGroup> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkUserGroup::getExamId, examId)
-                .eq(MarkUserGroup::getPaperNumber, paperNumber)
-                .eq(MarkUserGroup::getUserId, userId)
-                .orderByAsc(MarkUserGroup::getId);
+    public List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId) {
+        QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
+                .eq(MarkUserQuestion::getPaperNumber, paperNumber)
+                .eq(MarkUserQuestion::getUserId, userId)
+                .orderByAsc(MarkUserQuestion::getId);
         return this.list(queryWrapper);
     }
 
     @Override
     public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        UpdateWrapper<MarkUserGroup> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<MarkUserGroup> lambda = updateWrapper.lambda();
-        lambda.eq(MarkUserGroup::getExamId, examId)
-                .eq(MarkUserGroup::getPaperNumber, paperNumber);
+        UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<MarkUserQuestion> lambda = updateWrapper.lambda();
+        lambda.eq(MarkUserQuestion::getExamId, examId)
+                .eq(MarkUserQuestion::getPaperNumber, paperNumber);
         if (groupNumber != null) {
-            lambda.eq(MarkUserGroup::getGroupNumber, groupNumber);
+            lambda.eq(MarkUserQuestion::getGroupNumber, groupNumber);
         }
         this.remove(updateWrapper);
     }
 
     @Override
     public void updateMode(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkMode mode) {
-        UpdateWrapper<MarkUserGroup> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<MarkUserGroup> lambdaUpdateWrapper = updateWrapper.lambda();
-        lambdaUpdateWrapper.set(MarkUserGroup::getMode, mode)
-                .eq(MarkUserGroup::getExamId, examId)
-                .eq(MarkUserGroup::getPaperNumber, paperNumber);
+        UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<MarkUserQuestion> lambdaUpdateWrapper = updateWrapper.lambda();
+        lambdaUpdateWrapper.set(MarkUserQuestion::getMode, mode)
+                .eq(MarkUserQuestion::getExamId, examId)
+                .eq(MarkUserQuestion::getPaperNumber, paperNumber);
         if (groupNumber != null) {
-            lambdaUpdateWrapper.eq(MarkUserGroup::getGroupNumber, groupNumber);
+            lambdaUpdateWrapper.eq(MarkUserQuestion::getGroupNumber, groupNumber);
         }
         if (userId != null) {
-            lambdaUpdateWrapper.eq(MarkUserGroup::getUserId, userId);
+            lambdaUpdateWrapper.eq(MarkUserQuestion::getUserId, userId);
         }
         this.update(updateWrapper);
     }
 
     @Override
     public List<String> listBindMarkers(Long examId, String paperNumber, Integer groupNumber) {
-        List<MarkUserGroup> markUserGroups = listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+        List<MarkUserQuestion> markUserGroups = listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
         List<String> userIds = new ArrayList<>();
         if (CollectionUtils.isNotEmpty(markUserGroups)) {
             userIds = markUserGroups.stream().map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());

+ 20 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserPaperServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.mark.service.impl;
+
+import com.qmth.teachcloud.mark.entity.MarkUserPaper;
+import com.qmth.teachcloud.mark.mapper.MarkUserPaperMapper;
+import com.qmth.teachcloud.mark.service.MarkUserPaperService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 试卷评卷员设置 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2025-02-21
+ */
+@Service
+public class MarkUserPaperServiceImpl extends ServiceImpl<MarkUserPaperMapper, MarkUserPaper> implements MarkUserPaperService {
+
+}

+ 22 - 0
teachcloud-mark/src/main/resources/mapper/MarkHeaderHistoryMapper.xml

@@ -0,0 +1,22 @@
+<?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.qmth.teachcloud.mark.mapper.MarkHeaderHistoryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkHeaderHistory">
+        <id column="id" property="id" />
+        <result column="exam_id" property="examId" />
+        <result column="paper_number" property="paperNumber" />
+        <result column="student_id" property="studentId" />
+        <result column="question_id" property="questionId" />
+        <result column="main_number" property="mainNumber" />
+        <result column="sub_number" property="subNumber" />
+        <result column="user_id" property="userId" />
+        <result column="score" property="score" />
+        <result column="track_list" property="trackList" />
+        <result column="original_score" property="originalScore" />
+        <result column="original_track_list" property="originalTrackList" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 1 - 1
teachcloud-mark/src/main/resources/mapper/MarkUserGroupMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.qmth.teachcloud.mark.mapper.MarkUserGroupMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkUserGroup">
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkUserQuestion">
         <id column="id" property="id" />
         <result column="exam_id" property="examId" />
         <result column="paper_number" property="paperNumber" />

+ 14 - 0
teachcloud-mark/src/main/resources/mapper/MarkUserPaperMapper.xml

@@ -0,0 +1,14 @@
+<?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.qmth.teachcloud.mark.mapper.MarkUserPaperMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkUserPaper">
+        <id column="id" property="id" />
+        <result column="exam_id" property="examId" />
+        <result column="paper_number" property="paperNumber" />
+        <result column="user_id" property="userId" />
+        <result column="question_model" property="questionModel" />
+    </resultMap>
+
+</mapper>

+ 3 - 3
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -26,7 +26,7 @@ import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.data.service.TSyncDataService;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
-import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.service.MarkGroupService;
@@ -133,8 +133,8 @@ public class JobServiceImpl implements JobService {
             for (MarkPaper markPaper : markPaperList) {
                 List<MarkGroup> markGroups = markGroupService.listGroupByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
                 for (MarkGroup markGroup : markGroups) {
-                    List<MarkUserGroup> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(markPaper.getExamId(), markPaper.getPaperNumber(), markGroup.getNumber());
-                    for (MarkUserGroup marker : markUserGroups) {
+                    List<MarkUserQuestion> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(markPaper.getExamId(), markPaper.getPaperNumber(), markGroup.getNumber());
+                    for (MarkUserQuestion marker : markUserGroups) {
                         try {
                             if (markService.needUpdateQuality(marker, 30)) {
                                 log.info("start auto-update markerId: " + marker.getId());