ting.yin 1 жил өмнө
parent
commit
95c762c1e5
20 өөрчлөгдсөн 446 нэмэгдсэн , 435 устгасан
  1. 0 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkProblemType.java
  2. 19 19
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SpecialTagDTO.java
  3. 43 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerSpecialTagDTO.java
  4. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkStepDTO.java
  5. 0 194
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/TrackDTO.java
  6. 11 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java
  7. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResult.java
  8. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkHeaderTagService.java
  9. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkHeaderTrackService.java
  10. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  11. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSpecialTagService.java
  12. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java
  13. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTrackService.java
  14. 32 21
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderTagServiceImpl.java
  15. 8 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderTrackServiceImpl.java
  16. 11 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  17. 243 167
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  18. 31 19
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSpecialTagServiceImpl.java
  19. 12 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java
  20. 13 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTrackServiceImpl.java

+ 0 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkProblemType.java

@@ -1,7 +1,5 @@
 package com.qmth.teachcloud.common.enums.mark;
 
-import com.baomidou.mybatisplus.annotation.EnumValue;
-
 import java.util.LinkedList;
 import java.util.List;
 

+ 19 - 19
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SpecialTagDTO.java

@@ -1,12 +1,12 @@
 package com.qmth.teachcloud.mark.dto.mark;
 
+import java.io.Serializable;
+
 import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
 import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
 import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 
