Pārlūkot izejas kodu

3.2.7 删除分组

xiaofei 1 gadu atpakaļ
vecāks
revīzija
8f6b3c385e
27 mainītis faili ar 453 papildinājumiem un 291 dzēšanām
  1. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java
  2. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArbitrateHistoryService.java
  3. 4 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupService.java
  4. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupStudentService.java
  5. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkProblemHistoryService.java
  6. 4 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  7. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  8. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  9. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java
  10. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSyncService.java
  11. 3 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  12. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTrackService.java
  13. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserGroupService.java
  14. 12 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java
  15. 27 23
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java
  16. 9 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupStudentServiceImpl.java
  17. 7 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkHeaderTrackServiceImpl.java
  18. 12 8
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkProblemHistoryServiceImpl.java
  19. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  20. 124 84
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  21. 147 156
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  22. 9 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java
  23. 20 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSyncServiceImpl.java
  24. 10 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  25. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTrackServiceImpl.java
  26. 14 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserGroupServiceImpl.java
  27. 3 0
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

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

@@ -34,4 +34,6 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
 	IPage<AnswerQueryVo> queryPage(Page<AnswerQueryVo> page,@Param("query") AnswerQueryDomain query);
 
 	List<String> querySummary(@Param("query") AnswerQueryDomain query);
+
+    List<Long> findIdByExamIdAndPaperNumberAndSubjectiveStatus(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("unmark") String unmark, @Param("marked") String marked);
 }

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

@@ -34,4 +34,6 @@ public interface MarkArbitrateHistoryService extends IService<MarkArbitrateHisto
     void saveArbitrateTask(MarkResult markResult);
 
     void deleteByStudentId(Long studentId);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupService.java

@@ -46,4 +46,8 @@ public interface MarkGroupService extends IService<MarkGroup> {
     void updateTaskCount(Long examId, String paperNumber, Integer groupNumber, int taskCount);
 
     List<MarkGroupQuestionsDto> listGroupQuestions(Long examId, String paperNumber);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+
+    long countByExamIdAndPaperNumber(Long examId, String paperNumber);
 }

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

@@ -17,4 +17,6 @@ public interface MarkGroupStudentService extends IService<MarkGroupStudent> {
     long countByStudentIdAndStatus(Long studentId, SubjectiveStatus marked);
 
     void deleteByStudentId(Long studentId);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

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

@@ -25,4 +25,6 @@ public interface MarkProblemHistoryService extends IService<MarkProblemHistory>
     void resetByMarkTaskId(Long id, MarkProblemStatus waiting, Long userId, MarkProblemStatus back, Long now);
 
     void deleteByStudentId(Long studentId);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

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

@@ -46,10 +46,12 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     MarkQuestion getByExamIdAndPaperNumberAndMainNumberAndSubNumberAndObjective(Long examId, String paperNumber, Integer mainNumber, Integer subNumber, boolean isObjective);
 
-	List<MarkQuestion> listByExamIdAndPaperNumberAndPaperIndexAndPageIndex(Long examId, String paperNumber,
-			Integer paperIndex, Integer pageIndex);
+    List<MarkQuestion> listByExamIdAndPaperNumberAndPaperIndexAndPageIndex(Long examId, String paperNumber,
+                                                                           Integer paperIndex, Integer pageIndex);
 
     MarkQuestionDto pageQuestionsByExamIdAndPaperNumber(Long examId, String paperNumber, String paperType, boolean canCreate);
 
     void updateGroupNumberByExamIdAndPaperNumberAndGroupNumber(Integer newGroupNumber, Long examId, String paperNumber, Integer groupNumber);
+
+    long countByExamIdAndPaperNumberAndObjectiveAndGroupNumberIsNull(Long examId, String paperNumber, boolean objective);
 }

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

@@ -59,4 +59,13 @@ public interface MarkService {
 	List<MarkTaskDto> getHistory(Long userId);
 
 	void clear(Long userId);
+
+    void deleteMarkGroup(MarkGroup markGroup);
+
+    /**
+     * /** 释放某个大题的锁定任务
+     *
+     * @param markGroup
+     */
+    void releaseByMarkGroup(MarkGroup markGroup);
 }

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

@@ -37,6 +37,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 examId, String paperNumber, SubjectiveStatus status, double score, String scoreList);
 
     ScanExamInfoVo getScanExamInfo(BasicExam exam);
 
@@ -89,4 +90,6 @@ public interface MarkStudentService extends IService<MarkStudent> {
 	AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode);
 
 	UpdateTimeVo confirm(Long examId, String coursePaperId, String studentCode, Boolean omrAbsent);
+
+    List<Long> findIdByExamIdAndPaperNumberAndSubjectiveStatus(Long examId, String paperNumber, SubjectiveStatus unmark, SubjectiveStatus marked);
 }

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

@@ -23,4 +23,6 @@ public interface MarkSubjectiveScoreService extends IService<MarkSubjectiveScore
     List<MarkSubjectiveScore> listByStudentIdAndUncalculate(Long studentId, boolean uncalculate);
 
     void deleteByStudentId(Long studentId);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

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

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -13,4 +14,6 @@ public interface MarkSyncService {
     void markerResetSync(MarkUserGroup markUserGroup);
 
     void updateQuality(List<MarkUserGroup> markUserGroups, String lockKey);
+
+    void deleteMarkGroup(MarkGroup markGroup);
 }

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

