Переглянути джерело

3.4.4 update-20250310,sql优化

xiaofei 3 місяців тому
батько
коміт
8b7af1f582
22 змінених файлів з 517 додано та 274 видалено
  1. 2 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArbitrateController.java
  2. 8 6
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java
  3. 14 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java
  4. 118 35
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkStatusDto.java
  5. 4 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/SubmitResult.java
  6. 5 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java
  7. 89 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkArbitrateResult.java
  8. 0 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkHeaderGroupResult.java
  9. 2 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArbitrateHistoryService.java
  10. 7 11
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  11. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  12. 1 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserQuestionService.java
  13. 21 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java
  14. 146 79
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  15. 15 16
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  16. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  17. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java
  18. 3 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanOmrTaskServiceImpl.java
  19. 5 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java
  20. 16 27
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/TaskLock.java
  21. 15 4
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml
  22. 36 37
      teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

+ 2 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArbitrateController.java

@@ -10,6 +10,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateMarkerDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.params.MarkArbitrateResult;
 import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.service.MarkArbitrateHistoryService;
@@ -117,7 +118,7 @@ public class MarkArbitrateController {
      */
     @ApiOperation(value = "保存任务")
     @RequestMapping(value = "/saveTask", method = RequestMethod.POST)
-    public Result saveTask(@RequestBody MarkHeaderGroupResult markResult) {
+    public Result saveTask(@RequestBody MarkArbitrateResult markResult) {
         markArbitrateHistoryService.saveArbitrateTask(markResult);
         return ResultUtil.ok(true);
     }

+ 8 - 6
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java

@@ -76,18 +76,20 @@ public class MarkController extends BaseController {
     }
 
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
-    public Result status(@RequestParam Long examId, @RequestParam String paperNumber
-    ) {
+    public Result status(@RequestParam Long examId, @RequestParam String paperNumber,
+                         @RequestParam QuestionModel questionModel) {
         validMarkPaperForMark(examId, paperNumber);
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getStatus(user.getId(), examId, paperNumber));
+        return ResultUtil.ok(markService.getStatus(user.getId(), examId, paperNumber, questionModel));
     }
 
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
-    public Result getTask(@RequestParam Long examId, @RequestParam String paperNumber,
-                          @RequestParam QuestionModel questionModel) {
+    public Result getTask(@RequestParam Long examId,
+                          @RequestParam String paperNumber,
+                          @RequestParam QuestionModel questionModel,
+                          @RequestParam(required = false) Long questionId) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getTask(user.getId(), examId, paperNumber, questionModel));
+        return ResultUtil.ok(markService.getTask(user.getId(), examId, paperNumber, questionModel, questionId));
     }
 
     @RequestMapping(value = "/saveTask", method = RequestMethod.POST)

+ 14 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java

@@ -71,6 +71,12 @@ public class Task implements Serializable {
      */
     private List<TaskQuestion> questionList;
 
+    /**
+     * 仲裁任务ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long arbitrateId;
+
     public Long getExamId() {
         return examId;
     }
@@ -190,4 +196,12 @@ public class Task implements Serializable {
     public void setQuestionList(List<TaskQuestion> questionList) {
         this.questionList = questionList;
     }
+
+    public Long getArbitrateId() {
+        return arbitrateId;
+    }
+
+    public void setArbitrateId(Long arbitrateId) {
+        this.arbitrateId = arbitrateId;
+    }
 }

+ 118 - 35
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkStatusDto.java

@@ -1,41 +1,124 @@
 package com.qmth.teachcloud.mark.dto.mark.mark;
 
+import com.qmth.teachcloud.common.entity.MarkQuestion;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
+
 public class MarkStatusDto {
-	private int totalCount;
-	private int personCount;
-	private int markedCount;
-	private int problemCount;
-	private int arbitrateCount;
-	public int getTotalCount() {
-		return totalCount;
-	}
-	public void setTotalCount(int totalCount) {
-		this.totalCount = totalCount;
-	}
-	public int getPersonCount() {
-		return personCount;
-	}
-	public void setPersonCount(int personCount) {
-		this.personCount = personCount;
-	}
-	public int getMarkedCount() {
-		return markedCount;
-	}
-	public void setMarkedCount(int markedCount) {
-		this.markedCount = markedCount;
-	}
-	public int getProblemCount() {
-		return problemCount;
-	}
-	public void setProblemCount(int problemCount) {
-		this.problemCount = problemCount;
-	}
-	public int getArbitrateCount() {
-		return arbitrateCount;
-	}
-	public void setArbitrateCount(int arbitrateCount) {
-		this.arbitrateCount = arbitrateCount;
-	}
+    /**
+     * 考生数量
+     */
+    private int totalCount;
+    /**
+     * 个人评卷考生数量
+     */
+    private int personCount;
+    /**
+     * 未评卷考生数量
+     */
+    private int leftCount;
+    /**
+     * 总评卷考生数量
+     */
+    private int markedCount;
+    /**
+     * 问题卷题目任务数量
+     */
+    private int problemCount;
+    /**
+     * 待仲裁卷题目任务数量
+     */
+    private int arbitrateCount;
+    /**
+     * 大题号
+     */
+    private Integer mainNumber;
+    /**
+     * 小题号
+     */
+    private Integer subNumber;
+    /**
+     * 题目ID
+     */
+    private Long questionId;
+
+    public MarkStatusDto() {
+    }
+
+    public MarkStatusDto(MarkQuestion markQuestion) {
+        this.mainNumber = markQuestion.getMainNumber();
+        this.subNumber = markQuestion.getSubNumber();
+        this.questionId = markQuestion.getId();
+    }
+
+    public int getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(int totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public int getPersonCount() {
+        return personCount;
+    }
+
+    public void setPersonCount(int personCount) {
+        this.personCount = personCount;
+    }
+
+    public int getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(int leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public int getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(int markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public int getProblemCount() {
+        return problemCount;
+    }
+
+    public void setProblemCount(int problemCount) {
+        this.problemCount = problemCount;
+    }
+
+    public int getArbitrateCount() {
+        return arbitrateCount;
+    }
+
+    public void setArbitrateCount(int arbitrateCount) {
+        this.arbitrateCount = arbitrateCount;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
 
+    public Long getQuestionId() {
+        return questionId;
+    }
 
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
 }

+ 4 - 15
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/SubmitResult.java

@@ -7,22 +7,18 @@ public class SubmitResult {
 
     private boolean success;
 
-    private Long examId;
-    private String paperNumber;
     private Long studentId;
 
     public static SubmitResult faile() {
-        return new SubmitResult(false, null, null, null);
+        return new SubmitResult(false, null);
     }
 
-    public static SubmitResult success(Long examId, String paperNumber, Long studentId) {
-        return new SubmitResult(true, examId, paperNumber, studentId);
+    public static SubmitResult success(Long studentId) {
+        return new SubmitResult(true, studentId);
     }
 
-    private SubmitResult(boolean success, Long examId, String paperNumber, Long studentId) {
+    private SubmitResult(boolean success, Long studentId) {
         this.success = success;
-        this.examId = examId;
-        this.paperNumber = paperNumber;
         this.studentId = studentId;
     }
 
@@ -34,11 +30,4 @@ public class SubmitResult {
         return studentId;
     }
 
-    public Long getExamId() {
-        return examId;
-    }
-
-    public String getPaperNumber() {
-        return paperNumber;
-    }
 }

+ 5 - 7
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java

@@ -4,7 +4,6 @@ import java.util.List;
 
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkTaskDto;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
-import com.qmth.teachcloud.mark.enums.QuestionModel;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -34,17 +33,16 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
     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<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> findUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+                                @Param("userId") Long userId);
 
-    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> findUnMarkedFilterClass(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("classMark") Boolean classMark);
 
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
 
     int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("statusList") MarkTaskStatus[] statusList);
-    int countByExamIdAndPaperNumberAndUserIdAndAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("markerId") Long markerId, @Param("userId") Long userId, @Param("classNames") List<String> classNames);
-    int countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("markerId") Long markerId, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("status") String status);
+    int countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("classNames") List<String> classNames);
+    int countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("questionId") Long questionId, @Param("statusList") MarkTaskStatus[] statusList);
 
     IPage<MarkTaskDto> pageMarkTask(@Param("page") Page<Object> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("status") MarkTaskStatus status, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName, @Param("subScore") Double subScore);
 

+ 89 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkArbitrateResult.java

@@ -0,0 +1,89 @@
+package com.qmth.teachcloud.mark.params;
+
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
+import com.qmth.teachcloud.mark.entity.*;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 标准评卷结果对象(管理员直接分打)
+ */
+public class MarkArbitrateResult {
+
+    private Long arbitrateId;
+    /**
+     * 考生编号
+     */
+    private Long studentId;
+
+    /**
+     * 总分
+     */
+    private double markScore;
+
+    /**
+     * 阅卷轨迹列表
+     */
+    private TrackDTO[] markerTrackList;
+
+    /**
+     * 特殊标记列表
+     */
+    private SpecialTagDTO[] markerTagList;
+
+
+    /**
+     * 所花时间
+     */
+    private int spent;
+
+    public Long getArbitrateId() {
+        return arbitrateId;
+    }
+
+    public void setArbitrateId(Long arbitrateId) {
+        this.arbitrateId = arbitrateId;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public double getMarkScore() {
+        return markScore;
+    }
+
+    public void setMarkScore(double markScore) {
+        this.markScore = markScore;
+    }
+
+    public TrackDTO[] getMarkerTrackList() {
+        return markerTrackList;
+    }
+
+    public void setMarkerTrackList(TrackDTO[] markerTrackList) {
+        this.markerTrackList = markerTrackList;
+    }
+
+    public SpecialTagDTO[] getMarkerTagList() {
+        return markerTagList;
+    }
+
+    public void setMarkerTagList(SpecialTagDTO[] markerTagList) {
+        this.markerTagList = markerTagList;
+    }
+
+    public int getSpent() {
+        return spent;
+    }
+
+    public void setSpent(int spent) {
+        this.spent = spent;
+    }
+}

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

@@ -14,8 +14,6 @@ import java.util.List;
  */
 public class MarkHeaderGroupResult {
 
-    public static final String SPLIT = ",";
-
     private Long taskId;
     private Long questionId;
 

+ 2 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArbitrateHistoryService.java

@@ -8,6 +8,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.mark.params.MarkArbitrateResult;
 import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 
@@ -33,7 +34,7 @@ public interface MarkArbitrateHistoryService extends IService<MarkArbitrateHisto
 
     Task getArbitrateTask(Long arbitrateId, Long examId, String paperNumber, Long questionId);
 
-    void saveArbitrateTask(MarkHeaderGroupResult markResult);
+    void saveArbitrateTask(MarkArbitrateResult markResult);
 
     void deleteByStudentId(Long studentId);
 

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

@@ -9,7 +9,7 @@ import com.qmth.teachcloud.mark.dto.mark.mark.MarkStatusDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.SubmitResult;
 import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.QuestionModel;
-import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
+import com.qmth.teachcloud.mark.params.MarkArbitrateResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.params.MarkResultQuestion;
 import io.lettuce.core.GeoArgs.Sort;
@@ -23,12 +23,7 @@ import java.util.Set;
  */
 public interface MarkService {
 
-    /**
-     * 释放某个评卷员已完成的评卷任务
-     *
-     * @param submitResult 评卷结果
-     */
-    void releaseTask(SubmitResult submitResult, Long userId);
+    void releaseStudent(Long examId, String paperNumber, Long studentId, Long userId);
 
     int applyCurrentCount(MarkQuestion markQuestion);
 
@@ -48,7 +43,7 @@ public interface MarkService {
 
     boolean needUpdateQuality(MarkUserQuestion marker, int expireMinutes);
 
-    void processArbitrate(MarkHeaderGroupResult markResult, Long userId);
+    void processArbitrate(MarkArbitrateResult markResult, Long userId);
 
     void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version);
 
@@ -60,9 +55,9 @@ public interface MarkService {
 
     MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber);
 
-    MarkStatusDto getStatus(Long userId, Long examId, String paperNumber);
+    List<MarkStatusDto> getStatus(Long userId, Long examId, String paperNumber, QuestionModel questionModel);
 
-    Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel);
+    Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel, Long questionId);
 
     /**
      * /** 释放某个大题的锁定任务
@@ -84,7 +79,8 @@ public interface MarkService {
 
     void clear(Long userId, Long examId, String paperNumber);
 
-    boolean applyTask(Long examId, String paperNumber, Long studentId, Integer taskNumber, Long userId, Set<Long> questions);
+    boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions,  List<Long> taskIds);
+    boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions);
 
     boolean hasApplied(MarkTask t, Long userId);
 

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

@@ -10,7 +10,6 @@ import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
-import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.params.MarkResultQuestion;
 
 import javax.servlet.http.HttpServletResponse;
@@ -57,16 +56,17 @@ public interface MarkTaskService extends IService<MarkTask> {
     void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 
     int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, Long userId, List<String> className, MarkTaskStatus... status);
-    int countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long markerId, Long userId, List<String> className, String status);
+    int countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(Long examId, String paperNumber, Long userId, List<String> className);
+    int countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(Long examId, String paperNumber, Long userId, List<String> className, Long questionId, MarkTaskStatus...status);
 
     IPage<Long> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore);
 
-    List<Long> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
+    List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId);
 
-    List<Long> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
+    List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Boolean classMark);
 
     int countByIdAndStatus(Long studentId, MarkTaskStatus status);
-    int countByStudentIdAndStatus(Long studentId, MarkTaskStatus... status);
+    int countByStatusAndIdIn(List<Long> ids, MarkTaskStatus... status);
 
     List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status);
 

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

@@ -2,7 +2,6 @@ package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.common.enums.mark.MarkMode;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.mark.bean.marker.MarkerAddParam;
 import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
@@ -12,7 +11,6 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.teachcloud.mark.enums.QuestionModel;
 
 import java.util.List;
 
@@ -59,7 +57,7 @@ public interface MarkUserQuestionService extends IService<MarkUserQuestion> {
 
     List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Long questionId);
 
-    List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
+    List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserIdAndEnableTure(Long examId, String paperNumber, Long userId);
 
     void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 

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

@@ -8,11 +8,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
+import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkArbitrateStatus;
 import com.qmth.teachcloud.common.enums.mark.MarkMode;
+import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -25,6 +27,7 @@ import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkArbitrateHistoryMapper;
+import com.qmth.teachcloud.mark.params.MarkArbitrateResult;
 import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.service.*;
 import org.apache.commons.collections4.CollectionUtils;
@@ -48,6 +51,8 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     // 并发处理互斥锁
     private Map<Long, Integer> currentTaskMap = new HashMap<>();
 
+    @Resource
+    private BasicCourseService basicCourseService;
     @Resource
     private MarkPaperService markPaperService;
     @Resource
@@ -140,23 +145,24 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
         MarkArbitrateSettingDto markArbitrateSettingDto = new MarkArbitrateSettingDto();
         if (markPaper != null) {
+            BasicCourse basicCourse = basicCourseService.getById(markPaper.getCourseId());
             markArbitrateSettingDto.setMarkMode(MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK.name() : markPaper.getMarkMode().name());
-            markArbitrateSettingDto.setCourseCode(markPaper.getCourseCode());
-            markArbitrateSettingDto.setCourseName(markPaper.getCourseName());
+            markArbitrateSettingDto.setCourseCode(basicCourse != null ? basicCourse.getCode() : null);
+            markArbitrateSettingDto.setCourseName(basicCourse != null ? basicCourse.getName() : null);
             markArbitrateSettingDto.setPaperNumber(markPaper.getPaperNumber());
             markArbitrateSettingDto.setUserLoginName(sysUser.getLoginName());
             markArbitrateSettingDto.setUserName(sysUser.getRealName());
-            if (StringUtils.isNotBlank(markPaper.getPaperFilePath())) {
-                List<FilePathVo> filePathVoList = JSON.parseArray(markPaper.getPaperFilePath(), FilePathVo.class);
-                List<String> filePaths = new ArrayList<>();
-                for (FilePathVo filePathVo : filePathVoList) {
-                    filePaths.add(fileUploadService.filePreview(JSON.toJSONString(filePathVo)));
-                }
-                markArbitrateSettingDto.setPaperUrl(filePaths);
-            }
-            if (StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
-                markArbitrateSettingDto.setAnswerUrl(fileUploadService.filePreview(markPaper.getAnswerFilePath()));
-            }
+//            if (StringUtils.isNotBlank(markPaper.getPaperFilePath())) {
+//                List<FilePathVo> filePathVoList = JSON.parseArray(markPaper.getPaperFilePath(), FilePathVo.class);
+//                List<String> filePaths = new ArrayList<>();
+//                for (FilePathVo filePathVo : filePathVoList) {
+//                    filePaths.add(fileUploadService.filePreview(JSON.toJSONString(filePathVo)));
+//                }
+//                markArbitrateSettingDto.setPaperUrl(filePaths);
+//            }
+//            if (StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
+//                markArbitrateSettingDto.setAnswerUrl(fileUploadService.filePreview(markPaper.getAnswerFilePath()));
+//            }
         }
         return markArbitrateSettingDto;
     }
@@ -183,9 +189,9 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     }
 
     @Override
-    public void saveArbitrateTask(MarkHeaderGroupResult markResult) {
+    public void saveArbitrateTask(MarkArbitrateResult markResult) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        MarkArbitrateHistory markArbitrateHistory = this.getById(markResult.getTaskId());
+        MarkArbitrateHistory markArbitrateHistory = this.getById(markResult.getArbitrateId());
         if (markArbitrateHistory != null) {
             try {
                 lockService.watch(LockType.EXAM_SUBJECT, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber());

+ 146 - 79
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -26,7 +26,7 @@ import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.lock.LockService;
-import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
+import com.qmth.teachcloud.mark.params.MarkArbitrateResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.params.MarkResultQuestion;
 import com.qmth.teachcloud.mark.service.*;
@@ -99,16 +99,18 @@ public class MarkServiceImpl implements MarkService {
     private BasicOperationLogService basicOperationLogService;
 
     /**
-     * 释放某个评卷员已完成的评卷任务
+     * 释放某个评卷员的考生
      *
-     * @param submitResult 评卷结果
-     * @param userId       评卷员
+     * @param exmId       考试ID
+     * @param paperNumber 试卷编号
+     * @param studentId   考生ID
+     * @param userId      用户ID
      */
     @Override
-    public void releaseTask(SubmitResult submitResult, Long userId) {
-        if (submitResult.getStudentId() != null) {
-            TaskLock taskLock = TaskLockUtil.getFormalTask(getKey(submitResult.getExamId(), submitResult.getPaperNumber()));
-            taskLock.remove(submitResult.getStudentId(), 1, userId);
+    public void releaseStudent(Long exmId, String paperNumber, Long studentId, Long userId) {
+        if (studentId != null) {
+            TaskLock taskLock = TaskLockUtil.getFormalTask(getKey(exmId, paperNumber));
+            taskLock.remove(studentId, userId);
             taskLock.refresh(userId);
         }
     }
@@ -309,10 +311,10 @@ public class MarkServiceImpl implements MarkService {
      */
     @Transactional
     @Override
-    public void processArbitrate(MarkHeaderGroupResult markResult, Long userId) {
-        MarkArbitrateHistory markArbitrateHistory = markArbitrateHistoryService.getById(markResult.getTaskId());
+    public void processArbitrate(MarkArbitrateResult markResult, Long userId) {
+        MarkArbitrateHistory markArbitrateHistory = markArbitrateHistoryService.getById(markResult.getArbitrateId());
         markArbitrateHistory.setUpdateUserId(userId);
-        markArbitrateHistory.setTotalScore(markResult.getScore());
+        markArbitrateHistory.setTotalScore(markResult.getMarkScore());
 //        markArbitrateHistory.setScoreList(markResult.isUnselective() ? null : markResult.getScoreList());
         markArbitrateHistory.setStatus(MarkArbitrateStatus.MARKED);
         markArbitrateHistory.setUpdateTime(System.currentTimeMillis());
@@ -333,10 +335,10 @@ public class MarkServiceImpl implements MarkService {
         markArbitrateHistoryService.saveOrUpdate(markArbitrateHistory);
         markTaskService.updateHeaderResult(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(),
                 markArbitrateHistory.getQuestionId(), markArbitrateHistory.getStudentId(),
-                markArbitrateHistory.getUpdateUserId(), markResult.getScore(), markResult.getTrackList(), markResult.getSpecialTagList(), markArbitrateHistory.getUpdateTime(), MarkTaskStatus.ARBITRATED);
+                markArbitrateHistory.getUpdateUserId(), markResult.getMarkScore(), markResult.getMarkerTrackList(), markResult.getMarkerTagList(), markArbitrateHistory.getUpdateTime(), MarkTaskStatus.ARBITRATED);
         updateMarkedCount(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(),
                 markArbitrateHistory.getQuestionId());
-        checkStudentQuestion(markArbitrateHistory.getStudentId(), markQuestionService.getById(markArbitrateHistory.getQuestionId()), null);
+        checkStudentQuestion(markArbitrateHistory.getStudentId(), markQuestionService.getById(markArbitrateHistory.getQuestionId()), markResult.getMarkScore());
         // 评卷质量重新统计
         List<MarkUserQuestion> markUserGroups = markUserQuestionService.listByExamIdAndPaperNumberAndQuestionId(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getQuestionId());
         markUserGroups.forEach(m -> this.updateQuality(m));
@@ -347,12 +349,12 @@ public class MarkServiceImpl implements MarkService {
      *
      * @param studentId
      * @param markQuestion
-     * @param result
+     * @param markScore
      */
-    private void checkStudentQuestion(Long studentId, MarkQuestion markQuestion, MarkResultQuestion result) {
+    private void checkStudentQuestion(Long studentId, MarkQuestion markQuestion, Double markScore) {
         if (calculateQuestionId(markQuestion, studentId)) {
             //更新考生分组分数
-            updateStudentQuestionScore(studentId, markQuestion, result);
+            updateStudentQuestionScore(studentId, markQuestion, markScore);
 //            checkStudentSubjective(studentId, markQuestion.getExamId(), markQuestion.getPaperNumber(), version);
         } else {
             markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
@@ -367,12 +369,14 @@ public class MarkServiceImpl implements MarkService {
             long questionCount = markQuestionService.countByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
             long subjectiveScoreCount = markSubjectiveScoreService.countByStudentId(studentId);
             // 主观题数大于0,主观题全部绑定了评卷员,考生小题分数数量等于主观题数量
-            if (questionCount > 0 && unBindMarkerQuestionCount == 0 && questionCount == subjectiveScoreCount) {
+            // todo 校验mark_subjective_score中的question_id是否一样
+            if (questionCount > 0) {
                 scoreCalculate(studentId, version);
-            } else {//否则更新该学生主观题状态为未阅卷
-//                markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
-                markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.UNMARK, null, null, version);
             }
+//            else {//否则更新该学生主观题状态为未阅卷
+////                markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
+//                markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.UNMARK, null, null, version);
+//            }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
@@ -422,7 +426,8 @@ public class MarkServiceImpl implements MarkService {
                 return;
             }
             int count = 0;
-            List<MarkStudent> studentList = markStudentService.listUnMarkTaskStudent(markQuestion.getExamId(), markQuestion.getPaperNumber(), markQuestion.getId(), pageSize);while (CollectionUtils.isNotEmpty(studentList)) {
+            List<MarkStudent> studentList = markStudentService.listUnMarkTaskStudent(markQuestion.getExamId(), markQuestion.getPaperNumber(), markQuestion.getId(), pageSize);
+            while (CollectionUtils.isNotEmpty(studentList)) {
                 // 已生成的双评任务总数的第一组任务数
                 int doubleMarkTaskCount1 = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndTaskNumber(
                         markQuestion.getExamId(), markQuestion.getPaperNumber(), markQuestion.getId(), 1);
@@ -558,7 +563,7 @@ public class MarkServiceImpl implements MarkService {
         return true;
     }
 
-    private void updateStudentQuestionScore(Long studentId, MarkQuestion markQuestion, MarkResultQuestion result) {
+    private void updateStudentQuestionScore(Long studentId, MarkQuestion markQuestion, Double markScore) {
         MarkSubjectiveScore ss = markSubjectiveScoreService.getByStudentIdAndQuestionId(studentId, markQuestion.getId());
         if (ss == null) {
             ss = new MarkSubjectiveScore();
@@ -569,7 +574,7 @@ public class MarkServiceImpl implements MarkService {
         ss.setQuestionId(markQuestion.getId());
         ss.setMainNumber(markQuestion.getMainNumber());
         ss.setSubNumber(markQuestion.getSubNumber());
-        ss.setScore(result.getMarkerScore());
+        ss.setScore(markScore);
         ss.setMainScore(0.0);
         markSubjectiveScoreService.saveOrUpdateByMultiId(ss);
     }
@@ -655,16 +660,9 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public MarkStatusDto getStatus(Long userId, Long examId, String paperNumber) {
-        MarkStatusDto dto = new MarkStatusDto();
+    public List<MarkStatusDto> getStatus(Long userId, Long examId, String paperNumber, QuestionModel questionModel) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
 
-        // 评卷方式
-        MarkUserPaper markUserPaper = markUserPaperService.getByExamIdAndPaperNumberAndUserId(examId, paperNumber, userId);
-        Long questionId = null;
-        if (markUserPaper != null && markUserPaper.getQuestionModel().equals(QuestionModel.SINGLE)) {
-            questionId = markTaskService.minQuestionIdByExamIdAndPaperNumber(examId, paperNumber, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED);
-        }
         List<String> classNames = null;
         //校验是否有分班阅
         if (markPaper != null && markPaper.getClassMark() != null && markPaper.getClassMark().booleanValue()) {
@@ -673,21 +671,48 @@ public class MarkServiceImpl implements MarkService {
                 classNames = markUserClassList.stream().map(MarkUserClass::getClassName).collect(Collectors.toList());
             }
         }
-        //待仲裁卷数量
-        dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                paperNumber, null, null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
-        //总数量
-        dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId, paperNumber, questionId, null, classNames));
-        //总评卷数量(已评)
-        dto.setMarkedCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId, paperNumber, questionId, null, classNames, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
-        //个人评卷数量
-        dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                paperNumber, questionId, userId, classNames, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
-                MarkTaskStatus.WAIT_ARBITRATE));
-        //问题卷数量
-        dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                paperNumber, questionId, null, classNames, MarkTaskStatus.PROBLEM));
-        return dto;
+
+        List<MarkStatusDto> dtoList = new ArrayList<>();
+        // 评卷方式
+        if (QuestionModel.SINGLE.equals(questionModel)) {
+            List<MarkUserQuestion> markUserQuestionList = markUserQuestionService.listByExamIdAndPaperNumberAndUserIdAndEnableTure(examId, paperNumber, userId);
+            MarkStatusDto dto;
+            for (MarkUserQuestion question : markUserQuestionList) {
+                dto = new MarkStatusDto(markQuestionService.getById(question.getId()));
+                //总数量(考生数)
+                dto.setTotalCount(markTaskService.countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, classNames));
+                //总评卷数量(考生数)
+//                dto.setMarkedCount(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, classNames, questionId, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
+                //个人评卷数量(考生数)
+//                dto.setPersonCount(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, classNames, questionId, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,MarkTaskStatus.WAIT_ARBITRATE));
+                //问题卷数量(任务数)
+                dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
+                        paperNumber, question.getQuestionId(), null, classNames, MarkTaskStatus.PROBLEM));
+                //待仲裁卷数量(任务数)
+                dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
+                        paperNumber, question.getQuestionId(), null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
+                dtoList.add(dto);
+            }
+        } else if (QuestionModel.MULTI.equals(questionModel)) {
+            MarkStatusDto dto = new MarkStatusDto();
+
+            //待仲裁卷数量
+            dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
+                    paperNumber, null, null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
+            //总数量
+            dto.setTotalCount(markTaskService.countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, classNames));
+            //总评卷数量(已评)
+//            dto.setMarkedCount(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, classNames, questionId, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
+            //个人评卷数量
+//            dto.setPersonCount(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, classNames, questionId, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED, MarkTaskStatus.WAIT_ARBITRATE));
+            //问题卷数量
+//            dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
+//                    paperNumber, questionId, null, classNames, MarkTaskStatus.PROBLEM));
+            dtoList.add(dto);
+        } else {
+            throw ExceptionResultEnum.ERROR.exception("参数有误");
+        }
+        return dtoList;
     }
 
     @Override
@@ -699,13 +724,13 @@ public class MarkServiceImpl implements MarkService {
     @Override
     public void releaseByStudent(MarkStudent student) {
         TaskLock taskLock = TaskLockUtil.getInspectedStudentTask(getKey(student.getExamId(), student.getPaperNumber()));
-        taskLock.remove(student.getId(), 1);
+        taskLock.remove(student.getId());
     }
 
     @Override
     public boolean applyStudent(MarkStudent student, Long userId) {
         TaskLock taskLock = TaskLockUtil.getInspectedStudentTask(getKey(student.getExamId(), student.getPaperNumber()));
-        boolean lock = taskLock.add(student.getId(), 1, userId, new HashSet<>());
+        boolean lock = taskLock.add(student.getId(), userId, new HashSet<>());
         // 上锁失败直接返回
         if (!lock) {
             return false;
@@ -714,7 +739,7 @@ public class MarkServiceImpl implements MarkService {
         if (student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED)) {
             return true;
         } else {
-            taskLock.remove(student.getId(), 1, userId);
+            taskLock.remove(student.getId(), userId);
             return false;
         }
     }
@@ -731,7 +756,7 @@ public class MarkServiceImpl implements MarkService {
                         result.getQuestionId(), markStudent.getId(), userId, result.getMarkerScore(), result.getMarkerTrackList(), result.getMarkerTagList(), currentTime, MarkTaskStatus.MARKED);
                 updateMarkedCount(markStudent.getExamId(), markStudent.getPaperNumber(), result.getQuestionId());
                 markStudentService.updateCheckInfo(markStudent.getId(), userId);
-                checkStudentQuestion(markStudent.getId(), markQuestionService.getById(result.getQuestionId()), result);
+                checkStudentQuestion(markStudent.getId(), markQuestionService.getById(result.getQuestionId()), result.getMarkerScore());
             } catch (ApiException e) {
                 throw ExceptionResultEnum.ERROR.exception(e.getMessage());
             } finally {
@@ -808,7 +833,7 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel) {
+    public Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel, Long questionId) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
         if (markPaper == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷试卷不存在");
@@ -817,33 +842,62 @@ public class MarkServiceImpl implements MarkService {
         if (count == 0) {
             throw ExceptionResultEnum.ERROR.exception("评卷任务被重置,请点击右上角返回按钮,重新在评卷入口菜单点击评卷");
         }
+        List<MarkUserQuestion> markUserQuestions = markUserQuestionService.listByExamIdAndPaperNumberAndUserIdAndEnableTure(examId, paperNumber, userId);
+        if (markUserQuestions.isEmpty()) {
+            throw ExceptionResultEnum.ERROR.exception("评卷员未设置评卷题目");
+        }
+        Set<Long> questions = markUserQuestions.stream().map(MarkUserQuestion::getQuestionId).collect(Collectors.toSet());
         Task task = null;
         List<Long> studentIds;
         int pageNumber = 1;
         while (task == null) {
-//            if (markPaper.getClassMark()) {
-//                studentIds = markTaskService.findUnMarkedFilterClass(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionModel);
-//            } else {
-//                studentIds = markTaskService.findUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionModel);
-//            }
-            studentIds = markStudentService.findUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, userId, markPaper.getClassMark());
-            if (studentIds.isEmpty()) {
-                break;
-            }
-            for (Long studentId : studentIds) {
-                List<MarkTask> markTaskList = markTaskService.listByStudentIdAndUserId(studentId, userId);
-                if (markTaskList.isEmpty()) {
-                    continue;
+            if (questionModel.equals(QuestionModel.SINGLE)) {
+                List<MarkTask> list = markTaskService.findUnMarkedFilterClass(new Page<>(pageNumber, 20), examId, paperNumber, userId, markPaper.getClassMark());
+                if (list.isEmpty()) {
+                    break;
                 }
-                if (questionModel.equals(QuestionModel.SINGLE)) {
-                    markTaskList = markTaskList.stream().limit(1).collect(Collectors.toList());
+                for (MarkTask t : list) {
+                    if (this.applyTask(examId, paperNumber, t.getStudentId(), userId, questions, Arrays.asList(t.getId()))) {
+                        task = taskService.build(userId, Arrays.asList(t));
+                        break;
+                    }
                 }
-                // 评阅题目ID集合
-                Set<Long> questions = markTaskList.stream().map(MarkTask::getQuestionId).collect(Collectors.toSet());
-                if (this.applyTask(examId, paperNumber, studentId, 1, userId, questions)) {
-                    task = taskService.build(userId, markTaskList);
+            } else if (questionModel.equals(QuestionModel.MULTI)) {
+                studentIds = markStudentService.findUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, userId, markPaper.getClassMark());
+                if (studentIds.isEmpty()) {
                     break;
                 }
+                for (Long studentId : studentIds) {
+                    if (this.applyTask(examId, paperNumber, studentId, userId, questions)) {
+                        List<MarkTask> markTaskList = markTaskService.listByStudentId(studentId);
+                        if (markTaskList.isEmpty()) {
+                            releaseStudent(examId, paperNumber, studentId, userId);
+                            continue;
+                        }
+                        Map<Long, List<MarkTask>> map = markTaskList.stream().collect(Collectors.groupingBy(MarkTask::getQuestionId));
+                        List<MarkTask> markTasks = new ArrayList<>();
+                        for (MarkUserQuestion markUserQuestion : markUserQuestions) {
+                            List<MarkTask> markTasks1 = map.get(markUserQuestion.getQuestionId());
+                            if (markTasks1.size() == 1) {
+                                markTasks.add(markTasks1.get(0));
+                            } else {
+                                MarkTask markTask = markTasks1.stream().filter(m -> userId.equals(m.getUserId())).findFirst().orElse(null);
+                                if (markTask == null) {
+                                    markTask = markTasks1.stream().filter(m -> m.getUserId() == null).findFirst().orElse(null);
+                                    if (markTask == null) {
+                                        markTask = markTasks1.get(0);
+                                    }
+                                }
+                                markTasks.add(markTask);
+                            }
+                        }
+                        markTasks.sort(Comparator.comparing(MarkTask::getMainNumber).thenComparing(MarkTask::getSubNumber));
+                        task = taskService.build(userId, markTasks);
+                        break;
+                    }
+                }
+            } else {
+                break;
             }
 
             if (task == null) {
@@ -854,27 +908,40 @@ public class MarkServiceImpl implements MarkService {
     }
 
     @Override
-    public boolean applyTask(Long examId, String paperNumber, Long studentId, Integer taskNumber, Long userId, Set<Long> questions) {
+    public boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions, List<Long> taskIds) {
         // 查询待领取任务时,已经做了多评同一studentId互斥处理
         TaskLock taskLock = TaskLockUtil.getFormalTask(getKey(examId, paperNumber));
-        boolean lock = taskLock.add(studentId, taskNumber, userId, questions);
+        boolean lock = taskLock.add(studentId, userId, questions);
         // 上锁失败直接返回
         if (!lock) {
             return false;
         }
-        // 重复校验任务状态
-        if (markTaskService.countByStudentIdAndStatus(studentId, MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED) > 0) {
+        // 检验是否有待评任务
+        if (markTaskService.countByStatusAndIdIn(taskIds, MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED) > 0) {
             return true;
         } else {
-            taskLock.remove(studentId, taskNumber, userId);
+            taskLock.remove(studentId, userId);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions) {
+        // 查询待领取任务时,已经做了多评同一studentId互斥处理
+        TaskLock taskLock = TaskLockUtil.getFormalTask(getKey(examId, paperNumber));
+        boolean lock = taskLock.add(studentId, userId, questions);
+        // 上锁失败直接返回
+        if (!lock) {
             return false;
         }
+        taskLock.remove(studentId, userId);
+        return false;
     }
 
     @Override
     public boolean hasApplied(MarkTask t, Long userId) {
         TaskLock taskLock = TaskLockUtil.getFormalTask(getKey(t.getExamId(), t.getPaperNumber()));
-        return taskLock.exist(t.getStudentId(), t.getTaskNumber(), userId);
+        return taskLock.exist(t.getStudentId(), userId);
     }
 
     @Override
@@ -934,7 +1001,7 @@ public class MarkServiceImpl implements MarkService {
             lockService.waitlock(LockType.STUDENT, result.getStudentId());
             sr = submitResult(examId, paperNumber, userId, result);
             if (sr.isSuccess()) {
-                releaseTask(sr, userId);
+                releaseStudent(examId, paperNumber, sr.getStudentId(), userId);
             }
         } catch (Exception e) {
             log.error("save task error", e);
@@ -990,7 +1057,7 @@ public class MarkServiceImpl implements MarkService {
             }
         }
         if (CollectionUtils.size(result.getQuestionList()) == count) {
-            return SubmitResult.success(examId, paperNumber, result.getStudentId());
+            return SubmitResult.success(result.getStudentId());
         } else {
             return SubmitResult.faile();
         }
@@ -1070,7 +1137,7 @@ public class MarkServiceImpl implements MarkService {
             resetStudentGroup(task.getStudentId());
         } else {
             // 判断当前分组是否已完成评卷
-            checkStudentQuestion(task.getStudentId(), markQuestion, result);
+            checkStudentQuestion(task.getStudentId(), markQuestion, result.getMarkerScore());
         }
         return true;
     }

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

@@ -20,7 +20,6 @@ import com.qmth.teachcloud.mark.dto.mark.manage.*;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
-import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkTaskMapper;
 import com.qmth.teachcloud.mark.params.MarkResultQuestion;
@@ -238,12 +237,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long markerId, Long userId, List<String> className, String status) {
-        if(status == null){
-            return this.baseMapper.countByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, markerId, userId, className);
-        } else {
-            return this.baseMapper.countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn(examId, paperNumber, markerId, userId, className, status);
-        }
+    public int countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(Long examId, String paperNumber, Long userId, List<String> className) {
+        return this.baseMapper.countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, className);
+    }
+
+    @Override
+    public int countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(Long examId, String paperNumber, Long userId, List<String> className, Long questionId, MarkTaskStatus...status) {
+        return this.baseMapper.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(examId, paperNumber, userId, className, questionId, status);
     }
 
     @Override
@@ -252,15 +252,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<Long> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber,
-                                   Long userId, QuestionModel questionModel) {
-        return this.baseMapper.findUnMarked(page, examId, paperNumber, userId, questionModel);
+    public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId) {
+        return this.baseMapper.findUnMarked(page, examId, paperNumber, userId);
     }
 
     @Override
-    public List<Long> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber,
-                                              Long userId, QuestionModel questionModel) {
-        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, questionModel);
+    public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Boolean classMark) {
+        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, classMark);
     }
 
     @Override
@@ -272,10 +270,11 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByStudentIdAndStatus(Long studentId, MarkTaskStatus... status) {
+    public int countByStatusAndIdIn(List<Long> ids, MarkTaskStatus... status) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-                .in(MarkTask::getStatus, status);
+        queryWrapper.lambda().in(MarkTask::getId, ids)
+                .in(MarkTask::getStatus, status)
+                .isNull(MarkTask::getUserId);
         return this.count(queryWrapper);
     }
 

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

@@ -200,7 +200,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
 
             List<MarkUserClass> markUserClassList = new ArrayList<>();
             for (Map.Entry<String, Long> entry : map.entrySet()) {
-                if (CollectionUtils.size(markUserQuestionService.listByExamIdAndPaperNumberAndUserId(examId, paperNumber, entry.getValue())) > 0) {
+                if (CollectionUtils.size(markUserQuestionService.listByExamIdAndPaperNumberAndUserIdAndEnableTure(examId, paperNumber, entry.getValue())) > 0) {
                     MarkUserClass markUserClass = new MarkUserClass();
                     markUserClass.setId(SystemConstant.getDbUuid());
                     markUserClass.setExamId(examId);

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

@@ -83,9 +83,9 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
                     classNames = markUserClassList.stream().map(MarkUserClass::getClassName).collect(Collectors.toList());
                 }
             }
-            int taskCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn(record.getExamId(), record.getPaperNumber(),null, sysUser.getId(), classNames, null);
+            int taskCount = markTaskService.countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName(record.getExamId(), record.getPaperNumber(), sysUser.getId(), classNames);
             record.setTaskCount(taskCount);
-            int markedCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn(record.getExamId(), record.getPaperNumber(),sysUser.getId(), sysUser.getId(), classNames, "('"+MarkTaskStatus.MARKED+"','"+MarkTaskStatus.ARBITRATED+"')");
+            int markedCount = markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName(record.getExamId(), record.getPaperNumber(), sysUser.getId(), classNames, null, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED);
             record.setMarkedCount(markedCount);
 
             record.setLeftCount(taskCount == 0 ? 0 : taskCount - markedCount);
@@ -326,12 +326,12 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
     }
 
     @Override
-    public List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId) {
+    public List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserIdAndEnableTure(Long examId, String paperNumber, Long userId) {
         QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
                 .eq(MarkUserQuestion::getPaperNumber, paperNumber)
                 .eq(MarkUserQuestion::getUserId, userId)
-                .orderByAsc(MarkUserQuestion::getId);
+                .eq(MarkUserQuestion::getEnable, true);
         return this.list(queryWrapper);
     }
 

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

@@ -817,7 +817,7 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
     @Override
     public boolean apply(MarkStudent t, Long userId) {
         TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-        boolean lock = taskLock.add(t.getId(), 1,userId.toString(), new HashSet<>());
+        boolean lock = taskLock.add(t.getId(),userId.toString(), new HashSet<>());
         // 上锁失败直接返回
         if (!lock) {
             return false;
@@ -835,12 +835,12 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
     @Override
     public void releaseByTask(MarkStudent t) {
         TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-        taskLock.remove(t.getId(),1);
+        taskLock.remove(t.getId());
     }
 
     @Override
     public boolean hasApplied(MarkStudent t, Long userId) {
         TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-        return taskLock.exist(t.getId(),1, userId.toString());
+        return taskLock.exist(t.getId(), userId.toString());
     }
 }

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

@@ -50,6 +50,7 @@ public class TaskServiceImpl implements TaskService {
     public Task build(MarkArbitrateHistory markArbitrateHistory, MarkQuestion markQuestion) {
         MarkStudent markStudent = markStudentService.getById(markArbitrateHistory.getStudentId());
         Task task = new Task();
+        task.setArbitrateId(markArbitrateHistory.getId());
         task.setStudentId(markArbitrateHistory.getStudentId());
         task.setSecretNumber(markArbitrateHistory.getSecretNumber());
         if (StringUtils.isNotBlank(markStudent.getObjectiveScoreList())) {
@@ -94,10 +95,12 @@ public class TaskServiceImpl implements TaskService {
         List<TaskQuestion> list = new LinkedList<>();
 
         List<MarkTask> markTaskList = markTaskService.listByStudentIdAndQuestionId(markArbitrateHistory.getStudentId(), markArbitrateHistory.getQuestionId());
-        List<ScoreItem> sItems = new ArrayList<ScoreItem>();
         TaskQuestion step = buildStep(markQuestion);
         if (markArbitrateHistory != null) {
-            step.setScore(sItems.get(0).getScore());
+            step.setSelfMark(true);
+            if(markArbitrateHistory.getTotalScore() != null) {
+                step.setScore(markArbitrateHistory.getTotalScore());
+            }
             step.setMarkerTime(markArbitrateHistory.getUpdateTime());
             if (markArbitrateHistory.getTotalScore() != null) {
                 step.setMarkerScore(markArbitrateHistory.getTotalScore());

+ 16 - 27
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/TaskLock.java

@@ -17,20 +17,20 @@ public class TaskLock {
     private int count;
 
     public TaskLock() {
-        head = new LockNode(0, 0, 0, new HashSet<>());
+        head = new LockNode(0, 0, new HashSet<>());
         count = 0;
     }
 
-    public synchronized boolean add(Object id, int number, Object owner, Set<Long> questions) {
+    public synchronized boolean add(Object id, Object owner, Set<Long> questions) {
         if (head.next == null) {
-            head.append(id, number, owner, questions);
+            head.append(id, owner, questions);
             count++;
             return true;
         } else {
             LockNode node = head.next;
             while (true) {
                 // id+number,只能被一个owner获取
-                if (node.isId(id) && node.isNumber(number)) {
+                if (node.isId(id)) {
                     return false;
                 }
                 // id只能被一个owner领取一个number
@@ -43,7 +43,7 @@ public class TaskLock {
                 }
                 // 可以领取
                 else {
-                    node.append(id, number, owner, questions);
+                    node.append(id, owner, questions);
                     count++;
                     return true;
                 }
@@ -51,10 +51,10 @@ public class TaskLock {
         }
     }
 
-    public synchronized boolean exist(Object id, int number, Object owner) {
+    public synchronized boolean exist(Object id, Object owner) {
         LockNode node = head.next;
         while (node != null) {
-            if (node.isId(id) && node.isNumber(number)) {
+            if (node.isId(id)) {
                 return node.isOwner(owner);
             } else {
                 node = node.next;
@@ -63,10 +63,10 @@ public class TaskLock {
         return false;
     }
 
-    public synchronized boolean remove(Object id, int number, Object owner) {
+    public synchronized boolean remove(Object id, Object owner) {
         LockNode node = head.next;
         while (node != null) {
-            if (node.isId(id) && node.isNumber(number)) {
+            if (node.isId(id)) {
                 if (node.isOwner(owner)) {
                     node.remove();
                     count--;
@@ -81,10 +81,10 @@ public class TaskLock {
         return false;
     }
 
-    public synchronized boolean remove(Object id, int number) {
+    public synchronized boolean remove(Object id) {
         LockNode node = head.next;
         while (node != null) {
-            if (node.isId(id) && node.isNumber(number)) {
+            if (node.isId(id)) {
                 node.remove();
                 count--;
                 return true;
@@ -123,10 +123,10 @@ public class TaskLock {
         }
     }
 
-    public synchronized boolean refresh(Object id, int number, Object owner) {
+    public synchronized boolean refresh(Object id, Object owner) {
         LockNode node = head.next;
         while (node != null) {
-            if (node.isId(id) && node.isNumber(number) && node.isOwner(owner)) {
+            if (node.isId(id) && node.isOwner(owner)) {
                 node.time = System.currentTimeMillis();
                 return true;
             }
@@ -179,7 +179,6 @@ public class TaskLock {
         while (node != null) {
             Map<String, Object> map = new HashMap<>();
             map.put("taskId", node.getId());
-            map.put("number", node.getNumber());
             map.put("markerId", node.getOwner());
             map.put("questions", JSON.toJSONString(node.getQuestions()));
             map.put("time", DateDisposeUtils.parseDateToStr(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS, new Date(node.getTime())));
@@ -197,16 +196,14 @@ public class TaskLock {
 
         private Object id;
 
-        private int number;
         private Set<Long> questions;
 
         private Object owner;
 
         private long time;
 
-        LockNode(Object id, int number, Object owner, Set<Long> questions) {
+        LockNode(Object id, Object owner, Set<Long> questions) {
             this.id = id;
-            this.number = number;
             this.owner = owner;
             this.questions = questions;
             this.time = System.currentTimeMillis();
@@ -220,10 +217,6 @@ public class TaskLock {
             return this.id.equals(id);
         }
 
-        private boolean isNumber(int number) {
-            return this.number == number;
-        }
-
         private boolean isOwner(Object owner) {
             return this.owner.equals(owner);
         }
@@ -239,8 +232,8 @@ public class TaskLock {
             }
         }
 
-        private void append(Object id, int number, Object owner, Set<Long> questions) {
-            LockNode node = new LockNode(id, number, owner, questions);
+        private void append(Object id, Object owner, Set<Long> questions) {
+            LockNode node = new LockNode(id, owner, questions);
             this.next = node;
             node.previous = this;
         }
@@ -249,10 +242,6 @@ public class TaskLock {
             return id;
         }
 
-        public int getNumber() {
-            return number;
-        }
-
         public Object getOwner() {
             return owner;
         }

+ 15 - 4
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -1042,14 +1042,25 @@
     </select>
     <select id="findUnMarked" resultType="java.lang.Long">
         SELECT m.id
-        FROM mark_student m
+            FROM mark_student m
         <where>
          m.exam_id = #{examId}
           AND m.paper_number = #{paperNumber}
           AND m.subjective_status = 'UNMARK'
-          AND EXISTS(SELECT 1
+          AND EXISTS (SELECT 1
                      FROM mark_task mt
-                     WHERE m.id = mt.student_id)
+                     WHERE mt.user_id IS NULL
+                        AND m.id = mt.student_id
+                        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 muq.enable = TRUE))
         <if test="classMark == true">
             AND EXISTS (
             SELECT 1
@@ -1082,7 +1093,7 @@
         where mp.status = 'FORMAL' and mp.upload_count > 0 and exists(select 1 from basic_exam be
         where exists(select 1 from basic_school bs where bs.enable = true and bs.id = be.school_id)
         and be.enable = true and be.id = mp.exam_id) and ms.exam_id = mp.exam_id and ms.paper_number = mp.paper_number)
-        and (ms.subjective_status = 'UNMARK' or ms.subjective_score = 0 or ms.subjective_score is null)
+        and ms.subjective_status = 'UNMARK'
         and ms.is_upload = true and (ms.is_absent = false and ms.is_manual_absent = false and omr_absent = false)
         <!--and exists(select 1 from mark_task mt where ms.id = mt.student_id)*-->
         <if test="limit != null and limit != ''">

+ 36 - 37
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -139,7 +139,7 @@
         group by mt.student_id
     </select>
     
-    <select id="findUnMarked" resultType="java.lang.Long">
+    <select id="findUnMarked" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
         SELECT
         	distinct mt.student_id
         FROM
@@ -147,8 +147,7 @@
         <where>
         	mt.exam_id = #{examId}
 		and mt.paper_number = #{paperNumber}
-		and mt.group_number = #{groupNumber}
-		and (mt.user_id is null or mt.user_id =#{userId})
+		and mt.user_id is null
 		and (mt.status='WAITING' or mt.status='REJECTED')
         AND EXISTS( SELECT
             1
@@ -166,22 +165,22 @@
 			t.student_id = mt.student_id
             AND t.exam_id = mt.exam_id
             AND t.paper_number = mt.paper_number
-            AND t.group_number = mt.group_number
+            AND t.question_id = mt.question_id
 			AND t.user_id = #{userId}
 			AND t.marker_score IS NOT NULL
 		)
         </where>
     </select>
 
-    <select id="findUnMarkedFilterClass" resultType="java.lang.Long">
+    <select id="findUnMarkedFilterClass" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
         SELECT
-        	distinct mt.student_id
+        	mt.*
         FROM
             mark_task mt
         <where>
         	mt.exam_id = #{examId}
 		and mt.paper_number = #{paperNumber}
-		and (mt.user_id is null or mt.user_id =#{userId})
+		and mt.user_id is null
 		and (mt.status='WAITING' or mt.status='REJECTED')
         AND EXISTS( SELECT
             1
@@ -191,7 +190,8 @@
             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 muq.user_id = #{userId}
+            AND muq.enable = true)
 		AND NOT EXISTS ( 
 			SELECT t.id 
 			FROM
@@ -205,6 +205,7 @@
 			AND t.user_id = #{userId}
 			AND t.marker_score IS NOT NULL
 		)
+        <if test="classMark == true">
 		AND EXISTS (
 			SELECT 1
 			FROM
@@ -213,6 +214,8 @@
 			(select ms.id, bes.teach_class_name from (select * from mark_student where exam_id = #{examId} and paper_number = #{paperNumber}) ms join (select id,teach_class_name from basic_exam_student where exam_id = #{examId}) bes on ms.basic_student_id = bes.id) s on mc.class_name = s.teach_class_name
 			WHERE mt.student_id = s.id
 		)
+        </if>
+        order by mt.main_number, mt.sub_number
         </where>
     </select>
     <select id="listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName"
@@ -251,7 +254,7 @@
     </select>
     <select id="countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn" resultType="java.lang.Integer">
         SELECT
-            count(distinct mt.student_id)
+            count(1)
         FROM
             mark_task mt
         WHERE
@@ -270,29 +273,16 @@
           </foreach>
         </if>
         <if test="classNames != null and classNames.size() > 0">
-            AND EXISTS( SELECT
-            ms.id, ms.exam_id, ms.paper_number, bes.teach_class_name
-            FROM
-            (SELECT
-            *
-            FROM
-            mark_student
-            WHERE
-            exam_id = #{examId} AND paper_number = #{paperNumber}) ms
-            JOIN (SELECT
-            *
-            FROM
-            basic_exam_student
-            WHERE
-            exam_id = #{examId} AND teach_class_name in
+            AND EXISTS( SELECT 1 FROM
+            (SELECT id FROM mark_student ms WHERE exam_id = #{examId} AND paper_number = #{paperNumber}
+            AND EXISTS (SELECT 1 FROM basic_exam_student bes WHERE bes.exam_id = #{examId} AND ms.basic_student_id = bes.id
+                                AND bes.teach_class_name IN (
             <foreach collection="classNames" item="className" separator="," open="(" close=")">
                 #{className}
-            </foreach>) bes ON ms.basic_student_id = bes.id
-            WHERE
-            mt.student_id = ms.id)
+            </foreach>))) t  WHERE mt.student_id = t.id)
         </if>
     </select>
-    <select id="countByExamIdAndPaperNumberAndUserIdAndAndClassName" resultType="java.lang.Integer">
+    <select id="countTotalCountByExamIdAndPaperNumberAndUserIdAndAndClassName" resultType="java.lang.Integer">
         SELECT
         count(distinct mt.student_id)
         FROM
@@ -300,9 +290,6 @@
         WHERE
         mt.exam_id = #{examId}
         AND mt.paper_number = #{paperNumber}
-        <if test="markerId != null">
-            AND mt.user_id = #{markerId}
-        </if>
         AND EXISTS( SELECT
             1
                 FROM
@@ -336,18 +323,20 @@
             mt.student_id = ms.id)
         </if>
     </select>
-    <select id="countByExamIdAndPaperNumberAndUserIdAndAndClassNameStatusIn" resultType="java.lang.Integer">
+    <select id="countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassName" resultType="java.lang.Integer">
         select count(distinct t.student_id) from (SELECT
         mt.student_id,
-        sum(case when mt.status in ('ARBITRATED','MARKED') then 0 else 1 end) unMarkCount
+        sum(case when mt.marker_score is not null and mt.status in
+        <foreach collection="statusList" item="status" separator="," open="(" close=")">
+            #{status}
+        </foreach>
+            then 1 else 0 end) markCount
         FROM
         mark_task mt
         WHERE
         mt.exam_id = #{examId}
         AND mt.paper_number = #{paperNumber}
-        <if test="markerId != null">
-            AND mt.user_id = #{markerId}
-        </if>
+        AND mt.user_id = #{userId}
         AND EXISTS( SELECT
         1
         FROM
@@ -357,6 +346,9 @@
         AND mt.paper_number = muq.paper_number
         AND mt.question_id = muq.question_id
         AND muq.user_id = #{userId}
+        <if test="questionId != null">
+            AND muq.question_id = #{questionId}
+        </if>
         AND muq.enable = true)
         <if test="classNames != null and classNames.size() > 0">
             AND EXISTS( SELECT
@@ -379,7 +371,14 @@
             </foreach>) bes ON ms.basic_student_id = bes.id
             WHERE
             mt.student_id = ms.id)
-        </if> group by mt.student_id) t where t.unMarkCount = 0
+        </if> group by mt.student_id) t where t.markCount = (select count(1)
+                                                        from mark_user_question where exam_id = #{examId}
+                                            AND paper_number = #{paperNumber}
+                                            AND user_id = #{userId}
+                                            <if test="questionId != null">
+                                                AND question_id = #{questionId}
+                                            </if>
+                                            AND enable = true)
     </select>
     <select id="pageMarkTask" resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkTaskDto">
         SELECT