浏览代码

3.4.4 update-20250303,联调bug修复

xiaofei 3 月之前
父节点
当前提交
2aef5080fc
共有 38 个文件被更改,包括 902 次插入694 次删除
  1. 6 1
      distributed-print/install/mysql/upgrade/3.4.4.sql
  2. 4 13
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java
  3. 3 4
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java
  4. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/MarkPaperFileDto.java
  5. 0 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerSpecialTagDTO.java
  6. 32 215
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java
  7. 331 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TaskQuestion.java
  8. 0 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TrackDTO.java
  9. 39 36
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkSubjectDto.java
  10. 7 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/SubmitResult.java
  11. 9 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/score/SettingDto.java
  12. 14 12
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java
  13. 5 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/LockType.java
  14. 0 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkQuestionMapper.java
  15. 6 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java
  16. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserPaperMapper.java
  17. 0 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResult.java
  18. 19 21
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResultQuestion.java
  19. 3 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  20. 3 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  21. 9 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  22. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserPaperService.java
  23. 3 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/TaskService.java
  24. 2 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java
  25. 19 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java
  26. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkProblemHistoryServiceImpl.java
  27. 28 31
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  28. 100 136
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  29. 36 36
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  30. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSyncServiceImpl.java
  31. 38 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  32. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserPaperServiceImpl.java
  33. 12 13
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java
  34. 97 67
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java
  35. 0 10
      teachcloud-mark/src/main/resources/mapper/MarkQuestionMapper.xml
  36. 41 11
      teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml
  37. 18 0
      teachcloud-mark/src/main/resources/mapper/MarkUserPaperMapper.xml
  38. 2 3
      teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml

+ 6 - 1
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -142,4 +142,9 @@ INSERT INTO sys_privilege
 VALUES(1193, '课程任课老师导入', '/api/admin/basic/course/import', 'URL', 13, 1, 'AUTH', NULL, 1, 1, 1);
 INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
-VALUES(1194, '课程任课老师导入', 'AssginCourseUserImport', 'BUTTON', 576, 7, 'AUTH', '1193', 1, 0, 1);
+VALUES(1194, '课程任课老师导入', 'AssginCourseUserImport', 'BUTTON', 576, 7, 'AUTH', '1193', 1, 0, 1);
+
+-- 2025-03-03
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1013', '新增考生', '/api/scan/student/save', 'URL', '970', '44', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1014', '复制卡格式', '/api/scan/answer/card/copy', 'URL', '970', '45', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1013,1014,1148,3072,3073,3074,3075' WHERE (`id` = '970');

+ 4 - 13
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java

@@ -22,7 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,13 +78,6 @@ public class MarkController extends BaseController {
         return ResultUtil.ok(markService.getStatus(user.getId(), examId, paperNumber));
     }
 