@@ -50,6 +50,7 @@ public interface MarkTaskService extends IService<MarkTask> {
 
 	int countByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 
-	int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(Long examId, String paperNumber,
-			Integer groupNumber, Long userId, MarkTaskStatus... status);
+	int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkTaskStatus... status);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

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

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

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

@@ -52,4 +52,6 @@ public interface MarkUserGroupService extends IService<MarkUserGroup> {
     List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Integer groupNumber);
     
     List<MarkUserGroup> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

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

@@ -4,15 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateMarkerDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkArbitrateHistoryMapper;
@@ -174,6 +175,15 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
         this.remove(updateWrapper);
     }
 
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkArbitrateHistory> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkArbitrateHistory::getExamId, examId)
+                .eq(MarkArbitrateHistory::getPaperNumber, paperNumber)
+                .eq(MarkArbitrateHistory::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
+
     private void releaseTask(Long taskId) {
         synchronized (currentTaskMap) {
             currentTaskMap.remove(taskId);

+ 27 - 23
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java

@@ -15,7 +15,9 @@ import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupSingleDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.ScorePolicy;
+import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkGroupMapper;
 import com.qmth.teachcloud.mark.service.*;
 import org.apache.commons.collections4.CollectionUtils;
@@ -55,6 +57,10 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
     private MarkTaskService markTaskService;
     @Resource
     private MarkService markService;
+    @Resource
+    private MarkSyncService markSyncService;
+    @Resource
+    private LockService lockService;
 
     @Override
     public MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber) {
@@ -103,29 +109,10 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
     @Transactional
     @Override
     public void deleteGroupByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        // 删除分组
-        UpdateWrapper<MarkGroup> markGroupUpdateWrapper = new UpdateWrapper<>();
-        markGroupUpdateWrapper.lambda().eq(MarkGroup::getExamId, examId)
-                .eq(MarkGroup::getPaperNumber, paperNumber)
-                .eq(MarkGroup::getNumber, groupNumber);
-        this.remove(markGroupUpdateWrapper);
-        // 删除评卷员
-        UpdateWrapper<MarkUserGroup> markUserGroupUpdateWrapper = new UpdateWrapper<>();
-        markUserGroupUpdateWrapper.lambda().eq(MarkUserGroup::getExamId, examId)
-                .eq(MarkUserGroup::getPaperNumber, paperNumber)
-                .eq(MarkUserGroup::getGroupNumber, groupNumber);
-        markUserGroupService.remove(markUserGroupUpdateWrapper);
-
-        // 清除题目分组号
-        UpdateWrapper<MarkQuestion> markQuestionUpdateWrapper = new UpdateWrapper<>();
-        markQuestionUpdateWrapper.lambda().set(MarkQuestion::getGroupNumber, null)
-                .eq(MarkQuestion::getExamId, examId)
-                .eq(MarkQuestion::getPaperNumber, paperNumber)
-                .eq(MarkQuestion::getGroupNumber, groupNumber);
-        markQuestionService.update(markQuestionUpdateWrapper);
-
-        // 更新MarkPaper中groupStatus
-        markPaperService.updateGroupStatusByExamIdAndPaperNumber(false, examId, paperNumber);
+        MarkGroup markGroup = this.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+        if (lockService.trylock(LockType.GROUP_DELETE, examId, paperNumber, groupNumber)) {
+            markSyncService.deleteMarkGroup(markGroup);
+        }
 
     }
 
@@ -424,4 +411,21 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
         markGroupQuestionsDtoList.sort(Comparator.comparingInt(MarkGroupQuestionsDto::getGroupNumber));
         return markGroupQuestionsDtoList;
     }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkGroup> markGroupUpdateWrapper = new UpdateWrapper<>();
+        markGroupUpdateWrapper.lambda().eq(MarkGroup::getExamId, examId)
+                .eq(MarkGroup::getPaperNumber, paperNumber)
+                .eq(MarkGroup::getNumber, groupNumber);
+        this.remove(markGroupUpdateWrapper);
+    }
+
+    @Override
+    public long countByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        QueryWrapper<MarkGroup> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkGroup::getExamId, examId)
+                .eq(MarkGroup::getPaperNumber, paperNumber);
+        return this.count(queryWrapper);
+    }
 }

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

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.mark.entity.MarkGroupStudent;
-import com.qmth.teachcloud.mark.entity.MarkHeaderTrack;
 import com.qmth.teachcloud.mark.mapper.MarkGroupStudentMapper;
 import com.qmth.teachcloud.mark.service.MarkGroupStudentService;
 import org.springframework.stereotype.Service;
@@ -35,4 +34,13 @@ public class MarkGroupStudentServiceImpl extends ServiceImpl<MarkGroupStudentMap
         updateWrapper.lambda().eq(MarkGroupStudent::getStudentId, studentId);
         this.remove(updateWrapper);
     }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkGroupStudent> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkGroupStudent::getExamId, examId)