-import java.io.Serializable;
-
 public class SpecialTagDTO implements Serializable {
 
     private static final long serialVersionUID = -5424015292124065736L;
@@ -27,23 +27,23 @@ public class SpecialTagDTO implements Serializable {
 
     }
 
-//    public SpecialTagDTO(MarkSpecialTag markSpecialTag) {
-//        this.tagName = markSpecialTag.getTagName();
-//        this.positionX = markSpecialTag.getPositionX();
-//        this.positionY = markSpecialTag.getPositionY();
-//        this.offsetIndex = markSpecialTag.getOffsetIndex();
-//        this.offsetX = markSpecialTag.getOffsetX();
-//        this.offsetY = markSpecialTag.getOffsetY();
-//    }
-
-//    public SpecialTagDTO(HeaderTag tag) {
-//        this.tagName = tag.getTagName();
-//        this.positionX = tag.getPositionX();
-//        this.positionY = tag.getPositionY();
-//        this.offsetIndex = tag.getOffsetIndex();
-//        this.offsetX = tag.getOffsetX();
-//        this.offsetY = tag.getOffsetY();
-//    }
+    public SpecialTagDTO(MarkSpecialTag markSpecialTag) {
+        this.tagName = markSpecialTag.getTagName();
+        this.positionX = markSpecialTag.getPositionX();
+        this.positionY = markSpecialTag.getPositionY();
+        this.offsetIndex = markSpecialTag.getOffsetIndex();
+        this.offsetX = markSpecialTag.getOffsetX();
+        this.offsetY = markSpecialTag.getOffsetY();
+    }
+
+    public SpecialTagDTO(MarkHeaderTag tag) {
+        this.tagName = tag.getTagName();
+        this.positionX = tag.getPositionX();
+        this.positionY = tag.getPositionY();
+        this.offsetIndex = tag.getOffsetIndex();
+        this.offsetX = tag.getOffsetX();
+        this.offsetY = tag.getOffsetY();
+    }
 
     public MarkSpecialTag transform(MarkTask markTask) {
         MarkSpecialTag markSpecialTag = new MarkSpecialTag();

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

@@ -0,0 +1,43 @@
+package com.qmth.teachcloud.mark.dto.mark.manage;
+
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
+import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
+
+public class MarkerSpecialTagDTO extends SpecialTagDTO {
+
+    private static final long serialVersionUID = 4928109012686348307L;
+
+    private Long markerId;
+
+    private int groupNumber;
+
+    public MarkerSpecialTagDTO(Long markerId, int groupNumber, MarkSpecialTag specialTag) {
+        super(specialTag);
+        this.markerId = markerId;
+        this.groupNumber = groupNumber;
+    }
+
+    public MarkerSpecialTagDTO(Long markerId, int groupNumber, MarkHeaderTag headerTag) {
+        super(headerTag);
+        this.markerId = markerId;
+        this.groupNumber = groupNumber;
+    }
+
+    public Long getMarkerId() {
+        return markerId;
+    }
+
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
+
+    public int getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(int groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+}

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkStepDTO.java

@@ -3,6 +3,8 @@ package com.qmth.teachcloud.mark.dto.mark.mark;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
+
 public class MarkStepDTO  {
 
     private int groupNumber;

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

@@ -1,194 +0,0 @@
-package com.qmth.teachcloud.mark.dto.mark.mark;
-
-
-import com.qmth.teachcloud.mark.entity.*;
-
-public class TrackDTO {
-
-
-    private Integer mainNumber;
-
-    private String subNumber;
-
-    private int number;
-
-    private double score;
-
-    private double positionX;
-
-    private double positionY;
-
-    private int offsetIndex;
-
-    private int offsetX;
-
-    private int offsetY;
-
-    private boolean unanswered;
-
-    public TrackDTO() {
-
-    }
-
-    public TrackDTO(MarkTrack track) {
-        String questionNumber = track.getQuestionNumber();
-        String str[] = questionNumber.split("\\.");
-        setMainNumber(Integer.parseInt(str[0]));
-        setSubNumber(str[1]);
-        setNumber(track.getNumber());
-        setScore(track.getScore());
-        setPositionX(track.getPositionX());
-        setPositionY(track.getPositionY());
-        setOffsetIndex(track.getOffsetIndex());
-        setOffsetX(track.getOffsetX());
-        setOffsetY(track.getOffsetY());
-    }
-//
-//    public TrackDTO(TrialTrack track) {
-//        String str[] = track.getQuestionNumber().split("\\.");
-//        setMainNumber(Integer.parseInt(str[0]));
-//        setSubNumber(str[1]);
-//        setNumber(track.getNumber());
-//        setScore(track.getScore());
-//        setPositionX(track.getPositionX());
-//        setPositionY(track.getPositionY());
-//        setOffsetIndex(track.getOffsetIndex());
-//        setOffsetX(track.getOffsetX());
-//        setOffsetY(track.getOffsetY());
-//        setUnanswered(track.isUnanswered());
-//    }
-//
-//    public TrackDTO(HeaderTrack track) {
-//        String questionNumber = track.getQuestionNumber();
-//        String str[] = questionNumber.split("\\.");
-//        setMainNumber(Integer.parseInt(str[0]));
-//        setSubNumber(str[1]);
-//        setNumber(track.getNumber());
-//        setScore(track.getScore());
-//        setPositionX(track.getPositionX());
-//        setPositionY(track.getPositionY());
-//        setOffsetIndex(track.getOffsetIndex());
-//        setOffsetX(track.getOffsetX());
-//        setOffsetY(track.getOffsetY());
-//        setUnanswered(track.isUnanswered());
-//    }
-//
-    public MarkTrack transform(MarkTask library, MarkUserGroup marker) {
-        MarkTrack track = new MarkTrack();
-        track.setTaskId(library.getId());
-        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
-        track.setNumber(getNumber());
-        track.setStudentId(library.getStudentId());
-        track.setExamId(library.getExamId());
-        track.setPaperNumber(library.getPaperNumber());
-        track.setGroupNumber(library.getGroupNumber());
-        track.setUserId(marker.getId());
-        track.setScore(getScore());
-        track.setPositionX(getPositionX());
-        track.setPositionY(getPositionY());
-        track.setOffsetIndex(getOffsetIndex());
-        track.setOffsetX(getOffsetX());
-        track.setOffsetY(getOffsetY());
-        return track;
-    }
-
-
-    public MarkHeaderTrack transform(MarkArbitrateHistory library) {
-        MarkHeaderTrack track = new MarkHeaderTrack();
-        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
-        track.setNumber(getNumber());
-        track.setStudentId(library.getStudentId());
-        track.setExamId(library.getExamId());
-        track.setPaperNumber(library.getPaperNumber());
-        track.setGroupNumber(library.getGroupNumber());
-        track.setUserId(library.getUpdateUserId());
-        track.setScore(getScore());
-        track.setPositionX(getPositionX());
-        track.setPositionY(getPositionY());
-        track.setOffsetIndex(getOffsetIndex());
-        track.setOffsetX(getOffsetX());
-        track.setOffsetY(getOffsetY());
-        return track;
-    }
-
-    public Integer getMainNumber() {
-        return mainNumber;
-    }
-
-    public void setMainNumber(Integer mainNumber) {
-        this.mainNumber = mainNumber;
-    }
-
-    public String getSubNumber() {
-        return subNumber;
-    }
-
-    public void setSubNumber(String subNumber) {
-        this.subNumber = subNumber;
-    }
-
-    public int getNumber() {
-        return number;
-    }
-
-    public void setNumber(int number) {
-        this.number = number;
-    }
-
-    public double getScore() {
-        return score;
-    }
-
-    public void setScore(double score) {
-        this.score = score;
-    }
-
-    public double getPositionX() {
-        return positionX;
-    }
-
-    public void setPositionX(double positionX) {
-        this.positionX = positionX;
-    }
-
-    public double getPositionY() {
-        return positionY;
-    }
-
-    public void setPositionY(double positionY) {
-        this.positionY = positionY;
-    }
-
-    public int getOffsetIndex() {
-        return offsetIndex;
-    }
-
-    public void setOffsetIndex(int offsetIndex) {
-        this.offsetIndex = offsetIndex;
-    }
-
-    public int getOffsetX() {
-        return offsetX;
-    }
-
-    public void setOffsetX(int offsetX) {
-        this.offsetX = offsetX;
-    }
-
-    public int getOffsetY() {
-        return offsetY;
-    }
-
-    public void setOffsetY(int offsetY) {
-        this.offsetY = offsetY;
-    }
-
-    public boolean isUnanswered() {
-        return unanswered;
-    }
-
-    public void setUnanswered(boolean unanswered) {
-        this.unanswered = unanswered;
-    }
-
-}

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

@@ -8,6 +8,7 @@ import java.util.List;
 import org.apache.commons.lang.math.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -15,6 +16,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.enums.ScanStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
+import com.qmth.teachcloud.mark.bean.FilePathVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.utils.BigDecimalUtils;
 
@@ -568,6 +570,15 @@ public class MarkStudent implements Serializable {
         }
         return list;
     }
+    
+    public List<String> getSheetPathList() {
+    	List<String> list = new ArrayList<String>();
+        List<FilePathVo> vos = JSON.parseArray(StringUtils.trimToNull(sheetPath),FilePathVo.class);
+        for (FilePathVo filePathVo : vos) {
+        	list.add(JSON.toJSONString(filePathVo));
+		}
+        return list;
+    }
 
     public void setScoreList(List<ScoreItem> scoreList, boolean objective) {
         if (scoreList != null) {

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

@@ -67,7 +67,7 @@ public class MarkResult {
     /**
      * 是否问题卷
      */
-    private boolean isProblem;
+    private boolean problem;
 
     /**
      * 问题类型
@@ -193,11 +193,11 @@ public class MarkResult {
     }
 
     public boolean isProblem() {
-        return isProblem;
+        return problem;
     }
 
-    public void setProblem(boolean isProblem) {
-        this.isProblem = isProblem;
+    public void setProblem(boolean problem) {
+        this.problem = problem;
     }
 
 

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

@@ -1,6 +1,9 @@
 package com.qmth.teachcloud.mark.service;
 
 import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
+
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
@@ -16,4 +19,6 @@ public interface MarkHeaderTagService extends IService<MarkHeaderTag> {
     void deleteByStudentIdAndGroupNumber(Long studentId, Integer groupNumber);
 
     void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number);
+
+	List<MarkHeaderTag> findByStudentId(Long studentId);
 }

+ 1 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkHeaderTrackService.java

@@ -22,4 +22,5 @@ public interface MarkHeaderTrackService extends IService<MarkHeaderTrack> {
     void deleteByExamIdAndPaperNumberAndGroupNumberAndStudentId(Long examId, String paperNumber, Integer groupNumber, Long studentId);
 
     void deleteByStudentId(Long studentId);
+
 }

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

@@ -31,6 +31,8 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
     List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     void saveQuestions(MarkQuestionParams markQuestionParams);
+    
+    List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber,Boolean isObjective);
 
     List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number, Boolean isObjective);
 

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

@@ -1,6 +1,9 @@
 package com.qmth.teachcloud.mark.service;
 
 import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
+
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
@@ -18,4 +21,6 @@ public interface MarkSpecialTagService extends IService<MarkSpecialTag> {
     void deleteByStudentId(Long studentId);
 
     void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+
+	List<MarkSpecialTag> findByTaskId(Long taskId);
 }

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

@@ -28,4 +28,6 @@ public interface MarkSubjectiveScoreService extends IService<MarkSubjectiveScore
     void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 
 	List<QuestionVo> getSubjectiveVo(Long examId, String paperNumber);
+	
+	  List<MarkSubjectiveScore> listByStudentId(Long studentId);
 }

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

@@ -24,4 +24,6 @@ public interface MarkTrackService extends IService<MarkTrack> {
     void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
     
     List<MarkTrack> listByTaskId(Long taskId);
+
+	List<MarkTrack> findByStudentIdAndQuestionNumber(Long studentId, String questionNumber);
 }

+ 32 - 21
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderTagServiceImpl.java

@@ -1,12 +1,16 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
 import com.qmth.teachcloud.mark.mapper.MarkHeaderTagMapper;
 import com.qmth.teachcloud.mark.service.MarkHeaderTagService;
-import org.springframework.stereotype.Service;
 
 /**
  * <p>
@@ -17,26 +21,33 @@ import org.springframework.stereotype.Service;
  * @since 2023-11-01
  */
 @Service
-public class MarkHeaderTagServiceImpl extends ServiceImpl<MarkHeaderTagMapper, MarkHeaderTag> implements MarkHeaderTagService {
+public class MarkHeaderTagServiceImpl extends ServiceImpl<MarkHeaderTagMapper, MarkHeaderTag>
+		implements MarkHeaderTagService {
+
+	@Override
+	public void deleteByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
+		UpdateWrapper<MarkHeaderTag> updateWrapper = new UpdateWrapper<>();
+		LambdaUpdateWrapper<MarkHeaderTag> lambdaUpdateWrapper = updateWrapper.lambda();
+		lambdaUpdateWrapper.eq(MarkHeaderTag::getStudentId, studentId);
+		if (groupNumber != null) {
+			lambdaUpdateWrapper.eq(MarkHeaderTag::getGroupNumber, groupNumber);
+		}
+		this.remove(updateWrapper);
+	}
 
-    @Override
-    public void deleteByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
-        UpdateWrapper<MarkHeaderTag> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<MarkHeaderTag> lambdaUpdateWrapper = updateWrapper.lambda();
-        lambdaUpdateWrapper.eq(MarkHeaderTag::getStudentId, studentId);
-        if (groupNumber != null) {
-            lambdaUpdateWrapper.eq(MarkHeaderTag::getGroupNumber, groupNumber);
-        }
-        this.remove(updateWrapper);
-    }
+	@Override
+	public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number) {
+		UpdateWrapper<MarkHeaderTag> updateWrapper = new UpdateWrapper<>();
+		LambdaUpdateWrapper<MarkHeaderTag> lambdaUpdateWrapper = updateWrapper.lambda();
+		lambdaUpdateWrapper.eq(MarkHeaderTag::getExamId, examId).eq(MarkHeaderTag::getPaperNumber, paperNumber)
+				.eq(MarkHeaderTag::getGroupNumber, number);
+		this.remove(updateWrapper);
+	}
 
-    @Override
-    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number) {
-        UpdateWrapper<MarkHeaderTag> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<MarkHeaderTag> lambdaUpdateWrapper = updateWrapper.lambda();
-        lambdaUpdateWrapper.eq(MarkHeaderTag::getExamId, examId)
-                .eq(MarkHeaderTag::getPaperNumber, paperNumber)
-                .eq(MarkHeaderTag::getGroupNumber, number);
-        this.remove(updateWrapper);
-    }
+	@Override
+	public List<MarkHeaderTag> findByStudentId(Long studentId) {
+		QueryWrapper<MarkHeaderTag> queryWrapper = new QueryWrapper<>();
+		queryWrapper.lambda().eq(MarkHeaderTag::getStudentId, studentId);
+		return this.list(queryWrapper);
+	}
 }

+ 8 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderTrackServiceImpl.java

@@ -1,5 +1,9 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -7,9 +11,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.mark.entity.MarkHeaderTrack;
 import com.qmth.teachcloud.mark.mapper.MarkHeaderTrackMapper;
 import com.qmth.teachcloud.mark.service.MarkHeaderTrackService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
 
 /**
  * <p>
@@ -28,7 +29,8 @@ public class MarkHeaderTrackServiceImpl extends ServiceImpl<MarkHeaderTrackMappe
         queryWrapper.lambda().eq(MarkHeaderTrack::getExamId, examId)
                 .eq(MarkHeaderTrack::getPaperNumber, paperNumber)
                 .eq(MarkHeaderTrack::getGroupNumber, groupNumber)
-                .eq(MarkHeaderTrack::getStudentId, studentId);
+                .eq(MarkHeaderTrack::getStudentId, studentId)
+                .orderByAsc(MarkHeaderTrack::getNumber);
         return this.list(queryWrapper);
     }
 
@@ -36,7 +38,8 @@ public class MarkHeaderTrackServiceImpl extends ServiceImpl<MarkHeaderTrackMappe
     public List<MarkHeaderTrack> listByStudentIdAndQuestionNumber(Long studentId, String questionNumber) {
         QueryWrapper<MarkHeaderTrack> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkHeaderTrack::getStudentId, studentId)
-                .eq(MarkHeaderTrack::getQuestionNumber, questionNumber);
+                .eq(MarkHeaderTrack::getQuestionNumber, questionNumber)
+                .orderByAsc(MarkHeaderTrack::getNumber);
         return this.list(queryWrapper);
     }
 

+ 11 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -265,4 +265,15 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         }
         return this.list(queryWrapper);
     }
+
+	@Override
+	public List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber, Boolean isObjective) {
+		 QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
+	        queryWrapper.lambda().eq(MarkQuestion::getExamId, examId)
+	                .eq(MarkQuestion::getPaperNumber, paperNumber)
+	                .eq(MarkQuestion::getObjective, isObjective)
+	                .orderByAsc(MarkQuestion::getMainNumber)
+	                .orderByAsc(MarkQuestion::getSubNumber);
+	        return this.list(queryWrapper);
+	}
 }

+ 243 - 167
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -13,6 +13,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.Resource;
 
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -31,19 +32,24 @@ import com.qmth.teachcloud.common.enums.mark.MarkProblemType;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkerSpecialTagDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkerTrackDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkGroupDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkStatusDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkStepDTO;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.SubmitResult;
-import com.qmth.teachcloud.mark.dto.mark.mark.TrackDTO;
 import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkGroupStudent;
+import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
 import com.qmth.teachcloud.mark.entity.MarkHeaderTrack;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkProblemHistory;
+import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
 import com.qmth.teachcloud.mark.entity.MarkTask;
@@ -778,7 +784,8 @@ public class MarkServiceImpl implements MarkService {
 		for (MarkUserGroup markUserGroup : markUserGroups) {
 			MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber,
 					markUserGroup.getGroupNumber());
-			markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserGroup.getGroupNumber(), false));
+			markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId,
+					paperNumber, markUserGroup.getGroupNumber(), false));
 			MarkGroupDto dto = new MarkGroupDto();
 			dto.setGroupNumber(markUserGroup.getGroupNumber());
 			dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber,
@@ -928,9 +935,9 @@ public class MarkServiceImpl implements MarkService {
 		page.addOrder(orderItem);
 		IPage<MarkTask> list = markTaskService.listPageHistory(page, userId, examId, paperNumber, groupNumber,
 				secretNumber, markerScore);
-		List<MarkTaskDto> recordsDtos =new ArrayList<MarkTaskDto>();
+		List<MarkTaskDto> recordsDtos = new ArrayList<MarkTaskDto>();
 		for (MarkTask task : list.getRecords()) {
-			MarkTaskDto dto = this.getTaskDto(task,group);
+			MarkTaskDto dto = this.getTaskDto(task, group);
 			recordsDtos.add(dto);
 		}
 		IPage<MarkTaskDto> result = new Page<MarkTaskDto>();
@@ -968,7 +975,7 @@ public class MarkServiceImpl implements MarkService {
 			}
 			for (MarkTask t : list) {
 				if (this.applyTask(t, userId)) {
-					task =  this.getTaskDto(t,group);
+					task = this.getTaskDto(t, group);
 					break;
 				}
 			}
@@ -997,12 +1004,12 @@ public class MarkServiceImpl implements MarkService {
 			return false;
 		}
 	}
-	
+
 	@Override
 	public boolean hasApplied(MarkTask t, Long userId) {
 		String key = t.getExamId() + "_" + t.getPaperNumber() + "_" + t.getGroupNumber();
-		 TaskLock taskLock = TaskLockUtil.getFormalTask(key);
-		 return taskLock.exist(t.getStudentId(), t.getTaskNumber(),userId);
+		TaskLock taskLock = TaskLockUtil.getFormalTask(key);
+		return taskLock.exist(t.getStudentId(), t.getTaskNumber(), userId);
 	}
 
 	@Override
@@ -1024,8 +1031,7 @@ public class MarkServiceImpl implements MarkService {
 			Long now = System.currentTimeMillis();
 			if (result.isProblem()) {
 				// 状态更新
-				if (markTaskService.updateProblemResult(task.getId(), userId, now,
-						result.getSpent())) {
+				if (markTaskService.updateProblemResult(task.getId(), userId, now, result.getSpent())) {
 					saveProblemHistory(result, task, userId);
 					updateMarkedCount(markUserGroup.getExamId(), markUserGroup.getPaperNumber(),
 							markUserGroup.getGroupNumber());
@@ -1038,7 +1044,7 @@ public class MarkServiceImpl implements MarkService {
 				}
 			}
 			if (result.getMarkerScore() <= group.getTotalScore()) {
-				if (submitTask(task,userId, group, result)) {
+				if (submitTask(task, userId, group, result)) {
 					updateMarkedCount(markUserGroup.getExamId(), markUserGroup.getPaperNumber(),
 							markUserGroup.getGroupNumber());
 					return SubmitResult.success(task);
@@ -1049,97 +1055,96 @@ public class MarkServiceImpl implements MarkService {
 	}
 
 	private void saveProblemHistory(MarkResult result, MarkTask task, Long userId) {
-        MarkProblemHistory history = markProblemHistoryService.findByTaskIdAndStatus(task.getId(), MarkProblemStatus.WAITING);
-        if (history == null) {
-            history = new MarkProblemHistory();
-        }
-        history.setExamId(task.getExamId());
-        history.setSecretNumber(task.getSecretNumber());
-        history.setStudentId(task.getStudentId());
-        history.setTaskId(task.getId());
-        history.setPaperNumber(task.getPaperNumber());
-        history.setGroupNumber(task.getGroupNumber());
-        history.setType(result.getProblemType());
-        if(MarkProblemType.OTHER.equals(result.getProblemType())) {
-        	history.setRemark(result.getProblemRemark());
-        }
-        history.setStatus(MarkProblemStatus.WAITING);
-        history.setUserId(userId);
-        markProblemHistoryService.save(history);
+		MarkProblemHistory history = markProblemHistoryService.findByTaskIdAndStatus(task.getId(),
+				MarkProblemStatus.WAITING);
+		if (history == null) {
+			history = new MarkProblemHistory();
+		}
+		history.setExamId(task.getExamId());
+		history.setSecretNumber(task.getSecretNumber());
+		history.setStudentId(task.getStudentId());
+		history.setTaskId(task.getId());
+		history.setPaperNumber(task.getPaperNumber());
+		history.setGroupNumber(task.getGroupNumber());
+		history.setType(result.getProblemType());
+		if (MarkProblemType.OTHER.equals(result.getProblemType())) {
+			history.setRemark(result.getProblemRemark());
+		}
+		history.setStatus(MarkProblemStatus.WAITING);
+		history.setUserId(userId);
+		markProblemHistoryService.save(history);
 	}
 
-	private boolean submitTask(MarkTask task,Long userId, MarkGroup group, MarkResult result) {
-        // 非本人领取的待评任务
-        if ((task.getStatus() == MarkTaskStatus.WAITING || task.getStatus() == MarkTaskStatus.REJECTED)
-                && !hasApplied(task, userId)) {
-            return false;
-        }
-        // 非本人的回评任务
-        if ((task.getStatus() == MarkTaskStatus.MARKED)
-                && !task.getUserId().equals(userId)) {
-            return false;
-        }
-        // 是否多评情况下已处理过该考生评卷任务
-        if (markTaskService
-                .countByStudentIdAndMarkerIdAndIdNotEqual(task.getStudentId(), userId, task.getId()) > 0) {
-            return false;
-        }
-        // 未选做
+	private boolean submitTask(MarkTask task, Long userId, MarkGroup group, MarkResult result) {
+		// 非本人领取的待评任务
+		if ((task.getStatus() == MarkTaskStatus.WAITING || task.getStatus() == MarkTaskStatus.REJECTED)
+				&& !hasApplied(task, userId)) {
+			return false;
+		}
+		// 非本人的回评任务
+		if ((task.getStatus() == MarkTaskStatus.MARKED) && !task.getUserId().equals(userId)) {
+			return false;
+		}
+		// 是否多评情况下已处理过该考生评卷任务
+		if (markTaskService.countByStudentIdAndMarkerIdAndIdNotEqual(task.getStudentId(), userId, task.getId()) > 0) {
+			return false;
+		}
+		// 未选做
 //        if (result.isUnselective() && group.isSelective()) {
 //            result.setMarkerScore(UN_SELECTIVE_SCORE);
 //            result.setScoreList(new Double[0]);
 //            trackDao.deleteByLibraryId(library.getId());
 //            specialTagDao.deleteByLibraryId(library.getId());
 //        }
-        // 尝试提交评卷结果
-        Long now = System.currentTimeMillis();
-        if (markTaskService.updateMarkerResult(task.getId(), MarkTaskStatus.MARKED, userId,
-                result.getMarkerScore(), result.getScoreList(), now, result.getSpent(), null, null, null,
-                MarkTaskStatus.WAITING, MarkTaskStatus.MARKED, MarkTaskStatus.REJECTED)) {
-            // 条件不符更新失败,直接返回
-            return false;
-        }
-        // 保存阅卷轨迹
+		// 尝试提交评卷结果
+		Long now = System.currentTimeMillis();
+		if (markTaskService.updateMarkerResult(task.getId(), MarkTaskStatus.MARKED, userId, result.getMarkerScore(),
+				result.getScoreList(), now, result.getSpent(), null, null, null, MarkTaskStatus.WAITING,
+				MarkTaskStatus.MARKED, MarkTaskStatus.REJECTED)) {
+			// 条件不符更新失败,直接返回
+			return false;
+		}
+		// 保存阅卷轨迹
 //        int unansweredCount = 0;
-        if (result.getTrackList() != null && !result.isUnselective()) {
-        	markTrackService.deleteByTaskId(task.getId());
-            markTrackService.saveBatch(result.getTrackList(task, userId));
+		if (result.getTrackList() != null && !result.isUnselective()) {
+			markTrackService.deleteByTaskId(task.getId());
+			markTrackService.saveBatch(result.getTrackList(task, userId));
 //            for (MarkTrack markTrack : tracks) {
 //                if (markTrack.isUnanswered()) {
 //                    unansweredCount++;
 //                }
 //            }
 //            libraryDao.updateUnansweredCount(library.getId(), unansweredCount);
-        }
-        // 保存特殊标记
-        if (result.getSpecialTagList() != null && !result.isUnselective()) {
-            markSpecialTagService.deleteByTaskId(task.getId());
-            markSpecialTagService.saveBatch(result.getSpecialTagList(task));
-        }
-        // 判断多评模式下是否需要仲裁
-        MarkArbitrateHistory history = null;
-        if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
-            // 多评模式
-            List<MarkTask> list = markTaskService.findByStudentIdAndGroupNumberAndStatus(task.getStudentId(),
-                    task.getGroupNumber(), MarkTaskStatus.MARKED);
-            for (MarkTask other : list) {
-                // 本评卷任务或组长已打分,则跳过该任务
-                if (other.getId().equals(task.getId()) || other.getHeaderScore() != null) {
-                    continue;
-                }
-                // 均为未选做,跳过该任务
+		}
+		// 保存特殊标记
+		if (result.getSpecialTagList() != null && !result.isUnselective()) {
+			markSpecialTagService.deleteByTaskId(task.getId());
+			markSpecialTagService.saveBatch(result.getSpecialTagList(task));
+		}
+		// 判断多评模式下是否需要仲裁
+		MarkArbitrateHistory history = null;
+		if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
+			// 多评模式
+			List<MarkTask> list = markTaskService.findByStudentIdAndGroupNumberAndStatus(task.getStudentId(),
+					task.getGroupNumber(), MarkTaskStatus.MARKED);
+			for (MarkTask other : list) {
+				// 本评卷任务或组长已打分,则跳过该任务
+				if (other.getId().equals(task.getId()) || other.getHeaderScore() != null) {
+					continue;
+				}
+				// 均为未选做,跳过该任务
 //                if (other.getMarkerScore() == UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE) {
 //                    continue;
 //                }
-                // 其中一个有分另一个未选做 直接进入仲裁
+				// 其中一个有分另一个未选做 直接进入仲裁
 //                if ((other.getMarkerScore() != UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE)
 //                        || (other.getMarkerScore() == UN_SELECTIVE_SCORE && result.getMarkerScore() != UN_SELECTIVE_SCORE)) {
 //                    history = buildArbitrateHistory(library, now);
 //                    break;
 //                }
-                // 分差超过阀值
-                if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
-                    // 开启三评
+				// 分差超过阀值
+				if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
+					// 开启三评
 //                    if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
 //                        if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber()) == 2) {
 //                            buildThirdLibrary(library, group);
@@ -1150,114 +1155,185 @@ public class MarkServiceImpl implements MarkService {
 //                            history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
 //                        }
 //                    } else {
-                        // 未开启三评,触发仲裁
-                        history = buildArbitrateHistory(task, now);
-                        break;
+					// 未开启三评,触发仲裁
+					history = buildArbitrateHistory(task, now);
+					break;
 //                    }
-                }
-            }
-        }
-        if (history != null) {
-            // 保存仲裁记录
-            markArbitrateHistoryService.save(history);
-            // 触发仲裁后续状态更新
-            markTaskService.updateStatusByStudentIdAndGroupNumber(task.getStudentId(), task.getGroupNumber(),
-            		MarkTaskStatus.WAIT_ARBITRATE);
-            // 未评完
-            resetStudentGroup(task.getStudentId(), task.getExamId(), task.getPaperNumber(),
-                    task.getGroupNumber());
-        } else {
-            // 判断当前分组是否已完成评卷
-            checkStudentGroup(task.getStudentId(), group);
-        }
-        return true;
-    }
+				}
+			}
+		}
+		if (history != null) {
+			// 保存仲裁记录
+			markArbitrateHistoryService.save(history);
+			// 触发仲裁后续状态更新
+			markTaskService.updateStatusByStudentIdAndGroupNumber(task.getStudentId(), task.getGroupNumber(),
+					MarkTaskStatus.WAIT_ARBITRATE);
+			// 未评完
+			resetStudentGroup(task.getStudentId(), task.getExamId(), task.getPaperNumber(), task.getGroupNumber());
+		} else {
+			// 判断当前分组是否已完成评卷
+			checkStudentGroup(task.getStudentId(), group);
+		}
+		return true;
+	}
 
 	private MarkArbitrateHistory buildArbitrateHistory(MarkTask task, Long now) {
 		MarkArbitrateHistory history = new MarkArbitrateHistory();
-        history.setExamId(task.getExamId());
-        history.setPaperNumber(task.getPaperNumber());
-        history.setGroupNumber(task.getGroupNumber());
-        history.setStudentId(task.getStudentId());
-        history.setStudentCode(task.getStudentCode());
-        history.setSecretNumber(task.getSecretNumber());
-        history.setStatus(MarkArbitrateStatus.WAITING);
-        history.setCreateTime(now);
-        return history;
-    }
-	
+		history.setExamId(task.getExamId());
+		history.setPaperNumber(task.getPaperNumber());
+		history.setGroupNumber(task.getGroupNumber());
+		history.setStudentId(task.getStudentId());
+		history.setStudentCode(task.getStudentCode());
+		history.setSecretNumber(task.getSecretNumber());
+		history.setStatus(MarkArbitrateStatus.WAITING);
+		history.setCreateTime(now);
+		return history;
+	}
+
 	@Override
-	public MarkTaskDto getTaskDto(MarkTask t,MarkGroup group) {
+	public MarkTaskDto getTaskDto(MarkTask t, MarkGroup group) {
 		MarkTaskDto task = new MarkTaskDto(t);
 		task.setQuestionList(buildMarkStep(t));
-		task.setSheetUrls(null);
+		MarkStudent student = markStudentService.getById(t.getStudentId());
+		task.setSheetUrls(teachcloudCommonService.filePreview(student.getSheetPathList()));
 		task.setSliceConfig(group.getPictureConfigList());
-        return task;
+		return task;
 	}
 
 	private List<MarkStepDTO> buildMarkStep(MarkTask task) {
-        List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
-        List<MarkQuestion> sList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(task.getExamId(), task.getPaperNumber(),  task.getGroupNumber(), false);
-        List<MarkTrack> tracks = new ArrayList<MarkTrack>();
-        List<ScoreItem> sItems = new ArrayList<ScoreItem>();
-        List<ScoreItem> rItems = null;
-        if (task != null) {
-            tracks = markTrackService.listByTaskId(task.getId());
-            sItems = task.getMarkerScoreItem();
-        }
-        for (int i = 0; i < sList.size(); i++) {
-        	MarkQuestion question = sList.get(i);
-            MarkStepDTO step = buildStep(question);
-            if (task != null) {
-                if (!sItems.isEmpty() && sItems.size() == sList.size()) {
-                    step.setScore(sItems.get(i).getScore());
-                }
-                if (rItems == null) {
-                    // 无打回记录
-                    step.setRejected(false);
-                } else if (rItems != null && rItems.isEmpty()) {
-                    // 全打回
-                    step.setRejected(true);
-                } else if (rItems != null && !rItems.isEmpty() && rItems.size() == sList.size()) {
-                    // 部分打回
-                    step.setRejected(rItems.get(i).getScore() == null);
-                }
-                // 未选做
+		List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
+		List<MarkQuestion> sList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(
+				task.getExamId(), task.getPaperNumber(), task.getGroupNumber(), false);
+		List<MarkTrack> tracks = new ArrayList<MarkTrack>();
+		List<ScoreItem> sItems = new ArrayList<ScoreItem>();
+		List<ScoreItem> rItems = null;
+		if (task != null) {
+			tracks = markTrackService.listByTaskId(task.getId());
+			sItems = task.getMarkerScoreItem();
+		}
+		for (int i = 0; i < sList.size(); i++) {
+			MarkQuestion question = sList.get(i);
+			MarkStepDTO step = buildStep(question);
+			if (task != null) {
+				if (!sItems.isEmpty() && sItems.size() == sList.size()) {
+					step.setScore(sItems.get(i).getScore());
+				}
+				if (rItems == null) {
+					// 无打回记录
+					step.setRejected(false);
+				} else if (rItems != null && rItems.isEmpty()) {
+					// 全打回
+					step.setRejected(true);
+				} else if (rItems != null && !rItems.isEmpty() && rItems.size() == sList.size()) {
+					// 部分打回
+					step.setRejected(rItems.get(i).getScore() == null);
+				}
+				// 未选做
 //                if (task.getMarkerScore() != null && task.getMarkerScore() == UN_SELECTIVE_SCORE) {
 //                    step.setScore(UN_SELECTIVE_SCORE);
 //                }
-                // 增加阅卷轨迹列表获取
-                String questionNumber = question.getQuestionNumber();
-                for (MarkTrack track : tracks) {
-                    if (track.getQuestionNumber().equals(questionNumber)) {
-                        step.addTrack(new TrackDTO(track));
-                    }
-                }
-            }
-            list.add(step);
-        }
-        return list;
-    }
+				// 增加阅卷轨迹列表获取
+				String questionNumber = question.getQuestionNumber();
+				for (MarkTrack track : tracks) {
+					if (track.getQuestionNumber().equals(questionNumber)) {
+						step.addTrack(new TrackDTO(track));
+					}
+				}
+			}
+			list.add(step);
+		}
+		return list;
+	}
 
 	private MarkStepDTO buildStep(MarkQuestion question) {
-        MarkStepDTO step = new MarkStepDTO();
-        step.setMainNumber(question.getMainNumber());
-        step.setSubNumber(question.getSubNumber());
-        step.setGroupNumber(question.getGroupNumber());
-        step.setTitle(question.getMainTitle());
-        step.setDefaultScore(0d);
-        step.setMaxScore(question.getTotalScore());
-        step.setMinScore(0d);
-        step.setIntervalScore(question.getIntervalScore());
-        step.setUncalculate(false);
+		MarkStepDTO step = new MarkStepDTO();
+		step.setMainNumber(question.getMainNumber());
+		step.setSubNumber(question.getSubNumber());
+		step.setGroupNumber(question.getGroupNumber());
+		step.setTitle(question.getMainTitle());
+		step.setDefaultScore(0d);
+		step.setMaxScore(question.getTotalScore());
+		step.setMinScore(0d);
+		step.setIntervalScore(question.getIntervalScore());
+		step.setUncalculate(false);
 //        step.setSelectiveIndex(question.getSelectiveIndex());
-        return step;
-    }
+		return step;
+	}
 
 	@Override
 	public MarkTaskDto getTaskDto(MarkStudent student) {
 		MarkTaskDto task = new MarkTaskDto();
-	       
-        return task;
+		task.setSheetUrls(teachcloudCommonService.filePreview(student.getSheetPathList()));
+		task.setStudentId(student.getId());
+		task.setSecretNumber(student.getSecretNumber());
+		task.setStudentCode(student.getStudentCode());
+		if (!student.getSubjectiveStatus().equals(SubjectiveStatus.UNMARK)) {
+			task.setQuestionList(buildMarkStep(student));
+			task.setSpecialTagList(getMarkSpecialTagList(student));
+			task.setHeaderTagList(getHeaderTagList(student));
+		}
+		if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
+			task.setObjectiveScore(student.getObjectiveScore());
+		}
+		task.setMarkerScore(student.getTotalScore());
+		return task;
+	}
+
+	private SpecialTagDTO[] getHeaderTagList(MarkStudent student) {
+		List<MarkHeaderTag> list = markHeaderTagService.findByStudentId(student.getId());
+		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;
+	}
+
+	private SpecialTagDTO[] getMarkSpecialTagList(MarkStudent student) {
+		List<SpecialTagDTO> list = new LinkedList<>();
+		List<MarkGroup> groups = markGroupService.listGroupByExamIdAndPaperNumber(student.getExamId(),
+				student.getPaperNumber());
+		for (MarkGroup group : groups) {
+			List<MarkTask> libraryList = markTaskService.listByStudentIdAndGroupNumber(student.getId(),
+					group.getNumber());
+			// 不管单评还是多评显示所有评卷员特殊标记
+			for (MarkTask library : libraryList) {
+				List<MarkSpecialTag> tagList = markSpecialTagService.findByTaskId(library.getId());
+				for (MarkSpecialTag specialTag : tagList) {
+					list.add(new MarkerSpecialTagDTO(library.getUserId(), library.getGroupNumber(), specialTag));
+				}
+			}
+		}
+		return list.toArray(new SpecialTagDTO[0]);
+	}
+
+	private List<MarkStepDTO> buildMarkStep(MarkStudent student) {
+		List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
+		List<MarkQuestion> sList = markQuestionService.listQuestionByExamIdAndPaperNumber(student.getExamId(),
+				student.getPaperNumber(), false);
+		List<MarkSubjectiveScore> scoreList = markSubjectiveScoreService.listByStudentId(student.getId());
+		// List<ScoreItem> sItems = student.getScoreList(false);
+		for (int i = 0; i < scoreList.size(); i++) {
+			MarkQuestion question = sList.get(i);
+			String questionNumber = question.getQuestionNumber();
+			MarkStepDTO step = buildStep(question);
+			if (!scoreList.isEmpty() && scoreList.size() == sList.size()) {
+				step.setScore(scoreList.get(i).getScore());
+//                step.setRejected(scoreList.get(i).getRejected());
+			}
+			// 不管单评还是多评显示所有评卷员给分轨迹
+			List<MarkTrack> tracks = markTrackService.findByStudentIdAndQuestionNumber(student.getId(), questionNumber);
+			for (MarkTrack track : tracks) {
+				step.addTrack(new MarkerTrackDTO(track));
+			}
+			// 仲裁轨迹
+			List<MarkHeaderTrack> headerTracks = markHeaderTrackService
+					.listByStudentIdAndQuestionNumber(student.getId(), questionNumber);
+			for (MarkHeaderTrack headerTrack : headerTracks) {
+				step.addHeaderTrack(new TrackDTO(headerTrack));
+			}
+			list.add(step);
+		}
+		return list;
 	}
 }

+ 31 - 19
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSpecialTagServiceImpl.java

@@ -1,11 +1,15 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
 import com.qmth.teachcloud.mark.mapper.MarkSpecialTagMapper;
 import com.qmth.teachcloud.mark.service.MarkSpecialTagService;
-import org.springframework.stereotype.Service;
 
 /**
  * <p>
@@ -16,22 +20,30 @@ import org.springframework.stereotype.Service;
  * @since 2023-11-01
  */
 @Service
-public class MarkSpecialTagServiceImpl extends ServiceImpl<MarkSpecialTagMapper, MarkSpecialTag> implements MarkSpecialTagService {
-
-    @Override
-    public void deleteByTaskId(Long taskId) {
-        UpdateWrapper<MarkSpecialTag> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(MarkSpecialTag::getTaskId, taskId);
-        this.remove(updateWrapper);
-    }
-
-    @Override
-    public void deleteByStudentId(Long studentId) {
-        this.baseMapper.deleteByStudentId(studentId);
-    }
-
-    @Override
-    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        this.baseMapper.deleteByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-    }
+public class MarkSpecialTagServiceImpl extends ServiceImpl<MarkSpecialTagMapper, MarkSpecialTag>
+		implements MarkSpecialTagService {
+
+	@Override
+	public void deleteByTaskId(Long taskId) {
+		UpdateWrapper<MarkSpecialTag> updateWrapper = new UpdateWrapper<>();
+		updateWrapper.lambda().eq(MarkSpecialTag::getTaskId, taskId);
+		this.remove(updateWrapper);
+	}
+
+	@Override
+	public void deleteByStudentId(Long studentId) {
+		this.baseMapper.deleteByStudentId(studentId);
+	}
+
+	@Override
+	public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+		this.baseMapper.deleteByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+	}
+
+	@Override
+	public List<MarkSpecialTag> findByTaskId(Long taskId) {
+		QueryWrapper<MarkSpecialTag> queryWrapper = new QueryWrapper<>();
+		queryWrapper.lambda().eq(MarkSpecialTag::getTaskId, taskId);
+		return this.list(queryWrapper);
+	}
 }

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

@@ -27,7 +27,9 @@ public class MarkSubjectiveScoreServiceImpl extends ServiceImpl<MarkSubjectiveSc
     @Override
     public List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
         QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId);
+        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
+        .orderByAsc(MarkSubjectiveScore::getMainNumber)
+        .orderByAsc(MarkSubjectiveScore::getSubNumber);
         if (groupNumber != null) {
             queryWrapper.lambda().eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
         }
@@ -99,4 +101,13 @@ public class MarkSubjectiveScoreServiceImpl extends ServiceImpl<MarkSubjectiveSc
 		return this.baseMapper.getSubjectiveVo(examId, paperNumber);
 	}
 