-//    @RequestMapping(value = "/getGroup", method = RequestMethod.POST)
-//    @ResponseBody
-//    public Result getGroup(@RequestParam Long examId, @RequestParam String paperNumber) {
-//        SysUser user = (SysUser) ServletUtil.getRequestUser();
-//        return ResultUtil.ok(markService.getGroup(user.getId(), examId, paperNumber));
-//    }
-
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     public Result getTask(@RequestParam Long examId, @RequestParam String paperNumber,
                           @RequestParam QuestionModel questionModel) {
@@ -94,8 +86,8 @@ public class MarkController extends BaseController {
     }
 
     @RequestMapping(value = "/saveTask", method = RequestMethod.POST)
-    public Result saveTask(HttpServletRequest request, @RequestParam Long examId, @RequestParam String paperNumber,
-                            @RequestBody MarkResult markResult) {
+    public Result saveTask(@RequestParam Long examId, @RequestParam String paperNumber,
+                           @RequestBody MarkResult markResult) {
         validMarkPaperForMark(examId, paperNumber);
         SysUser user = (SysUser) ServletUtil.getRequestUser();
         return ResultUtil.ok(markService.saveTask(examId, paperNumber, user.getId(), markResult));
@@ -103,10 +95,9 @@ public class MarkController extends BaseController {
 
     @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
     public Result getHistory(@RequestParam int pageNumber, @RequestParam int pageSize, @RequestParam String order, @RequestParam String sort,
-                             @RequestParam Long examId, @RequestParam String paperNumber,
-                             @RequestParam Integer groupNumber, @RequestParam(required = false) String secretNumber, @RequestParam(required = false) Double markerScore) {
+                             @RequestParam Long examId, @RequestParam String paperNumber, @RequestParam(required = false) String secretNumber, @RequestParam(required = false) Double markerScore) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getHistory(user.getId(), pageNumber, pageSize, "DESC".equalsIgnoreCase(sort) ? Sort.desc : Sort.asc, order, examId, paperNumber, groupNumber, secretNumber, markerScore));
+        return ResultUtil.ok(markService.getHistory(user.getId(), pageNumber, pageSize, "DESC".equalsIgnoreCase(sort) ? Sort.desc : Sort.asc, order, examId, paperNumber, secretNumber, markerScore));
     }
 
     @RequestMapping(value = "/updateSetting", method = RequestMethod.POST)

+ 3 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java

@@ -310,10 +310,6 @@ public class MarkQuestion extends BaseEntity implements Serializable {
         this.leftCount = leftCount;
     }
 
-    public List<MarkConfigItem> getPictureConfigList() {
-        return MarkConfigItem.parse(this.picList);
-    }
-
     public double getMarkScore() {
         return markScore;
     }
@@ -339,6 +335,9 @@ public class MarkQuestion extends BaseEntity implements Serializable {
         this.pictureConfigs = pictureConfigs;
     }
 
+    public List<MarkConfigItem> getPictureConfigList() {
+        return MarkConfigItem.parse(this.picList);
+    }
     @Override
     public String toString() {
         return "MarkQuestion{" +

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SubjectiveAnswerFileDto.java → teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/MarkPaperFileDto.java

@@ -2,7 +2,7 @@ package com.qmth.teachcloud.mark.dto.mark;
 
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 
-public class SubjectiveAnswerFileDto {
+public class MarkPaperFileDto {
 
     private String paperType;
 

+ 0 - 10
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerSpecialTagDTO.java

@@ -13,7 +13,6 @@ public class MarkerSpecialTagDTO extends SpecialTagDTO {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long markerId;
 
-    private int groupNumber;
     private Long questionId;
 
     public MarkerSpecialTagDTO(Long markerId, Long questionId, MarkSpecialTag specialTag) {
@@ -25,7 +24,6 @@ public class MarkerSpecialTagDTO extends SpecialTagDTO {
     public MarkerSpecialTagDTO(Long markerId, int groupNumber, MarkHeaderTag headerTag) {
         super(headerTag);
         this.markerId = markerId;
-        this.groupNumber = groupNumber;
     }
 
     public Long getMarkerId() {
@@ -36,14 +34,6 @@ public class MarkerSpecialTagDTO extends SpecialTagDTO {
         this.markerId = markerId;
     }
 
-    public int getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(int groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
     public Long getQuestionId() {
         return questionId;
     }

+ 32 - 215
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java

@@ -15,12 +15,6 @@ public class Task implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
 
-    /**
-     * 评卷任务编号
-     */
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long taskId;
-
     /**
      * 考生编号
      */
@@ -47,37 +41,6 @@ public class Task implements Serializable {
 
     private String paperNumber;
     private String paperType;
-    private Long questionId;
-
-    /**
-     * 题卡图片拼接配置
-     */
-    private List<MarkConfigItem> sliceConfig;
-
-    /**
-     * 多媒体地址
-     */
-    private String jsonUrl;
-
-    /**
-     * 给分步骤
-     */
-    private List<MarkStepDTO> questionList;
-
-    /**
-     * 特殊标记列表
-     */
-    private SpecialTagDTO[] specialTagList;
-
-    /**
-     * 组长特殊标记列表
-     */
-    private SpecialTagDTO[] headerTagList;
-
-    /**
-     * 题卡原图地址
-     */
-    private List<String> sheetUrls;
 
     /**
      * 客观题总分
@@ -85,57 +48,23 @@ public class Task implements Serializable {
     private Double objectiveScore;
 
     /**
-     * 评分
-     */
-    private Double markerScore;
-
-    /**
-     * 评卷时间
-     */
-    private Long markerTime;
-
-    /**
-     * 是否自评
-     */
-    private boolean isSelf;
-
-    /**
-     * 是否回评
-     */
-    private boolean isPrevious;
-
-    /**
-     * 是否打回
-     */
-    private boolean isRejected;
-
-    /**
-     * 打回原因
-     */
-    private String rejectReason;
-
-    /**
-     * 打回上次分数
+     * 题卡原图地址
      */
-    private String rejectScoreList;
-
+    private List<String> sheetUrls;
     /**
-     * 评卷员登录名
+     * 题卡图片拼接配置
      */
-    private String markerName;
+    private List<MarkConfigItem> sliceConfig;
 
     /**
-     * 复核时间
+     * 多媒体地址
      */
-    private Date inspectTime;
+    private String jsonUrl;
 
     /**
-     * 错误信息
+     * 给分步骤
      */
-    private String message;
-
-    public Task() {
-    }
+    private List<TaskQuestion> questionList;
 
     public Long getExamId() {
         return examId;
@@ -145,14 +74,6 @@ public class Task implements Serializable {
         this.examId = examId;
     }
 
-    public Long getTaskId() {
-        return taskId;
-    }
-
-    public void setTaskId(Long taskId) {
-        this.taskId = taskId;
-    }
-
     public Long getStudentId() {
         return studentId;
     }
@@ -201,44 +122,20 @@ public class Task implements Serializable {
         this.courseName = courseName;
     }
 
-    public List<MarkConfigItem> getSliceConfig() {
-        return sliceConfig;
-    }
-
-    public void setSliceConfig(List<MarkConfigItem> sliceConfig) {
-        this.sliceConfig = sliceConfig;
-    }
-
-    public String getJsonUrl() {
-        return jsonUrl;
-    }
-
-    public void setJsonUrl(String jsonUrl) {
-        this.jsonUrl = jsonUrl;
-    }
-
-    public List<MarkStepDTO> getQuestionList() {
-        return questionList;
-    }
-
-    public void setQuestionList(List<MarkStepDTO> questionList) {
-        this.questionList = questionList;
-    }
-
-    public SpecialTagDTO[] getSpecialTagList() {
-        return specialTagList;
+    public String getPaperNumber() {
+        return paperNumber;
     }
 
-    public void setSpecialTagList(SpecialTagDTO[] specialTagList) {
-        this.specialTagList = specialTagList;
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
     }
 
-    public List<String> getSheetUrls() {
-        return sheetUrls;
+    public String getPaperType() {
+        return paperType;
     }
 
-    public void setSheetUrls(List<String> sheetUrls) {
-        this.sheetUrls = sheetUrls;
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
     }
 
     public Double getObjectiveScore() {
@@ -249,115 +146,35 @@ public class Task implements Serializable {
         this.objectiveScore = objectiveScore;
     }
 
-    public Double getMarkerScore() {
-        return markerScore;
-    }
-
-    public void setMarkerScore(Double markerScore) {
-        this.markerScore = markerScore;
-    }
-
-    public Long getMarkerTime() {
-        return markerTime;
-    }
-
-    public void setMarkerTime(Long markerTime) {
-        this.markerTime = markerTime;
-    }
-
-    public boolean isSelf() {
-        return isSelf;
-    }
-
-    public void setSelf(boolean isSelf) {
-        this.isSelf = isSelf;
-    }
-
-    public boolean isPrevious() {
-        return isPrevious;
-    }
-
-    public void setPrevious(boolean isPrevious) {
-        this.isPrevious = isPrevious;
-    }
-
-    public boolean isRejected() {
-        return isRejected;
-    }
-
-    public void setRejected(boolean isRejected) {
-        this.isRejected = isRejected;
-    }
-
-    public String getMarkerName() {
-        return markerName;
-    }
-
-    public void setMarkerName(String markerName) {
-        this.markerName = markerName;
-    }
-
-    public Date getInspectTime() {
-        return inspectTime;
-    }
-
-    public void setInspectTime(Date inspectTime) {
-        this.inspectTime = inspectTime;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public String getRejectReason() {
-        return rejectReason;
-    }
-
-    public void setRejectReason(String rejectReason) {
-        this.rejectReason = rejectReason;
-    }
-
-    public String getRejectScoreList() {
-        return rejectScoreList;
-    }
-
-    public void setRejectScoreList(String rejectScoreList) {
-        this.rejectScoreList = rejectScoreList;
-    }
-
-    public SpecialTagDTO[] getHeaderTagList() {
-        return headerTagList;
+    public List<String> getSheetUrls() {
+        return sheetUrls;
     }
 
-    public void setHeaderTagList(SpecialTagDTO[] headerTagList) {
-        this.headerTagList = headerTagList;
+    public void setSheetUrls(List<String> sheetUrls) {
+        this.sheetUrls = sheetUrls;
     }
 
-    public String getPaperNumber() {
-        return paperNumber;
+    public List<MarkConfigItem> getSliceConfig() {
+        return sliceConfig;
     }
 
-    public void setPaperNumber(String paperNumber) {
-        this.paperNumber = paperNumber;
+    public void setSliceConfig(List<MarkConfigItem> sliceConfig) {
+        this.sliceConfig = sliceConfig;
     }
 
-    public String getPaperType() {
-        return paperType;
+    public String getJsonUrl() {
+        return jsonUrl;
     }
 
-    public void setPaperType(String paperType) {
-        this.paperType = paperType;
+    public void setJsonUrl(String jsonUrl) {
+        this.jsonUrl = jsonUrl;
     }
 
-    public Long getQuestionId() {
-        return questionId;
+    public List<TaskQuestion> getQuestionList() {
+        return questionList;
     }
 
-    public void setQuestionId(Long questionId) {
-        this.questionId = questionId;
+    public void setQuestionList(List<TaskQuestion> questionList) {
+        this.questionList = questionList;
     }
 }

+ 331 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TaskQuestion.java

@@ -0,0 +1,331 @@
+package com.qmth.teachcloud.mark.dto.mark.manage;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.bean.marking.MarkConfigItem;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.entity.MarkHeaderTrack;
+import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+public class TaskQuestion implements Serializable {
+
+    private static final long serialVersionUID = 3309698238297224617L;
+    /**
+     * 评卷任务编号
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long taskId;
+
+    /**
+     * 考生ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long questionId;
+
+
+    /**
+     * 大题号
+     */
+    private Integer mainNumber;
+
+    /**
+     * 小题号
+     */
+    private Integer subNumber;
+
+    private double intervalScore;
+
+    private double defaultScore;
+
+    private String title;
+    private MarkTaskStatus status;
+
+    private Double score;
+
+    private double maxScore;
+
+    private double minScore;
+
+    private boolean uncalculate;
+
+    /**
+     * 给分步骤
+     */
+    private TrackDTO[] markerTrackList;
+
+    private TrackDTO[] headerTrackList;
+
+    /**
+     * 特殊标记列表
+     */
+    private SpecialTagDTO[] markerTagList;
+
+    /**
+     * 组长特殊标记列表
+     */
+    private SpecialTagDTO[] headerTagList;
+
+
+    /**
+     * 评分
+     */
+    private Double markerScore;
+
+    /**
+     * 评卷时间
+     */
+    private Long markerTime;
+
+    /**
+     * 是否自评
+     */
+    private boolean selfMark;
+
+    /**
+     * 是否回评
+     */
+    private boolean isPrevious;
+
+    /**
+     * 是否打回
+     */
+    private boolean isRejected;
+
+    /**
+     * 打回原因
+     */
+    private String rejectReason;
+
+    /**
+     * 打回上次分数
+     */
+    private String rejectScoreList;
+
+    /**
+     * 评卷员登录名
+     */
+    private String markerName;
+
+    /**
+     * 复核时间
+     */
+    private Date inspectTime;
+
+    /**
+     * 错误信息
+     */
+    private String message;
+
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    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 double getIntervalScore() {
+        return intervalScore;
+    }
+
+    public void setIntervalScore(double intervalScore) {
+        this.intervalScore = intervalScore;
+    }
+
+    public double getDefaultScore() {
+        return defaultScore;
+    }
+
+    public void setDefaultScore(double defaultScore) {
+        this.defaultScore = defaultScore;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public double getMaxScore() {
+        return maxScore;
+    }
+
+    public void setMaxScore(double maxScore) {
+        this.maxScore = maxScore;
+    }
+
+    public double getMinScore() {
+        return minScore;
+    }
+
+    public void setMinScore(double minScore) {
+        this.minScore = minScore;
+    }
+
+    public boolean isUncalculate() {
+        return uncalculate;
+    }
+
+    public void setUncalculate(boolean uncalculate) {
+        this.uncalculate = uncalculate;
+    }
+
+    public TrackDTO[] getMarkerTrackList() {
+        return markerTrackList;
+    }
+
+    public void setMarkerTrackList(TrackDTO[] markerTrackList) {
+        this.markerTrackList = markerTrackList;
+    }
+
+    public TrackDTO[] getHeaderTrackList() {
+        return headerTrackList;
+    }
+
+    public void setHeaderTrackList(TrackDTO[] headerTrackList) {
+        this.headerTrackList = headerTrackList;
+    }
+
+    public SpecialTagDTO[] getMarkerTagList() {
+        return markerTagList;
+    }
+
+    public void setMarkerTagList(SpecialTagDTO[] markerTagList) {
+        this.markerTagList = markerTagList;
+    }
+
+    public SpecialTagDTO[] getHeaderTagList() {
+        return headerTagList;
+    }
+
+    public void setHeaderTagList(SpecialTagDTO[] headerTagList) {
+        this.headerTagList = headerTagList;
+    }
+
+    public Double getMarkerScore() {
+        return markerScore;
+    }
+
+    public void setMarkerScore(Double markerScore) {
+        this.markerScore = markerScore;
+    }
+
+    public Long getMarkerTime() {
+        return markerTime;
+    }
+
+    public void setMarkerTime(Long markerTime) {
+        this.markerTime = markerTime;
+    }
+
+    public MarkTaskStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(MarkTaskStatus status) {
+        this.status = status;
+    }
+
+    public boolean isSelfMark() {
+        return selfMark;
+    }
+
+    public void setSelfMark(boolean selfMark) {
+        this.selfMark = selfMark;
+    }
+
+    public boolean isPrevious() {
+        return isPrevious;
+    }
+
+    public void setPrevious(boolean previous) {
+        isPrevious = previous;
+    }
+
+    public boolean isRejected() {
+        return isRejected;
+    }
+
+    public void setRejected(boolean rejected) {
+        isRejected = rejected;
+    }
+
+    public String getRejectReason() {
+        return rejectReason;
+    }
+
+    public void setRejectReason(String rejectReason) {
+        this.rejectReason = rejectReason;
+    }
+
+    public String getRejectScoreList() {
+        return rejectScoreList;
+    }
+
+    public void setRejectScoreList(String rejectScoreList) {
+        this.rejectScoreList = rejectScoreList;
+    }
+
+    public String getMarkerName() {
+        return markerName;
+    }
+
+    public void setMarkerName(String markerName) {
+        this.markerName = markerName;
+    }
+
+    public Date getInspectTime() {
+        return inspectTime;
+    }
+
+    public void setInspectTime(Date inspectTime) {
+        this.inspectTime = inspectTime;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 0 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TrackDTO.java

@@ -81,7 +81,6 @@ public class TrackDTO implements Serializable {
         track.setStudentId(markTask.getStudentId());
         track.setExamId(markTask.getExamId());
         track.setPaperNumber(markTask.getPaperNumber());
-//        track.setGroupNumber(markTask.getGroupNumber());
         track.setUserId(userId);
         track.setScore(getScore());
         track.setPositionX(getPositionX());

+ 39 - 36
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkSubjectDto.java

@@ -1,41 +1,44 @@
 package com.qmth.teachcloud.mark.dto.mark.mark;
 
-public class MarkSubjectDto {
-	private String name;
-	private String code;
-	private String answerUrl;
-	private String paperUrl;
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getCode() {
-		return code;
-	}
-
-	public void setCode(String code) {
-		this.code = code;
-	}
+import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
 
-	public String getAnswerUrl() {
-		return answerUrl;
-	}
-
-	public void setAnswerUrl(String answerUrl) {
-		this.answerUrl = answerUrl;
-	}
-
-	public String getPaperUrl() {
-		return paperUrl;
-	}
-
-	public void setPaperUrl(String paperUrl) {
-		this.paperUrl = paperUrl;
-	}
+import java.util.List;
 
+public class MarkSubjectDto {
+    private String name;
+    private String code;
+    private List<MarkPaperFileDto> answerUrl;
+    private List<MarkPaperFileDto> paperUrl;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public List<MarkPaperFileDto> getAnswerUrl() {
+        return answerUrl;
+    }
+
+    public void setAnswerUrl(List<MarkPaperFileDto> answerUrl) {
+        this.answerUrl = answerUrl;
+    }
+
+    public List<MarkPaperFileDto> getPaperUrl() {
+        return paperUrl;
+    }
+
+    public void setPaperUrl(List<MarkPaperFileDto> paperUrl) {
+        this.paperUrl = paperUrl;
+    }
 }

+ 7 - 10
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/SubmitResult.java

@@ -1,7 +1,5 @@
 package com.qmth.teachcloud.mark.dto.mark.mark;
 
-import com.qmth.teachcloud.mark.entity.MarkTask;
-
 /**
  * 评卷提交结果状态
  */
@@ -9,27 +7,26 @@ public class SubmitResult {
 
     private boolean success;
 
-    private MarkTask markLibrary;
+    private Long studentId;
 
     public static SubmitResult faile() {
         return new SubmitResult(false, null);
     }
 
-    public static SubmitResult success(MarkTask library) {
-        return new SubmitResult(true, library);
+    public static SubmitResult success(Long studentId) {
+        return new SubmitResult(true, studentId);
     }
 
-    private SubmitResult(boolean success, MarkTask markLibrary) {
+    private SubmitResult(boolean success, Long studentId) {
         this.success = success;
-        this.markLibrary = markLibrary;
+        this.studentId = studentId;
     }
 
     public boolean isSuccess() {
         return success;
     }
 
-    public MarkTask getMarkLibrary() {
-        return markLibrary;
+    public Long getStudentId() {
+        return studentId;
     }
-
 }

+ 9 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/score/SettingDto.java

@@ -2,6 +2,9 @@ package com.qmth.teachcloud.mark.dto.mark.score;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
+
+import java.util.List;
 
 public class SettingDto {
 
@@ -11,8 +14,8 @@ public class SettingDto {
     private String courseCode;
     private String courseName;
     private String paperNumber;
-    private String paperUrl;
-    private String answerUrl;
+    private List<MarkPaperFileDto> paperUrl;
+    private List<MarkPaperFileDto> answerUrl;
 
     public Long getExamId() {
         return examId;
@@ -54,19 +57,19 @@ public class SettingDto {
         this.paperNumber = paperNumber;
     }
 
-    public String getPaperUrl() {
+    public List<MarkPaperFileDto> getPaperUrl() {
         return paperUrl;
     }
 
-    public void setPaperUrl(String paperUrl) {
+    public void setPaperUrl(List<MarkPaperFileDto> paperUrl) {
         this.paperUrl = paperUrl;
     }
 
-    public String getAnswerUrl() {
+    public List<MarkPaperFileDto> getAnswerUrl() {
         return answerUrl;
     }
 
-    public void setAnswerUrl(String answerUrl) {
+    public void setAnswerUrl(List<MarkPaperFileDto> answerUrl) {
         this.answerUrl = answerUrl;
     }
 }

+ 14 - 12
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java

@@ -7,6 +7,8 @@ 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;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -346,34 +348,34 @@ public class MarkTask implements Serializable {
         this.headerTagList = headerTagList;
     }
 
-    public List<MarkTrack> listMarkerTrack() {
-        List<MarkTrack> markTrackList = new ArrayList<>();
+    public List<TrackDTO> listMarkerTrack() {
+        List<TrackDTO> markTrackList = new ArrayList<>();
         if (StringUtils.isNotBlank(markerTrackList)) {
-            markTrackList = JSON.parseArray(markerTrackList, MarkTrack.class);
+            markTrackList = JSON.parseArray(markerTrackList, TrackDTO.class);
         }
         return markTrackList;
     }
 
-    public List<MarkSpecialTag> listMarkerTag() {
-        List<MarkSpecialTag> markSpecialTagList = new ArrayList<>();
+    public List<SpecialTagDTO> listMarkerTag() {
+        List<SpecialTagDTO> markSpecialTagList = new ArrayList<>();
         if (StringUtils.isNotBlank(markerTagList)) {
-            markSpecialTagList = JSON.parseArray(markerTagList, MarkSpecialTag.class);
+            markSpecialTagList = JSON.parseArray(markerTagList, SpecialTagDTO.class);
         }
         return markSpecialTagList;
     }
 
-    public List<MarkHeaderTrack> listHeaderTrack() {
-        List<MarkHeaderTrack> markHeaderTrackList = new ArrayList<>();
+    public List<TrackDTO> listHeaderTrack() {
+        List<TrackDTO> markHeaderTrackList = new ArrayList<>();
         if (StringUtils.isNotBlank(headerTrackList)) {
-            markHeaderTrackList = JSON.parseArray(headerTrackList, MarkHeaderTrack.class);
+            markHeaderTrackList = JSON.parseArray(headerTrackList, TrackDTO.class);
         }
         return markHeaderTrackList;
     }
 
-    public List<MarkHeaderTag> listHeaderTag() {
-        List<MarkHeaderTag> headerSpecialTagList = new ArrayList<>();
+    public List<SpecialTagDTO> listHeaderTag() {
+        List<SpecialTagDTO> headerSpecialTagList = new ArrayList<>();
         if (StringUtils.isNotBlank(headerTagList)) {
-            headerSpecialTagList = JSON.parseArray(headerTagList, MarkHeaderTag.class);
+            headerSpecialTagList = JSON.parseArray(headerTagList, SpecialTagDTO.class);
         }
         return headerSpecialTagList;
     }

+ 5 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/LockType.java

@@ -1,16 +1,15 @@
 package com.qmth.teachcloud.mark.enums;
 
 public enum LockType {
-	EXAM_SUBJECT("exam_subject"), 
-	GROUP("group"), 
-	GROUP_DELETE("group_delete"), 
+	EXAM_SUBJECT("exam_subject"),
+	QUESTION("question"),
 	STUDENT("student"),
-	MARK_USER_GROUP("mark_user_group"), 
+	MARK_USER_QUESTION("mark_user_group"),
 	MARKER_RESET("marker_reset"), 
 	USER("user"), 
 	FORMAL_LIBRARY("formal_library"),
-	TRIAL_LIBRARY("trial_library"), 
-	ARBITRATE("arbitrate"), 
+	TRIAL_LIBRARY("trial_library"),
+	ARBITRATE("arbitrate"),
 	BATCH_QUALITY("batch_quality"),
 	SCORE_CALCULATE("score_calculate"), 
 	GROUP_LIBRARY("group_library"), 

+ 0 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkQuestionMapper.java

@@ -19,7 +19,5 @@ public interface MarkQuestionMapper extends BaseMapper<MarkQuestion> {
 
     String assembleQuestionsByExamIdAndPaperNumberAndNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
 
-    Double sumTotalScoreByQuestionId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
-
     List<MarkQuestionAnswerVo> listQuestionAnswerByExamIdAndPaperNumberAndPaperType(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType, @Param("objective") Boolean objective);
 }

+ 6 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java

@@ -31,13 +31,13 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     MarkTask getLastOneByUserIdAndStatus(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("status") String status);
 
-    IPage<MarkTask> listPageHistory(@Param("page") Page<MarkTask> page, @Param("userId") Long userId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
-                                    @Param("groupNumber") Integer groupNumber, @Param("secretNumber") String secretNumber, @Param("markerScore") Double markerScore);
+    IPage<Long> listPageHistory(@Param("page") Page<Long> page, @Param("userId") Long userId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+                                    @Param("secretNumber") String secretNumber, @Param("markerScore") Double markerScore);
 
-    List<MarkTask> findUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+    List<Long> findUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
                                 @Param("userId") Long userId, @Param("questionModel") QuestionModel questionModel);
 
-    List<MarkTask> findUnMarkedFilterClass(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+    List<Long> findUnMarkedFilterClass(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
                                            @Param("userId") Long userId, @Param("questionModel") QuestionModel questionModel);
 
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
@@ -49,4 +49,6 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
     MarkManageDto selectMarkedCountAndTotalCount(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 
     Long minQuestionIdByExamIdAndPaperNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("statusList") MarkTaskStatus[] statusList);
+
+    List<MarkTask> listByStudentIdAndUserId(@Param("studentId") Long studentId, @Param("userId") Long userId);
 }

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

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.mark.mapper;
 
 import com.qmth.teachcloud.mark.entity.MarkUserPaper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface MarkUserPaperMapper extends BaseMapper<MarkUserPaper> {
 
+    String getSubjectiveQuestionNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId);
 }

+ 0 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResult.java

@@ -8,8 +8,6 @@ import java.util.List;
  */
 public class MarkResult {
 
-    public static final String SPLIT = ",";
-
     /**
      * 考生编号
      */

+ 19 - 21
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResultQuestion.java

@@ -16,9 +16,6 @@ import java.util.List;
  */
 public class MarkResultQuestion {
 
-    public static final String SPLIT = ",";
-
-
     /**
      * 评卷任务编号
      */
@@ -40,12 +37,12 @@ public class MarkResultQuestion {
     /**
      * 阅卷轨迹列表
      */
-    private TrackDTO[] trackList;
+    private TrackDTO[] markerTrackList;
 
     /**
      * 特殊标记列表
      */
-    private SpecialTagDTO[] specialTagList;
+    private SpecialTagDTO[] markerTagList;
 
     /**
      * 所花时间
@@ -108,25 +105,26 @@ public class MarkResultQuestion {
         this.markerScore = markerScore;
     }
 
-    public TrackDTO[] getTrackList() {
-        return trackList;
+    public TrackDTO[] getMarkerTrackList() {
+        return markerTrackList;
     }
 
-    public void setTrackList(TrackDTO[] trackList) {
-        this.trackList = trackList;
+    public void setMarkerTrackList(TrackDTO[] markerTrackList) {
+        this.markerTrackList = markerTrackList;
     }
-    public SpecialTagDTO[] getSpecialTagList() {
-        return specialTagList;
+
+    public SpecialTagDTO[] getMarkerTagList() {
+        return markerTagList;
     }
 
-    public void setSpecialTagList(SpecialTagDTO[] specialTagList) {
-        this.specialTagList = specialTagList;
+    public void setMarkerTagList(SpecialTagDTO[] markerTagList) {
+        this.markerTagList = markerTagList;
     }
 
     public List<MarkHeaderTrack> getTrackList(MarkArbitrateHistory history) {
         List<MarkHeaderTrack> list = new LinkedList<>();
-        if (trackList != null) {
-            for (TrackDTO dto : trackList) {
+        if (markerTrackList != null) {
+            for (TrackDTO dto : markerTrackList) {
                 list.add(dto.transform(history));
             }
         }
@@ -135,8 +133,8 @@ public class MarkResultQuestion {
 
     public List<MarkTrack> getTrackList(MarkTask markTask, Long userId) {
         List<MarkTrack> list = new LinkedList<>();
-        if (trackList != null) {
-            for (TrackDTO dto : trackList) {
+        if (markerTrackList != null) {
+            for (TrackDTO dto : markerTrackList) {
                 list.add(dto.transform(markTask, userId));
             }
         }
@@ -145,8 +143,8 @@ public class MarkResultQuestion {
 
     public List<MarkHeaderTag> getHeaderTagList(MarkArbitrateHistory library) {
         List<MarkHeaderTag> list = new LinkedList<>();
-        if (specialTagList != null) {
-            for (SpecialTagDTO dto : specialTagList) {
+        if (markerTagList != null) {
+            for (SpecialTagDTO dto : markerTagList) {
                 list.add(dto.transform(library));
             }
         }
@@ -155,8 +153,8 @@ public class MarkResultQuestion {
 
     public List<MarkSpecialTag> getSpecialTagList(MarkTask markTask) {
         List<MarkSpecialTag> list = new LinkedList<>();
-        if (specialTagList != null) {
-            for (SpecialTagDTO dto : specialTagList) {
+        if (markerTagList != null) {
+            for (SpecialTagDTO dto : markerTagList) {
                 list.add(dto.transform(markTask));
             }
         }

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

@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.bean.mark.DoubleMarkParam;
+import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
-import com.qmth.teachcloud.mark.dto.mark.SubjectiveAnswerFileDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupQuestionsDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupSummaryProgressDto;
@@ -74,11 +74,9 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     String uploadSubjectiveFile(Long examId, String paperNumber, String paperType, MultipartFile file, String md5);
 
-    List<SubjectiveAnswerFileDto> previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber);
+    List<MarkPaperFileDto> previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    double sumTotalScoreByQuestionId(Long examId, String paperNumber, Long questionId);
-
-    MarkQuestion getByExamIdAndPaperNumberAndMainNumberAndSubNumberAndObjective(Long examId, String paperNumber, Integer mainNumber, Integer subNumber, boolean isObjective);
+    List<MarkPaperFileDto> previewPaperFileByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     List<MarkQuestion> listByExamIdAndPaperNumberAndPaperIndexAndPageIndex(Long examId, String paperNumber, Integer paperIndex, Integer pageIndex, boolean isObjective);
 
@@ -123,5 +121,4 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
     void updateDoubleMarkByQuestionId(DoubleMarkParam doubleMarkParam);
 
     MarkQuestionSubjectiveStepStatusDto stepStatus(Long examId, String paperNumber);
-
 }

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

@@ -60,8 +60,6 @@ public interface MarkService {
 
     MarkStatusDto getStatus(Long userId, Long examId, String paperNumber);
 
-//    List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber);
-
     Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel);
 
     /**
@@ -78,16 +76,16 @@ public interface MarkService {
 
     void submitHeaderTask(List<MarkHeaderGroupResult> markResult, MarkStudent markUserGroup);
 
-    IPage<Task> getHistory(Long userId, int pageNumber, int pageSize, Sort sort, String order, Long examId, String paperNumber,
-                           Integer groupNumber, String secretNumber, Double markerScore);
+    IPage<Task> getHistory(Long userId, int pageNumber, int pageSize, Sort sort, String order, Long examId, String paperNumber, String secretNumber, Double markerScore);
 
     SubmitResult saveTask(Long examId, String paperNumber, Long userId, MarkResult markResult);
 
     void clear(Long userId, Long examId, String paperNumber);
 
     boolean applyTask(MarkTask t, Long userId);
+    boolean applyTask(Long studentId, Long userId);
 
-    boolean hasApplied(MarkTask t, Long userId);
+    boolean hasApplied(Long studentId, Long userId);
 
     void deleteInitMarkData(Long examId, String paperNumber);
 

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

@@ -57,14 +57,14 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, Long userId, List<String> className, MarkTaskStatus... status);
 
-    IPage<MarkTask> listPageHistory(Page<MarkTask> page, Long userId, Long examId, String paperNumber,
-                                    Integer groupNumber, String secretNumber, Double markerScore);
+    IPage<Long> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore);
 
-    List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
+    List<Long> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
 
-    List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
+    List<Long> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
 
-    int countByIdAndStatus(Long id, MarkTaskStatus status);
+    int countByIdAndStatus(Long studentId, MarkTaskStatus status);
+    int countByStudentIdAndStatus(Long studentId, MarkTaskStatus... status);
 
     List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status);
 
@@ -94,4 +94,8 @@ public interface MarkTaskService extends IService<MarkTask> {
     List<MarkTask> listByStudentId(Long studentId);
 
     Long minQuestionIdByExamIdAndPaperNumber(Long examId, String paperNumber, MarkTaskStatus...statuses);
+
+    List<MarkTask> listByStudentIdAndUserId(Long studentId, Long userId);
+
+    List<MarkTask> listByStudentIdAndMarkerId(Long studentId, Long markerId);
 }

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

@@ -14,4 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface MarkUserPaperService extends IService<MarkUserPaper> {
 
     MarkUserPaper getByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
+
+    String getSubjectiveQuestionNumber(Long examId, String paperNumber, Long id);
 }

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

@@ -5,11 +5,13 @@ import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 
+import java.util.List;
+
 public interface TaskService {
     Task build(MarkArbitrateHistory markArbitrateHistory, MarkQuestion markQuestion);
 
     Task build(Long studentId);
 
-	Task build(MarkTask task);
+	Task build(Long userId, List<MarkTask> markTaskList);
 
 }

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

@@ -192,13 +192,13 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
         if (markArbitrateHistory != null) {
             try {
                 lockService.watch(LockType.EXAM_SUBJECT, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber());
-                lockService.watch(LockType.GROUP, markArbitrateHistory.getQuestionId());
+                lockService.watch(LockType.QUESTION, markArbitrateHistory.getQuestionId());
                 markService.processArbitrate(markResult, sysUser.getId());
                 releaseTask(markArbitrateHistory.getId());
             } catch (Exception e) {
                 log.error("ArbitrateController-处理仲裁卷出错", e);
             } finally {
-                lockService.unwatch(LockType.GROUP, markArbitrateHistory.getQuestionId());
+                lockService.unwatch(LockType.QUESTION, markArbitrateHistory.getQuestionId());
                 lockService.unwatch(LockType.EXAM_SUBJECT, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber());
             }
         } else {
@@ -245,7 +245,6 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
         MarkQuestion markQuestion = markQuestionService.getById(questionId);
         for (MarkArbitrateHistory history : markArbitrateHistoryList) {
             Task task = taskService.build(history, markQuestion);
-            task.setPrevious(true);
             taskList.add(task);
         }
         return taskList;

+ 19 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -41,6 +41,7 @@ import com.qmth.teachcloud.mark.bean.document.ArchivePaperQuery;
 import com.qmth.teachcloud.mark.bean.document.ArchivePaperVo;
 import com.qmth.teachcloud.mark.bean.vo.parseCard.Struct;
 import com.qmth.teachcloud.mark.dto.ArchiveScoreExportDto;
+import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
 import com.qmth.teachcloud.mark.dto.mark.score.CheckScoreListDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
@@ -455,10 +456,26 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
             settingDto.setCourseCode(markPaper.getCourseCode());
             settingDto.setCourseName(markPaper.getCourseName());
             if (StringUtils.isNotBlank(markPaper.getPaperFilePath())) {
-                settingDto.setPaperUrl(teachcloudCommonService.filePreview(markPaper.getPaperFilePath()));
+                List<MarkPaperFileDto> markPaperFileDtos = new ArrayList<>();
+                if (markPaper != null && StringUtils.isNotBlank(markPaper.getPaperFilePath())) {
+                    markPaperFileDtos = JSON.parseArray(markPaper.getPaperFilePath(), MarkPaperFileDto.class);
+                    for (MarkPaperFileDto markPaperFileDto : markPaperFileDtos) {
+                        markPaperFileDto.setUrl(teachcloudCommonService.filePreview(JSON.toJSONString(markPaperFileDto.getFilePathVo())));
+                        markPaperFileDto.setFilePathVo(null);
+                    }
+                }
+                settingDto.setPaperUrl(markPaperFileDtos);
             }
             if (StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
-                settingDto.setAnswerUrl(teachcloudCommonService.filePreview(markPaper.getAnswerFilePath()));
+                List<MarkPaperFileDto> markPaperFileDtos = new ArrayList<>();
+                if (markPaper != null && StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
+                    markPaperFileDtos = JSON.parseArray(markPaper.getAnswerFilePath(), MarkPaperFileDto.class);
+                    for (MarkPaperFileDto markPaperFileDto : markPaperFileDtos) {
+                        markPaperFileDto.setUrl(teachcloudCommonService.filePreview(JSON.toJSONString(markPaperFileDto.getFilePathVo())));
+                        markPaperFileDto.setFilePathVo(null);
+                    }
+                }
+                settingDto.setAnswerUrl(markPaperFileDtos);
             }
         }
         return settingDto;

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

@@ -94,14 +94,14 @@ public class MarkProblemHistoryServiceImpl extends ServiceImpl<MarkProblemHistor
             if (markTask != null) {
                 try {
                     lockService.watch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
-                    lockService.watch(LockType.GROUP, markTask.getQuestionId());
+                    lockService.watch(LockType.QUESTION, markTask.getQuestionId());
                     if (markTask.getStatus().equals(MarkTaskStatus.PROBLEM)) {
                         markService.rejectMarkTask(markProblemHistory, markTask, sysUser.getId());
                     }
                 } catch (Exception e) {
                     log.error("问题卷打回失败", e);
                 } finally {
-                    lockService.unwatch(LockType.GROUP, markTask.getQuestionId());
+                    lockService.unwatch(LockType.QUESTION, markTask.getQuestionId());
                     lockService.unwatch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
                 }
             }

+ 28 - 31
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -26,7 +26,7 @@ import com.qmth.teachcloud.mark.bean.mark.DoubleMarkParam;
 import com.qmth.teachcloud.mark.bean.student.MarkStudentQuery;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
 import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
-import com.qmth.teachcloud.mark.dto.mark.SubjectiveAnswerFileDto;
+import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
@@ -156,12 +156,12 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                     Optional<MarkQuestion> questionOptional = markQuestionList.stream().filter(m -> m.getId().equals(question.getId())).findFirst();
                     if (questionOptional.isPresent()) {
                         MarkQuestion markQuestion = questionOptional.get();
-                        if (markQuestion.getTotalScore().doubleValue() - question.getTotalScore().doubleValue() != 0) {
-                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改小题满分");
+                        if (markQuestion.getMarkedCount() != null && markQuestion.getMarkedCount() > 0 && markQuestion.getTotalScore() != null && markQuestion.getTotalScore().doubleValue() - question.getTotalScore().doubleValue() != 0) {
+                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已阅卷,不能修改小题满分");
                         }
                         // 主观题改客观题
-                        if (!markQuestion.getObjective() && question.getObjective()) {
-                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改为客观题题型");
+                        if (markQuestion.getMarkedCount() != null && markQuestion.getMarkedCount() > 0 && !markQuestion.getObjective() && question.getObjective()) {
+                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已阅卷,不能修改为客观题题型");
                         }
                         if (question.getTotalScore() < 0) {
                             throw ExceptionResultEnum.ERROR.exception("小题满分不能小于0");
@@ -421,14 +421,14 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         if (markPaper == null) {
             throw ExceptionResultEnum.ERROR.exception("课程不存在");
         }
-        List<SubjectiveAnswerFileDto> subjectiveAnswerFileDtoList = new ArrayList<>();
+        List<MarkPaperFileDto> subjectiveAnswerFileDtoList = new ArrayList<>();
         if (StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
-            subjectiveAnswerFileDtoList = JSON.parseArray(markPaper.getAnswerFilePath(), SubjectiveAnswerFileDto.class);
+            subjectiveAnswerFileDtoList = JSON.parseArray(markPaper.getAnswerFilePath(), MarkPaperFileDto.class);
         }
         String answerFilePath = fileStoreUtil.uploadFile(file, md5, UploadFileEnum.PDF);
 
-        SubjectiveAnswerFileDto subjectiveAnswerFileDto = null;
-        for (SubjectiveAnswerFileDto answerFileDto : subjectiveAnswerFileDtoList) {
+        MarkPaperFileDto subjectiveAnswerFileDto = null;
+        for (MarkPaperFileDto answerFileDto : subjectiveAnswerFileDtoList) {
             if (paperType.equals(answerFileDto.getPaperType())) {
                 answerFileDto.setFilePathVo(JSON.parseObject(answerFilePath, FilePathVo.class));
                 subjectiveAnswerFileDto = answerFileDto;
@@ -436,7 +436,7 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         }
 
         if (subjectiveAnswerFileDto == null) {
-            subjectiveAnswerFileDto = new SubjectiveAnswerFileDto();
+            subjectiveAnswerFileDto = new MarkPaperFileDto();
             subjectiveAnswerFileDto.setPaperType(paperType);
             subjectiveAnswerFileDto.setFilePathVo(JSON.parseObject(answerFilePath, FilePathVo.class));
             subjectiveAnswerFileDtoList.add(subjectiveAnswerFileDto);
@@ -451,34 +451,31 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     }
 
     @Override
-    public List<SubjectiveAnswerFileDto> previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber) {
+    public List<MarkPaperFileDto> previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        List<SubjectiveAnswerFileDto> subjectiveAnswerFileDtoList = new ArrayList<>();
+        List<MarkPaperFileDto> markPaperFileDtos = new ArrayList<>();
         if (markPaper != null && StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
-            subjectiveAnswerFileDtoList = JSON.parseArray(markPaper.getAnswerFilePath(), SubjectiveAnswerFileDto.class);
-            for (SubjectiveAnswerFileDto answerFileDto : subjectiveAnswerFileDtoList) {
-                answerFileDto.setUrl(teachcloudCommonService.filePreview(JSON.toJSONString(answerFileDto.getFilePathVo())));
-                answerFileDto.setFilePathVo(null);
+            markPaperFileDtos = JSON.parseArray(markPaper.getAnswerFilePath(), MarkPaperFileDto.class);
+            for (MarkPaperFileDto markPaperFileDto : markPaperFileDtos) {
+                markPaperFileDto.setUrl(teachcloudCommonService.filePreview(JSON.toJSONString(markPaperFileDto.getFilePathVo())));
+                markPaperFileDto.setFilePathVo(null);
             }
         }
-        return subjectiveAnswerFileDtoList;
+        return markPaperFileDtos;
     }
 
     @Override
-    public double sumTotalScoreByQuestionId(Long examId, String paperNumber, Long questionId) {
-        Double score = this.baseMapper.sumTotalScoreByQuestionId(examId, paperNumber, questionId);
-        return score != null ? score.doubleValue() : 0d;
-    }
-
-    @Override
-    public MarkQuestion getByExamIdAndPaperNumberAndMainNumberAndSubNumberAndObjective(Long examId, String paperNumber, Integer mainNumber, Integer subNumber, boolean isObjective) {
-        QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkQuestion::getExamId, examId)
-                .eq(MarkQuestion::getPaperNumber, paperNumber)
-                .eq(MarkQuestion::getMainNumber, mainNumber)
-                .eq(MarkQuestion::getSubNumber, subNumber)
-                .eq(MarkQuestion::getObjective, isObjective);
-        return this.getOne(queryWrapper);
+    public List<MarkPaperFileDto> previewPaperFileByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        List<MarkPaperFileDto> markPaperFileDtos = new ArrayList<>();
+        if (markPaper != null && StringUtils.isNotBlank(markPaper.getPaperFilePath())) {
+            markPaperFileDtos = JSON.parseArray(markPaper.getPaperFilePath(), MarkPaperFileDto.class);
+            for (MarkPaperFileDto markPaperFileDto : markPaperFileDtos) {
+                markPaperFileDto.setUrl(teachcloudCommonService.filePreview(JSON.toJSONString(markPaperFileDto.getFilePathVo())));
+                markPaperFileDto.setFilePathVo(null);
+            }
+        }
+        return markPaperFileDtos;
     }
 
     @Override

+ 100 - 136
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -37,7 +37,6 @@ import com.qmth.teachcloud.mark.utils.TaskLock;
 import com.qmth.teachcloud.mark.utils.TaskLockUtil;
 import io.lettuce.core.GeoArgs.Sort;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -110,9 +109,9 @@ public class MarkServiceImpl implements MarkService {
      */
     @Override
     public void releaseTask(SubmitResult submitResult, Long userId) {
-        if (submitResult.getMarkLibrary() != null) {
-            TaskLock taskLock = TaskLockUtil.getFormalTask(String.valueOf(userId));
-            taskLock.remove(submitResult.getMarkLibrary().getStudentId(), submitResult.getMarkLibrary().getTaskNumber(), userId);
+        if (submitResult.getStudentId() != null) {
+            TaskLock taskLock = TaskLockUtil.getFormalTask(String.valueOf(submitResult.getStudentId()));
+            taskLock.remove(submitResult.getStudentId(), 1, userId);
             taskLock.refresh(userId);
         }
     }
@@ -341,7 +340,7 @@ public class MarkServiceImpl implements MarkService {
                 markArbitrateHistory.getUpdateUserId(), markResult.getScore(), markResult.getTrackList(), markResult.getSpecialTagList(), markArbitrateHistory.getUpdateTime(), MarkTaskStatus.ARBITRATED);
         updateMarkedCount(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(),
                 markArbitrateHistory.getQuestionId());
-        checkStudentGroup(markArbitrateHistory.getStudentId(), markQuestionService.getById(markArbitrateHistory.getQuestionId()));
+        checkStudentGroup(markArbitrateHistory.getStudentId(), markQuestionService.getById(markArbitrateHistory.getQuestionId()), null);
         // 评卷质量重新统计
         List<MarkUserQuestion> markUserGroups = markUserQuestionService.listByExamIdAndPaperNumberAndQuestionId(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getQuestionId());
         markUserGroups.forEach(m -> this.updateQuality(m));
@@ -357,11 +356,12 @@ public class MarkServiceImpl implements MarkService {
      *
      * @param studentId
      * @param markQuestion
+     * @param result
      */
-    private void checkStudentGroup(Long studentId, MarkQuestion markQuestion) {
+    private void checkStudentGroup(Long studentId, MarkQuestion markQuestion, MarkResultQuestion result) {
         if (calculateGroup(markQuestion, studentId)) {
             //更新考生分组分数
-            updateStudentGroupScore(studentId, markQuestion);
+            updateStudentGroupScore(studentId, markQuestion, result);
             //未分组的题目
             long unGroupQuestionCount = markQuestionService.countByExamIdAndPaperNumberAndObjectiveAndGroupNumberIsNull(
                     markQuestion.getExamId(), markQuestion.getPaperNumber(), false);
@@ -417,7 +417,7 @@ public class MarkServiceImpl implements MarkService {
     private void buildFormalLibrary(MarkQuestion markQuestion) {
         int pageSize = 100;
         try {
-            lockService.watch(LockType.GROUP, markQuestion.getId());
+            lockService.watch(LockType.QUESTION, markQuestion.getId());
             // 上锁后重复验证分组状态
             MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(markQuestion.getExamId(), markQuestion.getPaperNumber());
             if (MarkPaperStatus.FINISH.equals(markPaper.getStatus())) {
@@ -509,7 +509,7 @@ public class MarkServiceImpl implements MarkService {
             log.error("build formal markTask error for examId=" + markQuestion.getExamId() + ", paperNumber="
                     + markQuestion.getPaperNumber() + ", questionId=" + markQuestion.getId(), e);
         } finally {
-            lockService.unwatch(LockType.GROUP, markQuestion.getId());
+            lockService.unwatch(LockType.QUESTION, markQuestion.getId());
         }
     }
 
@@ -562,7 +562,7 @@ public class MarkServiceImpl implements MarkService {
         return true;
     }
 
-    private void updateStudentGroupScore(Long studentId, MarkQuestion markQuestion) {
+    private void updateStudentGroupScore(Long studentId, MarkQuestion markQuestion, MarkResultQuestion result) {
         MarkSubjectiveScore ss = markSubjectiveScoreService.getByStudentIdAndQuestionId(studentId, markQuestion.getId());
         if (ss == null) {
             ss = new MarkSubjectiveScore();
@@ -573,7 +573,7 @@ public class MarkServiceImpl implements MarkService {
         ss.setQuestionId(markQuestion.getId());
         ss.setMainNumber(markQuestion.getMainNumber());
         ss.setSubNumber(markQuestion.getSubNumber());
-        ss.setScore(markQuestion.getMarkScore());
+        ss.setScore(result.getMarkerScore());
         ss.setMainScore(0.0);
         markSubjectiveScoreService.saveOrUpdateByMultiId(ss);
     }
@@ -636,10 +636,8 @@ public class MarkServiceImpl implements MarkService {
         dto.setEnableAllZore(false);//是否开启全零分(知学知考阅卷默认false)
         dto.setFileServer(null);//图片服务地址
         dto.setUserName(user.getRealName());//评卷员名称
-        dto.getSubject().setAnswerUrl(StringUtils.isBlank(markPaper.getAnswerFilePath()) ? null
-                : teachcloudCommonService.filePreview(markPaper.getAnswerFilePath()));
-//        dto.getSubject().setPaperUrl(StringUtils.isBlank(markPaper.getPaperFilePath()) ? null
-//                : JSON.toJSONString(teachcloudCommonService.filePreview(JSON.parseArray(markPaper.getPaperFilePath(), String.class),  SystemConstant.MARK_JPG_EXPIRE_MINUTE)));
+        dto.getSubject().setAnswerUrl(markQuestionService.previewAnswerFileByExamIdAndPaperNumber(examId, paperNumber));
+        dto.getSubject().setPaperUrl(markQuestionService.previewPaperFileByExamIdAndPaperNumber(examId, paperNumber));
         BasicCourse basicCourse = basicCourseService.getById(markPaper.getCourseId());
         dto.getSubject().setCode(markPaper.getPaperNumber());
         dto.getSubject().setName(basicCourse != null ? basicCourse.getName() : null);
@@ -695,29 +693,6 @@ public class MarkServiceImpl implements MarkService {
         return dto;
     }
 
-//    @Override
-//    public List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber) {
-//        List<MarkUserQuestion> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndUserId(examId,
-//                paperNumber, userId);
-//        List<MarkGroupDto> list = new ArrayList<MarkGroupDto>();
-//        for (MarkUserQuestion markUserGroup : markUserGroups) {
-//            MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber,
-//                    markUserGroup.getGroupNumber());
-//            markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId,
-//                    paperNumber, markUserGroup.getGroupNumber(), false));
-//            MarkGroupDto dto = new MarkGroupDto();
-//            dto.setGroupNumber(markUserGroup.getGroupNumber());
-//            dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber,
-//                    markUserGroup.getGroupNumber()));
-//            dto.setMarkedCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber,
-//                    markUserGroup.getGroupNumber(), Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED)));
-//            dto.setGroupQuestions(markGroup.getGroupQuestions());
-//            dto.setTitle(markGroup.getTitle());
-//            list.add(dto);
-//        }
-//        return list;
-//    }
-
     @Override
     public void clear(Long userId, Long examId, String paperNumber) {
         String key = String.valueOf(userId);
@@ -757,34 +732,18 @@ public class MarkServiceImpl implements MarkService {
         Long userId = ServletUtil.getRequestUserId();
         for (MarkHeaderGroupResult groupResult : markHeaderGroupResultList) {
             try {
-                lockService.watch(LockType.GROUP, groupResult.getQuestionId());
+                lockService.watch(LockType.QUESTION, groupResult.getQuestionId());
                 Long currentTime = System.currentTimeMillis();
-//                if (groupResult.getTrackList() != null) {
-//                    for (MarkScoreList scoreList : groupResult.getScore()) {
-//                        String questionNumber = scoreList.getMainNumber() + "." + scoreList.getSubNumber();
-//                        markHeaderTrackService.deleteByExamIdAndPaperNumberAndGroupNumberAndStudentIdAndQuestionNumber(
-//                                markStudent.getExamId(), markStudent.getPaperNumber(), groupResult.getGroupNumber(),
-//                                groupResult.getStudentId(), questionNumber);
-//                    }
-//                    List<MarkHeaderTrack> tracks = groupResult.getTrackList(groupResult, markStudent, userId);
-//                    markHeaderTrackService.saveOrUpdateBatchByMultiId(tracks);
-//                }
-//                if (groupResult.getHeaderTagList(groupResult, userId) != null) {
-//                    markHeaderTagService.deleteByExamIdAndPaperNumberAndGroupNumberAndStudentId(markStudent.getExamId(),
-//                            markStudent.getPaperNumber(), groupResult.getGroupNumber(), groupResult.getStudentId());
-//                    List<MarkHeaderTag> tags = groupResult.getHeaderTagList(groupResult, userId);
-//                    markHeaderTagService.saveOrUpdateBatch(tags);
-//                }
                 updateMarkSubjectScore(markStudent, groupResult);
                 markTaskService.updateHeaderResult(markStudent.getExamId(), markStudent.getPaperNumber(),
                         groupResult.getQuestionId(), groupResult.getStudentId(), userId, groupResult.getScore(), groupResult.getTrackList(), groupResult.getSpecialTagList(), currentTime, MarkTaskStatus.MARKED);
                 updateMarkedCount(markStudent.getExamId(), markStudent.getPaperNumber(), groupResult.getQuestionId());
                 markStudentService.updateCheckInfo(markStudent.getId(), userId);
-                checkStudentGroup(groupResult.getStudentId(), markQuestionService.getById(groupResult.getQuestionId()));
+                checkStudentGroup(groupResult.getStudentId(), markQuestionService.getById(groupResult.getQuestionId()), null);
             } catch (ApiException e) {
                 throw ExceptionResultEnum.ERROR.exception(e.getMessage());
             } finally {
-                lockService.unwatch(LockType.GROUP, groupResult.getQuestionId());
+                lockService.unwatch(LockType.QUESTION, groupResult.getQuestionId());
             }
         }
 
@@ -823,26 +782,20 @@ public class MarkServiceImpl implements MarkService {
 
     @Override
     public IPage<Task> getHistory(Long userId, int pageNumber, int pageSize, Sort sort, String order, Long examId,
-                                  String paperNumber, Integer groupNumber, String secretNumber, Double markerScore) {
+                                  String paperNumber, String secretNumber, Double markerScore) {
         if (!"marker_time".equals(order) && !"marker_score".equals(order)) {
             order = "marker_time";
         }
-//        MarkGroup group = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-//        if (group == null) {
-//            throw ExceptionResultEnum.ERROR.exception("评卷大题不存在");
-//        }
-        Page<MarkTask> page = new Page<>(pageNumber, pageSize);
+        Page<Long> page = new Page<>(pageNumber, pageSize);
         OrderItem orderItem = new OrderItem(order, sort.equals(Sort.asc));
         page.addOrder(orderItem);
-        IPage<MarkTask> list = markTaskService.listPageHistory(page, userId, examId, paperNumber, groupNumber,
-                secretNumber, markerScore);
-        List<Task> recordsDtos = new ArrayList<Task>();
-        for (MarkTask task : list.getRecords()) {
-            Task dto = taskService.build(task);
-            dto.setPrevious(true);
+        IPage<Long> list = markTaskService.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore);
+        List<Task> recordsDtos = new ArrayList<>();
+        for (Long studentId : list.getRecords()) {
+            Task dto = taskService.build(studentId);
             recordsDtos.add(dto);
         }
-        IPage<Task> result = new Page<Task>();
+        IPage<Task> result = new Page<>();
         result.setCurrent(list.getCurrent());
         result.setPages(list.getPages());
         result.setRecords(recordsDtos);
@@ -867,24 +820,24 @@ public class MarkServiceImpl implements MarkService {
 //            throw ExceptionResultEnum.ERROR.exception("评卷任务被重置,请点击右上角返回按钮,重新在评卷入口菜单点击评卷");
 //        }
         Task task = null;
-        List<MarkTask> list;
-        Long questionId = null;
+        List<Long> studentIds;
         int pageNumber = 1;
         while (task == null) {
             if (markPaper.getClassMark()) {
-                list = markTaskService.findUnMarkedFilterClass(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionModel);
+                studentIds = markTaskService.findUnMarkedFilterClass(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionModel);
             } else {
-                list = markTaskService.findUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionModel);
+                studentIds = markTaskService.findUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionModel);
             }
-            if (list.isEmpty()) {
+            if (studentIds.isEmpty()) {
                 break;
             }
-            for (MarkTask t : list) {
-                if (this.applyTask(t, userId)) {
-                    task = taskService.build(t);
-                    break;
-                }
+            for (Long studentId : studentIds) {
+//                if (this.applyTask(studentId, userId)) {
+                List<MarkTask> markTaskList = markTaskService.listByStudentIdAndUserId(studentId, userId);
+                task = taskService.build(userId, markTaskList);
+//                }
             }
+
             if (task == null) {
                 pageNumber++;
             }
@@ -912,10 +865,29 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public boolean hasApplied(MarkTask t, Long userId) {
-        String key = t.getExamId() + "_" + t.getPaperNumber() + "_" + t.getQuestionId();
+    public boolean applyTask(Long studentId, Long userId) {
+        // 查询待领取任务时,已经做了多评同一studentId互斥处理
+        String key = String.valueOf(studentId);
+        TaskLock taskLock = TaskLockUtil.getFormalTask(key);
+        boolean lock = taskLock.add(studentId, 1, userId);
+        // 上锁失败直接返回
+        if (!lock) {
+            return false;
+        }
+        // 重复校验任务状态
+        if (markTaskService.countByStudentIdAndStatus(studentId, MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED) > 0) {
+            return true;
+        } else {
+            taskLock.remove(studentId, 1, userId);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean hasApplied(Long studentId, Long userId) {
+        String key = String.valueOf(studentId);
         TaskLock taskLock = TaskLockUtil.getFormalTask(key);
-        return taskLock.exist(t.getStudentId(), t.getTaskNumber(), userId);
+        return taskLock.exist(studentId, 1, userId);
     }
 
     @Override
@@ -960,20 +932,17 @@ public class MarkServiceImpl implements MarkService {
 
     @Override
     public SubmitResult saveTask(Long examId, String paperNumber, Long userId, MarkResult result) {
-//        MarkUserQuestion markUserGroup = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId,
-//                paperNumber, groupNumber, userId);
-//        if (markUserGroup == null) {
-//            throw ExceptionResultEnum.ERROR.exception("评卷员未绑定该评卷任务");
-//        }
-//        MarkGroup group = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(markUserGroup.getExamId(),
-//                markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber());
-//        if (group == null) {
-//            throw ExceptionResultEnum.ERROR.exception("评卷分组不存在");
-//        }
+        for (MarkResultQuestion question : result.getQuestionList()) {
+            MarkUserQuestion markUserQuestion = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, question.getQuestionId(), userId);
+            if (markUserQuestion == null) {
+                throw ExceptionResultEnum.ERROR.exception("评卷员未绑定题目" + question.getMainNumber() + "-" + question.getSubNumber());
+            }
+        }
+
         SubmitResult sr = null;
         try {
             lockService.watch(LockType.EXAM_SUBJECT, examId, paperNumber);
-            lockService.watch(LockType.MARK_USER_GROUP, userId);
+            lockService.watch(LockType.MARK_USER_QUESTION, userId);
             lockService.waitlock(LockType.STUDENT, result.getStudentId());
             sr = submitResult(examId, paperNumber, userId, result);
             if (sr.isSuccess()) {
@@ -983,7 +952,7 @@ public class MarkServiceImpl implements MarkService {
             log.error("save task error", e);
         } finally {
             lockService.unlock(LockType.STUDENT, result.getStudentId());
-            lockService.unwatch(LockType.MARK_USER_GROUP, userId);
+            lockService.unwatch(LockType.MARK_USER_QUESTION, userId);
             lockService.unwatch(LockType.EXAM_SUBJECT, examId, paperNumber);
         }
 
@@ -996,36 +965,42 @@ public class MarkServiceImpl implements MarkService {
     private SubmitResult submitResult(Long examId, String paperNumber, Long userId, MarkResult result) {
         int spentAvg = result.getSpent() / result.getQuestionList().size();
         for (MarkResultQuestion markResultQuestion : result.getQuestionList()) {
-            markResultQuestion.setSpent(spentAvg);
-            MarkUserQuestion markUserQuestion = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, markResultQuestion.getQuestionId(), userId);
-            MarkQuestion markQuestion = markQuestionService.getById(markResultQuestion.getQuestionId());
-            MarkTask task = markTaskService.getById(markResultQuestion.getTaskId());
-            if (task != null && task.getExamId().equals(markUserQuestion.getExamId())
-                    && task.getPaperNumber().equals(markUserQuestion.getPaperNumber())
-                    && task.getQuestionId().equals(markUserQuestion.getQuestionId())) {
-                // 问题卷
-                Long now = System.currentTimeMillis();
-                if (markResultQuestion.isProblem()) {
-                    // 状态更新
-                    if (markTaskService.updateProblemResult(task.getId(), userId, now, markResultQuestion.getSpent())) {
-                        saveProblemHistory(markResultQuestion, task, userId);
-                        updateMarkedCount(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(), markUserQuestion.getQuestionId());
-                        // 未评完
-                        resetStudentGroup(task.getStudentId());
-                        return SubmitResult.success(task);
+            try {
+                lockService.watch(LockType.QUESTION, markResultQuestion.getQuestionId());
+                markResultQuestion.setSpent(spentAvg);
+                MarkUserQuestion markUserQuestion = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, markResultQuestion.getQuestionId(), userId);
+                MarkQuestion markQuestion = markQuestionService.getById(markResultQuestion.getQuestionId());
+                MarkTask task = markTaskService.getById(markResultQuestion.getTaskId());
+                if (task != null && task.getExamId().equals(markUserQuestion.getExamId())
+                        && task.getPaperNumber().equals(markUserQuestion.getPaperNumber())
+                        && task.getQuestionId().equals(markUserQuestion.getQuestionId())) {
+                    // 问题卷
+                    Long now = System.currentTimeMillis();
+                    if (markResultQuestion.isProblem()) {
+                        // 状态更新
+                        if (markTaskService.updateProblemResult(task.getId(), userId, now, markResultQuestion.getSpent())) {
+                            saveProblemHistory(markResultQuestion, task, userId);
+                            updateMarkedCount(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(), markUserQuestion.getQuestionId());
+                            // 未评完
+                            resetStudentGroup(task.getStudentId());
+                        }
                     }
-                }
-                if (markResultQuestion.getMarkerScore() <= markQuestion.getTotalScore()) {//阅卷分是否小于等于该组总分
-                    if (submitTask(task, userId, markQuestion, markUserQuestion, markResultQuestion)) {
-                        updateMarkedCount(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(),
-                                markUserQuestion.getQuestionId());
-                        return SubmitResult.success(task);
+                    if (markResultQuestion.getMarkerScore() <= markQuestion.getTotalScore()) {//阅卷分是否小于等于该组总分
+                        if (submitTask(task, userId, markQuestion, markResultQuestion)) {
+                            updateMarkedCount(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(),
+                                    markUserQuestion.getQuestionId());
+                        }
                     }
                 }
+            } catch (Exception e) {
+                throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+            } finally {
+                lockService.unwatch(LockType.QUESTION, markResultQuestion.getQuestionId());
             }
         }
+        return SubmitResult.success(result.getStudentId());
 
-        return SubmitResult.faile();
+//        return SubmitResult.faile();
     }
 
     private void saveProblemHistory(MarkResultQuestion result, MarkTask task, Long userId) {
@@ -1052,12 +1027,12 @@ public class MarkServiceImpl implements MarkService {
         markProblemHistoryService.save(history);
     }
 
-    private boolean submitTask(MarkTask task, Long userId, MarkQuestion markQuestion, MarkUserQuestion markUserQuestion, MarkResultQuestion result) {
+    private boolean submitTask(MarkTask task, Long userId, MarkQuestion markQuestion, MarkResultQuestion result) {
         // 非本人领取的待评任务
-        if ((task.getStatus() == MarkTaskStatus.WAITING || task.getStatus() == MarkTaskStatus.REJECTED)
-                && !hasApplied(task, markUserQuestion.getId())) {
-            return false;
-        }
+//        if ((task.getStatus() == MarkTaskStatus.WAITING || task.getStatus() == MarkTaskStatus.REJECTED)
+//                && !hasApplied(task.getStudentId(), userId)) {
+//            return false;
+//        }
         // 非本人的回评任务
         if ((task.getStatus() == MarkTaskStatus.MARKED) && !task.getUserId().equals(userId)) {
             return false;
@@ -1076,17 +1051,6 @@ public class MarkServiceImpl implements MarkService {
             // 条件不符更新失败,直接返回
             return false;
         }
-//        // 保存阅卷轨迹
-//        // int unansweredCount = 0;
-//        if (result.getTrackList() != null && !result.isUnselective()) {
-//            markTrackService.deleteByTaskId(task.getId());
-//            markTrackService.saveBatch(result.getTrackList(task, userId));
-//        }
-//        // 保存特殊标记
-//        if (result.getSpecialTagList() != null && !result.isUnselective()) {
-//            markSpecialTagService.deleteByTaskId(task.getId());
-//            markSpecialTagService.saveBatch(result.getSpecialTagList(task));
-//        }
         // 判断多评模式下是否需要仲裁
         MarkArbitrateHistory history = null;
         if (markQuestion.getArbitrateThreshold() != null && markQuestion.getArbitrateThreshold() > 0) {
@@ -1113,7 +1077,7 @@ public class MarkServiceImpl implements MarkService {
             resetStudentGroup(task.getStudentId());
         } else {
             // 判断当前分组是否已完成评卷
-            checkStudentGroup(task.getStudentId(), markQuestion);
+            checkStudentGroup(task.getStudentId(), markQuestion, result);
         }
         return true;
     }

+ 36 - 36
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1,34 +1,5 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.awt.*;
-import java.awt.color.ColorSpace;
-import java.awt.image.BufferedImage;
-import java.awt.image.ColorConvertOp;
-import java.io.*;
-import java.lang.reflect.Field;
-import java.math.BigDecimal;
-import java.net.URLEncoder;
-import java.util.*;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-import javax.imageio.ImageIO;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.NotNull;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.FileCopyUtils;
-import org.springframework.web.multipart.MultipartFile;
-
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -74,6 +45,7 @@ import com.qmth.teachcloud.mark.dto.ScanOmrTaskStatusDto;
 import com.qmth.teachcloud.mark.dto.UnexistStudentDto;
 import com.qmth.teachcloud.mark.dto.mark.*;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 import com.qmth.teachcloud.mark.dto.mark.score.*;
 import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.*;
@@ -84,6 +56,33 @@ import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.BatchGetDataUtil;
 import com.qmth.teachcloud.mark.utils.Calculator;
 import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
+import java.awt.*;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -2056,7 +2055,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                             continue;
                         }
                         List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
-                        List<MarkTrack> trackList = new ArrayList<>();
+                        List<TrackDTO> trackList = new ArrayList<>();
                         List<MarkTask> markTaskList = markTaskService.listByStudentId(s.getId());
                         for (MarkTask markTask : markTaskList) {
                             trackList.addAll(markTask.listMarkerTrack());
@@ -2072,7 +2071,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                             File sheet = fileUploadService.downloadFile(JSON.toJSONString(vo), vo.getPath());
                             File track = new File(tempFile.getPath() + File.separator + s.getStudentCode() + "-" + (i + 1) + ".jpg");
                             int offsetIndex = i + 1;
-                            List<MarkTrack> tracks = trackList.stream().filter(t -> t.getOffsetIndex().equals(offsetIndex)).collect(Collectors.toList());
+                            List<TrackDTO> tracks = trackList.stream().filter(t -> t.getOffsetIndex() != offsetIndex).collect(Collectors.toList());
                             this.createTrack(sheet, track, tracks);
                             Image image = Image.getInstance(track.getPath());
                             image.scaleAbsolute(PageSize.A3.getHeight() - 100, PageSize.A3.getWidth() - 100);
@@ -2096,7 +2095,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         }
     }
 
-    private void createTrack(File sheet, File track, List<MarkTrack> trackList) throws IOException {
+    private void createTrack(File sheet, File track, List<TrackDTO> trackList) throws IOException {
         {
             FileOutputStream output = null;
             try {
@@ -2109,10 +2108,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 // 写入签名
                 if (trackList != null && !trackList.isEmpty()) {
                     for (int i = 0; i < trackList.size(); i++) {
-                        MarkTrack t = trackList.get(i);
+                        TrackDTO t = trackList.get(i);
                         BigDecimal x = new BigDecimal(t.getOffsetX());
                         BigDecimal y = new BigDecimal(t.getOffsetY());
-                        g.drawString(t.getScore().toString(), x.intValue(), y.intValue());
+                        g.drawString(String.valueOf(t.getScore()), x.intValue(), y.intValue());
                     }
                 }
                 g.dispose();
@@ -2429,10 +2428,11 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         this.update(markStudentUpdateWrapper);
         return UpdateTimeVo.create();
     }
+
     @Override
-    public boolean add(Long examId, String coursePaperId, String studentCode, String studentName,String paperType){
+    public boolean add(Long examId, String coursePaperId, String studentCode, String studentName, String paperType) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        MarkPaper markPaper = markPaperService.getByExamIdAndCoursePaperId(examId,coursePaperId);
+        MarkPaper markPaper = markPaperService.getByExamIdAndCoursePaperId(examId, coursePaperId);
         MarkStudent markStudent = new MarkStudent(SystemConstant.getDbUuid(), examId, null, markPaper.getCourseId(), markPaper.getPaperNumber(), coursePaperId, markPaper.getSerialNumber(), paperType, studentCode, "", null, null, null, null, user.getId());
         if (markStudent.getSecretNumber() == null) {
             markStudent.randomSecretNumber();

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

@@ -32,15 +32,15 @@ public class MarkSyncServiceImpl implements MarkSyncService {
         try {
             if (markUserQuestion != null) {
                 lockService.waitlock(LockType.EXAM_SUBJECT, markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
-                lockService.waitlock(LockType.MARK_USER_GROUP, markUserQuestion.getId());
-                lockService.watch(LockType.GROUP, markUserQuestion.getQuestionId());
+                lockService.waitlock(LockType.MARK_USER_QUESTION, markUserQuestion.getId());
+                lockService.watch(LockType.QUESTION, markUserQuestion.getQuestionId());
                 markService.resetMarker(markUserQuestion);
             }
         } catch (Exception e) {
             log.error("reset marker error", e);
         } finally {
-            lockService.unwatch(LockType.GROUP, markUserQuestion.getQuestionId());
-            lockService.unlock(LockType.MARK_USER_GROUP, markUserQuestion.getId());
+            lockService.unwatch(LockType.QUESTION, markUserQuestion.getQuestionId());
+            lockService.unlock(LockType.MARK_USER_QUESTION, markUserQuestion.getId());
             lockService.unlock(LockType.EXAM_SUBJECT, markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
             lockService.unlock(LockType.MARKER_RESET, markUserQuestion.getId());
         }

+ 38 - 15
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -229,31 +229,38 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public IPage<MarkTask> listPageHistory(Page<MarkTask> page, Long userId, Long examId, String paperNumber,
-                                           Integer groupNumber, String secretNumber, Double markerScore) {
-        return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, groupNumber, secretNumber, markerScore);
+    public IPage<Long> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore) {
+        return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore);
     }
 
     @Override
-    public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber,
-                                       Long userId, QuestionModel questionModel) {
+    public List<Long> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber,
+                                   Long userId, QuestionModel questionModel) {
         return this.baseMapper.findUnMarked(page, examId, paperNumber, userId, questionModel);
     }
 
     @Override
-    public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber,
-                                                  Long userId, QuestionModel questionModel) {
+    public List<Long> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber,
+                                              Long userId, QuestionModel questionModel) {
         return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, questionModel);
     }
 
     @Override
-    public int countByIdAndStatus(Long id, MarkTaskStatus status) {
+    public int countByIdAndStatus(Long studentId, MarkTaskStatus status) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkTask::getId, id)
+        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
                 .eq(MarkTask::getStatus, status);
         return this.count(queryWrapper);
     }
 
+    @Override
+    public int countByStudentIdAndStatus(Long studentId, MarkTaskStatus... status) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
+                .in(MarkTask::getStatus, status);
+        return this.count(queryWrapper);
+    }
+
     @Override
     public List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
@@ -308,8 +315,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getStatus, status)
                 .set(MarkTask::getUserId, userId)
                 .set(MarkTask::getMarkerScore, result.getMarkerScore())
-                .set(MarkTask::getMarkerTrackList, JSON.toJSONString(result.getTrackList()))
-                .set(MarkTask::getMarkerTagList, JSON.toJSONString(result.getSpecialTagList()))
+                .set(MarkTask::getMarkerTrackList, JSON.toJSONString(result.getMarkerTrackList()))
+                .set(MarkTask::getMarkerTagList, JSON.toJSONString(result.getMarkerTagList()))
                 .set(MarkTask::getMarkerTime, now)
                 .set(MarkTask::getMarkerSpent, result.getSpent())
                 .set(MarkTask::getHeaderId, null)
@@ -364,7 +371,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         }
         try {
             lockService.watch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
-            lockService.watch(LockType.GROUP, markTask.getQuestionId());
+            lockService.watch(LockType.QUESTION, markTask.getQuestionId());
             lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
             if (!markTask.getStatus().equals(MarkTaskStatus.MARKED)) {
                 throw ExceptionResultEnum.ERROR.exception("当前任务不允许打回");
@@ -374,13 +381,14 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
             log.error("打回失败", e);
         } finally {
             lockService.unlock(LockType.STUDENT, markTask.getStudentId());
-            lockService.unwatch(LockType.GROUP, markTask.getQuestionId());
+            lockService.unwatch(LockType.QUESTION, markTask.getQuestionId());
             lockService.unwatch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
         }
     }
 
     @Override
     public Task getMarkTrack(Long id) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         MarkTask markTask = this.getById(id);
         if (markTask == null) {
             throw ExceptionResultEnum.ERROR.exception("任务不存在,请刷新列表");
@@ -388,8 +396,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         if (!MarkTaskStatus.MARKED.equals(markTask.getStatus())) {
             throw ExceptionResultEnum.ERROR.exception("已评任务才允许打回");
         }
-        Task dto = taskService.build(markTask);
-        dto.setPrevious(true);
+        Task dto = taskService.build(sysUser.getId(), Arrays.asList(markTask));
         return dto;
     }
 
@@ -411,4 +418,20 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     public Long minQuestionIdByExamIdAndPaperNumber(Long examId, String paperNumber, MarkTaskStatus... statusList) {
         return this.baseMapper.minQuestionIdByExamIdAndPaperNumber(examId, paperNumber, statusList);
     }
+
+    @Override
+    public List<MarkTask> listByStudentIdAndUserId(Long studentId, Long userId) {
+        return baseMapper.listByStudentIdAndUserId(studentId, userId);
+    }
+
+    @Override
+    public List<MarkTask> listByStudentIdAndMarkerId(Long studentId, Long markerId) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
+                .eq(MarkTask::getUserId, markerId)
+                .eq(MarkTask::getStatus, MarkTaskStatus.MARKED)
+                .orderByAsc(MarkTask::getMainNumber)
+                .orderByAsc(MarkTask::getSubNumber);
+        return this.list(queryWrapper);
+    }
 }

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

@@ -26,4 +26,9 @@ public class MarkUserPaperServiceImpl extends ServiceImpl<MarkUserPaperMapper, M
                 .eq(MarkUserPaper::getUserId, userId);
         return this.getOne(queryWrapper);
     }
+
+    @Override
+    public String getSubjectiveQuestionNumber(Long examId, String paperNumber, Long userId) {
+        return this.baseMapper.getSubjectiveQuestionNumber(examId, paperNumber, userId);
+    }
 }

+ 12 - 13
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java

@@ -74,8 +74,8 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
         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();
-            int markedCount = record.getMarkedCount();
+            int taskCount = 0;
+            int markedCount = 0;
             MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(record.getExamId(), record.getPaperNumber());
             // 分班阅
             List<String> classNames = null;
@@ -99,8 +99,7 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
                 record.setPercent(bigDecimal.doubleValue());
             }
             // 分组题目
-            MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
-            record.setQuestionNumber(markQuestion.getQuestionNumber());
+            record.setQuestionNumber(markUserPaperService.getSubjectiveQuestionNumber(record.getExamId(), record.getPaperNumber(), sysUser.getId()));
         }
 
         return markEntranceDtoIPage;
@@ -152,16 +151,16 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
 
     private List<Long> listMergeQuestionId(Long examId, String paperNumber, Long questionId) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+
+        MarkQuestion markQuestion = markQuestionService.getById(questionId);
+        if (markQuestion == null) {
+            throw ExceptionResultEnum.ERROR.exception("题目不存在");
+        }
         List<Long> questionIds = new ArrayList<>();
-        if (markPaper != null && markPaper.getMergeMarker() != null && markPaper.getMergeMarker()) {
-            // 逻辑解绑
-            MarkQuestion markQuestion = markQuestionService.getById(questionId);
-            if (markQuestion == null) {
-                throw ExceptionResultEnum.ERROR.exception("题目不存在");
-            }
+        if (markQuestion.getQuestionType() == 4 && markPaper != null && markPaper.getMergeMarker() != null && markPaper.getMergeMarker()) {
             List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
             // 填空题,整个大题一起解绑
-            return markQuestionList.stream().filter(m -> markQuestion.getMainNumber().equals(m.getMainNumber()) && "4".equals(m.getQuestionType())).map(MarkQuestion::getId).collect(Collectors.toList());
+            return markQuestionList.stream().filter(m -> markQuestion.getMainNumber().equals(m.getMainNumber()) && m.getQuestionType() == 4).map(MarkQuestion::getId).collect(Collectors.toList());
         } else {
             questionIds.add(questionId);
         }
@@ -206,12 +205,12 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
             MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
             if (markUserGroup != null) {
                 try {
-                    lockService.waitlock(LockType.MARK_USER_GROUP, markUserGroupId);
+                    lockService.waitlock(LockType.MARK_USER_QUESTION, markUserGroupId);
                     markService.releaseByMarkUserGroup(markUserGroup);
                 } catch (Exception e) {
                     log.error("release marker error", e);
                 } finally {
-                    lockService.unlock(LockType.MARK_USER_GROUP, markUserGroupId);
+                    lockService.unlock(LockType.MARK_USER_QUESTION, markUserGroupId);
                 }
             }
         }

+ 97 - 67
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java

@@ -8,6 +8,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 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.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
@@ -45,27 +46,23 @@ public class TaskServiceImpl implements TaskService {
         MarkStudent markStudent = markStudentService.getById(markArbitrateHistory.getStudentId());
         Task task = new Task();
         task.setStudentId(markArbitrateHistory.getStudentId());
-        task.setTaskId(markArbitrateHistory.getId());
         task.setSecretNumber(markArbitrateHistory.getSecretNumber());
-        task.setQuestionList(buildArbitrateStep(markQuestion, markArbitrateHistory));
         if (StringUtils.isNotBlank(markStudent.getObjectiveScoreList())) {
             task.setObjectiveScore(markStudent.getObjectiveScore());
         }
         if (StringUtils.isNotBlank(markStudent.getSheetPath())) {
             task.setSheetUrls(teachcloudCommonService.filePreview(markStudent.getSheetPathList(), SystemConstant.MARK_JPG_EXPIRE_MINUTE));
         }
-        task.setMarkerTime(markArbitrateHistory.getUpdateTime());
-        if (markArbitrateHistory.getTotalScore() != null) {
-            task.setMarkerScore(markArbitrateHistory.getTotalScore());
-        }
         if (StringUtils.isNotBlank(markQuestion.getPicList())) {
             task.setSliceConfig(JSON.parseArray(markQuestion.getPicList(), MarkConfigItem.class));
         }
+        task.setQuestionList(buildArbitrateStep(markQuestion, markArbitrateHistory));
         return task;
     }
 
     @Override
     public Task build(Long studentId) {
+        SysUser user = (SysUser) ServletUtil.getRequestUser();
         MarkStudentVo markStudent = markStudentService.getMarkStudentVoByStudentId(studentId);
         Task task = new Task();
         if (markStudent != null) {
@@ -82,20 +79,18 @@ public class TaskServiceImpl implements TaskService {
             task.setSheetUrls(teachcloudCommonService.fileMarkPreview(markStudent.getSheetPathList()));
 
             if (!markStudent.getSubjectiveStatus().equals(SubjectiveStatus.UNMARK)) {
-                task.setQuestionList(buildMarkStep(markStudent));
-                task.setSpecialTagList(getMarkSpecialTagList(markStudent));
-                task.setHeaderTagList(getHeaderTagList(markStudent));
+                List<MarkTask> markTaskList = markTaskService.listByStudentIdAndMarkerId(studentId, user.getId());
+                task.setQuestionList(buildQuestionList(user.getId(), markTaskList));
             }
             if (StringUtils.isNotBlank(markStudent.getObjectiveScoreList())) {
                 task.setObjectiveScore(markStudent.getObjectiveScore());
             }
-            task.setMarkerScore(markStudent.getTotalScore());
             return task;
         }
         return task;
     }
 
-    private List<MarkStepDTO> buildMarkStep(MarkStudent markStudent) {
+    /*private List<MarkStepDTO> buildMarkStep(MarkStudent markStudent) {
         Long examId = markStudent.getExamId();
         String paperNumber = markStudent.getPaperNumber();
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
@@ -116,15 +111,15 @@ public class TaskServiceImpl implements TaskService {
             // 增加阅卷轨迹列表获取
             List<MarkTask> markTaskList = markTaskService.listByStudentIdAndQuestionId(markStudent.getId(), question.getId());
             // 仲裁轨迹
-            List<MarkHeaderTrack> headerTracks = new ArrayList<>();
+            List<TrackDTO> headerTracks = new ArrayList<>();
             for (MarkTask markTask : markTaskList) {
                 headerTracks.addAll(markTask.listHeaderTrack());
             }
             Map<Long, String> userNameMap = new HashMap<>();
             // 不管单评还是多评显示所有评卷员给分轨迹
             for (MarkTask markTask : markTaskList) {
-                List<MarkTrack> tracks = markTask.listMarkerTrack();
-                for (MarkTrack track : tracks) {
+                List<TrackDTO> tracks = markTask.listMarkerTrack();
+                for (TrackDTO track : tracks) {
                     if (userNameMap.get(track.getUserId()) == null) {
                         SysUser user = sysUserService.getByUserId(track.getUserId());
                         userNameMap.put(track.getUserId(), user.getRealName() + "(" + user.getLoginName() + ")");
@@ -177,7 +172,7 @@ public class TaskServiceImpl implements TaskService {
             list.add(step);
         }
         return list;
-    }
+    }*/
 
     private MarkerTrackDTO replaceTrackFromHeaderTrack(MarkTrack markTrack, List<MarkHeaderTrack> headerTracks, Map<Long, String> userNameMap) {
         MarkerTrackDTO markerTrackDTO = new MarkerTrackDTO(markTrack, userNameMap.get(markTrack.getUserId()));
@@ -192,31 +187,33 @@ public class TaskServiceImpl implements TaskService {
         return markerTrackDTO;
     }
 
-    private List<MarkStepDTO> buildArbitrateStep(MarkQuestion markQuestion, MarkArbitrateHistory markArbitrateHistory) {
-        List<MarkStepDTO> list = new LinkedList<>();
+    private List<TaskQuestion> buildArbitrateStep(MarkQuestion markQuestion, MarkArbitrateHistory markArbitrateHistory) {
+        List<TaskQuestion> list = new LinkedList<>();
 
         List<MarkTask> markTaskList = markTaskService.listByStudentIdAndQuestionId(markArbitrateHistory.getStudentId(), markArbitrateHistory.getQuestionId());
         List<ScoreItem> sItems = new ArrayList<ScoreItem>();
-        MarkStepDTO step = buildStep(markQuestion);
+        TaskQuestion step = buildStep(markQuestion);
         if (markArbitrateHistory != null) {
             step.setScore(sItems.get(0).getScore());
+            step.setMarkerTime(markArbitrateHistory.getUpdateTime());
+            if (markArbitrateHistory.getTotalScore() != null) {
+                step.setMarkerScore(markArbitrateHistory.getTotalScore());
+            }
             // 增加阅卷轨迹列表获取
-            String questionNumber = markQuestion.getQuestionNumber();
-            // todo 轨迹 2025-02-25
-//            for (MarkHeaderTrack track : tracks) {
-//                if (track.getQuestionNumber().equals(questionNumber)) {
-//                    step.addTrack(new TrackDTO(track));
-//                }
-//            }
+            List<TrackDTO> tracks = new ArrayList<>();
+            for (MarkTask markTask : markTaskList) {
+                tracks.addAll(markTask.listHeaderTrack());
+            }
+            step.setHeaderTrackList(tracks.toArray(new TrackDTO[tracks.size()]));
         }
         list.add(step);
         return list;
     }
 
-    private MarkStepDTO buildStep(MarkQuestion question) {
-        MarkStepDTO step = new MarkStepDTO();
+    private TaskQuestion buildStep(MarkQuestion question) {
+        TaskQuestion step = new TaskQuestion();
         step.setMainNumber(question.getMainNumber());
-        step.setSubNumber(String.valueOf(question.getSubNumber()));
+        step.setSubNumber(question.getSubNumber());
         step.setQuestionId(question.getId());
         step.setTitle(question.getMainTitle());
         step.setDefaultScore(0d);
@@ -228,69 +225,104 @@ public class TaskServiceImpl implements TaskService {
     }
 
     @Override
-    public Task build(MarkTask t) {
+    public Task build(Long userId, List<MarkTask> markTaskList) {
+        Long markStudentId = markTaskList.get(0).getStudentId();
+        MarkStudent student = markStudentService.getById(markStudentId);
         Task task = new Task();
-        task.setTaskId(t.getId());
-        task.setQuestionId(t.getQuestionId());
-        task.setSecretNumber(t.getSecretNumber());
-        task.setMarkerTime(t.getMarkerTime());
-        task.setPaperNumber(t.getPaperNumber());
-        task.setMarkerScore(t.getMarkerScore());
-        task.setRejected(t.getStatus().equals(MarkTaskStatus.REJECTED));
-        task.setPrevious(t.getStatus().equals(MarkTaskStatus.MARKED));
-        task.setStudentId(t.getStudentId());
-        task.setStudentCode(t.getStudentCode());
-        task.setQuestionList(buildMarkStep(t));
-        task.setSpecialTagList(getMarkSpecialTagList(t));
-        MarkStudent student = markStudentService.getById(t.getStudentId());
+        task.setSecretNumber(student.getSecretNumber());
+        task.setPaperNumber(student.getPaperNumber());
+        task.setStudentId(markStudentId);
+        task.setStudentCode(student.getStudentCode());
+        task.setPaperType(student.getPaperType());
         task.setPaperType(student.getPaperType());
         task.setSheetUrls(teachcloudCommonService.fileMarkPreview(student.getSheetPathList()));
-        MarkQuestion markQuestion = markQuestionService.getById(t.getQuestionId());
-        task.setSliceConfig(markQuestion.getPictureConfigList());
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(t.getExamId(), t.getPaperNumber());
+        task.setSliceConfig(buildPic(markTaskList));
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(student.getExamId(), student.getPaperNumber());
         task.setObjectiveScore(markPaper.getShowObjectScore() ? student.getObjectiveScore() : null);
+        // 题目数据
+        task.setQuestionList(buildQuestionList(userId, markTaskList));
         return task;
     }
 
-    private List<MarkStepDTO> buildMarkStep(MarkTask task) {
+    private List<MarkConfigItem> buildPic(List<MarkTask> markTaskList) {
+        List<MarkConfigItem> markConfigItems = new ArrayList<>();
+        for (MarkTask t : markTaskList) {
+            MarkQuestion markQuestion = markQuestionService.getById(t.getQuestionId());
+            if (markQuestion.getQuestionType() == 4) {
+                markConfigItems.addAll(markQuestion.getPictureConfigList());
+                break;
+            } else {
+                markConfigItems.addAll(markQuestion.getPictureConfigList());
+            }
+        }
+        return markConfigItems;
+    }
+
+    private List<TaskQuestion> buildQuestionList(Long userId, List<MarkTask> markTaskList) {
+        List<TaskQuestion> taskQuestions = new ArrayList<>();
+        for (MarkTask t : markTaskList) {
+            TaskQuestion tq = new TaskQuestion();
+            tq.setTaskId(t.getId());
+            tq.setQuestionId(t.getQuestionId());
+            tq.setMainNumber(t.getMainNumber());
+            tq.setSubNumber(t.getSubNumber());
+            MarkQuestion markQuestion = markQuestionService.getById(t.getQuestionId());
+            tq.setIntervalScore(markQuestion.getIntervalScore());
+            tq.setMaxScore(markQuestion.getTotalScore());
+            tq.setMinScore(0);
+            tq.setTitle(markQuestion.getMainTitle());
+            tq.setStatus(t.getStatus());
+            List<TrackDTO> markerTrack = t.listMarkerTrack();
+            tq.setMarkerTrackList(markerTrack.toArray(new TrackDTO[markerTrack.size()]));
+            List<SpecialTagDTO> markerTag = t.listMarkerTag();
+            tq.setMarkerTagList(markerTag.toArray(new SpecialTagDTO[markerTag.size()]));
+            List<TrackDTO> headerTrack = t.listHeaderTrack();
+            tq.setHeaderTrackList(headerTrack.toArray(new TrackDTO[headerTrack.size()]));
+            List<SpecialTagDTO> headerTag = t.listHeaderTag();
+            tq.setHeaderTagList(headerTag.toArray(new SpecialTagDTO[headerTag.size()]));
+            tq.setMarkerScore(t.getMarkerScore());
+            tq.setSelfMark(t.getUserId() == null || t.getUserId().equals(userId));
+            tq.setRejected(t.getStatus().equals(MarkTaskStatus.REJECTED));
+            tq.setPrevious(t.getStatus().equals(MarkTaskStatus.MARKED));
+            taskQuestions.add(tq);
+        }
+        return taskQuestions;
+    }
+
+    /*private List<MarkStepDTO> buildMarkStep(MarkTask task) {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
         MarkQuestion markQuestion = markQuestionService.getById(task.getQuestionId());
-        List<MarkTrack> tracks = task.listMarkerTrack();
+        List<TrackDTO> tracks = task.listMarkerTrack();
         MarkStepDTO step = buildStep(markQuestion);
         if (task != null) {
             step.setScore(task.getMarkerScore());
             // 增加阅卷轨迹列表获取
-            for (MarkTrack track : tracks) {
-                step.addTrack(new TrackDTO(track));
+            for (TrackDTO track : tracks) {
+                step.addTrack(track);
             }
         }
         list.add(step);
         return list;
-    }
+    }*/
 
     private SpecialTagDTO[] getHeaderTagList(MarkStudent student) {
         List<MarkTask> markTaskList = markTaskService.listByStudentId(student.getId());
-        List<MarkHeaderTag> list = new ArrayList<>();
+        List<SpecialTagDTO> list = new ArrayList<>();
         for (MarkTask markTask : markTaskList) {
             list.addAll(markTask.listHeaderTag());
         }
-        SpecialTagDTO[] specialTags = new SpecialTagDTO[list.size()];
-        for (int i = 0; i < list.size(); i++) {
-            specialTags[i] = new MarkerSpecialTagDTO(list.get(i).getUserId(), list.get(i).getGroupNumber(),
-                    list.get(i));
-        }
-        return specialTags;
+//        SpecialTagDTO[] specialTags = new SpecialTagDTO[list.size()];
+//        for (int i = 0; i < list.size(); i++) {
+//            specialTags[i] = new MarkerSpecialTagDTO(list.get(i).getUserId(), list.get(i).getGroupNumber(), list.get(i));
+//        }
+        return list.toArray(new SpecialTagDTO[list.size()]);
     }
 
     public SpecialTagDTO[] getMarkSpecialTagList(MarkTask t) {
         SpecialTagDTO[] specialTags = null;
-        List<MarkSpecialTag> list = t.listMarkerTag();
+        List<SpecialTagDTO> list = t.listMarkerTag();
         if (!list.isEmpty()) {
-            specialTags = new SpecialTagDTO[list.size()];
-            for (int i = 0; i < list.size(); i++) {
-                SpecialTagDTO specialTagDTO = new SpecialTagDTO(list.get(i));
-                specialTags[i] = specialTagDTO;
-            }
+            specialTags = list.toArray(new SpecialTagDTO[list.size()]);
         }
         return specialTags;
     }
@@ -300,10 +332,8 @@ public class TaskServiceImpl implements TaskService {
         List<MarkTask> taskList = markTaskService.listByStudentId(student.getId());
         // 不管单评还是多评显示所有评卷员特殊标记
         for (MarkTask t : taskList) {
-            List<MarkSpecialTag> tagList = t.listMarkerTag();
-            for (MarkSpecialTag specialTag : tagList) {
-                list.add(new MarkerSpecialTagDTO(t.getUserId(), t.getQuestionId(), specialTag));
-            }
+            List<SpecialTagDTO> tagList = t.listMarkerTag();
+            list.addAll(tagList);
         }
         return list.toArray(new SpecialTagDTO[0]);
     }

+ 0 - 10
teachcloud-mark/src/main/resources/mapper/MarkQuestionMapper.xml

@@ -30,16 +30,6 @@
           AND mq.objective = false
         ORDER BY mq.main_number , mq.sub_number
     </select>
-    <select id="sumTotalScoreByQuestionId" resultType="java.lang.Double">
-        SELECT
-            SUM(CAST(q.total_score AS DECIMAL (10 , 3 )))
-        FROM
-            mark_question q
-        WHERE
-            q.exam_id = #{examId}
-          AND q.paper_number = #{paperNumber}
-          AND q.group_number = #{groupNumber}
-    </select>
     <select id="listQuestionAnswerByExamIdAndPaperNumberAndPaperType"
             resultType="com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo">
         SELECT

+ 41 - 11
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -118,15 +118,14 @@
         ORDER BY marker_time DESC
             LIMIT 1
     </select>
-	<select id="listPageHistory" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
+	<select id="listPageHistory" resultType="java.lang.Long">
         SELECT
-        	*
+        	distinct mt.student_id
         FROM
             mark_task mt
         <where>
 			mt.exam_id = #{examId}
 		and mt.paper_number = #{paperNumber}
-		and mt.group_number = #{groupNumber}
 		and mt.user_id = #{userId}
 		and mt.status = 'MARKED'
             <if test="secretNumber != null and secretNumber != '' ">
@@ -138,9 +137,9 @@
         </where>
     </select>
     
-    <select id="findUnMarked" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
+    <select id="findUnMarked" resultType="java.lang.Long">
         SELECT
-        	*
+        	distinct mt.student_id
         FROM
             mark_task mt
         <where>
@@ -149,6 +148,15 @@
 		and mt.group_number = #{groupNumber}
 		and (mt.user_id is null or mt.user_id =#{userId})
 		and (mt.status='WAITING' or mt.status='REJECTED')
+        AND EXISTS( SELECT
+            1
+            FROM
+            mark_user_question muq
+            WHERE
+            mt.exam_id = muq.exam_id
+            AND mt.paper_Number = muq.paper_number
+            AND mt.question_id = muq.question_id
+            AND muq.user_id = #{userId})
 		AND NOT EXISTS ( 
 			SELECT t.id FROM
 			mark_task t
@@ -163,20 +171,25 @@
         </where>
     </select>
 
-    <select id="findUnMarkedFilterClass" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
+    <select id="findUnMarkedFilterClass" resultType="java.lang.Long">
         SELECT
-        	*
+        	distinct mt.student_id
         FROM
             mark_task mt
         <where>
         	mt.exam_id = #{examId}
 		and mt.paper_number = #{paperNumber}
-        <if test="questionModel ==@com.qmth.teachcloud.mark.enums.QuestionModel@SINGLE">
-            and mt.question_id = (select question_id from mark_task where (mt.user_id is null or mt.user_id =#{userId})
-            and (mt.status='WAITING' or mt.status='REJECTED') order by )
-        </if>
 		and (mt.user_id is null or mt.user_id =#{userId})
 		and (mt.status='WAITING' or mt.status='REJECTED')
+        AND EXISTS( SELECT
+            1
+            FROM
+            mark_user_question muq
+            WHERE
+            mt.exam_id = muq.exam_id
+            AND mt.paper_Number = muq.paper_number
+            AND mt.question_id = muq.question_id
+            AND muq.user_id = #{userId})
 		AND NOT EXISTS ( 
 			SELECT t.id 
 			FROM
@@ -367,4 +380,21 @@
             </if>
             order by mt.main_number, mt.sub_number limit 1
     </select>
+    <select id="listByStudentIdAndUserId" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
+        SELECT
+            mt.*
+        FROM
+            mark_task mt
+        WHERE
+            mt.student_id = #{studentId}
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          mark_user_question muq
+                      WHERE
+                          mt.exam_id = muq.exam_id
+                        AND mt.paper_Number = muq.paper_number
+                        AND mt.question_id = muq.question_id
+                        AND muq.user_id = #{userId})
+    </select>
 </mapper>

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

@@ -10,5 +10,23 @@
         <result column="user_id" property="userId" />
         <result column="question_model" property="questionModel" />
     </resultMap>
+    <select id="getSubjectiveQuestionNumber" resultType="java.lang.String">
+        SELECT
+            GROUP_CONCAT(CONCAT(mq.main_number, '-', mq.sub_number))
+        FROM
+            mark_question mq
+        WHERE
+            mq.exam_id = #{examId} AND mq.paper_number = #{paperNumber}
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          mark_user_question muq
+                      WHERE
+                          mq.exam_id = muq.exam_id
+                        AND mq.paper_number = muq.paper_number
+                        AND mq.id = muq.question_id
+                        AND muq.user_id = #{userId})
+          ORDER BY mq.main_number, mq.sub_number
+    </select>
 
 </mapper>

+ 2 - 3
teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml

@@ -22,11 +22,10 @@
     <select id="listEntranceGroup" resultType="com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto">
         SELECT
             distinct mq.exam_id examId,
-            mq.id questionId,
             bc.code courseCode,
             bc.name courseName,
             so.name openCollege,
-            mq.paper_number paperNumber,
+            muq.paper_number paperNumber,
             be.name AS examName,
             bs.name AS semesterName
         FROM
@@ -44,6 +43,7 @@
                 LEFT JOIN
             basic_semester bs ON be.semester_id = bs.id
         <where>
+            mq.task_count > 0
             <if test="examId != null">
                 and mq.exam_id = #{examId}
             </if>
@@ -61,7 +61,6 @@
                 and exists (select 1 from mark_paper mp where mp.exam_id = mq.exam_id and mp.paper_number = mq.paper_number and mp.status = #{status})
             </if>
         </where>
-            order by muq.id desc
     </select>
     <select id="listGroupUserByExamIdAndPaperNumberAndQuestionId"
             resultType="com.qmth.teachcloud.common.bean.dto.mark.MarkUser">