+                .eq(MarkGroupStudent::getPaperNumber, paperNumber)
+                .eq(MarkGroupStudent::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.mark.service.impl;
 
 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.MarkHeaderTrack;
@@ -42,10 +43,13 @@ public class MarkHeaderTrackServiceImpl extends ServiceImpl<MarkHeaderTrackMappe
     @Override
     public void deleteByExamIdAndPaperNumberAndGroupNumberAndStudentId(Long examId, String paperNumber, Integer groupNumber, Long studentId) {
         UpdateWrapper<MarkHeaderTrack> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(MarkHeaderTrack::getExamId, examId)
+        LambdaUpdateWrapper<MarkHeaderTrack> lambdaUpdateWrapper = updateWrapper.lambda();
+        lambdaUpdateWrapper.eq(MarkHeaderTrack::getExamId, examId)
                 .eq(MarkHeaderTrack::getPaperNumber, paperNumber)
-                .eq(MarkHeaderTrack::getGroupNumber, groupNumber)
-                .eq(MarkHeaderTrack::getStudentId, studentId);
+                .eq(MarkHeaderTrack::getGroupNumber, groupNumber);
+        if (studentId != null) {
+            lambdaUpdateWrapper.eq(MarkHeaderTrack::getStudentId, studentId);
+        }
         this.remove(updateWrapper);
     }
 

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

@@ -4,24 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkProblemDto;
-import com.qmth.teachcloud.mark.entity.MarkHeaderTrack;
-import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.MarkProblemStatus;
-import com.qmth.teachcloud.mark.service.MarkQuestionService;
-import com.qmth.teachcloud.mark.service.MarkStudentService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkProblemDto;
 import com.qmth.teachcloud.mark.entity.MarkProblemHistory;
+import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkProblemHistoryMapper;
-import com.qmth.teachcloud.mark.service.MarkProblemHistoryService;
-import com.qmth.teachcloud.mark.service.MarkService;
-import com.qmth.teachcloud.mark.service.MarkTaskService;
+import com.qmth.teachcloud.mark.service.*;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -120,4 +115,13 @@ public class MarkProblemHistoryServiceImpl extends ServiceImpl<MarkProblemHistor
         updateWrapper.lambda().eq(MarkProblemHistory::getStudentId, studentId);
         this.remove(updateWrapper);
     }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkProblemHistory> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkProblemHistory::getExamId, examId)
+                .eq(MarkProblemHistory::getPaperNumber, paperNumber)
+                .eq(MarkProblemHistory::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
 }

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

@@ -242,4 +242,14 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                 .eq(MarkQuestion::getGroupNumber, groupNumber);
         this.update(updateWrapper);
     }
+
+    @Override
+    public long countByExamIdAndPaperNumberAndObjectiveAndGroupNumberIsNull(Long examId, String paperNumber, boolean objective) {
+        QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkQuestion::getExamId, examId)
+                .eq(MarkQuestion::getPaperNumber, paperNumber)
+                .eq(MarkQuestion::getObjective, objective)
+                .isNull(MarkQuestion::getGroupNumber);
+        return this.count(queryWrapper);
+    }
 }

+ 124 - 84
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -1,11 +1,7 @@
 package com.qmth.teachcloud.mark.service.impl;
 
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.mark.MarkArbitrateStatus;
-import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
-import com.qmth.teachcloud.common.enums.mark.MarkProblemStatus;
-import com.qmth.teachcloud.common.enums.mark.MarkProblemType;
-import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
+import com.qmth.teachcloud.common.enums.mark.*;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkGroupDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkSettingDto;
@@ -626,83 +622,127 @@ public class MarkServiceImpl implements MarkService {
         markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList));
     }
 
