Przeglądaj źródła

3.4.4 update-20250325,bug修改

xiaofei 2 miesięcy temu
rodzic
commit
a1c706d245
25 zmienionych plików z 237 dodań i 146 usunięć
  1. 12 0
      distributed-print/install/mysql/upgrade/3.4.4.sql
  2. 15 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionSubjectiveController.java
  3. 0 34
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CardFile.java
  4. 10 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/vo/parseCard/pic/SubPictureConfig.java
  5. 41 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkClassDetailDto.java
  6. 1 23
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkClassProgressDto.java
  7. 3 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupSummaryProgressDto.java
  8. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java
  9. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java
  10. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserClassMapper.java
  11. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkHeaderHistoryService.java
  12. 4 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  13. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  14. 3 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  15. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java
  16. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderHistoryServiceImpl.java
  17. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java
  18. 37 22
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  19. 16 9
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  20. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  21. 14 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  22. 2 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  23. 13 9
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/CardParseUtils.java
  24. 2 17
      teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml
  25. 21 9
      teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml

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

@@ -354,3 +354,15 @@ CREATE TABLE `mark_archive_student` (
 
 ALTER TABLE `mark_paper` ADD COLUMN `archive` TINYINT(1) NULL DEFAULT 0 COMMENT '是否归档,1-已归档' AFTER `merge_marker`;
 
+-- 2025-03-24
+create table if not exists boot_app_info (
+    app_code varchar(20) not null,
+    app_version varchar(10) not null,
+    locked bit(1) not null default 0,
+    unique key(app_code)
+    );
+
+insert into boot_app_info (app_code,app_version) values('teachcloud','3.4.3');
+
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1221', '班级阅卷进度-详情', '/api/admin/mark/question/subjective/class/detail', 'URL', '917', '21', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '928,929,932,933,934,935,936,937,938,939,940,941,942,943,964,965,966,967,968,1008,1012,1183,1186,1221' WHERE (`id` = '944');

+ 15 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionSubjectiveController.java

@@ -10,7 +10,8 @@ import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.mark.bean.mark.DoubleMarkParam;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassDetailDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupQuestionsDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupSummaryProgressDto;
 import com.qmth.teachcloud.mark.service.MarkQuestionService;
@@ -106,7 +107,19 @@ public class MarkQuestionSubjectiveController extends BaseController {
                                @ApiParam(value = "班级") @RequestParam(required = false) String className,
                                @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkGroupClassProgressDto> markGroupClassProgressDtoIPage = markQuestionService.summaryGroupClassProgress(examId, paperNumber, className, pageNumber, pageSize);
+        IPage<MarkClassProgressDto> markGroupClassProgressDtoIPage = markQuestionService.summaryGroupClassProgress(examId, paperNumber, className, pageNumber, pageSize);
+        return ResultUtil.ok(markGroupClassProgressDtoIPage);
+    }
+
+    /**
+     * 班级阅卷进度列表查询
+     */
+    @ApiOperation(value = "班级阅卷进度列表")
+    @RequestMapping(value = "/class/detail", method = RequestMethod.POST)
+    public Result classSummary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                               @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                               @ApiParam(value = "班级") @RequestParam(required = false) String className) {
+        List<MarkClassDetailDto> markGroupClassProgressDtoIPage = markQuestionService.detailGroupClassProgress(examId, paperNumber, className);
         return ResultUtil.ok(markGroupClassProgressDtoIPage);
     }
 

+ 0 - 34
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CardFile.java

@@ -85,40 +85,6 @@ public class CardFile {
         return JSON.toJSONString(list);
     }
 