+	@Override
+	public List<MarkSubjectiveScore> listByStudentId(Long studentId) {
+		 QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
+	        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId).orderByAsc(MarkSubjectiveScore::getMainNumber)
+            .orderByAsc(MarkSubjectiveScore::getSubNumber);;
+	        List<MarkSubjectiveScore> list = this.list(queryWrapper);
+	        return list;
+	}
+
 }

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

@@ -1,14 +1,15 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.mark.entity.MarkTrack;
 import com.qmth.teachcloud.mark.mapper.MarkTrackMapper;
 import com.qmth.teachcloud.mark.service.MarkTrackService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
 
 /**
  * <p>
@@ -58,4 +59,13 @@ public class MarkTrackServiceImpl extends ServiceImpl<MarkTrackMapper, MarkTrack
 	        queryWrapper.lambda().eq(MarkTrack::getTaskId, taskId);
 	        return this.list(queryWrapper);
 	}
+
+	@Override
+	public List<MarkTrack> findByStudentIdAndQuestionNumber(Long studentId, String questionNumber) {
+		QueryWrapper<MarkTrack> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTrack::getStudentId, studentId)
+                .eq(MarkTrack::getQuestionNumber, questionNumber)
+                .orderByAsc(MarkTrack::getNumber);
+        return this.list(queryWrapper);
+	}
 }