-	@Override
-	public MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber, Integer groupNumber) {
-		MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, user.getId());
-		MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-		
-		MarkSettingDto dto = new MarkSettingDto();
-		dto.setExamType(ExamType.SCAN_IMAGE);
-		dto.setMode(markPaper.getMarkMode());
-		dto.setSheetView(markPaper.getSheetView());
-		dto.setSheetConfig(markPaper.getSheetConfig());
-		dto.setEnableAllZore(false);
-		dto.setFileServer(null);
-		dto.setUserName(user.getRealName());
-		dto.getSubject().setAnswerUrl(markPaper.getAnswerFilePath());
-		dto.getSubject().setPaperUrl(markPaper.getPaperFilePath());
-		dto.getSubject().setCode(markPaper.getPaperNumber());
-		dto.getSubject().setName(markPaper.getCourseName());
-		dto.setForceSpecialTag(true);
-		dto.setUiSetting(user.getUiSetting());
-		dto.setStatusValue(markPaper.getStatus());
-		dto.setProblemTypes(MarkProblemType.getOptionList());
-		dto.setGroupNumber(groupNumber);
-		dto.setTopCount(markUserGroup.getTopCount());
-		dto.setSplitConfig(new Double[0]);
-		dto.setPrefetchCount(3);
-		dto.setStartTime(markPaper.getMarkStartTime());
-		dto.setEndTime(markPaper.getMarkEndTime());
-		dto.setSelective(false);
-		dto.setAutoScroll(markPaper.getAutoScroll());
-		dto.setEnableSplit(false);
-		return dto;
-	}
-
-	@Override
-	public MarkStatusDto getStatus(Long userId, Long examId, String paperNumber, Integer groupNumber) {
-		MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
-		MarkStatusDto dto = new MarkStatusDto();
-		dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(examId, paperNumber, groupNumber, userId,MarkTaskStatus.WAIT_ARBITRATE));
-		dto.setMarkedCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber, markUserGroup.getGroupNumber(), Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED)));
-		dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(examId, paperNumber, groupNumber, userId,MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
-		dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(examId, paperNumber, groupNumber, userId,MarkTaskStatus.PROBLEM));
-		dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber));
-		return dto;
-	}
-
-	@Override
-	public List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber) {
-		List<MarkUserGroup> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndUserId(examId, paperNumber, userId);
-		List<MarkGroupDto> list = new ArrayList<MarkGroupDto>();
-		for (MarkUserGroup markUserGroup : markUserGroups) {
-			MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserGroup.getGroupNumber());
-			MarkGroupDto dto = new MarkGroupDto();
-			dto.setGroupNumber(markUserGroup.getGroupNumber());
-			dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserGroup.getGroupNumber()));
-			dto.setMarkedCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber, markUserGroup.getGroupNumber(), Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED)));
-			dto.setGroupQuestions(markGroup.getQuestionTitle());
-			dto.setTitle(markGroup.getTitle());
-			list.add(dto);
-		}
-		return list;
-	}
-
-	@Override
-	public MarkTaskDto getTask(Long userId, Long examId, String paperNumber) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public List<MarkTaskDto> getHistory(Long userId) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void clear(Long userId) {
-		// TODO Auto-generated method stub
-		
-	}
+    @Override
+    public MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber, Integer groupNumber) {
+        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, user.getId());
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+
+        MarkSettingDto dto = new MarkSettingDto();
+        dto.setExamType(ExamType.SCAN_IMAGE);
+        dto.setMode(markPaper.getMarkMode());
+        dto.setSheetView(markPaper.getSheetView());
+        dto.setSheetConfig(markPaper.getSheetConfig());
+        dto.setEnableAllZore(false);
+        dto.setFileServer(null);
+        dto.setUserName(user.getRealName());
+        dto.getSubject().setAnswerUrl(markPaper.getAnswerFilePath());
+        dto.getSubject().setPaperUrl(markPaper.getPaperFilePath());
+        dto.getSubject().setCode(markPaper.getPaperNumber());
+        dto.getSubject().setName(markPaper.getCourseName());
+        dto.setForceSpecialTag(true);
+        dto.setUiSetting(user.getUiSetting());
+        dto.setStatusValue(markPaper.getStatus());
+        dto.setProblemTypes(MarkProblemType.getOptionList());
+        dto.setGroupNumber(groupNumber);
+        dto.setTopCount(markUserGroup.getTopCount());
+        dto.setSplitConfig(new Double[0]);
+        dto.setPrefetchCount(3);
+        dto.setStartTime(markPaper.getMarkStartTime());
+        dto.setEndTime(markPaper.getMarkEndTime());
+        dto.setSelective(false);
+        dto.setAutoScroll(markPaper.getAutoScroll());
+        dto.setEnableSplit(false);
+        return dto;
+    }
+
+    @Override
+    public MarkStatusDto getStatus(Long userId, Long examId, String paperNumber, Integer groupNumber) {
+        MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
+        MarkStatusDto dto = new MarkStatusDto();
+        dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(examId, paperNumber, groupNumber, userId, MarkTaskStatus.WAIT_ARBITRATE));
+        dto.setMarkedCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber, markUserGroup.getGroupNumber(), Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED)));
+        dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(examId, paperNumber, groupNumber, userId, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
+        dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(examId, paperNumber, groupNumber, userId, MarkTaskStatus.PROBLEM));
+        dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber));
+        return dto;
+    }
+
+    @Override
+    public List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber) {
+        List<MarkUserGroup> markUserGroups = markUserGroupService.listByExamIdAndPaperNumberAndUserId(examId, paperNumber, userId);
+        List<MarkGroupDto> list = new ArrayList<MarkGroupDto>();
+        for (MarkUserGroup markUserGroup : markUserGroups) {
+            MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserGroup.getGroupNumber());
+            MarkGroupDto dto = new MarkGroupDto();
+            dto.setGroupNumber(markUserGroup.getGroupNumber());
+            dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserGroup.getGroupNumber()));
+            dto.setMarkedCount(markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber, markUserGroup.getGroupNumber(), Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED)));
+            dto.setGroupQuestions(markGroup.getQuestionTitle());
+            dto.setTitle(markGroup.getTitle());
+            list.add(dto);
+        }
+        return list;
+    }
+
+    @Override
+    public MarkTaskDto getTask(Long userId, Long examId, String paperNumber) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public List<MarkTaskDto> getHistory(Long userId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void clear(Long userId) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void deleteMarkGroup(MarkGroup markGroup) {
+        // 正评相关数据
+        markTrackService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+//        specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        markHeaderTrackService.deleteByExamIdAndPaperNumberAndGroupNumberAndStudentId(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber(), null);
+//        headerTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        markArbitrateHistoryService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        markProblemHistoryService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        markTaskService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        // 评卷员数据
+        markUserGroupService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        // 小题数据
+        markQuestionService.updateGroupNumberByExamIdAndPaperNumberAndGroupNumber(null, markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        // 考生分组状态与得分明细
+        markGroupStudentService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        markSubjectiveScoreService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        // 删除分组
+        releaseByMarkGroup(markGroup);
+        markGroupService.deleteByExamIdAndPaperNumberAndGroupNumber(markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        // 更新MarkPaper中groupStatus
+        markPaperService.updateGroupStatusByExamIdAndPaperNumber(false, markGroup.getExamId(), markGroup.getPaperNumber());
+        // 未分组的题目
+        long unGroupQuestionCount = markQuestionService.countByExamIdAndPaperNumberAndObjectiveAndGroupNumberIsNull(markGroup.getExamId(), markGroup.getPaperNumber(), false);
+        // 考生整体状态与总分更新
+        long groupCount = markGroupService.countByExamIdAndPaperNumber(markGroup.getExamId(), markGroup.getPaperNumber());
+        if (groupCount == 0 || unGroupQuestionCount > 0) {
+            markStudentService.updateSubjectiveStatusAndScore(markGroup.getExamId(), markGroup.getPaperNumber(), SubjectiveStatus.UNMARK, 0D, null);
+//            inspectHistoryService.deleteByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
+        } else {
+            List<Long> studentList = markStudentService.findIdByExamIdAndPaperNumberAndSubjectiveStatus(markGroup.getExamId(), markGroup.getPaperNumber(), SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
+            for (Long studentId : studentList) {
+                checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
+            }
+        }
+    }
+
+    @Override
+    public void releaseByMarkGroup(MarkGroup markGroup) {
+        TaskLock taskLock = getTaskLock(markGroup);
+        taskLock.clear();
+    }
+
 }

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

@@ -1,21 +1,5 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-import javax.validation.constraints.NotNull;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -36,11 +20,7 @@ import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
 import com.qmth.teachcloud.mark.bean.omredit.OmrEditDomain;
 import com.qmth.teachcloud.mark.bean.omredit.OmrEditPaper;
-import com.qmth.teachcloud.mark.bean.scananswer.AnswerPageVo;
-import com.qmth.teachcloud.mark.bean.scananswer.AnswerPaperVo;
-import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
-import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
-import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
+import com.qmth.teachcloud.mark.bean.scananswer.*;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.CheckTask;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamCheckInfoVo;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamInfoVo;
@@ -48,33 +28,29 @@ import com.qmth.teachcloud.mark.bean.student.AbsentManualUpdateVo;
 import com.qmth.teachcloud.mark.bean.student.StudentQuery;
 import com.qmth.teachcloud.mark.bean.student.StudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreInfo;
-import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveAnswerDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
-import com.qmth.teachcloud.mark.entity.MarkPaper;
-import com.qmth.teachcloud.mark.entity.MarkQuestion;
-import com.qmth.teachcloud.mark.entity.MarkStudent;
-import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
-import com.qmth.teachcloud.mark.entity.ScanPaper;
-import com.qmth.teachcloud.mark.entity.ScanPaperPage;
-import com.qmth.teachcloud.mark.entity.ScanStudentPaper;
+import com.qmth.teachcloud.mark.dto.mark.score.*;
+import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.ExamStatus;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
 import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
-import com.qmth.teachcloud.mark.service.MarkPaperService;
-import com.qmth.teachcloud.mark.service.MarkQuestionService;
-import com.qmth.teachcloud.mark.service.MarkStudentService;
-import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
-import com.qmth.teachcloud.mark.service.ScanOmrTaskService;
-import com.qmth.teachcloud.mark.service.ScanPackageService;
-import com.qmth.teachcloud.mark.service.ScanPaperPageService;
-import com.qmth.teachcloud.mark.service.ScanPaperService;
-import com.qmth.teachcloud.mark.service.ScanStudentPaperService;
+import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.BatchGetDataUtil;
 import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -106,7 +82,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     private TeachcloudCommonService teachcloudCommonService;
     @Autowired
     private ConcurrentService concurrentService;
-    
+
 
     @Override
     public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
@@ -123,14 +99,24 @@ 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, Double score, String scoreList) {
         UpdateWrapper<MarkStudent> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(MarkStudent::getSubjectiveStatus, status).set(MarkStudent::getSubjectiveScore, score)
                 .set(MarkStudent::getSubjectiveScoreList, scoreList).eq(MarkStudent::getId, studentId);
         this.update(updateWrapper);
     }
 
+    @Override
+    public void updateSubjectiveStatusAndScore(Long examId, String paperNumber, SubjectiveStatus status, double score, String scoreList) {
+        UpdateWrapper<MarkStudent> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkStudent::getSubjectiveStatus, status)
+                .set(MarkStudent::getSubjectiveScore, score)
+                .set(MarkStudent::getSubjectiveScoreList, scoreList)
+                .eq(MarkStudent::getExamId, examId)
+                .eq(MarkStudent::getPaperNumber, paperNumber);
+        this.update(updateWrapper);
+    }
+
     @Override
     public ScanExamInfoVo getScanExamInfo(BasicExam exam) {
         ScanExamInfoVo vo = new ScanExamInfoVo();
@@ -479,104 +465,104 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 .eq(MarkStudent::getCoursePaperId, coursePaperId);
         return this.list(queryWrapper);
     }
-    
+
     @Override
-	public IPage<AnswerQueryVo> query(AnswerQueryDomain query) {
-		// 查询考生分页信息
-		IPage<AnswerQueryVo> iPage = baseMapper.queryPage(new Page<>(query.getPageNumber(), query.getPageSize()),
-				query);
-		if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
-			for (AnswerQueryVo vo : iPage.getRecords()) {
-				if(vo.getIsAbsent()!=null&&vo.getIsAbsent()) {
-					vo.setExamStatus(ExamStatus.ABSENT);
-				}else {
-					vo.setExamStatus(ExamStatus.OK);
-				}
-			}
-		}
-		if (CollectionUtils.isNotEmpty(iPage.getRecords()) && (query.getWithPaper() != null && query.getWithPaper())) {
-			Map<Long, AnswerQueryVo> map = new HashMap<>();
-
-			for (AnswerQueryVo vo : iPage.getRecords()) {
-				List<AnswerPaperVo> papers = new ArrayList<>();
-				vo.setPapers(papers);
-				if (vo.getCardPaperCount() != null) {
-					for (int i = 1; i <= vo.getCardPaperCount(); i++) {
-						AnswerPaperVo pv = new AnswerPaperVo();
-						pv.setNumber(i);
-						papers.add(pv);
-					}
-				}
-				map.put(vo.getId(), vo);
-			}
-			// 根据考生id查找绑定paper
-			List<Long> studentIds = iPage.getRecords().stream().map(p -> p.getId()).collect(Collectors.toList());
-			List<StudentPaperVo> paperList = new BatchGetDataUtil<StudentPaperVo, Long>() {
-
-				@Override
-				public List<StudentPaperVo> getData(List<Long> paramList) {
-					return scanPaperService.listByStudentIds(paramList);
-				}
-			}.getDataForBatch(studentIds, 200);
-
-			if (CollectionUtils.isNotEmpty(paperList)) {
-				Map<Long, AnswerPaperVo> paperMap = new HashMap<>();
-				for (StudentPaperVo p : paperList) {
-					AnswerQueryVo vo = map.get(p.getStudentId());
-					if (vo == null) {
-						continue;
-					}
-					List<AnswerPaperVo> papers = vo.getPapers();
-					if (papers == null) {
-						continue;
-					}
-					if (papers.size() < p.getNumber()) {
-						continue;
-					}
-					AnswerPaperVo pvo = papers.get(p.getNumber() - 1);
-					pvo.setId(p.getPaperId());
-					pvo.setNumber(p.getNumber());
-					pvo.setAssigned(p.getAssigned());
-					paperMap.put(p.getPaperId(), pvo);
-				}
-				// 查找page
-				List<Long> paperIds = paperList.stream().map(p -> p.getPaperId()).collect(Collectors.toList());
-				List<ScanPaperPage> paperPageList = new BatchGetDataUtil<ScanPaperPage, Long>() {
-
-					@Override
-					public List<ScanPaperPage> getData(List<Long> paramList) {
-						return scanPaperPageService.listByPaperList(paramList);
-					}
-				}.getDataForBatch(paperIds, 200);
-
-				if (CollectionUtils.isNotEmpty(paperPageList)) {
-					for (ScanPaperPage p : paperPageList) {
-						AnswerPaperVo pvo = paperMap.get(p.getPaperId());
-						if (pvo == null) {
-							continue;
-						}
-						List<AnswerPageVo> pages = pvo.getPages();
-						if (pages == null) {
-							pages = new ArrayList<>();
-							pvo.setPages(pages);
-						}
-						AnswerPageVo pageVo = new AnswerPageVo();
-						pageVo.setIndex(p.getPageIndex());
-						pageVo.setSheetUri(p.getSheetPath());
-						if (query.getWithOmrDetail() != null && query.getWithOmrDetail()) {
-							pageVo.setAbsent(p.getAbsent());
-							pageVo.setBreach(p.getBreach());
-							pageVo.setQuestion(p.getQuestion());
-							pageVo.setRecogData(p.getRecogData());
-						}
-						pages.add(pageVo);
-					}
-				}
-			}
-		}
-		return iPage;
-	}
-    
+    public IPage<AnswerQueryVo> query(AnswerQueryDomain query) {
+        // 查询考生分页信息
+        IPage<AnswerQueryVo> iPage = baseMapper.queryPage(new Page<>(query.getPageNumber(), query.getPageSize()),
+                query);
+        if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
+            for (AnswerQueryVo vo : iPage.getRecords()) {
+                if (vo.getIsAbsent() != null && vo.getIsAbsent()) {
+                    vo.setExamStatus(ExamStatus.ABSENT);
+                } else {
+                    vo.setExamStatus(ExamStatus.OK);
+                }
+            }
+        }
+        if (CollectionUtils.isNotEmpty(iPage.getRecords()) && (query.getWithPaper() != null && query.getWithPaper())) {
+            Map<Long, AnswerQueryVo> map = new HashMap<>();
+
+            for (AnswerQueryVo vo : iPage.getRecords()) {
+                List<AnswerPaperVo> papers = new ArrayList<>();
+                vo.setPapers(papers);
+                if (vo.getCardPaperCount() != null) {
+                    for (int i = 1; i <= vo.getCardPaperCount(); i++) {
+                        AnswerPaperVo pv = new AnswerPaperVo();
+                        pv.setNumber(i);
+                        papers.add(pv);
+                    }
+                }
+                map.put(vo.getId(), vo);
+            }
+            // 根据考生id查找绑定paper
+            List<Long> studentIds = iPage.getRecords().stream().map(p -> p.getId()).collect(Collectors.toList());
+            List<StudentPaperVo> paperList = new BatchGetDataUtil<StudentPaperVo, Long>() {
+
+                @Override
+                public List<StudentPaperVo> getData(List<Long> paramList) {
+                    return scanPaperService.listByStudentIds(paramList);
+                }
+            }.getDataForBatch(studentIds, 200);
+
+            if (CollectionUtils.isNotEmpty(paperList)) {
+                Map<Long, AnswerPaperVo> paperMap = new HashMap<>();
+                for (StudentPaperVo p : paperList) {
+                    AnswerQueryVo vo = map.get(p.getStudentId());
+                    if (vo == null) {
+                        continue;
+                    }
+                    List<AnswerPaperVo> papers = vo.getPapers();
+                    if (papers == null) {
+                        continue;
+                    }
+                    if (papers.size() < p.getNumber()) {
+                        continue;
+                    }
+                    AnswerPaperVo pvo = papers.get(p.getNumber() - 1);
+                    pvo.setId(p.getPaperId());
+                    pvo.setNumber(p.getNumber());
+                    pvo.setAssigned(p.getAssigned());
+                    paperMap.put(p.getPaperId(), pvo);
+                }
+                // 查找page
+                List<Long> paperIds = paperList.stream().map(p -> p.getPaperId()).collect(Collectors.toList());
+                List<ScanPaperPage> paperPageList = new BatchGetDataUtil<ScanPaperPage, Long>() {
+
+                    @Override
+                    public List<ScanPaperPage> getData(List<Long> paramList) {
+                        return scanPaperPageService.listByPaperList(paramList);
+                    }
+                }.getDataForBatch(paperIds, 200);
+
+                if (CollectionUtils.isNotEmpty(paperPageList)) {
+                    for (ScanPaperPage p : paperPageList) {
+                        AnswerPaperVo pvo = paperMap.get(p.getPaperId());
+                        if (pvo == null) {
+                            continue;
+                        }
+                        List<AnswerPageVo> pages = pvo.getPages();
+                        if (pages == null) {
+                            pages = new ArrayList<>();
+                            pvo.setPages(pages);
+                        }
+                        AnswerPageVo pageVo = new AnswerPageVo();
+                        pageVo.setIndex(p.getPageIndex());
+                        pageVo.setSheetUri(p.getSheetPath());
+                        if (query.getWithOmrDetail() != null && query.getWithOmrDetail()) {
+                            pageVo.setAbsent(p.getAbsent());
+                            pageVo.setBreach(p.getBreach());
+                            pageVo.setQuestion(p.getQuestion());
+                            pageVo.setRecogData(p.getRecogData());
+                        }
+                        pages.add(pageVo);
+                    }
+                }
+            }
+        }
+        return iPage;
+    }
+
     @Override
     public List<String> summary(AnswerQueryDomain query) {
         // 不分页查询考生准考证号
@@ -584,9 +570,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Transactional
-	@Override
-	public UpdateTimeVo omrEdit(Long userId,OmrEditDomain domain) {
-		MarkStudent student = findByExamIdAndStudentCode(domain.getExamId(), domain.getStudentCode());
+    @Override
+    public UpdateTimeVo omrEdit(Long userId, OmrEditDomain domain) {
+        MarkStudent student = findByExamIdAndStudentCode(domain.getExamId(), domain.getStudentCode());
         if (student == null) {
             throw new ParameterException("考生信息未找到");
         }
@@ -615,7 +601,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         } finally {
             concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
         }
-	}
+    }
 
     @Override
     public MarkStudent findByExamIdAndStudentCode(Long examId, String studentCode) {
@@ -641,9 +627,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Transactional
-	@Override
-	public AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode) {
-    	MarkStudent student = findByExamIdAndCoursePaperIdAndStudentCode(examId, coursePaperId, studentCode);
+    @Override
+    public AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode) {
+        MarkStudent student = findByExamIdAndCoursePaperIdAndStudentCode(examId, coursePaperId, studentCode);
         if (student == null) {
             throw new ParameterException("考生未找到");
         }
@@ -656,22 +642,27 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         lw.eq(MarkStudent::getScanStatus, ScanStatus.UNEXIST);
         update(lw);
         return AbsentManualUpdateVo.create(ScanStatus.MANUAL_ABSENT);
-	}
+    }
 
     @Transactional