-    public static String getMarkConfigAdd(List<SubPictureConfig> list, double position) {
-        List<PictureConfig> configList = new ArrayList<>();
-        for (SubPictureConfig configItem : list) {
-            // 填空题,不扩宽评卷区
-            if (configItem.getQuestionType() != 4) {
-                if (configItem.getX() < position) {
-                    double calcW = configItem.getX() + configItem.getW() + position;
-                    configItem.setW(calcW <= 1 ? configItem.getW() + position : 1 - configItem.getX());
-                } else {
-                    configItem.setX(configItem.getX() - position);
-                    double calcW = configItem.getX() + configItem.getW() + position * 2;
-                    configItem.setW(calcW <= 1 ? configItem.getW() + position * 2 : 1 - configItem.getX());
-                }
-
-                if (configItem.getY() < position) {
-                    double calcH = configItem.getY() + configItem.getH() + position;
-                    configItem.setH(calcH <= 1 ? configItem.getH() + position : 1 - configItem.getY());
-                } else {
-                    configItem.setY(configItem.getY() - position);
-                    double calcH = configItem.getY() + configItem.getH() + position * 2;
-                    configItem.setH(calcH <= 1 ? configItem.getH() + position * 2 : 1 - configItem.getH());
-                }
-            }
-            PictureConfig pictureConfig = new PictureConfig();
-            pictureConfig.setI(configItem.getI());
-            pictureConfig.setX(configItem.getX());
-            pictureConfig.setY(configItem.getY());
-            pictureConfig.setW(configItem.getW());
-            pictureConfig.setH(configItem.getH());
-            configList.add(pictureConfig);
-        }
-        return JSON.toJSONString(configList);
-    }
-
     /**
      * 解析卡格式文件中的裁切图坐标,用于云阅卷同步
      *

+ 10 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/vo/parseCard/pic/SubPictureConfig.java

@@ -35,7 +35,16 @@ public class SubPictureConfig {
         if (CollectionUtils.isEmpty(subPictureConfigList)) {
             return null;
         }
-        return CardFile.getMarkConfigAdd(subPictureConfigList, 0.015);
+        List<PictureConfig> configList = subPictureConfigList.stream().map(m -> {
+            PictureConfig pictureConfig = new PictureConfig();
+            pictureConfig.setI(m.getI());
+            pictureConfig.setX(m.getX());
+            pictureConfig.setY(m.getY());
+            pictureConfig.setW(m.getW());
+            pictureConfig.setH(m.getH());
+            return pictureConfig;
+        }).collect(Collectors.toList());
+        return CardFile.getMarkConfigAddPic(configList, 0.015);
     }
 
     public int getI() {

+ 41 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkClassDetailDto.java

@@ -0,0 +1,41 @@
+package com.qmth.teachcloud.mark.dto.mark.manage;
+
+public class MarkClassDetailDto {
+
+    private String questionNumber;
+    private Integer taskCount;
+    private Integer markedCount;
+    private String markerUser;
+
+    public String getQuestionNumber() {
+        return questionNumber;
+    }
+
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
+    }
+
+    public Integer getTaskCount() {
+        return taskCount;
+    }
+
+    public void setTaskCount(Integer taskCount) {
+        this.taskCount = taskCount;
+    }
+
+    public Integer getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Integer markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public String getMarkerUser() {
+        return markerUser;
+    }
+
+    public void setMarkerUser(String markerUser) {
+        this.markerUser = markerUser;
+    }
+}

+ 1 - 23
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupClassProgressDto.java → teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkClassProgressDto.java

@@ -1,9 +1,6 @@
 package com.qmth.teachcloud.mark.dto.mark.manage;
 
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-
-public class MarkGroupClassProgressDto {
+public class MarkClassProgressDto {
 
     private String className;
     private Integer markerCount;
@@ -13,10 +10,6 @@ public class MarkGroupClassProgressDto {
     private Integer currentCount;
     private String percent;
     private Integer arbitrateCount;
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long questionId;
-    private String questionNumber;
-
     public String getClassName() {
         return className;
     }
@@ -81,19 +74,4 @@ public class MarkGroupClassProgressDto {
         this.arbitrateCount = arbitrateCount;
     }
 
-    public Long getQuestionId() {
-        return questionId;
-    }
-
-    public void setQuestionId(Long questionId) {
-        this.questionId = questionId;
-    }
-
-    public String getQuestionNumber() {
-        return questionNumber;
-    }
-
-    public void setQuestionNumber(String questionNumber) {
-        this.questionNumber = questionNumber;
-    }
 }

+ 3 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupSummaryProgressDto.java

@@ -6,7 +6,7 @@ public class MarkGroupSummaryProgressDto {
 
     private Boolean classMark;
     private MarkGroupTotalProgressDto totalInfo;
-    private List<MarkGroupClassProgressDto> classInfo;
+    private List<MarkClassProgressDto> classInfo;
     private List<MarkGroupProgressDto> groupInfo;
 
     public Boolean getClassMark() {
@@ -25,11 +25,11 @@ public class MarkGroupSummaryProgressDto {
         this.totalInfo = totalInfo;
     }
 
-    public List<MarkGroupClassProgressDto> getClassInfo() {
+    public List<MarkClassProgressDto> getClassInfo() {
         return classInfo;
     }
 
-    public void setClassInfo(List<MarkGroupClassProgressDto> classInfo) {
+    public void setClassInfo(List<MarkClassProgressDto> classInfo) {
         this.classInfo = classInfo;
     }
 

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

@@ -65,6 +65,10 @@ public class Task implements Serializable {
      * 评卷题目总分
      */
     private Double markerScore;
+    /**
+     * 评卷时间
+     */
+    private Long markerTime;
 
     /**
      * 给分步骤
@@ -189,6 +193,14 @@ public class Task implements Serializable {
         this.markerScore = markerScore;
     }
 
+    public Long getMarkerTime() {
+        return markerTime;
+    }
+
+    public void setMarkerTime(Long markerTime) {
+        this.markerTime = markerTime;
+    }
+
     public List<TaskQuestion> getQuestionList() {
         return questionList;
     }

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

@@ -31,7 +31,7 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     MarkTask getLastOneByUserIdAndStatus(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("status") String status);
 
-    IPage<Long> listPageHistory(@Param("page") Page<Long> page, @Param("userId") Long userId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+    IPage<MarkTask> listPageHistory(@Param("page") Page<Long> page, @Param("userId") Long userId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
                                     @Param("secretNumber") String secretNumber, @Param("markerScore") Double markerScore);
 
     List<MarkTask> findUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,

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

@@ -3,7 +3,7 @@ package com.qmth.teachcloud.mark.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
 import com.qmth.teachcloud.mark.entity.MarkUserClass;
 import org.apache.ibatis.annotations.Param;
@@ -23,5 +23,5 @@ public interface MarkUserClassMapper extends BaseMapper<MarkUserClass> {
     List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndQuestionIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("className") String className);
     List<MarkUserClass> listMarkerClassByExamIdAndPaperNumberAndUserId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId);
 
-    IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(@Param("page") Page<MarkGroupClassProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("className") String className);
+    IPage<MarkClassProgressDto> pageClassByExamIdAndPaperNumber(@Param("page") Page<MarkClassProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("className") String className);
 }

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

@@ -17,4 +17,6 @@ import java.util.List;
 public interface MarkHeaderHistoryService extends IService<MarkHeaderHistory> {
 
     List<ScoreHistoryVo> findByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    void deleteByStudentIdAndQuestionId(Long studentId, Long questionId);
 }

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

@@ -7,7 +7,8 @@ import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.bean.mark.DoubleMarkParam;
 import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassDetailDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupQuestionsDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupSummaryProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
@@ -101,7 +102,8 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber);
 
-    IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize);
+    IPage<MarkClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize);
+    List<MarkClassDetailDto> detailGroupClassProgress(Long examId, String paperNumber, String className);
 
     List<MarkGroupQuestionsDto> listGroupQuestions(Long examId, String paperNumber);
 

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

@@ -59,7 +59,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber);
 
-    void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status, Double score, String scoreList);
+    void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status);
 
     void updateSubjectiveStatusAndScore(Long examId, String paperNumber, SubjectiveStatus status, Double score, String scoreList);
 

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

@@ -59,7 +59,7 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber,Long userId, List<String> className, List<Long> questionIds, MarkTaskStatus... status);
 
-    IPage<Long> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore);
+    IPage<MarkTask> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore);
 
     List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId);
 
@@ -101,4 +101,6 @@ public interface MarkTaskService extends IService<MarkTask> {
     List<MarkTask> listByStudentIdAndUserId(Long studentId, Long userId);
 
     List<MarkTask> listByStudentIdAndMarkerId(Long studentId, Long markerId, List<MarkTaskStatus> markTaskStatuses);
+
+    void resetHeaderByStudentIdAndQuestionId(Long studentId, Long questionId);
 }

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

@@ -2,7 +2,7 @@ package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDto;
 import com.qmth.teachcloud.common.bean.params.mark.group.MarkClassUserParams;
@@ -35,7 +35,7 @@ public interface MarkUserClassService extends IService<MarkUserClass> {
 
     List<MarkUserClass> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(Page<MarkGroupClassProgressDto> page, Long examId, String paperNumber, String className);
+    IPage<MarkClassProgressDto> pageClassByExamIdAndPaperNumber(Page<MarkClassProgressDto> page, Long examId, String paperNumber, String className);
 
     List<MarkUserClass> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
 

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

@@ -2,6 +2,8 @@ package com.qmth.teachcloud.mark.service.impl;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.qmth.teachcloud.mark.entity.MarkTask;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -25,4 +27,12 @@ public class MarkHeaderHistoryServiceImpl extends ServiceImpl<MarkHeaderHistoryM
     public List<ScoreHistoryVo> findByExamIdAndPaperNumber(Long examId, String paperNumber) {
         return this.baseMapper.findByExamIdAndPaperNumber(examId, paperNumber);
     }
+
+    @Override
+    public void deleteByStudentIdAndQuestionId(Long studentId, Long questionId) {
+        UpdateWrapper<MarkHeaderHistory> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkHeaderHistory::getStudentId, studentId)
+                .eq(MarkHeaderHistory::getQuestionId, questionId);
+        this.remove(updateWrapper);
+    }
 }

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -169,6 +169,15 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
         if (StringUtils.isNotBlank(markPaper.getSheetConfig())) {
             lambda.set(MarkPaper::getSheetConfig, markPaper.getSheetConfig());
         }
+        // 取消双评时,校验题目是否有设置双评
+        if (markPaper.getDoubleMark() != null && !markPaper.getDoubleMark()) {
+            List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(markPaper.getExamId(), markPaper.getPaperNumber(), false);
+            long count = markQuestionList.stream().filter(m -> m.getDoubleRate() != null && m.getDoubleRate() > 0).count();
+            if (count > 0) {
+                throw ExceptionResultEnum.ERROR.exception("部分题目开启了双评,【是否开启双评】不能取消");
+            }
+        }
+
         // 更新评卷员模式
         markUserPaperService.updateModeBatch(markPaper.getExamId(), markPaper.getPaperNumber(), MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode());
         this.update(updateWrapper);

+ 37 - 22
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -32,7 +32,10 @@ import com.qmth.teachcloud.mark.dto.mark.manage.*;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionSubjectiveStepStatusDto;
-import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
+import com.qmth.teachcloud.mark.entity.MarkTask;
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import com.qmth.teachcloud.mark.lock.LockService;
@@ -668,37 +671,23 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     }
 
     @Override
-    public IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize) {
+    public IPage<MarkClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
         if (markPaper.getClassMark()) {
-            Page<MarkGroupClassProgressDto> page = new Page<>(pageNumber, pageSize);
-            IPage<MarkGroupClassProgressDto> markGroupClassProgressDtoIPage = markUserClassService.pageClassByExamIdAndPaperNumber(page, examId, paperNumber, className);
-            for (MarkGroupClassProgressDto markGroupClassProgressDto : markGroupClassProgressDtoIPage.getRecords()) {
-                Long questionId = markGroupClassProgressDto.getQuestionId();
+            Page<MarkClassProgressDto> page = new Page<>(pageNumber, pageSize);
+            IPage<MarkClassProgressDto> markGroupClassProgressDtoIPage = markUserClassService.pageClassByExamIdAndPaperNumber(page, examId, paperNumber, className);
+            for (MarkClassProgressDto markGroupClassProgressDto : markGroupClassProgressDtoIPage.getRecords()) {
                 List<MarkTask> totalMarkTaskList = new ArrayList<>();
                 List<MarkUser> totalMarkUserList = new ArrayList<>();
-                totalMarkTaskList.addAll(markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, questionId, null, markGroupClassProgressDto.getClassName()));
-                totalMarkUserList.addAll(markUserQuestionService.listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, questionId, markGroupClassProgressDto.getClassName()));
-
-                MarkQuestion markQuestion = this.getById(questionId);
-                List<MarkUser> markUserList = markUserClassService.listClassMarkerByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, questionId, markGroupClassProgressDto.getClassName());
-                int count = 0;
-                for (MarkUser markUser : markUserList) {
-                    MarkUserQuestion markUserQuestion = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, questionId, markUser.getUserId());
-                    if (markUserQuestion != null) {
-                        int markerCount = markService.applyCurrentCount(markQuestion, markUserQuestion.getUserId());
-                        count += markerCount;
-                    }
-                }
+                totalMarkTaskList.addAll(markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, null, null, markGroupClassProgressDto.getClassName()));
+                totalMarkUserList.addAll(markUserQuestionService.listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, null, markGroupClassProgressDto.getClassName()));
 
                 // 待仲裁数量
-                int arbitrateCount = markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, questionId, Arrays.asList(markGroupClassProgressDto.getClassName()));
-                markGroupClassProgressDto.setQuestionNumber(markQuestion.getQuestionNumber());
+                int arbitrateCount = markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, null, Arrays.asList(markGroupClassProgressDto.getClassName()));
                 markGroupClassProgressDto.setMarkerCount(totalMarkUserList.size());
                 markGroupClassProgressDto.setTaskCount(totalMarkTaskList.size());
                 markGroupClassProgressDto.setMarkedCount(markTaskService.markedCount(totalMarkTaskList));
                 markGroupClassProgressDto.setLeftCount(markGroupClassProgressDto.getTaskCount() - markGroupClassProgressDto.getMarkedCount());
-                markGroupClassProgressDto.setCurrentCount(count);
                 markGroupClassProgressDto.setPercent(Calculator.divide2String(Calculator.multiply(markGroupClassProgressDto.getMarkedCount(), 100), Double.valueOf(markGroupClassProgressDto.getTaskCount()), 2));
                 markGroupClassProgressDto.setArbitrateCount(arbitrateCount);
             }
@@ -707,6 +696,32 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         return null;
     }
 
+    @Override
+    public List<MarkClassDetailDto> detailGroupClassProgress(Long examId, String paperNumber, String className) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        List<MarkQuestion> markQuestionList = this.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+        List<MarkClassDetailDto> markClassDetailDtoList = new ArrayList<>();
+        for (MarkQuestion markQuestion : markQuestionList) {
+            MarkClassDetailDto markClassDetailDto = new MarkClassDetailDto();
+            Long questionId = markQuestion.getId();
+            List<MarkTask> totalMarkTaskList = new ArrayList<>();
+            List<MarkUser> totalMarkUserList = new ArrayList<>();
+            totalMarkTaskList.addAll(markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, questionId, null, className));
+            totalMarkUserList.addAll(markUserQuestionService.listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, questionId, className));
+
+            // 待仲裁数量
+            int arbitrateCount = markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, questionId, Arrays.asList(className));
+            markClassDetailDto.setQuestionNumber(markQuestion.getQuestionNumber());
+            markClassDetailDto.setTaskCount(totalMarkTaskList.size());
+            markClassDetailDto.setMarkedCount(markTaskService.markedCount(totalMarkTaskList));
+            List<MarkUser> markUserList = markUserClassService.listClassMarkerByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, questionId, className);
+            String markerUser = markUserList.stream().map(m -> m.getName().concat("(".concat(m.getLoginName().concat(")")))).collect(Collectors.joining(";"));
+            markClassDetailDto.setMarkerUser(markerUser);
+            markClassDetailDtoList.add(markClassDetailDto);
+        }
+        return markClassDetailDtoList;
+    }
+
     @Override
     public List<MarkGroupQuestionsDto> listGroupQuestions(Long examId, String paperNumber) {
         List<MarkQuestion> markQuestionList = this.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);

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

@@ -182,7 +182,7 @@ public class MarkServiceImpl implements MarkService {
                 markProblemHistoryService.deleteByExamIdAndPaperNumberAndTaskId(examId, paperNumber, markTask.getId());
                 markArbitrateHistoryService.deleteByExamIdAndPaperNumberAndStudentIdAndQuestionId(examId, paperNumber, studentId, questionId);
                 lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
-                markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
+                markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK);
                 lockService.unlock(LockType.STUDENT, markTask.getStudentId());
             }
             markUserQuestionService.resetById(markUserQuestion.getId());
@@ -221,8 +221,7 @@ public class MarkServiceImpl implements MarkService {
     }
 
     private void resetStudentStatus(Long studentId) {
-//        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
-        markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.UNMARK, null, null, null);
+        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK);
     }
 
 
@@ -361,7 +360,7 @@ public class MarkServiceImpl implements MarkService {
             updateStudentQuestionScore(studentId, markQuestion, markScore);
 //            checkStudentSubjective(studentId, markQuestion.getExamId(), markQuestion.getPaperNumber(), version);
         } else {
-            markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
+            markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK);
         }
     }
 
@@ -410,6 +409,9 @@ public class MarkServiceImpl implements MarkService {
     @Override
     public void buildMarkTask(MarkPaper markPaper) {
         try {
+            if(markPaper.getPaperNumber().equals("1017")){
+                System.out.println(1);
+            }
             lockService.watch(LockType.EXAM_SUBJECT, markPaper.getExamId(), markPaper.getPaperNumber());
             log.info("start create library for examId=" + markPaper.getExamId() + ", paperNumber="
                     + markPaper.getPaperNumber());
@@ -434,7 +436,7 @@ public class MarkServiceImpl implements MarkService {
             for (MarkQuestion markQuestion : markQuestionList) {
                 // 生成正评任务
                 buildFormalTask(markQuestion);
-                if (markQuestion.getDoubleRate() > 0) {
+                if (markQuestion.getDoubleRate() != null && markQuestion.getDoubleRate() > 0) {
                     // 补双评任务
                     fillFormalTask(markQuestion);
                 }
@@ -630,7 +632,7 @@ public class MarkServiceImpl implements MarkService {
     @Transactional
     @Override
     public void deleteMarkTaskByStudent(MarkStudent student) {
-        markStudentService.updateSubjectiveStatusAndScore(student.getId(), SubjectiveStatus.UNMARK, null, null);
+        markStudentService.updateSubjectiveStatusAndScore(student.getId(), SubjectiveStatus.UNMARK);
         // 正评相关数据
         markArbitrateHistoryService.deleteByStudentId(student.getId());
         markProblemHistoryService.deleteByStudentId(student.getId());
@@ -925,12 +927,13 @@ public class MarkServiceImpl implements MarkService {
         Page<Long> page = new Page<>(pageNumber, pageSize);
         OrderItem orderItem = new OrderItem(order, sort.equals(Sort.asc));
         page.addOrder(orderItem);
-        IPage<Long> list = markTaskService.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore);
+        IPage<MarkTask> list = markTaskService.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore);
         List<Task> recordsDtos = new ArrayList<>();
         List<MarkTaskStatus> markTaskStatuses = Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM);
-        for (Long studentId : list.getRecords()) {
-            List<MarkTask> markTaskList = markTaskService.listByStudentIdAndMarkerId(studentId, userId, markTaskStatuses);
+        for (MarkTask markTask : list.getRecords()) {
+            List<MarkTask> markTaskList = markTaskService.listByStudentIdAndMarkerId(markTask.getStudentId(), userId, markTaskStatuses);
             Task dto = taskService.build(userId, markTaskList);
+            dto.setMarkerTime(markTask.getMarkerTime());
             recordsDtos.add(dto);
         }
         IPage<Task> result = new Page<>();
@@ -1266,6 +1269,8 @@ public class MarkServiceImpl implements MarkService {
             // 回评时,分数不一致,需要重新统分
             if (task.getMarkerScore() != null && !task.getMarkerScore().equals(result.getMarkerScore())) {
                 resetStudentStatus(task.getStudentId());
+                markTaskService.resetHeaderByStudentIdAndQuestionId(task.getStudentId(), task.getQuestionId());
+                markHeaderHistoryService.deleteByStudentIdAndQuestionId(task.getStudentId(), task.getQuestionId());
             }
             // 判断当前分组是否已完成评卷
             checkStudentQuestion(task.getStudentId(), markQuestion, result.getMarkerScore());
@@ -1322,6 +1327,8 @@ public class MarkServiceImpl implements MarkService {
 //            markSubjectiveScoreService.updateRejected(markTask.getStudentId(), markTask.getQuestionId(), true);
             markSubjectiveScoreService.deleteByStudentIdAndQuestionId(markTask.getStudentId(), markTask.getQuestionId());
             resetStudentStatus(markTask.getStudentId());
+            markTaskService.resetHeaderByStudentIdAndQuestionId(markTask.getStudentId(), markTask.getQuestionId());
+            markHeaderHistoryService.deleteByStudentIdAndQuestionId(markTask.getStudentId(), markTask.getQuestionId());
             updateMarkedCount(markTask.getExamId(), markTask.getPaperNumber(), markTask.getQuestionId());
             return true;
         } else {

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

@@ -180,11 +180,11 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Override
-    public void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status, Double score,
-                                               String scoreList) {
+    public void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status) {
         UpdateWrapper<MarkStudent> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkStudent::getSubjectiveStatus, status).set(MarkStudent::getSubjectiveScore, score)
-                .set(MarkStudent::getSubjectiveScoreList, scoreList)
+        updateWrapper.lambda().set(MarkStudent::getSubjectiveStatus, status).
+                set(MarkStudent::getSubjectiveScore, null)
+                .set(MarkStudent::getSubjectiveScoreList, null)
                 .set(MarkStudent::getCheckUserId, null)
                 .set(MarkStudent::getCheckTime, null)
                 .eq(MarkStudent::getId, studentId);

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

@@ -246,7 +246,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public IPage<Long> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore) {
+    public IPage<MarkTask> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore) {
         return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore);
     }
 
@@ -451,4 +451,17 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .orderByAsc(MarkTask::getSubNumber);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public void resetHeaderByStudentIdAndQuestionId(Long studentId, Long questionId) {
+        UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkTask::getHeaderId, null)
+                .set(MarkTask::getHeaderTime, null)
+                .set(MarkTask::getHeaderScore, null)
+                .set(MarkTask::getHeaderTrackList, null)
+                .set(MarkTask::getHeaderTagList, null)
+                .eq(MarkTask::getStudentId, studentId)
+                .eq(MarkTask::getQuestionId, questionId);
+        this.update(updateWrapper);
+    }
 }

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

@@ -11,11 +11,10 @@ import com.qmth.teachcloud.common.bean.params.mark.group.MarkClassUserParams;
 import com.qmth.teachcloud.common.bean.params.mark.group.MarkGroupClassUserParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 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.mark.bean.student.MarkStudentQuery;
 import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkClassProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDetailDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
@@ -177,7 +176,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
     }
 
     @Override
-    public IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(Page<MarkGroupClassProgressDto> page, Long examId, String paperNumber, String className) {
+    public IPage<MarkClassProgressDto> pageClassByExamIdAndPaperNumber(Page<MarkClassProgressDto> page, Long examId, String paperNumber, String className) {
         return this.baseMapper.pageClassByExamIdAndPaperNumber(page, examId, paperNumber, className);
     }
 

+ 13 - 9
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/CardParseUtils.java

@@ -159,22 +159,26 @@ public class CardParseUtils {
 
         List<SubPictureConfig> combinePictureConfigList = new ArrayList<>();
         SubPictureConfig prevConfig = null;
-        for (int i1 = 0; i1 < pictureConfigs.size(); i1++) {
-            SubPictureConfig subPictureConfig = pictureConfigs.get(i1);
+        int i1 = 0;
+        for (SubPictureConfig item : pictureConfigs) {
             if (i1 == 0) {
-                prevConfig = subPictureConfig;
+                prevConfig = item;
                 combinePictureConfigList.add(prevConfig);
+                i1++;
                 continue;
             }
 
             Double elasticRate = 0.01;
-            if (prevConfig.getI() == subPictureConfig.getI() &&
-                    prevConfig.getY() + prevConfig.getH() + elasticRate >= subPictureConfig.getY() &&
-                    prevConfig.getW() == subPictureConfig.getW() &&
-                    prevConfig.getX() == subPictureConfig.getX()) {
-                prevConfig.setH(subPictureConfig.getY() + subPictureConfig.getH() - prevConfig.getY());
+            if (prevConfig.getMainNumber().equals(item.getMainNumber())
+                    && prevConfig.getI() == item.getI() &&
+                    prevConfig.getY() + prevConfig.getH() + elasticRate >= item.getY() &&
+                    prevConfig.getW().equals(item.getW()) &&
+                    prevConfig.getX().equals(item.getX())) {
+                combinePictureConfigList.remove(prevConfig);
+                prevConfig.setH(item.getY() + item.getH() - prevConfig.getY());
+                combinePictureConfigList.add(prevConfig);
             } else {
-                prevConfig = subPictureConfig;
+                prevConfig = item;
                 combinePictureConfigList.add(prevConfig);
             }
         }

+ 2 - 17
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -118,7 +118,7 @@
         ORDER BY marker_time DESC
             LIMIT 1
     </select>
-	<select id="listPageHistory" resultType="java.lang.Long">
+	<select id="listPageHistory" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
         SELECT
         	 mt.student_id,
         	 max(mt.marker_time) marker_time
@@ -224,22 +224,7 @@
               AND mt.user_id = #{userId}
           </if>
           <if test="className != null and className != ''">
-              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 = #{className}) bes ON ms.basic_student_id = bes.id
-              where mt.student_id = ms.id)
+              AND EXISTS(SELECT 1 FROM mark_student ms WHERE mt.student_id = ms.id and ms.exam_id = #{examId} AND ms.paper_number = #{paperNumber} AND ms.teach_class_name = #{className})
           </if>
     </select>
     <select id="countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn" resultType="java.lang.Integer">

+ 21 - 9
teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml

@@ -32,18 +32,30 @@
           AND muc.class_name = #{className}
     </select>
     <select id="pageClassByExamIdAndPaperNumber"
-            resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto">
-        SELECT
-            distinct mq.id questionId, muc.class_name className
-        FROM (select * from mark_question where exam_id = #{examId}
-        AND paper_number = #{paperNumber}) mq
-                 JOIN
-            mark_user_class muc ON mq.exam_id = muc.exam_id AND mq.paper_number = muc.paper_number
-        WHERE
+            resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkClassProgressDto">
+<!--        SELECT-->
+<!--            distinct mq.id questionId, mq.main_number , mq.sub_number,  muc.class_name className-->
+<!--        FROM (select * from mark_question where exam_id = #{examId}-->
+<!--        AND paper_number = #{paperNumber}) mq-->
+<!--                 JOIN-->
+<!--            mark_user_class muc ON mq.exam_id = muc.exam_id AND mq.paper_number = muc.paper_number-->
+<!--        <where>-->
+<!--            <if test="className != null and className != ''">-->
+<!--                AND muc.class_name = #{className}-->
+<!--            </if>-->
+<!--        </where>-->
+<!--        ORDER BY  muc.class_name, mq.main_number, mq.sub_number-->
+
+        SELECT DISTINCT
+            muc.class_name className
+        FROM
+            mark_user_class muc
+        <where>
             <if test="className != null and className != ''">
                 AND muc.class_name = #{className}
             </if>
-        ORDER BY  muc.class_name, mq.main_number, mq.sub_number
+        </where>
+        ORDER BY muc.class_name
     </select>
     <select id="listMarkerClassByExamIdAndPaperNumberAndUserId"
             resultType="com.qmth.teachcloud.mark.entity.MarkUserClass">