-	@Override
-	public UpdateTimeVo confirm(Long examId, String coursePaperId, String studentCode, Boolean omrAbsent) {
+    @Override
+    public UpdateTimeVo confirm(Long examId, String coursePaperId, String studentCode, Boolean omrAbsent) {
         LambdaUpdateWrapper<MarkStudent> lw = new LambdaUpdateWrapper<>();
         lw.set(MarkStudent::getOmrAbsentChecked, true);
         lw.eq(MarkStudent::getExamId, examId);
         lw.eq(MarkStudent::getCoursePaperId, coursePaperId);
         lw.eq(MarkStudent::getStudentCode, studentCode);
         if (omrAbsent != null) {
-        	lw.eq(MarkStudent::getOmrAbsent, omrAbsent);
+            lw.eq(MarkStudent::getOmrAbsent, omrAbsent);
         }
         if (!update(lw)) {
-        	throw new ParameterException("考生未找到");
+            throw new ParameterException("考生未找到");
         }
-		return UpdateTimeVo.create();
-	}
+        return UpdateTimeVo.create();
+    }
+
+    @Override
+    public List<Long> findIdByExamIdAndPaperNumberAndSubjectiveStatus(Long examId, String paperNumber, SubjectiveStatus unmark, SubjectiveStatus marked) {
+        return this.baseMapper.findIdByExamIdAndPaperNumberAndSubjectiveStatus(examId, paperNumber, unmark.name(), marked.name());
+    }
 }

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

@@ -3,7 +3,6 @@ package com.qmth.teachcloud.mark.service.impl;
 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.MarkHeaderTrack;
 import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
 import com.qmth.teachcloud.mark.mapper.MarkSubjectiveScoreMapper;
 import com.qmth.teachcloud.mark.service.MarkSubjectiveScoreService;
@@ -64,6 +63,15 @@ public class MarkSubjectiveScoreServiceImpl extends ServiceImpl<MarkSubjectiveSc
         this.remove(updateWrapper);
     }
 
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkSubjectiveScore::getExamId, examId)
+                .eq(MarkSubjectiveScore::getPaperNumber, paperNumber)
+                .eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
+
     private void sort(List<MarkSubjectiveScore> list) {
         list.sort((o1, o2) -> {
             int i = o1.getMainNumber() - o2.getMainNumber();

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

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
@@ -59,4 +60,23 @@ public class MarkSyncServiceImpl implements MarkSyncService {
         }
         lockService.unlock(LockType.BATCH_QUALITY, lockKey);
     }
+
+    @Async
+    @Override
+    public void deleteMarkGroup(MarkGroup markGroup) {
+        if (markGroup == null) {
+            return;
+        }
+        try {
+            lockService.waitlock(LockType.EXAM_SUBJECT, markGroup.getExamId(), markGroup.getPaperNumber());
+            lockService.waitlock(LockType.GROUP, markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+            markService.deleteMarkGroup(markGroup);
+        } catch (Exception e) {
+            log.error("delete group error", e);
+        } finally {
+            lockService.unlock(LockType.GROUP, markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+            lockService.unlock(LockType.EXAM_SUBJECT, markGroup.getExamId(), markGroup.getPaperNumber());
+            lockService.unlock(LockType.GROUP_DELETE, markGroup.getExamId(), markGroup.getPaperNumber(), markGroup.getNumber());
+        }
+    }
 }

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

@@ -209,8 +209,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(Long examId, String paperNumber,
-                                                                             Integer groupNumber, Long userId, MarkTaskStatus... status) {
+    public int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusIn(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkTaskStatus... status) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
@@ -219,4 +218,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .in(MarkTask::getStatus, Arrays.asList(status));
         return this.count(queryWrapper);
     }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkTask::getExamId, examId)
+                .eq(MarkTask::getPaperNumber, paperNumber)
+                .eq(MarkTask::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
 }

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

@@ -42,4 +42,13 @@ public class MarkTrackServiceImpl extends ServiceImpl<MarkTrackMapper, MarkTrack
         updateWrapper.lambda().eq(MarkTrack::getStudentId, studentId);
         this.remove(updateWrapper);
     }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkTrack> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkTrack::getExamId, examId)
+                .eq(MarkTrack::getPaperNumber, paperNumber)
+                .eq(MarkTrack::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
 }

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

@@ -5,19 +5,17 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityChartDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
-import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.mark.service.MarkPaperService;
-import com.qmth.teachcloud.mark.service.MarkQuestionService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityChartDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import com.qmth.teachcloud.mark.enums.LockType;
@@ -284,4 +282,13 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
                 .orderByAsc(MarkUserGroup::getId);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkUserGroup> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkUserGroup::getExamId, examId)
+                .eq(MarkUserGroup::getPaperNumber, paperNumber)
+                .eq(MarkUserGroup::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
 }

+ 3 - 0
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -232,4 +232,7 @@
         <include refid="queryWhereAndOrder"/>
         order by t.id
     </select>
+    <select id="findIdByExamIdAndPaperNumberAndSubjectiveStatus" resultType="java.lang.Long">
+        select id from mark_student where exam_id = #{examId} and paper_number = #{paperNumber} and subjective_status in (#{unmark}, #{marked})
+    </select>
 </mapper>