瀏覽代碼

3.4.4 update-20250226,评卷逻辑改动

xiaofei 3 月之前
父節點
當前提交
5a5a8e58f1
共有 100 個文件被更改,包括 2295 次插入3322 次删除
  1. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  2. 14 20
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java
  3. 6 6
      distributed-print-business/src/main/resources/mapper/ConditionMapper.xml
  4. 10 0
      distributed-print/install/mysql/upgrade/3.4.4.sql
  5. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskAuditController.java
  6. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/WorkController.java
  7. 12 11
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArbitrateController.java
  8. 21 9
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkClassController.java
  9. 24 24
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkController.java
  10. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkEntranceController.java
  11. 0 153
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkGroupController.java
  12. 8 8
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQualityController.java
  13. 10 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionController.java
  14. 153 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionSubjectiveController.java
  15. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkRejectController.java
  16. 4 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkTaskController.java
  17. 32 32
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserQuestionController.java
  18. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/MarkConfigItem.java
  19. 6 6
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/group/QuestionPictureConfigParams.java
  20. 14 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkPaperSettingConfig.java
  21. 73 31
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java
  22. 8 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SpecialTagDTO.java
  23. 36 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SubjectiveAnswerFileDto.java
  24. 10 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/entrance/MarkEntranceDto.java
  25. 10 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupClassProgressDto.java
  26. 15 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupProgressDto.java
  27. 10 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupQuestionsDto.java
  28. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupSummaryProgressDto.java
  29. 10 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkQualityDto.java
  30. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkRejectHistoryDto.java
  31. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkStepDTO.java
  32. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkTaskDto.java
  33. 10 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkUserGroupProgressDto.java
  34. 11 11
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerInfoDto.java
  35. 10 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerSpecialTagDTO.java
  36. 6 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java
  37. 3 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TrackDTO.java
  38. 11 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkSettingDto.java
  39. 0 93
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupDto.java
  40. 0 36
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupSingleDto.java
  41. 28 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupTaskDto.java
  42. 1 12
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArbitrateHistory.java
  43. 0 346
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java
  44. 0 93
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroupStudent.java
  45. 7 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java
  46. 1 11
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkProblemHistory.java
  47. 5 17
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkRejectHistory.java
  48. 1 34
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkSubjectiveScore.java
  49. 49 108
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java
  50. 19 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserPaper.java
  51. 5 25
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserQuestion.java
  52. 36 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/QuestionModel.java
  53. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkArbitrateHistoryMapper.java
  54. 0 16
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkGroupMapper.java
  55. 0 16
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkGroupStudentMapper.java
  56. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkQuestionMapper.java
  57. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkRejectHistoryMapper.java
  58. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java
  59. 13 10
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java
  60. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserClassMapper.java
  61. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserQuestionMapper.java
  62. 209 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/ArbitrateResult.java
  63. 50 42
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkHeaderGroupResult.java
  64. 9 163
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResult.java
  65. 198 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResultQuestion.java
  66. 8 9
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArbitrateHistoryService.java
  67. 0 57
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupService.java
  68. 0 24
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupStudentService.java
  69. 3 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkProblemHistoryService.java
  70. 28 9
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  71. 3 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkRejectHistoryService.java
  72. 18 20
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  73. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  74. 3 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java
  75. 1 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSyncService.java
  76. 26 23
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  77. 4 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java
  78. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserPaperService.java
  79. 17 18
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserQuestionService.java
  80. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/TaskService.java
  81. 29 37
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java
  82. 0 557
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java
  83. 0 55
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupStudentServiceImpl.java
  84. 21 20
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java
  85. 12 21
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkProblemHistoryServiceImpl.java
  86. 244 61
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  87. 6 12
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkRejectHistoryServiceImpl.java
  88. 283 445
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  89. 6 16
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  90. 13 15
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java
  91. 33 34
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSyncServiceImpl.java
  92. 74 75
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  93. 64 23
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  94. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserPaperServiceImpl.java
  95. 100 92
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java
  96. 65 132
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java
  97. 8 8
      teachcloud-mark/src/main/resources/mapper/MarkArbitrateHistoryMapper.xml
  98. 0 20
      teachcloud-mark/src/main/resources/mapper/MarkGroupMapper.xml
  99. 0 15
      teachcloud-mark/src/main/resources/mapper/MarkGroupStudentMapper.xml
  100. 1 1
      teachcloud-mark/src/main/resources/mapper/MarkQuestionMapper.xml

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -137,7 +137,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Resource
     private ScanAnswerCardService scanAnswerCardService;
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserQuestionService;
     @Resource
     private MarkUserClassService markUserClassService;
     @Resource
@@ -781,7 +781,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
                         markPaperPackageService.deleteByExamIdAndPaperNumber(examDetail.getExamId(), examDetailCourse.getPaperNumber());
                         markQuestionService.deleteByExamIdAndPaperNumber(examDetail.getExamId(), examDetailCourse.getPaperNumber());
                         scanAnswerCardService.deleteByExamIdAndPaperNumber(examDetail.getExamId(), examDetailCourse.getPaperNumber());
-                        markUserGroupService.deleteByExamIdAndPaperNumberAndGroupNumber(examDetail.getExamId(), examDetailCourse.getPaperNumber(), null);
+                        markUserQuestionService.deleteByExamIdAndPaperNumberAndQuestionId(examDetail.getExamId(), examDetailCourse.getPaperNumber(), null);
                         markUserClassService.deleteByExamIdAndPaperNumber(examDetail.getExamId(), examDetailCourse.getPaperNumber());
                     } else {
                         markPaperPackageService.deleteByExamIdAndPaperNumberAndPackageCode(examDetail.getExamId(), examDetailCourse.getPaperNumber(), examDetail.getPackageCode());

+ 14 - 20
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java

@@ -28,17 +28,12 @@ import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ConvertUtil;
-import com.qmth.teachcloud.common.util.DateDisposeUtils;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupDto;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupSingleDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
-import com.qmth.teachcloud.mark.service.MarkGroupService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkQuestionAnswerService;
 import com.qmth.teachcloud.mark.service.MarkQuestionService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.time.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -84,8 +79,6 @@ public class ImportLogicServiceImpl implements ImportLogicService {
     @Resource
     private MarkQuestionService markQuestionService;
     @Resource
-    private MarkGroupService markGroupService;
-    @Resource
     private SysRoleService sysRoleService;
     @Resource
     private CommonCacheService commonCacheService;
@@ -1199,9 +1192,10 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             // 试卷编号-> 题目集合 Map
             Map<String, List<SubjectiveStructDto>> paperQuestionsMap = subjectiveStructDtoList.stream().collect(Collectors.groupingBy(SubjectiveStructDto::getPaperNumber));
             paperQuestionsMap.forEach((paperNumber, paperQuestionList) -> {
-                if (markGroupService.countByExamIdAndPaperNumber(examId, paperNumber) > 0) {
+                // todo 2025-02-25
+                if(true) /*(markGroupService.countByExamIdAndPaperNumber(examId, paperNumber) > 0) {
                     paperErrorList.add(String.format("[试卷编号]%s,已存在分组,请先删除该试卷的所有分组再导入试题", paperNumber));
-                } else {
+                } else */{
                     MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
                     Long courseId = markPaper.getCourseId();
                     BasicCourse basicCourse = basicCourseService.getById(courseId);
@@ -1338,17 +1332,17 @@ public class ImportLogicServiceImpl implements ImportLogicService {
                             }).collect(Collectors.toList());
                             markQuestionService.saveBatch(markQuestionList);
 
-                            MarkGroupDto markGroupDto = new MarkGroupDto();
-                            markGroupDto.setDoubleEnable(false);
-                            markGroupDto.setGroupNumber(groupNumber);
-                            markGroupDto.setMarkers(markUsers);
-                            markGroupDto.setQuestions(markQuestionList);
-                            markGroupDto.setPictureConfigs(new ArrayList<>());
-                            MarkGroupSingleDto markGroupSingleDto = new MarkGroupSingleDto();
-                            markGroupSingleDto.setExamId(examId);
-                            markGroupSingleDto.setPaperNumber(paperNumber);
-                            markGroupSingleDto.setGroupInfo(markGroupDto);
-                            markGroupService.saveGroup(markGroupSingleDto);
+//                            MarkGroupDto markGroupDto = new MarkGroupDto();
+//                            markGroupDto.setDoubleEnable(false);
+//                            markGroupDto.setGroupNumber(groupNumber);
+//                            markGroupDto.setMarkers(markUsers);
+//                            markGroupDto.setQuestions(markQuestionList);
+//                            markGroupDto.setPictureConfigs(new ArrayList<>());
+//                            MarkGroupSingleDto markGroupSingleDto = new MarkGroupSingleDto();
+//                            markGroupSingleDto.setExamId(examId);
+//                            markGroupSingleDto.setPaperNumber(paperNumber);
+//                            markGroupSingleDto.setGroupInfo(markGroupDto);
+//                            markGroupService.saveGroup(markGroupSingleDto);
                         }
                         if (CollectionUtils.isNotEmpty(groupErrorList)) {
                             String groupErrorMsg = paperNumberGroupNumberNotice + String.join(",", groupErrorList);

+ 6 - 6
distributed-print-business/src/main/resources/mapper/ConditionMapper.xml

@@ -379,11 +379,11 @@
                 </if>
                 AND exists (select 1
                 FROM
-                mark_user_group mug
+                mark_user_qeustion mug
                 LEFT JOIN
-                mark_group mg ON mug.exam_id = mg.exam_id
+                mark_question mg ON mug.exam_id = mg.exam_id
                 AND mug.paper_number = mg.paper_number
-                AND mug.group_number = mg.number
+                AND mug.question_id = mg.id
                 <where>
                     bc.id = mg.course_id
                     and mg.exam_id = #{examId}
@@ -400,11 +400,11 @@
         SELECT
             distinct mg.paper_number paperNumber
         FROM
-            mark_user_group mug
+            mark_user_question mug
                 LEFT JOIN
-            mark_group mg ON mug.exam_id = mg.exam_id
+            mark_question mg ON mug.exam_id = mg.exam_id
                 AND mug.paper_number = mg.paper_number
-                AND mug.group_number = mg.number
+                AND mug.question_id = mg.id
         <where>
             mg.exam_id = #{examId}
             <if test="courseId != null">

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

@@ -82,3 +82,13 @@ CREATE TABLE `mark_header_history` (
           `create_time` BIGINT(20) NULL COMMENT '创建时间',
           PRIMARY KEY (`id`))
     COMMENT = '复核历史表';
+
+ALTER TABLE `mark_user_paper`
+    ADD COLUMN `mode` VARCHAR(45) NULL COMMENT '阅卷模式' AFTER `question_model`;
+
+ALTER TABLE `mark_task`
+    ADD COLUMN `main_number` INT NULL COMMENT '大题号' AFTER `question_id`,
+ADD COLUMN `sub_nubmer` INT NULL COMMENT '小题号' AFTER `main_number`;
+
+ALTER TABLE `mark_paper`
+    CHANGE COLUMN `open_mark_class` `class_mark` TINYINT NULL DEFAULT '0' COMMENT '是否开启分班阅' AFTER `paper_type`;

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskAuditController.java

@@ -16,7 +16,7 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.MarkUserQuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -55,7 +55,7 @@ public class ExamTaskAuditController {
     private MarkPaperService markPaperService;
 
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserGroupService;
 
     @ApiOperation(value = "审核-印刷员驳回后命题老师修改")
     @RequestMapping(value = "/apply_resave", method = RequestMethod.POST)

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/WorkController.java

@@ -19,7 +19,7 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.MarkUserQuestionService;
 import io.swagger.annotations.*;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
@@ -59,7 +59,7 @@ public class WorkController {
     private GradeInitializeService gradeInitializeService;
 
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserGroupService;
 
     @ApiOperation(value = "首页-电子交卷待办列表")
     @RequestMapping(value = "/exam/task/ready", method = RequestMethod.POST)

+ 12 - 11
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArbitrateController.java

@@ -10,6 +10,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateMarkerDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.service.MarkArbitrateHistoryService;
 import io.swagger.annotations.Api;
@@ -45,12 +46,12 @@ public class MarkArbitrateController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                        @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                       @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber,
+                       @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId,
                        @ApiParam(value = "状态") @RequestParam(required = false) String type,
                        @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<MarkArbitrateDto> markArbitrateDtoIPage = markArbitrateHistoryService.pageArbitrate(examId, paperNumber, groupNumber, type, className, pageNumber, pageSize);
+        IPage<MarkArbitrateDto> markArbitrateDtoIPage = markArbitrateHistoryService.pageArbitrate(examId, paperNumber, questionId, type, className, pageNumber, pageSize);
         return ResultUtil.ok(markArbitrateDtoIPage);
     }
 
@@ -71,8 +72,8 @@ public class MarkArbitrateController {
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
     public Result getStatus(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                             @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                            @ApiParam(value = "分组号", required = true) @RequestParam Integer groupNumber) {
-        return ResultUtil.ok(markArbitrateHistoryService.getArbitrateStatus(examId, paperNumber, groupNumber));
+                            @ApiParam(value = "题目ID", required = true) @RequestParam Long questionId) {
+        return ResultUtil.ok(markArbitrateHistoryService.getArbitrateStatus(examId, paperNumber, questionId));
     }
 
     /**
@@ -93,8 +94,8 @@ public class MarkArbitrateController {
     public Result getSetting(@ApiParam(value = "仲裁历史ID") @RequestParam(required = false) Long arbitrateId,
                              @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
                              @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
-                             @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber) {
-        MarkArbitrateSettingDto markArbitrateSettingDto = markArbitrateHistoryService.getArbitrateSetting(arbitrateId, examId, paperNumber, groupNumber);
+                             @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId) {
+        MarkArbitrateSettingDto markArbitrateSettingDto = markArbitrateHistoryService.getArbitrateSetting(arbitrateId, examId, paperNumber, questionId);
         return ResultUtil.ok(markArbitrateSettingDto);
     }
 
@@ -106,8 +107,8 @@ public class MarkArbitrateController {
     public Result getTask(@ApiParam(value = "仲裁历史ID") @RequestParam(required = false) Long arbitrateId,
                           @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
                           @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
-                          @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber) {
-        Task task = markArbitrateHistoryService.getArbitrateTask(arbitrateId, examId, paperNumber, groupNumber);
+                          @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId) {
+        Task task = markArbitrateHistoryService.getArbitrateTask(arbitrateId, examId, paperNumber, questionId);
         return ResultUtil.ok(task);
     }
 
@@ -116,7 +117,7 @@ public class MarkArbitrateController {
      */
     @ApiOperation(value = "保存任务")
     @RequestMapping(value = "/saveTask", method = RequestMethod.POST)
-    public Result saveTask(@RequestBody MarkResult markResult) {
+    public Result saveTask(@RequestBody MarkHeaderGroupResult markResult) {
         markArbitrateHistoryService.saveArbitrateTask(markResult);
         return ResultUtil.ok(true);
     }
@@ -128,10 +129,10 @@ public class MarkArbitrateController {
     @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
     public Result getTask(@ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
                           @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
-                          @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber,
+                          @ApiParam(value = "题止ID") @RequestParam(required = false) Long questionId,
                           @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                           @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        List<Task> taskList = markArbitrateHistoryService.getHistory(examId, paperNumber, groupNumber, pageNumber, pageSize);
+        List<Task> taskList = markArbitrateHistoryService.getHistory(examId, paperNumber, questionId, pageNumber, pageSize);
         return ResultUtil.ok(taskList);
     }
 }

+ 21 - 9
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkClassController.java

@@ -3,7 +3,6 @@ package com.qmth.distributed.print.api.mark;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDto;
 import com.qmth.teachcloud.common.bean.params.mark.group.MarkClassUserParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
@@ -34,22 +33,35 @@ public class MarkClassController extends BaseController {
     private MarkUserClassService markUserClassService;
 
     /**
-     * 查询
+     * 开启/关闭分班阅
      */
-    @ApiOperation(value = "查询")
-    @RequestMapping(value = "/list", method = RequestMethod.POST)
-    public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                       @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
-        MarkUserClassDto markUserClassDto = markUserClassService.listMarkUserClassByExamIdAndPaperNumber(examId, paperNumber);
-        return ResultUtil.ok(markUserClassDto);
+    @ApiOperation(value = "开启/关闭分班阅")
+    @RequestMapping(value = "/update_open_mark_class", method = RequestMethod.POST)
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "开启/关闭分班阅操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、是否开启分班阅:{{openMarkClass}}")
+    public Result delete(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                         @ApiParam(value = "是否开启分班阅", required = true) @RequestParam Boolean classMark) {
+        validMarkPaperForMark(examId, paperNumber);
+        return ResultUtil.ok(markUserClassService.updateOpenMarkClassByExamIdAndPaperNumber(examId, paperNumber, classMark));
     }
 
+    /**
+     * 查询
+     */
+//    @ApiOperation(value = "查询")
+//    @RequestMapping(value = "/list", method = RequestMethod.POST)
+//    public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+//                       @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+//        MarkUserClassDto markUserClassDto = markUserClassService.listMarkUserClassByExamIdAndPaperNumber(examId, paperNumber);
+//        return ResultUtil.ok(markUserClassDto);
+//    }
+
     /**
      * 查询
      */
     @ApiOperation(value = "提交")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.ADD,detail = "分班阅提交操作,考试ID:{{markClassUserParams.examId}}、试卷编号:{{markClassUserParams.paperNumber}}")
+    @OperationLogDetail(operationType = OperationTypeEnum.ADD, detail = "分班阅提交操作,考试ID:{{markClassUserParams.examId}}、试卷编号:{{markClassUserParams.paperNumber}}")
     public Result save(@RequestBody MarkClassUserParams markClassUserParams) {
         validMarkPaperForMark(markClassUserParams.getExamId(), markClassUserParams.getPaperNumber());
         return ResultUtil.ok(markUserClassService.saveMarkClassUser(markClassUserParams));

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

@@ -8,9 +8,10 @@ import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.service.MarkService;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.MarkUserQuestionService;
 import com.qmth.teachcloud.mark.utils.TaskLock;
 import com.qmth.teachcloud.mark.utils.TaskLockUtil;
 import io.lettuce.core.GeoArgs.Sort;
@@ -42,7 +43,7 @@ public class MarkController extends BaseController {
     @Autowired
     private MarkService markService;
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserGroupService;
     @Autowired
     private SysUserService userService;
 
@@ -64,40 +65,40 @@ public class MarkController extends BaseController {
     }
 
     @RequestMapping(value = "/getSetting", method = RequestMethod.POST)
-    public Result getSetting(@RequestParam Long examId, @RequestParam String paperNumber,
-                             @RequestParam Integer groupNumber) {
+    public Result getSetting(@RequestParam Long examId,
+                             @RequestParam String paperNumber) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getSetting(user, examId, paperNumber, groupNumber));
+        return ResultUtil.ok(markService.getSetting(user, examId, paperNumber));
     }
 
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
-    public Result status(@RequestParam Long examId, @RequestParam String paperNumber,
-                         @RequestParam Integer groupNumber) {
+    public Result status(@RequestParam Long examId, @RequestParam String paperNumber
+    ) {
         validMarkPaperForMark(examId, paperNumber);
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getStatus(user.getId(), examId, paperNumber, groupNumber));
+        return ResultUtil.ok(markService.getStatus(user.getId(), examId, paperNumber));
     }
 
-    @RequestMapping(value = "/getGroup", method = RequestMethod.POST)
-    @ResponseBody
-    public Result getGroup(@RequestParam Long examId, @RequestParam String paperNumber) {
-        SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getGroup(user.getId(), examId, paperNumber));
-    }
+//    @RequestMapping(value = "/getGroup", method = RequestMethod.POST)
+//    @ResponseBody
+//    public Result getGroup(@RequestParam Long examId, @RequestParam String paperNumber) {
+//        SysUser user = (SysUser) ServletUtil.getRequestUser();
+//        return ResultUtil.ok(markService.getGroup(user.getId(), examId, paperNumber));
+//    }
 
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     public Result getTask(@RequestParam Long examId, @RequestParam String paperNumber,
-                          @RequestParam Integer groupNumber) {
+                          @RequestParam QuestionModel questionModel) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.getTask(user.getId(), examId, paperNumber, groupNumber));
+        return ResultUtil.ok(markService.getTask(user.getId(), examId, paperNumber, questionModel));
     }
 
     @RequestMapping(value = "/saveTask", method = RequestMethod.POST)
     public Result saveTask(HttpServletRequest request, @RequestParam Long examId, @RequestParam String paperNumber,
-                           @RequestParam Integer groupNumber, @RequestBody MarkResult markResult) {
+                            @RequestBody MarkResult markResult) {
         validMarkPaperForMark(examId, paperNumber);
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(markService.saveTask(examId, paperNumber, groupNumber, user.getId(), markResult));
+        return ResultUtil.ok(markService.saveTask(examId, paperNumber, user.getId(), markResult));
     }
 
     @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
@@ -111,20 +112,19 @@ public class MarkController extends BaseController {
     @RequestMapping(value = "/updateSetting", method = RequestMethod.POST)
     public Result updateSetting(@RequestParam Long examId,
                                 @RequestParam String paperNumber,
-                                @RequestParam Integer groupNumber,
                                 @RequestParam String uiSetting,
-                                @RequestParam MarkMode mode) {
+                                @RequestParam MarkMode mode,
+                                @RequestParam QuestionModel questionModel) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
         userService.updateUiSetting(user.getId(), StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(uiSetting)));
-        markUserGroupService.updateMode(examId, paperNumber, groupNumber, user.getId(), mode);
+        markUserGroupService.updateMode(examId, paperNumber, user.getId(), mode, questionModel);
         return ResultUtil.ok(true);
     }
 
     @RequestMapping(value = "/clear", method = RequestMethod.POST)
-    public Result clear(@RequestParam Long examId, @RequestParam String paperNumber,
-                        @RequestParam Integer groupNumber) {
+    public Result clear(@RequestParam Long examId, @RequestParam String paperNumber) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        markService.clear(user.getId(), examId, paperNumber, groupNumber);
+        markService.clear(user.getId(), examId, paperNumber);
         return ResultUtil.ok(true);
     }
 }

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

@@ -8,7 +8,7 @@ import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.MarkUserQuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -35,7 +35,7 @@ import javax.validation.constraints.Min;
 public class MarkEntranceController {
 
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserGroupService;
 
     /**
      * 评卷入口数据列表

+ 0 - 153
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkGroupController.java

@@ -1,153 +0,0 @@
-package com.qmth.distributed.print.api.mark;
-
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.teachcloud.common.annotation.OperationLogDetail;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupQuestionsDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupSummaryProgressDto;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupSingleDto;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
-import com.qmth.teachcloud.common.bean.params.mark.group.GroupPictureConfigParams;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-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.service.MarkGroupService;
-import io.swagger.annotations.*;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import java.util.List;
-
-/**
- * <p>
- * 评卷分组表 前端控制器
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@Api(tags = "评卷-分组管理")
-@RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/group")
-public class MarkGroupController extends BaseController {
-
-    @Resource
-    private MarkGroupService markGroupService;
-
-    /**
-     * 分组查询
-     */
-    @ApiOperation(value = "查询")
-    @RequestMapping(value = "/list", method = RequestMethod.POST)
-    public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                       @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
-        MarkGroupTaskDto markGroupList = markGroupService.listGroupTaskByExamIdAndPaperNumber(examId, paperNumber);
-        return ResultUtil.ok(markGroupList);
-    }
-
-    /**
-     * 新增
-     */
-    @ApiOperation(value = "新增")
-    @RequestMapping(value = "/save", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.ADD, detail = "新增分组操作,考试ID:{{markGroupSingleDto.examId}}、试卷编号:{{markGroupSingleDto.paperNumber}}")
-    public Result add(@RequestBody MarkGroupSingleDto markGroupSingleDto) {
-        validMarkPaperForMark(markGroupSingleDto.getExamId(), markGroupSingleDto.getPaperNumber());
-        return ResultUtil.ok(markGroupService.saveGroup(markGroupSingleDto));
-    }
-
-    /**
-     * 修改
-     */
-    @ApiOperation(value = "修改")
-    @RequestMapping(value = "/update", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "修改分组操作,考试ID:{{markGroupSingleDto.examId}}、试卷编号:{{markGroupSingleDto.paperNumber}}、分组号:{{markGroupSingleDto.groupInfo.groupNumber}}")
-    public Result update(@RequestBody MarkGroupSingleDto markGroupSingleDto) {
-        validMarkPaperForMark(markGroupSingleDto.getExamId(), markGroupSingleDto.getPaperNumber());
-        return ResultUtil.ok(markGroupService.updateGroup(markGroupSingleDto));
-    }
-
-    /**
-     * 删除
-     */
-    @ApiOperation(value = "删除")
-    @RequestMapping(value = "/delete", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.DELETE, detail = "删除分组操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}")
-    public Result delete(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                         @ApiParam(value = "分组号", required = true) @RequestParam Integer groupNumber) {
-        validMarkPaperForMark(examId, paperNumber);
-        markGroupService.deleteGroupByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-        return ResultUtil.ok(true);
-    }
-
-    /**
-     * 评卷区设置
-     */
-    @ApiOperation(value = "评卷区设置")
-    @RequestMapping(value = "/update_picture_config", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "设置评卷区操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}")
-    public Result updatePictureConfig(@RequestBody GroupPictureConfigParams groupPictureConfigParams) {
-        validMarkPaperForMark(groupPictureConfigParams.getExamId(), groupPictureConfigParams.getPaperNumber());
-        markGroupService.updatePicListByExamIdAndPaperNumberAndGroupNumber(groupPictureConfigParams);
-        return ResultUtil.ok(true);
-    }
-
-    /**
-     * 开启/关闭分班阅
-     */
-    @ApiOperation(value = "开启/关闭分班阅")
-    @RequestMapping(value = "/update_open_mark_class", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "开启/关闭分班阅操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、是否开启分班阅:{{openMarkClass}}")
-    public Result delete(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                         @ApiParam(value = "是否开启分班阅", required = true) @RequestParam Boolean openMarkClass) {
-        validMarkPaperForMark(examId, paperNumber);
-        markGroupService.updateOpenMarkClassByExamIdAndPaperNumber(examId, paperNumber, openMarkClass);
-        return ResultUtil.ok(true);
-    }
-
-    /**
-     * 进度列表查询
-     */
-    @ApiOperation(value = "进度列表")
-    @RequestMapping(value = "/summary", method = RequestMethod.POST)
-    public Result summary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                          @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
-        MarkGroupSummaryProgressDto markGroupSummaryProgressDto = markGroupService.summaryGroupProgress(examId, paperNumber);
-        return ResultUtil.ok(markGroupSummaryProgressDto);
-    }
-
-    /**
-     * 班级阅卷进度列表查询
-     */
-    @ApiOperation(value = "班级阅卷进度列表")
-    @RequestMapping(value = "/class/summary", 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,
-                               @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                               @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkGroupClassProgressDto> markGroupClassProgressDtoIPage = markGroupService.summaryGroupClassProgress(examId, paperNumber, className, pageNumber, pageSize);
-        return ResultUtil.ok(markGroupClassProgressDtoIPage);
-    }
-
-    /**
-     * 评阅题目列表
-     */
-    @Aac(auth = false)
-    @ApiOperation(value = "评阅题目列表")
-    @RequestMapping(value = "/list/groupQuestions", method = RequestMethod.POST)
-    public Result listGroupQuestions(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                                     @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
-        List<MarkGroupQuestionsDto> markGroupQuestionsDtoList = markGroupService.listGroupQuestions(examId, paperNumber);
-        return ResultUtil.ok(markGroupQuestionsDtoList);
-    }
-
-}

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

@@ -10,7 +10,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.MarkUserQuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -38,7 +38,7 @@ import java.util.List;
 public class MarkQualityController {
 
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserQuestionService;
 
     /**
      * 评卷质量列表查询
@@ -47,11 +47,11 @@ public class MarkQualityController {
     @RequestMapping(value = "/list", 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) Integer groupNumber,
+                               @ApiParam(value = "题目") @RequestParam(required = false) Long questionId,
                                @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
                                @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkQualityDto> markQualityDtoIPage = markUserGroupService.pageQuality(examId, paperNumber, groupNumber, loginName, pageNumber, pageSize);
+        IPage<MarkQualityDto> markQualityDtoIPage = markUserQuestionService.pageQuality(examId, paperNumber, questionId, loginName, pageNumber, pageSize);
         return ResultUtil.ok(markQualityDtoIPage);
     }
 
@@ -63,8 +63,8 @@ public class MarkQualityController {
     @OperationLogDetail(operationType = OperationTypeEnum.SAVE, detail = "重新计算质量监控,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}")
     public Result update(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                          @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                         @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber) {
-        markUserGroupService.updateQuality(examId, paperNumber, groupNumber);
+                         @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId) {
+        markUserQuestionService.updateQuality(examId, paperNumber, questionId);
         return ResultUtil.ok(true);
     }
 
@@ -75,8 +75,8 @@ public class MarkQualityController {
     @RequestMapping(value = "/chart", method = RequestMethod.POST)
     public Result chart(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                                @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                               @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber) {
-        List<MarkQualityChartDto> markQualityChartDtoList = markUserGroupService.listQualityChart(examId, paperNumber, groupNumber);
+                               @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId) {
+        List<MarkQualityChartDto> markQualityChartDtoList = markUserQuestionService.listQualityChart(examId, paperNumber, questionId);
         return ResultUtil.ok(markQualityChartDtoList);
     }
 }

+ 10 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionController.java

@@ -6,6 +6,7 @@ import com.qmth.distributed.print.business.entity.ExamTaskDetail;
 import com.qmth.distributed.print.business.service.ExamCardService;
 import com.qmth.distributed.print.business.service.ExamTaskDetailService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.CardCreateMethodEnum;
@@ -15,6 +16,7 @@ import com.qmth.distributed.print.business.util.ExamTaskUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
@@ -63,9 +65,9 @@ public class MarkQuestionController extends BaseController {
     private ExamCardService examCardService;
 
     /**
-     * 卷结构查询
+     * 卷结构查询
      */
-    @ApiOperation(value = "查询")
+    @ApiOperation(value = "试卷结构-查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                        @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
@@ -92,9 +94,9 @@ public class MarkQuestionController extends BaseController {
     }
 
     /**
-     * 卷结构保存
+     * 卷结构保存
      */
-    @ApiOperation(value = "提交")
+    @ApiOperation(value = "试卷结构-保存")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @OperationLogDetail(operationType = OperationTypeEnum.ADD, detail = "提交评卷结构,考试ID:{{markQuestionParams.examId}}、试卷编号:{{markQuestionParams.paperNumber}}")
     public Result save(@RequestBody MarkQuestionParams markQuestionParams) {
@@ -103,6 +105,8 @@ public class MarkQuestionController extends BaseController {
         return ResultUtil.ok(true);
     }
 
+
+
     /**
      * 客观题标答查询
      */
@@ -177,9 +181,10 @@ public class MarkQuestionController extends BaseController {
     @OperationLogDetail(operationType = OperationTypeEnum.ADD, detail = "主观题标答文件上传操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}")
     public Result uploadSubjective(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                                    @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                   @ApiParam(value = "卷型", required = true) @RequestParam String paperType,
                                    @ApiParam(value = "文件", required = true) @RequestParam MultipartFile file,
                                    @ApiParam(value = "文件md5", required = true) @RequestParam String md5) {
 
-        return ResultUtil.ok(markQuestionService.uploadSubjectiveFile(examId, paperNumber, file, md5), "");
+        return ResultUtil.ok(markQuestionService.uploadSubjectiveFile(examId, paperNumber, paperType, file, md5), "");
     }
 }

+ 153 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionSubjectiveController.java

@@ -0,0 +1,153 @@
+package com.qmth.distributed.print.api.mark;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
+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.dto.mark.manage.MarkGroupClassProgressDto;
+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;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.List;
+
+/**
+ * <p>
+ * 评卷分组表 前端控制器
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+@Api(tags = "评卷-主观题管理")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/question/subjective")
+public class MarkQuestionSubjectiveController extends BaseController {
+
+    @Resource
+    private MarkQuestionService markQuestionService;
+
+    /**
+     * 主观题评卷设置-查询
+     */
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public Result setList(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                          @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        return ResultUtil.ok(markQuestionService.listGroupTaskByExamIdAndPaperNumber(examId, paperNumber));
+    }
+
+    /**
+     * 主观题评卷设置-评卷区设置
+     */
+    @ApiOperation(value = "评卷区设置")
+    @RequestMapping(value = "/picture/config/update", method = RequestMethod.POST)
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "设置评卷区操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}")
+    public Result updatePictureConfig(@RequestBody QuestionPictureConfigParams questionPictureConfigParams) {
+        validMarkPaperForMark(questionPictureConfigParams.getExamId(), questionPictureConfigParams.getPaperNumber());
+        markQuestionService.updatePicListByQuestionId(questionPictureConfigParams);
+        return ResultUtil.ok(true);
+    }
+
+    /**
+     * 主观题评卷设置-评卷方式设置
+     */
+    @ApiOperation(value = "评卷方式设置(单双评)")
+    @RequestMapping(value = "/double/mark/update", method = RequestMethod.POST)
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "设置评卷区操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}")
+    public Result saveDoubleMark(MarkQuestion markQuestion) {
+        validMarkPaperForMark(markQuestion.getExamId(), markQuestion.getPaperNumber());
+        markQuestionService.updateDoubleMarkByQuestionId(markQuestion);
+        return ResultUtil.ok(true);
+    }
+
+
+    /**
+     * 新增
+     */
+//    @ApiOperation(value = "新增")
+//    @RequestMapping(value = "/save", method = RequestMethod.POST)
+//    @OperationLogDetail(operationType = OperationTypeEnum.ADD, detail = "新增分组操作,考试ID:{{markGroupSingleDto.examId}}、试卷编号:{{markGroupSingleDto.paperNumber}}")
+//    public Result add(@RequestBody MarkGroupSingleDto markGroupSingleDto) {
+//        validMarkPaperForMark(markGroupSingleDto.getExamId(), markGroupSingleDto.getPaperNumber());
+//        return ResultUtil.ok(markGroupService.saveGroup(markGroupSingleDto));
+//    }
+
+    /**
+     * 修改
+     */
+//    @ApiOperation(value = "修改")
+//    @RequestMapping(value = "/update", method = RequestMethod.POST)
+//    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "修改分组操作,考试ID:{{markGroupSingleDto.examId}}、试卷编号:{{markGroupSingleDto.paperNumber}}、分组号:{{markGroupSingleDto.groupInfo.groupNumber}}")
+//    public Result update(@RequestBody MarkGroupSingleDto markGroupSingleDto) {
+//        validMarkPaperForMark(markGroupSingleDto.getExamId(), markGroupSingleDto.getPaperNumber());
+//        return ResultUtil.ok(markGroupService.updateGroup(markGroupSingleDto));
+//    }
+
+    /**
+     * 删除
+     */
+//    @ApiOperation(value = "删除")
+//    @RequestMapping(value = "/delete", method = RequestMethod.POST)
+//    @OperationLogDetail(operationType = OperationTypeEnum.DELETE, detail = "删除分组操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}")
+//    public Result delete(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+//                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+//                         @ApiParam(value = "分组号", required = true) @RequestParam Integer groupNumber) {
+//        validMarkPaperForMark(examId, paperNumber);
+//        markGroupService.deleteGroupByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+//        return ResultUtil.ok(true);
+//    }
+
+
+    /**
+     * 进度列表查询
+     */
+    @ApiOperation(value = "评卷进度列表")
+    @RequestMapping(value = "/summary", method = RequestMethod.POST)
+    public Result summary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                          @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        MarkGroupSummaryProgressDto markGroupSummaryProgressDto = markQuestionService.summaryGroupProgress(examId, paperNumber);
+        return ResultUtil.ok(markGroupSummaryProgressDto);
+    }
+
+    /**
+     * 班级阅卷进度列表查询
+     */
+    @ApiOperation(value = "班级阅卷进度列表")
+    @RequestMapping(value = "/class/summary", 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,
+                               @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);
+        return ResultUtil.ok(markGroupClassProgressDtoIPage);
+    }
+
+    /**
+     * 评阅题目列表
+     */
+    @Aac(auth = false)
+    @ApiOperation(value = "评阅题目列表")
+    @RequestMapping(value = "/list/groupQuestions", method = RequestMethod.POST)
+    public Result listGroupQuestions(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                     @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        List<MarkGroupQuestionsDto> markGroupQuestionsDtoList = markQuestionService.listGroupQuestions(examId, paperNumber);
+        return ResultUtil.ok(markGroupQuestionsDtoList);
+    }
+
+}

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

@@ -43,14 +43,14 @@ public class MarkRejectController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                        @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                       @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber,
+                       @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId,
                        @ApiParam(value = "教学班") @RequestParam(required = false) String teachClassName,
                        @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
                        @ApiParam(value = "学号") @RequestParam(required = false) String studentCode,
                        @ApiParam(value = "密号") @RequestParam(required = false) String secretNumber,
                        @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkRejectHistoryDto> rejectHistoryDtoIPage = markRejectHistoryService.pageRejectHistory(examId, paperNumber, groupNumber,loginName, studentCode, secretNumber, teachClassName, pageNumber, pageSize);
+        IPage<MarkRejectHistoryDto> rejectHistoryDtoIPage = markRejectHistoryService.pageRejectHistory(examId, paperNumber, questionId, loginName, studentCode, secretNumber, teachClassName, pageNumber, pageSize);
         return ResultUtil.ok(rejectHistoryDtoIPage);
     }
 

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

@@ -46,7 +46,7 @@ public class MarkTaskController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                        @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                       @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber,
+                       @ApiParam(value = "题目ID") @RequestParam(required = false) Long questionId,
                        @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
                        @ApiParam(value = "状态") @RequestParam(required = false) MarkTaskStatus status,
                        @ApiParam(value = "学号") @RequestParam(required = false) String studentCode,
@@ -55,14 +55,14 @@ public class MarkTaskController {
                        @ApiParam(value = "小题得分") @RequestParam(required = false) Double subScore,
                        @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkTaskDto> markTaskDtoIPage = markTaskService.pageMarkTask(examId, paperNumber, groupNumber, loginName, status, studentCode, secretNumber, teachClassName, subScore, pageNumber, pageSize);
+        IPage<MarkTaskDto> markTaskDtoIPage = markTaskService.pageMarkTask(examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore, pageNumber, pageSize);
         return ResultUtil.ok(markTaskDtoIPage);
     }
 
     /**
      * 打回
      */
-    @ApiOperation(value = "评卷轨迹")
+    @ApiOperation(value = "评卷轨迹-打回")
     @RequestMapping(value = "/get_mark_track", method = RequestMethod.POST)
     public Result getMarkTrack(@ApiParam(value = "任务ID", required = true) @RequestParam Long id) {
         return ResultUtil.ok(markTaskService.getMarkTrack(id));
@@ -74,7 +74,7 @@ public class MarkTaskController {
     @ApiOperation(value = "打回")
     @RequestMapping(value = "/reject", method = RequestMethod.POST)
     public Result reject(@ApiParam(value = "任务ID", required = true) @RequestParam Long id,
-                         @ApiParam(value = "试卷编号", required = true) @RequestParam String rejectReason) {
+                         @ApiParam(value = "打回原因", required = true) @RequestParam String rejectReason) {
         markTaskService.rejectMarkTask(id, rejectReason);
         return ResultUtil.ok(true);
     }

+ 32 - 32
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserGroupController.java → distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserQuestionController.java

@@ -11,7 +11,7 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.MarkUserQuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -36,24 +36,24 @@ import java.util.List;
 @Api(tags = "评卷-评卷员")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/marker")
-public class MarkUserGroupController extends BaseController {
+public class MarkUserQuestionController extends BaseController {
 
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserQuestionService;
 
     /**
      * 评卷员管理列表查询
      */
-    @ApiOperation(value = "评卷员管理列表查询")
+    @ApiOperation(value = "评卷员管理列表")
     @RequestMapping(value = "/list", 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) Integer groupNumber,
+                               @ApiParam(value = "题目") @RequestParam(required = false) Long questionId,
                                @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
                                @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<MarkUserGroupProgressDto> markGroupClassProgressDtoIPage = markUserGroupService.pageGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber, loginName, className, pageNumber, pageSize);
+        IPage<MarkUserGroupProgressDto> markGroupClassProgressDtoIPage = markUserQuestionService.pageGroupUserByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId, loginName, className, pageNumber, pageSize);
         return ResultUtil.ok(markGroupClassProgressDtoIPage);
     }
 
@@ -64,8 +64,8 @@ public class MarkUserGroupController extends BaseController {
     @RequestMapping(value = "/list_bind_marker", method = RequestMethod.POST)
     public Result listBindMarker(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                                  @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                                 @ApiParam(value = "分组号", required = true) @RequestParam Integer groupNumber) {
-        return ResultUtil.ok(markUserGroupService.listBindMarkers(examId, paperNumber, groupNumber));
+                                 @ApiParam(value = "题目ID", required = true) @RequestParam Long questionId) {
+        return ResultUtil.ok(markUserQuestionService.listBindMarkers(examId, paperNumber, questionId));
     }
 
     /**
@@ -76,10 +76,10 @@ public class MarkUserGroupController extends BaseController {
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "绑定评卷员操作,考试ID:{{examId}}、试卷编号:{{paperNumber}}、分组号:{{groupNumber}}、评卷员ID集合:{{userIds}}")
     public Result addMarker(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                             @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                            @ApiParam(value = "分组号", required = true) @RequestParam Integer groupNumber,
+                            @ApiParam(value = "题目", required = true) @RequestParam List<Long> questionIds,
                             @ApiParam(value = "评卷员ID集合", required = true) @RequestParam List<Long> userIds) {
         validMarkPaperForMark(examId, paperNumber);
-        markUserGroupService.addMarkUserGroup(examId, paperNumber, groupNumber, userIds);
+        markUserQuestionService.addMarkUserQuestion(examId, paperNumber, questionIds, userIds);
         return ResultUtil.ok(true);
     }
 
@@ -88,14 +88,14 @@ public class MarkUserGroupController extends BaseController {
      */
     @ApiOperation(value = "重置评卷员")
     @RequestMapping(value = "/reset", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "重置评卷员操作,用户分组ID:{{markUserGroupId}}")
-    public Result resetMarker(@ApiParam(value = "用户分组ID", required = true) @RequestParam Long markUserGroupId) {
-        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupId);
-        if (markUserGroup == null) {
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "重置评卷员操作,用户分组ID:{{markUserQuestionId}}")
+    public Result resetMarker(@ApiParam(value = "用户分组ID", required = true) @RequestParam Long markUserQuestionId) {
+        MarkUserQuestion markUserQuestion = markUserQuestionService.getById(markUserQuestionId);
+        if (markUserQuestion == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
-        validMarkPaperForMark(markUserGroup.getExamId(), markUserGroup.getPaperNumber());
-        return ResultUtil.ok(markUserGroupService.resetMarker(markUserGroup));
+        validMarkPaperForMark(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
+        return ResultUtil.ok(markUserQuestionService.resetMarker(markUserQuestion));
     }
 
     /**
@@ -103,14 +103,14 @@ public class MarkUserGroupController extends BaseController {
      */
     @ApiOperation(value = "解绑评卷员")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "解绑评卷员操作,用户分组ID:{{markUserGroupId}}")
-    public Result deleteMarker(@ApiParam(value = "用户分组ID", required = true) @RequestParam Long markUserGroupId) {
-        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupId);
-        if (markUserGroup == null) {
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "解绑评卷员操作,用户分组ID:{{markUserQuestionId}}")
+    public Result deleteMarker(@ApiParam(value = "用户分组ID", required = true) @RequestParam Long markUserQuestionId) {
+        MarkUserQuestion markUserQuestion = markUserQuestionService.getById(markUserQuestionId);
+        if (markUserQuestion == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
-        validMarkPaperForMark(markUserGroup.getExamId(), markUserGroup.getPaperNumber());
-        markUserGroupService.deleteMarker(markUserGroupId);
+        validMarkPaperForMark(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
+        markUserQuestionService.deleteMarker(markUserQuestion);
         return ResultUtil.ok(true);
     }
 
@@ -119,14 +119,14 @@ public class MarkUserGroupController extends BaseController {
      */
     @ApiOperation(value = "回收正在评卷的试卷")
     @RequestMapping(value = "/release", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "回收正在评卷的试卷操作,用户分组ID集合:{{markUserGroupIds}}")
-    public Result releaseMarker(@ApiParam(value = "用户分组ID集合", required = true) @RequestParam List<Long> markUserGroupIds) {
-        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupIds.get(0));
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "回收正在评卷的试卷操作,用户分组ID集合:{{markUserQuestionIds}}")
+    public Result releaseMarker(@ApiParam(value = "用户分组ID集合", required = true) @RequestParam List<Long> markUserQuestionIds) {
+        MarkUserQuestion markUserGroup = markUserQuestionService.getById(markUserQuestionIds.get(0));
         if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
         validMarkPaperForMark(markUserGroup.getExamId(), markUserGroup.getPaperNumber());
-        markUserGroupService.releaseMarker(markUserGroupIds);
+        markUserQuestionService.releaseMarker(markUserQuestionIds);
         return ResultUtil.ok(true);
     }
 
@@ -135,15 +135,15 @@ public class MarkUserGroupController extends BaseController {
      */
     @ApiOperation(value = "设置评卷任务")
     @RequestMapping(value = "/setTaskCount", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "设置评卷任务操作,用户分组ID集合:{{markUserGroupIds}}、评卷任务数:{{topCount}}")
-    public Result setTaskCount(@ApiParam(value = "用户分组ID集合", required = true) @RequestParam List<Long> markUserGroupIds,
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "设置评卷任务操作,用户分组ID集合:{{markUserQuestionIds}}、评卷任务数:{{topCount}}")
+    public Result setTaskCount(@ApiParam(value = "用户分组ID集合", required = true) @RequestParam List<Long> markUserQuestionIds,
                                @ApiParam(value = "评卷任务数", required = true) @RequestParam Integer topCount) {
-        MarkUserQuestion markUserGroup = markUserGroupService.getById(markUserGroupIds.get(0));
-        if (markUserGroup == null) {
+        MarkUserQuestion markUserQuestion = markUserQuestionService.getById(markUserQuestionIds.get(0));
+        if (markUserQuestion == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
         }
-        validMarkPaperForMark(markUserGroup.getExamId(), markUserGroup.getPaperNumber());
-        markUserGroupService.setTopCount(markUserGroupIds, topCount);
+        validMarkPaperForMark(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
+        markUserQuestionService.setTopCount(markUserQuestionIds, topCount);
         return ResultUtil.ok(true);
     }
 

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/mark/MarkConfigItem.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/MarkConfigItem.java

@@ -1,4 +1,4 @@
-package com.qmth.teachcloud.mark.bean.mark;
+package com.qmth.teachcloud.common.bean.marking;
 
 import org.apache.commons.lang3.StringUtils;
 

+ 6 - 6
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/group/GroupPictureConfigParams.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/group/QuestionPictureConfigParams.java

@@ -8,12 +8,12 @@ import java.util.List;
 /**
  * 评卷区设置请求参数
  */
-public class GroupPictureConfigParams implements Serializable {
+public class QuestionPictureConfigParams implements Serializable {
 
     private Long examId;
 
     private String paperNumber;
-    private Integer groupNumber;
+    private Long questionId;
 
     private List<PictureConfig> pictureConfigs;
 
@@ -33,12 +33,12 @@ public class GroupPictureConfigParams implements Serializable {
         this.paperNumber = paperNumber;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
     public List<PictureConfig> getPictureConfigs() {

+ 14 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkPaperSettingConfig.java

@@ -12,7 +12,8 @@ public class MarkPaperSettingConfig {
     private Double excellentScore;
     private Boolean showObjectScore;
     private Boolean autoScroll;
-    private Boolean openDoubleMarking;
+    private Boolean doubleMark;
+    private Boolean mergeMarker;
 
     public MarkMode getMarkMode() {
         return markMode;
@@ -70,11 +71,19 @@ public class MarkPaperSettingConfig {
         this.autoScroll = autoScroll;
     }
 
-    public Boolean getOpenDoubleMarking() {
-        return openDoubleMarking;
+    public Boolean getDoubleMark() {
+        return doubleMark;
     }
 
-    public void setOpenDoubleMarking(Boolean openDoubleMarking) {
-        this.openDoubleMarking = openDoubleMarking;
+    public void setDoubleMark(Boolean doubleMark) {
+        this.doubleMark = doubleMark;
+    }
+
+    public Boolean getMergeMarker() {
+        return mergeMarker;
+    }
+
+    public void setMergeMarker(Boolean mergeMarker) {
+        this.mergeMarker = mergeMarker;
     }
 }

+ 73 - 31
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java

@@ -1,21 +1,23 @@
 package com.qmth.teachcloud.common.entity;
 
-import java.io.Serializable;
-import java.util.Objects;
-
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
+import com.qmth.teachcloud.common.bean.marking.MarkConfigItem;
 import com.qmth.teachcloud.common.enums.ObjectivePolicy;
-
 import com.qmth.teachcloud.common.enums.ScorePolicy;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
 /**
  * <p>
  * 小题信息表
@@ -42,10 +44,6 @@ public class MarkQuestion extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "是否客观题")
     private Boolean objective;
 
-    @ApiModelProperty(value = "分组序号")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "大题号")
     private Integer mainNumber;
 
@@ -111,6 +109,15 @@ public class MarkQuestion extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "剩余数量")
     private Integer leftCount;
 
+    @TableField(exist = false)
+    private double markScore;
+
+    @TableField(exist = false)
+    private List<MarkUser> markers;
+
+    @TableField(exist = false)
+    private List<PictureConfig> pictureConfigs;
+
     public Long getExamId() {
         return examId;
     }
@@ -142,13 +149,6 @@ public class MarkQuestion extends BaseEntity implements Serializable {
         this.objective = objective;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
     public Integer getMainNumber() {
         return mainNumber;
     }
@@ -223,7 +223,7 @@ public class MarkQuestion extends BaseEntity implements Serializable {
     }
 
     public String getQuestionNumber() {
-        return getMainNumber() + "." + getSubNumber();
+        return getMainNumber() + "-" + getSubNumber();
     }
     public Integer getPaperIndex() {
 		return paperIndex;
@@ -297,23 +297,65 @@ public class MarkQuestion extends BaseEntity implements Serializable {
         this.leftCount = leftCount;
     }
 
+    public List<MarkConfigItem> getPictureConfigList() {
+        return MarkConfigItem.parse(this.picList);
+    }
+
+    public double getMarkScore() {
+        return markScore;
+    }
+
+    public void setMarkScore(double markScore) {
+        this.markScore = markScore;
+    }
+
+
+    public List<MarkUser> getMarkers() {
+        return markers;
+    }
+
+    public void setMarkers(List<MarkUser> markers) {
+        this.markers = markers;
+    }
+
+    public List<PictureConfig> getPictureConfigs() {
+        return pictureConfigs;
+    }
+
+    public void setPictureConfigs(List<PictureConfig> pictureConfigs) {
+        this.pictureConfigs = pictureConfigs;
+    }
+
     @Override
     public String toString() {
         return "MarkQuestion{" +
-            ", examId=" + examId +
-            ", paperNumber=" + paperNumber +
-            ", objective=" + objective +
-            ", groupNumber=" + groupNumber +
-            ", mainNumber=" + mainNumber +
-            ", subNumber=" + subNumber +
-            ", mainTitle=" + mainTitle +
-//            ", answer=" + answer +
-            ", totalScore=" + totalScore +
-            ", intervalScore=" + intervalScore +
-//            ", objectivePolicy=" + objectivePolicy +
-            ", questionType=" + questionType +
-            ", name=" + name +
-        "}";
+                "examId=" + examId +
+                ", paperNumber='" + paperNumber + '\'' +
+                ", paperType='" + paperType + '\'' +
+                ", objective=" + objective +
+                ", mainNumber=" + mainNumber +
+                ", subNumber=" + subNumber +
+                ", mainTitle='" + mainTitle + '\'' +
+                ", optionCount=" + optionCount +
+                ", totalScore=" + totalScore +
+                ", intervalScore=" + intervalScore +
+                ", answer='" + answer + '\'' +
+                ", objectivePolicy=" + objectivePolicy +
+                ", objectivePolicyScore=" + objectivePolicyScore +
+                ", questionType=" + questionType +
+                ", paperIndex=" + paperIndex +
+                ", pageIndex=" + pageIndex +
+                ", name='" + name + '\'' +
+                ", picList='" + picList + '\'' +
+                ", doubleRate=" + doubleRate +
+                ", arbitrateThreshold=" + arbitrateThreshold +
+                ", scorePolicy=" + scorePolicy +
+                ", taskCount=" + taskCount +
+                ", markedCount=" + markedCount +
+                ", leftCount=" + leftCount +
+                ", markScore=" + markScore +
+                ", markers=" + markers +
+                '}';
     }
 
     public Double getObjectivePolicyScore() {

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

@@ -1,11 +1,14 @@
 package com.qmth.teachcloud.mark.dto.mark;
 
-import java.io.Serializable;
-
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
+import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
+import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
+import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 
+import java.io.Serializable;
+
 public class SpecialTagDTO implements Serializable {
 
     private static final long serialVersionUID = -5424015292124065736L;
@@ -66,7 +69,7 @@ public class SpecialTagDTO implements Serializable {
         MarkHeaderTag markSpecialTag = new MarkHeaderTag();
         markSpecialTag.setId(SystemConstant.getDbUuid());
         markSpecialTag.setStudentId(arbitrateHistory.getStudentId());
-        markSpecialTag.setGroupNumber(arbitrateHistory.getGroupNumber());
+//        markSpecialTag.setGroupNumber(arbitrateHistory.getGroupNumber());
         markSpecialTag.setUserId(arbitrateHistory.getUpdateUserId());
         markSpecialTag.setTagName(tagName);
         markSpecialTag.setTagType(tagType);
@@ -82,7 +85,7 @@ public class SpecialTagDTO implements Serializable {
         MarkHeaderTag markSpecialTag = new MarkHeaderTag();
         markSpecialTag.setId(SystemConstant.getDbUuid());
         markSpecialTag.setStudentId(markResult.getStudentId());
-        markSpecialTag.setGroupNumber(markResult.getGroupNumber());
+//        markSpecialTag.setGroupNumber(markResult.getGroupNumber());
         markSpecialTag.setUserId(userId);
         markSpecialTag.setTagName(tagName);
         markSpecialTag.setTagType(tagType);

+ 36 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SubjectiveAnswerFileDto.java

@@ -0,0 +1,36 @@
+package com.qmth.teachcloud.mark.dto.mark;
+
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
+
+public class SubjectiveAnswerFileDto {
+
+    private String paperType;
+
+    private String url;
+
+    private FilePathVo filePathVo;
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public FilePathVo getFilePathVo() {
+        return filePathVo;
+    }
+
+    public void setFilePathVo(FilePathVo filePathVo) {
+        this.filePathVo = filePathVo;
+    }
+}

+ 10 - 10
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/entrance/MarkEntranceDto.java

@@ -12,12 +12,12 @@ public class MarkEntranceDto {
     private Long examId;
     private String examName;
     private String semesterName;
-    private Integer groupNumber;
+    private Long questionId;
     private String courseCode;
     private String courseName;
     private String openCollege;
     private String paperNumber;
-    private String groupQuestions;
+    private String questionNumber;
     private String className;
     private Integer taskCount;
     private Integer markedCount;
@@ -51,12 +51,12 @@ public class MarkEntranceDto {
         this.semesterName = semesterName;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
     public String getCourseCode() {
@@ -91,12 +91,12 @@ public class MarkEntranceDto {
         this.paperNumber = paperNumber;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 
     public String getClassName() {

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

@@ -10,8 +10,8 @@ public class MarkGroupClassProgressDto {
     private Integer currentCount;
     private String percent;
     private Integer arbitrateCount;
-    private Integer groupNumber;
-    private String groupQuestions;
+    private Long questionId;
+    private String questionNumber;
 
     public String getClassName() {
         return className;
@@ -77,19 +77,19 @@ public class MarkGroupClassProgressDto {
         this.arbitrateCount = arbitrateCount;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 }

+ 15 - 15
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkGroupProgressDto.java

@@ -2,8 +2,8 @@ package com.qmth.teachcloud.mark.dto.mark.manage;
 
 public class MarkGroupProgressDto {
 
-    private Integer groupNumber;
-    private String scoreList;
+    private Long questionId;
+    private Double totalScore;
     private Integer markerCount;
     private Integer taskCount;
     private Integer markedCount;
@@ -11,22 +11,22 @@ public class MarkGroupProgressDto {
     private Integer currentCount;
     private String percent;
     private Integer arbitrateCount;
-    private String groupQuestions;
+    private String questionNumber;
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public String getScoreList() {
-        return scoreList;
+    public Double getTotalScore() {
+        return totalScore;
     }
 
-    public void setScoreList(String scoreList) {
-        this.scoreList = scoreList;
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
     }
 
     public Integer getMarkerCount() {
@@ -85,11 +85,11 @@ public class MarkGroupProgressDto {
         this.arbitrateCount = arbitrateCount;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 }

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

@@ -2,22 +2,22 @@ package com.qmth.teachcloud.mark.dto.mark.manage;
 
 public class MarkGroupQuestionsDto {
 
-    private Integer groupNumber;
-    private String groupQuestions;
+    private Long questionId;
+    private String questionNumber;
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 }

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

@@ -4,17 +4,17 @@ import java.util.List;
 
 public class MarkGroupSummaryProgressDto {
 
-    private Boolean openMarkClass;
+    private Boolean classMark;
     private MarkGroupTotalProgressDto totalInfo;
     private List<MarkGroupClassProgressDto> classInfo;
     private List<MarkGroupProgressDto> groupInfo;
 
-    public Boolean getOpenMarkClass() {
-        return openMarkClass;
+    public Boolean getClassMark() {
+        return classMark;
     }
 
-    public void setOpenMarkClass(Boolean openMarkClass) {
-        this.openMarkClass = openMarkClass;
+    public void setClassMark(Boolean classMark) {
+        this.classMark = classMark;
     }
 
     public MarkGroupTotalProgressDto getTotalInfo() {

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

@@ -10,8 +10,8 @@ public class MarkQualityDto {
     private String loginName;
     private String name;
     private String orgName;
-    private Integer groupNumber;
-    private String groupQuestions;
+    private Long questionId;
+    private String questionNumber;
     private Integer finishCount;
     private Integer validCount;
     private Integer headerFinishCount;
@@ -53,20 +53,20 @@ public class MarkQualityDto {
         this.orgName = orgName;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 
     public Integer getFinishCount() {

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkRejectHistoryDto.java

@@ -12,7 +12,7 @@ public class MarkRejectHistoryDto extends MarkRejectHistory {
     private String rejectLoginName;
     private String rejectUserName;
     private String orgName;
-    private String groupQuestions;
+    private String questionNumber;
 
     public String getStudentName() {
         return studentName;
@@ -62,12 +62,12 @@ public class MarkRejectHistoryDto extends MarkRejectHistory {
         this.orgName = orgName;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 
     public String getRejectLoginName() {

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkStepDTO.java

@@ -8,7 +8,7 @@ public class MarkStepDTO implements Serializable {
 
     private static final long serialVersionUID = 3542801746602688750L;
 
-    private int groupNumber;
+    private Long questionId;
 
     private int mainNumber;
 
@@ -101,12 +101,12 @@ public class MarkStepDTO implements Serializable {
         this.trackList.add(track);
     }
 
-    public int getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(int groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
     public Double getScore() {

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkTaskDto.java

@@ -13,7 +13,7 @@ public class MarkTaskDto extends MarkTask {
     private String rejectUserName;
     private String orgName;
     private String statusDisplay;
-    private String groupQuestions;
+    private String questionNumber;
 
     public String getStudentName() {
         return studentName;
@@ -87,11 +87,11 @@ public class MarkTaskDto extends MarkTask {
         this.statusDisplay = statusDisplay;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 }

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

@@ -12,8 +12,8 @@ public class MarkUserGroupProgressDto {
     private String loginName;
     private String name;
     private String orgName;
-    private Integer groupNumber;
-    private String groupQuestions;
+    private Long questionId;
+    private String questionNumber;
     private Integer taskCount;
     private Integer topCount;
     private Integer markedCount;
@@ -61,20 +61,20 @@ public class MarkUserGroupProgressDto {
         this.orgName = orgName;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public String getGroupQuestions() {
-        return groupQuestions;
+    public String getQuestionNumber() {
+        return questionNumber;
     }
 
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
     }
 
     public Integer getTaskCount() {

+ 11 - 11
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerInfoDto.java

@@ -15,11 +15,11 @@ public class MarkerInfoDto {
     @ExcelProperty(name = "试卷编号", width = 20, index = 3)
     private String paperNumber;
 
-    @ExcelProperty(name = "分组序号", width = 20, index = 4)
-    private Integer groupNumber;
+    @ExcelProperty(name = "题目ID", width = 20, index = 4)
+    private Long questionId;
 
     @ExcelProperty(name = "大题名称", width = 20, index = 5)
-    private String groupName;
+    private String questionName;
 
     @ExcelProperty(name = "分组总分", width = 20, index = 6)
     private Double totalScore;
@@ -69,20 +69,20 @@ public class MarkerInfoDto {
         this.paperNumber = paperNumber;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public String getGroupName() {
-        return groupName;
+    public String getQuestionName() {
+        return questionName;
     }
 
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
+    public void setQuestionName(String questionName) {
+        this.questionName = questionName;
     }
 
     public Double getTotalScore() {

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

@@ -14,11 +14,12 @@ public class MarkerSpecialTagDTO extends SpecialTagDTO {
     private Long markerId;
 
     private int groupNumber;
+    private Long questionId;
 
-    public MarkerSpecialTagDTO(Long markerId, int groupNumber, MarkSpecialTag specialTag) {
+    public MarkerSpecialTagDTO(Long markerId, Long questionId, MarkSpecialTag specialTag) {
         super(specialTag);
         this.markerId = markerId;
-        this.groupNumber = groupNumber;
+        this.questionId = questionId;
     }
 
     public MarkerSpecialTagDTO(Long markerId, int groupNumber, MarkHeaderTag headerTag) {
@@ -43,4 +44,11 @@ public class MarkerSpecialTagDTO extends SpecialTagDTO {
         this.groupNumber = groupNumber;
     }
 
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
 }

+ 6 - 7
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java

@@ -2,7 +2,7 @@ package com.qmth.teachcloud.mark.dto.mark.manage;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.teachcloud.mark.bean.mark.MarkConfigItem;
+import com.qmth.teachcloud.common.bean.marking.MarkConfigItem;
 import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 
 import java.io.Serializable;
@@ -47,7 +47,7 @@ public class Task implements Serializable {
 
     private String paperNumber;
     private String paperType;
-    private Integer groupNumber;
+    private Long questionId;
 
     /**
      * 题卡图片拼接配置
@@ -353,12 +353,11 @@ public class Task implements Serializable {
         this.paperType = paperType;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
-
 }

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

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

+ 11 - 7
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkSettingDto.java

@@ -6,10 +6,12 @@ import com.qmth.teachcloud.common.enums.EnumResult;
 import com.qmth.teachcloud.common.enums.mark.MarkMode;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.mark.enums.ExamType;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 
 public class MarkSettingDto {
 	private ExamType examType;
 	private MarkMode mode;
+	private QuestionModel questionModel;
 	private Boolean forceMode;
 	private Boolean sheetView;
 	private String sheetConfig;
@@ -21,7 +23,6 @@ public class MarkSettingDto {
 	private String uiSetting;
 	private MarkPaperStatus statusValue;
 	private List<EnumResult> problemTypes;
-	private Integer groupNumber;
 	private Integer topCount;
 	private Double[] splitConfig;
 	private Integer prefetchCount;
@@ -42,6 +43,15 @@ public class MarkSettingDto {
 	public void setExamType(ExamType examType) {
 		this.examType = examType;
 	}
+
+	public QuestionModel getQuestionModel() {
+		return questionModel;
+	}
+
+	public void setQuestionModel(QuestionModel questionModel) {
+		this.questionModel = questionModel;
+	}
+
 	public MarkMode getMode() {
 		return mode;
 	}
@@ -114,12 +124,6 @@ public class MarkSettingDto {
 	public void setProblemTypes(List<EnumResult> problemTypes) {
 		this.problemTypes = problemTypes;
 	}
-	public Integer getGroupNumber() {
-		return groupNumber;
-	}
-	public void setGroupNumber(Integer groupNumber) {
-		this.groupNumber = groupNumber;
-	}
 	public Integer getTopCount() {
 		return topCount;
 	}

+ 0 - 93
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupDto.java

@@ -1,93 +0,0 @@
-package com.qmth.teachcloud.mark.dto.mark.setting;
-
-import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
-import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
-import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.common.enums.ScorePolicy;
-
-import java.util.List;
-
-public class MarkGroupDto {
-
-    private Boolean doubleEnable;
-    private Integer groupNumber;
-    private Double doubleRate;
-    private Double arbitrateThreshold;
-    private ScorePolicy scorePolicy;
-    private List<MarkUser> markers;
-    private List<PictureConfig> pictureConfigs;
-    private List<MarkQuestion> questions;
-    private String groupQuestions;
-
-    public Boolean getDoubleEnable() {
-        return doubleEnable;
-    }
-
-    public void setDoubleEnable(Boolean doubleEnable) {
-        this.doubleEnable = doubleEnable;
-    }
-
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
-    public Double getDoubleRate() {
-        return doubleRate;
-    }
-
-    public void setDoubleRate(Double doubleRate) {
-        this.doubleRate = doubleRate;
-    }
-
-    public Double getArbitrateThreshold() {
-        return arbitrateThreshold;
-    }
-
-    public void setArbitrateThreshold(Double arbitrateThreshold) {
-        this.arbitrateThreshold = arbitrateThreshold;
-    }
-
-    public ScorePolicy getScorePolicy() {
-        return scorePolicy;
-    }
-
-    public void setScorePolicy(ScorePolicy scorePolicy) {
-        this.scorePolicy = scorePolicy;
-    }
-
-    public List<MarkUser> getMarkers() {
-        return markers;
-    }
-
-    public void setMarkers(List<MarkUser> markers) {
-        this.markers = markers;
-    }
-
-    public List<PictureConfig> getPictureConfigs() {
-        return pictureConfigs;
-    }
-
-    public void setPictureConfigs(List<PictureConfig> pictureConfigs) {
-        this.pictureConfigs = pictureConfigs;
-    }
-
-    public List<MarkQuestion> getQuestions() {
-        return questions;
-    }
-
-    public void setQuestions(List<MarkQuestion> questions) {
-        this.questions = questions;
-    }
-
-    public String getGroupQuestions() {
-        return groupQuestions;
-    }
-
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
-    }
-}

+ 0 - 36
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupSingleDto.java

@@ -1,36 +0,0 @@
-package com.qmth.teachcloud.mark.dto.mark.setting;
-
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-
-public class MarkGroupSingleDto {
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long examId;
-    private String paperNumber;
-    private MarkGroupDto groupInfo;
-
-    public Long getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Long examId) {
-        this.examId = examId;
-    }
-
-    public String getPaperNumber() {
-        return paperNumber;
-    }
-
-    public void setPaperNumber(String paperNumber) {
-        this.paperNumber = paperNumber;
-    }
-
-    public MarkGroupDto getGroupInfo() {
-        return groupInfo;
-    }
-
-    public void setGroupInfo(MarkGroupDto groupInfo) {
-        this.groupInfo = groupInfo;
-    }
-}

+ 28 - 15
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkGroupTaskDto.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.mark.dto.mark.setting;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 
 import java.util.List;
 
@@ -10,9 +11,13 @@ public class MarkGroupTaskDto {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
     private String paperNumber;
-    private List<MarkGroupDto> groups;
-    private Boolean openMarkClass;
-    private Boolean openDoubleMarking;
+    private List<MarkQuestion> questions;
+    // 是否开启分班阅(开关)
+    private Boolean classMark;
+    // 是否开启双评(开关)
+    private Boolean doubleMark;
+    // 是否开启填空题整体设置评卷员(开关)
+    private Boolean mergeMarker;
 
     public Long getExamId() {
         return examId;
@@ -30,27 +35,35 @@ public class MarkGroupTaskDto {
         this.paperNumber = paperNumber;
     }
 
-    public List<MarkGroupDto> getGroups() {
-        return groups;
+    public List<MarkQuestion> getQuestions() {
+        return questions;
     }
 
-    public void setGroups(List<MarkGroupDto> groups) {
-        this.groups = groups;
+    public void setQuestions(List<MarkQuestion> questions) {
+        this.questions = questions;
     }
 
-    public Boolean getOpenMarkClass() {
-        return openMarkClass;
+    public Boolean getMergeMarker() {
+        return mergeMarker;
     }
 
-    public void setOpenMarkClass(Boolean openMarkClass) {
-        this.openMarkClass = openMarkClass;
+    public void setMergeMarker(Boolean mergeMarker) {
+        this.mergeMarker = mergeMarker;
     }
 
-    public Boolean getOpenDoubleMarking() {
-        return openDoubleMarking;
+    public Boolean getClassMark() {
+        return classMark;
     }
 
-    public void setOpenDoubleMarking(Boolean openDoubleMarking) {
-        this.openDoubleMarking = openDoubleMarking;
+    public void setClassMark(Boolean classMark) {
+        this.classMark = classMark;
+    }
+
+    public Boolean getDoubleMark() {
+        return doubleMark;
+    }
+
+    public void setDoubleMark(Boolean doubleMark) {
+        this.doubleMark = doubleMark;
     }
 }

+ 1 - 12
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArbitrateHistory.java

@@ -40,9 +40,6 @@ public class MarkArbitrateHistory implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
-    @ApiModelProperty(value = "大题号")
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "题目ID")
     private Long questionId;
 
@@ -99,14 +96,6 @@ public class MarkArbitrateHistory implements Serializable {
         this.paperNumber = paperNumber;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
     public Long getQuestionId() {
         return questionId;
     }
@@ -217,7 +206,7 @@ public class MarkArbitrateHistory implements Serializable {
                 "id=" + id +
                 ", examId=" + examId +
                 ", paperNumber=" + paperNumber +
-                ", groupNumber=" + groupNumber +
+                ", questionId=" + questionId +
                 ", studentCode=" + studentCode +
                 ", secretNumber=" + secretNumber +
                 ", studentId=" + studentId +

+ 0 - 346
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java

@@ -1,346 +0,0 @@
-package com.qmth.teachcloud.mark.entity;
-
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
-import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.mark.bean.mark.MarkConfigItem;
-import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
-import com.qmth.teachcloud.common.enums.ScorePolicy;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.Serializable;
-import java.text.DecimalFormat;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * <p>
- * 评卷分组表
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@TableName("mark_group")
-@ApiModel(value = "MarkGroup对象", description = "评卷分组表")
-public class MarkGroup implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "考试ID")
-    @MppMultiId(value = "exam_id")
-    private Long examId;
-
-    @ApiModelProperty(value = "课程ID")
-    @JsonSerialize(using = ToStringSerializer.class)
-    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
-    private Long courseId;
-
-    @ApiModelProperty(value = "课程代码")
-    private String courseCode;
-
-    @ApiModelProperty(value = "课程名称")
-    private String courseName;
-
-    @ApiModelProperty(value = "试卷编号")
-    @MppMultiId(value = "paper_number")
-    private String paperNumber;
-
-    @ApiModelProperty(value = "序号")
-    @MppMultiId(value = "number")
-    private Integer number;
-
-    @ApiModelProperty(value = "小图配置")
-    private String picList;
-
-    @ApiModelProperty(value = "满分")
-    private Double totalScore;
-
-
-    @ApiModelProperty(value = "是否开启双评")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private Boolean doubleEnable;
-
-    @ApiModelProperty(value = "双评比例")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private Double doubleRate;
-
-    @ApiModelProperty(value = "仲裁阈值")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private Double arbitrateThreshold;
-
-    @ApiModelProperty(value = "合分策略")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private ScorePolicy scorePolicy;
-
-    @ApiModelProperty(value = "任务总量")
-    private Integer taskCount;
-
-    @ApiModelProperty(value = "已评数量")
-    private Integer markedCount;
-
-    @ApiModelProperty(value = "剩余数量")
-    private Integer leftCount;
-
-    /**
-     * 大题号集合(逗号分隔)
-     */
-    @TableField(exist = false)
-    private String mainNumber;
-    /**
-     * 大题名称集合(逗号分隔)
-     */
-    @TableField(exist = false)
-    private String title;
-    /**
-     * 大题名称+小题号集合(逗号分隔)
-     */
-    @TableField(exist = false)
-    private String questionTitle;
-    /**
-     * 大题号+小题号集合(逗号分隔)
-     */
-    @TableField(exist = false)
-    private String groupQuestions;
-    /**
-     * 主观题小题满分集合(逗号分隔)
-     */
-    @TableField(exist = false)
-    private String scoreList;
-
-    @TableField(exist = false)
-    private double markScore;
-
-    @TableField(exist = false)
-    private List<ScoreItem> markScoreDetail;
-
-    public Long getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Long examId) {
-        this.examId = examId;
-    }
-
-    public Long getCourseId() {
-        return courseId;
-    }
-
-    public void setCourseId(Long courseId) {
-        this.courseId = courseId;
-    }
-
-    public String getCourseCode() {
-        return courseCode;
-    }
-
-    public void setCourseCode(String courseCode) {
-        this.courseCode = courseCode;
-    }
-
-    public String getCourseName() {
-        return courseName;
-    }
-
-    public void setCourseName(String courseName) {
-        this.courseName = courseName;
-    }
-
-    public String getPaperNumber() {
-        return paperNumber;
-    }
-
-    public void setPaperNumber(String paperNumber) {
-        this.paperNumber = paperNumber;
-    }
-
-    public Integer getNumber() {
-        return number;
-    }
-
-    public void setNumber(Integer number) {
-        this.number = number;
-    }
-
-    public String getPicList() {
-        return picList;
-    }
-
-    public void setPicList(String picList) {
-        this.picList = picList;
-    }
-
-    public Double getTotalScore() {
-        return totalScore;
-    }
-
-    public void setTotalScore(Double totalScore) {
-        this.totalScore = totalScore;
-    }
-
-    public Boolean getDoubleEnable() {
-        return doubleEnable;
-    }
-
-    public void setDoubleEnable(Boolean doubleEnable) {
-        this.doubleEnable = doubleEnable;
-    }
-
-    public Double getDoubleRate() {
-        return doubleRate;
-    }
-
-    public void setDoubleRate(Double doubleRate) {
-        this.doubleRate = doubleRate;
-    }
-
-    public Double getArbitrateThreshold() {
-        return arbitrateThreshold;
-    }
-
-    public void setArbitrateThreshold(Double arbitrateThreshold) {
-        this.arbitrateThreshold = arbitrateThreshold;
-    }
-
-    public ScorePolicy getScorePolicy() {
-        return scorePolicy;
-    }
-
-    public void setScorePolicy(ScorePolicy scorePolicy) {
-        this.scorePolicy = scorePolicy;
-    }
-
-    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 Integer getLeftCount() {
-        return leftCount;
-    }
-
-    public void setLeftCount(Integer leftCount) {
-        this.leftCount = leftCount;
-    }
-
-    public String getMainNumber() {
-        return mainNumber;
-    }
-
-    public void setMainNumber(String mainNumber) {
-        this.mainNumber = mainNumber;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getQuestionTitle() {
-        return questionTitle;
-    }
-
-    public void setQuestionTitle(String questionTitle) {
-        this.questionTitle = questionTitle;
-    }
-
-    public String getGroupQuestions() {
-        return groupQuestions;
-    }
-
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
-    }
-
-    public String getScoreList() {
-        return scoreList;
-    }
-
-    public void setScoreList(String scoreList) {
-        this.scoreList = scoreList;
-    }
-
-    public double getMarkScore() {
-        return markScore;
-    }
-
-    public void setMarkScore(double markScore) {
-        this.markScore = markScore;
-    }
-
-    public List<ScoreItem> getMarkScoreDetail() {
-        return markScoreDetail;
-    }
-
-    public void setMarkScoreDetail(List<ScoreItem> markScoreDetail) {
-        this.markScoreDetail = markScoreDetail;
-    }
-
-    public void setQuestionList(List<MarkQuestion> questionList) {
-        DecimalFormat format = new DecimalFormat("####.##");
-        Set<Integer> mainNumbers = new LinkedHashSet<>();
-        Set<String> mainTitles = new LinkedHashSet<>();
-        Set<String> questionTitles = new LinkedHashSet<>();
-        Set<String> groupQuestions = new LinkedHashSet<>();
-        StringBuilder score = new StringBuilder();
-        for (MarkQuestion question : questionList) {
-            if (score.length() > 0) {
-                score.append(",");
-            }
-            score.append(format.format(question.getTotalScore()));
-            mainNumbers.add(question.getMainNumber());
-            mainTitles.add(question.getMainTitle());
-            questionTitles.add(question.getMainTitle() + '-' + question.getSubNumber());
-            groupQuestions.add(String.valueOf(question.getMainNumber()) + '-' + question.getSubNumber());
-        }
-        this.mainNumber = StringUtils.join(mainNumbers, ",");
-        this.title = StringUtils.join(mainTitles, ",");
-        this.questionTitle = StringUtils.join(questionTitles, ",");
-        this.groupQuestions = StringUtils.join(groupQuestions, ",");
-        this.scoreList = score.toString();
-    }
-
-    public List<MarkConfigItem> getPictureConfigList() {
-        return MarkConfigItem.parse(this.picList);
-    }
-
-    @Override
-    public String toString() {
-        return "MarkGroup{" +
-                "examId=" + examId +
-                ", courseCode=" + courseCode +
-                ", paperNumber=" + paperNumber +
-                ", number=" + number +
-                ", picList=" + picList +
-                ", totalScore=" + totalScore +
-                ", doubleRate=" + doubleRate +
-                ", arbitrateThreshold=" + arbitrateThreshold +
-                ", scorePolicy=" + scorePolicy +
-                ", taskCount=" + taskCount +
-                ", markedCount=" + markedCount +
-                ", leftCount=" + leftCount +
-                "}";
-    }
-}

+ 0 - 93
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroupStudent.java

@@ -1,93 +0,0 @@
-package com.qmth.teachcloud.mark.entity;
-
-import java.io.Serializable;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
-import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-/**
- * <p>
- * 考生分组状态表
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@TableName("mark_group_student")
-@ApiModel(value="MarkGroupStudent对象", description="考生分组状态表")
-public class MarkGroupStudent implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    @MppMultiId(value = "student_id")
-    @ApiModelProperty(value = "考生ID")
-    private Long studentId;
-
-    @MppMultiId(value = "group_number")
-    @ApiModelProperty(value = "分组ID")
-    private Integer groupNumber;
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "考试ID")
-    private Long examId;
-
-    @ApiModelProperty(value = "科目代码")
-    private String paperNumber;
-
-    @ApiModelProperty(value = "状态")
-    private SubjectiveStatus status;
-
-    public Long getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Long studentId) {
-        this.studentId = studentId;
-    }
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-    public Long getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Long examId) {
-        this.examId = examId;
-    }
-    public String getPaperNumber() {
-        return paperNumber;
-    }
-
-    public void setPaperNumber(String paperNumber) {
-        this.paperNumber = paperNumber;
-    }
-    public SubjectiveStatus getStatus() {
-        return status;
-    }
-
-    public void setStatus(SubjectiveStatus status) {
-        this.status = status;
-    }
-
-    @Override
-    public String toString() {
-        return "MarkGroupStudent{" +
-            "studentId=" + studentId +
-            ", groupNumber=" + groupNumber +
-            ", examId=" + examId +
-            ", paperNumber=" + paperNumber +
-            ", status=" + status +
-        "}";
-    }
-}

+ 7 - 7
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java

@@ -122,7 +122,7 @@ public class MarkPaper implements Serializable {
     private Boolean groupStatus;
 
     @ApiModelProperty(value = "是否开启分班阅")
-    private Boolean openMarkClass;
+    private Boolean classMark;
 
     @ApiModelProperty(value = "是否开启双评")
     private Boolean doubleMark;
@@ -164,7 +164,7 @@ public class MarkPaper implements Serializable {
         this.absentCount = 0;
         this.questionStatus = false;
         this.groupStatus = false;
-        this.openMarkClass = false;
+        this.classMark = false;
         this.doubleMark = false;
         this.mergeMarker = true;
         this.status = MarkPaperStatus.FORMAL;
@@ -416,12 +416,12 @@ public class MarkPaper implements Serializable {
         this.groupStatus = groupStatus;
     }
 
-    public Boolean getOpenMarkClass() {
-        return openMarkClass;
+    public Boolean getClassMark() {
+        return classMark;
     }
 
-    public void setOpenMarkClass(Boolean openMarkClass) {
-        this.openMarkClass = openMarkClass;
+    public void setClassMark(Boolean classMark) {
+        this.classMark = classMark;
     }
 
     public Boolean getDoubleMark() {
@@ -508,7 +508,7 @@ public class MarkPaper implements Serializable {
                 ", showObjectScore=" + showObjectScore +
                 ", questionStatus=" + questionStatus +
                 ", groupStatus=" + groupStatus +
-                ", openMarkClass=" + openMarkClass +
+                ", classMark=" + classMark +
                 ", status=" + status +
                 "}";
     }

+ 1 - 11
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkProblemHistory.java

@@ -38,9 +38,6 @@ public class MarkProblemHistory implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
-    @ApiModelProperty(value = "大题号")
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "题目ID")
     private Long questionId;
 
@@ -105,13 +102,6 @@ public class MarkProblemHistory implements Serializable {
     public void setPaperNumber(String paperNumber) {
         this.paperNumber = paperNumber;
     }
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
 
     public Long getQuestionId() {
         return questionId;
@@ -212,7 +202,7 @@ public class MarkProblemHistory implements Serializable {
             "id=" + id +
             ", examId=" + examId +
             ", paperNumber=" + paperNumber +
-            ", groupNumber=" + groupNumber +
+            ", questionId=" + questionId +
             ", studentCode=" + studentCode +
             ", secretNumber=" + secretNumber +
             ", type=" + type +

+ 5 - 17
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkRejectHistory.java

@@ -1,17 +1,16 @@
 package com.qmth.teachcloud.mark.entity;
 
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.io.Serializable;
-import java.util.Date;
-
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.io.Serializable;
+
 /**
  * <p>
  * 
@@ -37,9 +36,6 @@ public class MarkRejectHistory implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
-    @ApiModelProperty(value = "分组号")
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "题目ID")
     private Long questionId;
 
@@ -94,13 +90,12 @@ public class MarkRejectHistory implements Serializable {
         this.id = SystemConstant.getDbUuid();
         this.examId = markTask.getExamId();
         this.paperNumber = markTask.getPaperNumber();
-        this.groupNumber = markTask.getGroupNumber();
+        this.questionId = markTask.getQuestionId();
         this.taskId = markTask.getId();
         this.studentId = markTask.getStudentId();
         this.studentCode = markTask.getStudentCode();
         this.secretNumber = markTask.getSecretNumber();
         this.userId = markTask.getUserId();
-        this.markerScoreList = markTask.getMarkerScoreList();
         this.markerScore = markTask.getMarkerScore();
         this.markerTime = markTask.getMarkerTime();
         this.rejectTime = System.currentTimeMillis();
@@ -126,13 +121,6 @@ public class MarkRejectHistory implements Serializable {
     public void setPaperNumber(String paperNumber) {
         this.paperNumber = paperNumber;
     }
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
 
     public Long getQuestionId() {
         return questionId;
@@ -249,7 +237,7 @@ public class MarkRejectHistory implements Serializable {
             "id=" + id +
             ", examId=" + examId +
             ", paperNumber=" + paperNumber +
-            ", groupNumber=" + groupNumber +
+            ", questionId=" + questionId +
             ", taskId=" + taskId +
             ", studentId=" + studentId +
             ", studentCode=" + studentCode +

+ 1 - 34
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkSubjectiveScore.java

@@ -44,24 +44,15 @@ public class MarkSubjectiveScore implements Serializable {
     @ApiModelProperty(value = "课程代码")
     private String paperNumber;
 
-    @ApiModelProperty(value = "分组序号")
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "题目ID")
     private Long questionId;
 
-    @ApiModelProperty(value = "分组得分")
-    private Double groupScore;
-
     @ApiModelProperty(value = "大题得分")
     private Double mainScore;
 
     @ApiModelProperty(value = "小题得分")
     private Double score;
 
-    @ApiModelProperty(value = "是否合分")
-    private Boolean uncalculate;
-
     @ApiModelProperty(value = "是否打回")
     private Boolean rejected;
 
@@ -100,14 +91,6 @@ public class MarkSubjectiveScore implements Serializable {
     public void setPaperNumber(String paperNumber) {
         this.paperNumber = paperNumber;
     }
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
     public Long getQuestionId() {
         return questionId;
     }
@@ -116,13 +99,6 @@ public class MarkSubjectiveScore implements Serializable {
         this.questionId = questionId;
     }
 
-    public Double getGroupScore() {
-        return groupScore;
-    }
-
-    public void setGroupScore(Double groupScore) {
-        this.groupScore = groupScore;
-    }
     public Double getMainScore() {
         return mainScore;
     }
@@ -137,13 +113,6 @@ public class MarkSubjectiveScore implements Serializable {
     public void setScore(Double score) {
         this.score = score;
     }
-    public Boolean getUncalculate() {
-        return uncalculate;
-    }
-
-    public void setUncalculate(Boolean uncalculate) {
-        this.uncalculate = uncalculate;
-    }
 
     public Boolean getRejected() {
         return rejected;
@@ -161,11 +130,9 @@ public class MarkSubjectiveScore implements Serializable {
             ", subNumber=" + subNumber +
             ", examId=" + examId +
             ", paperNumber=" + paperNumber +
-            ", groupNumber=" + groupNumber +
-            ", groupScore=" + groupScore +
+            ", questionId=" + questionId +
             ", mainScore=" + mainScore +
             ", score=" + score +
-            ", uncalculate=" + uncalculate +
         "}";
     }
 }

+ 49 - 108
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java

@@ -1,16 +1,19 @@
 package com.qmth.teachcloud.mark.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -22,7 +25,7 @@ import java.util.List;
  * @since 2023-09-22
  */
 @TableName("mark_task")
-@ApiModel(value="MarkTask对象", description="评卷任务表")
+@ApiModel(value = "MarkTask对象", description = "评卷任务表")
 public class MarkTask implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -47,9 +50,6 @@ public class MarkTask implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
-    @ApiModelProperty(value = "分组号")
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "题目ID")
     private Long questionId;
 
@@ -85,9 +85,6 @@ public class MarkTask implements Serializable {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Double markerScore;
 
-    @ApiModelProperty(value = "评卷给分明细")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private String markerScoreList;
 
     @ApiModelProperty(value = "评卷分数轨迹")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
@@ -114,10 +111,6 @@ public class MarkTask implements Serializable {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Double headerScore;
 
-    @ApiModelProperty(value = "科组长给分明细")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private String headerScoreList;
-
     @ApiModelProperty(value = "复核轨迹")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String headerTrackList;
@@ -138,6 +131,7 @@ public class MarkTask implements Serializable {
     public void setId(Long id) {
         this.id = id;
     }
+
     public Long getExamId() {
         return examId;
     }
@@ -177,13 +171,7 @@ public class MarkTask implements Serializable {
     public void setPaperNumber(String paperNumber) {
         this.paperNumber = paperNumber;
     }
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
     public Long getStudentId() {
         return studentId;
     }
@@ -207,6 +195,7 @@ public class MarkTask implements Serializable {
     public void setStudentCode(String studentCode) {
         this.studentCode = studentCode;
     }
+
     public String getSecretNumber() {
         return secretNumber;
     }
@@ -214,6 +203,7 @@ public class MarkTask implements Serializable {
     public void setSecretNumber(String secretNumber) {
         this.secretNumber = secretNumber;
     }
+
     public Integer getTaskNumber() {
         return taskNumber;
     }
@@ -221,6 +211,7 @@ public class MarkTask implements Serializable {
     public void setTaskNumber(Integer taskNumber) {
         this.taskNumber = taskNumber;
     }
+
     public MarkTaskStatus getStatus() {
         return status;
     }
@@ -228,6 +219,7 @@ public class MarkTask implements Serializable {
     public void setStatus(MarkTaskStatus status) {
         this.status = status;
     }
+
     public Long getUserId() {
         return userId;
     }
@@ -235,6 +227,7 @@ public class MarkTask implements Serializable {
     public void setUserId(Long userId) {
         this.userId = userId;
     }
+
     public Long getMarkerTime() {
         return markerTime;
     }
@@ -242,6 +235,7 @@ public class MarkTask implements Serializable {
     public void setMarkerTime(Long markerTime) {
         this.markerTime = markerTime;
     }
+
     public Double getMarkerScore() {
         return markerScore;
     }
@@ -249,13 +243,7 @@ public class MarkTask implements Serializable {
     public void setMarkerScore(Double markerScore) {
         this.markerScore = markerScore;
     }
-    public String getMarkerScoreList() {
-        return markerScoreList;
-    }
 
-    public void setMarkerScoreList(String markerScoreList) {
-        this.markerScoreList = markerScoreList;
-    }
     public Integer getMarkerSpent() {
         return markerSpent;
     }
@@ -263,6 +251,7 @@ public class MarkTask implements Serializable {
     public void setMarkerSpent(Integer markerSpent) {
         this.markerSpent = markerSpent;
     }
+
     public Long getHeaderId() {
         return headerId;
     }
@@ -270,6 +259,7 @@ public class MarkTask implements Serializable {
     public void setHeaderId(Long headerId) {
         this.headerId = headerId;
     }
+
     public Long getHeaderTime() {
         return headerTime;
     }
@@ -277,6 +267,7 @@ public class MarkTask implements Serializable {
     public void setHeaderTime(Long headerTime) {
         this.headerTime = headerTime;
     }
+
     public Double getHeaderScore() {
         return headerScore;
     }
@@ -284,13 +275,6 @@ public class MarkTask implements Serializable {
     public void setHeaderScore(Double headerScore) {
         this.headerScore = headerScore;
     }
-    public String getHeaderScoreList() {
-        return headerScoreList;
-    }
-
-    public void setHeaderScoreList(String headerScoreList) {
-        this.headerScoreList = headerScoreList;
-    }
 
     public String getRejectReason() {
         return rejectReason;
@@ -340,87 +324,44 @@ public class MarkTask implements Serializable {
         this.headerTagList = headerTagList;
     }
 
-    public List<ScoreItem> getScoreList() {
-        List<ScoreItem> list = new LinkedList<ScoreItem>();
-        String scoreList = null;
-        if (StringUtils.isNotBlank(headerScoreList)) {
-            scoreList = headerScoreList;
-        } else if (StringUtils.isNotBlank(markerScoreList)) {
-            scoreList = markerScoreList;
-        }
-        if (StringUtils.isNotBlank(scoreList)) {
-            try {
-                String[] values = scoreList.split(",");
-                for (String value : values) {
-                    if (value.equals("#")) {
-                        list.add(new ScoreItem(false));
-                    } else {
-                        ScoreItem item = ScoreItem.parse(value, false);
-                        if (item != null) {
-                            list.add(item);
-                        }
-                    }
-                }
-                if (scoreList.endsWith(",")) {
-                    list.add(new ScoreItem(false));
-                }
-            } catch (Exception e) {
-            }
-        }
-        return list;
-    }
-    
-    public List<ScoreItem> getMarkerScoreItem() {
-        List<ScoreItem> list = new LinkedList<ScoreItem>();
-        String scoreList = null;
-        if (StringUtils.isNotBlank(markerScoreList)) {
-            scoreList = markerScoreList;
+    public List<MarkTrack> listMarkerTrack() {
+        List<MarkTrack> markTrackList = new ArrayList<>();
+        if (StringUtils.isNotBlank(markerTrackList)) {
+            markTrackList = JSON.parseArray(markerTrackList, MarkTrack.class);
         }
-        if (StringUtils.isNotBlank(scoreList)) {
-            try {
-                String[] values = scoreList.split(",");
-                for (String value : values) {
-                    if (value.equals("#")) {
-                        list.add(new ScoreItem(false));
-                    } else {
-                        ScoreItem item = ScoreItem.parse(value, false);
-                        if (item != null) {
-                            list.add(item);
-                        }
-                    }
-                }
-                if (scoreList.endsWith(",")) {
-                    list.add(new ScoreItem(false));
-                }
-            } catch (Exception e) {
-            }
+        return markTrackList;
+    }
+
+    public List<MarkSpecialTag> listMarkerTag() {
+        List<MarkSpecialTag> markSpecialTagList = new ArrayList<>();
+        if (StringUtils.isNotBlank(markerTagList)) {
+            markSpecialTagList = JSON.parseArray(markerTagList, MarkSpecialTag.class);
         }
-        return list;
+        return markSpecialTagList;
     }
 
+
     @Override
     public String toString() {
         return "MarkTask{" +
-            "id=" + id +
-            ", examId=" + examId +
-            ", courseCode=" + courseCode +
-            ", courseName=" + courseName +
-            ", paperNumber=" + paperNumber +
-            ", groupNumber=" + groupNumber +
-            ", studentId=" + studentId +
-            ", studentCode=" + studentCode +
-            ", secretNumber=" + secretNumber +
-            ", taskNumber=" + taskNumber +
-            ", status=" + status +
-            ", userId=" + userId +
-            ", markerTime=" + markerTime +
-            ", markerScore=" + markerScore +
-            ", markerScoreList=" + markerScoreList +
-            ", markerSpent=" + markerSpent +
-            ", headerId=" + headerId +
-            ", headerTime=" + headerTime +
-            ", headerScore=" + headerScore +
-            ", headerScoreList=" + headerScoreList +
-        "}";
+                "id=" + id +
+                ", examId=" + examId +
+                ", courseCode=" + courseCode +
+                ", courseName=" + courseName +
+                ", paperNumber=" + paperNumber +
+                ", questionId=" + questionId +
+                ", studentId=" + studentId +
+                ", studentCode=" + studentCode +
+                ", secretNumber=" + secretNumber +
+                ", taskNumber=" + taskNumber +
+                ", status=" + status +
+                ", userId=" + userId +
+                ", markerTime=" + markerTime +
+                ", markerScore=" + markerScore +
+                ", markerSpent=" + markerSpent +
+                ", headerId=" + headerId +
+                ", headerTime=" + headerTime +
+                ", headerScore=" + headerScore +
+                "}";
     }
 }

+ 19 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserPaper.java

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.qmth.teachcloud.common.enums.mark.MarkMode;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -31,8 +34,11 @@ public class MarkUserPaper implements Serializable {
     @ApiModelProperty(value = "用户ID")
     private Long userId;
 
+    @ApiModelProperty(value = "强制评卷模式")
+    private MarkMode mode;
+
     @ApiModelProperty(value = "评卷模式(SINGLE:单题阅,MULTI:多题阅)")
-    private String questionModel;
+    private QuestionModel questionModel;
 
     public Long getId() {
         return id;
@@ -62,11 +68,20 @@ public class MarkUserPaper implements Serializable {
     public void setUserId(Long userId) {
         this.userId = userId;
     }
-    public String getQuestionModel() {
+
+    public MarkMode getMode() {
+        return mode;
+    }
+
+    public void setMode(MarkMode mode) {
+        this.mode = mode;
+    }
+
+    public QuestionModel getQuestionModel() {
         return questionModel;
     }
 
-    public void setQuestionModel(String questionModel) {
+    public void setQuestionModel(QuestionModel questionModel) {
         this.questionModel = questionModel;
     }
 
@@ -77,6 +92,7 @@ public class MarkUserPaper implements Serializable {
             ", examId=" + examId +
             ", paperNumber=" + paperNumber +
             ", userId=" + userId +
+            ", mode=" + mode +
             ", questionModel=" + questionModel +
         "}";
     }

+ 5 - 25
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserQuestion.java

@@ -19,8 +19,8 @@ import io.swagger.annotations.ApiModelProperty;
  * @author xf
  * @since 2023-09-22
  */
-@TableName("mark_user_group")
-@ApiModel(value="MarkUserGroup对象", description="评卷员表")
+@TableName("mark_user_question")
+@ApiModel(value="MarkUserQuestion对象", description="评卷员表")
 public class MarkUserQuestion implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -37,9 +37,6 @@ public class MarkUserQuestion implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
-    @ApiModelProperty(value = "分组编号")
-    private Integer groupNumber;
-
     @ApiModelProperty(value = "题目ID")
     private Long questionId;
 
@@ -47,9 +44,6 @@ public class MarkUserQuestion implements Serializable {
     @ApiModelProperty(value = "用户ID")
     private Long userId;
 
-    @ApiModelProperty(value = "强制评卷模式")
-    private MarkMode mode;
-
     @ApiModelProperty(value = "评卷数上限")
     private Integer topCount;
 
@@ -91,11 +85,11 @@ public class MarkUserQuestion implements Serializable {
     public MarkUserQuestion() {
     }
 
-    public MarkUserQuestion(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+    public MarkUserQuestion(Long examId, String paperNumber, Long questionId, Long userId) {
         this.id = SystemConstant.getDbUuid();
         this.examId = examId;
         this.paperNumber = paperNumber;
-        this.groupNumber = groupNumber;
+        this.questionId = questionId;
         this.userId = userId;
     }
 
@@ -120,9 +114,6 @@ public class MarkUserQuestion implements Serializable {
     public void setPaperNumber(String paperNumber) {
         this.paperNumber = paperNumber;
     }
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
 
     public Long getQuestionId() {
         return questionId;
@@ -132,9 +123,6 @@ public class MarkUserQuestion implements Serializable {
         this.questionId = questionId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
     public Long getUserId() {
         return userId;
     }
@@ -142,13 +130,6 @@ public class MarkUserQuestion implements Serializable {
     public void setUserId(Long userId) {
         this.userId = userId;
     }
-    public MarkMode getMode() {
-        return mode;
-    }
-
-    public void setMode(MarkMode mode) {
-        this.mode = mode;
-    }
     public Integer getTopCount() {
         return topCount;
     }
@@ -241,9 +222,8 @@ public class MarkUserQuestion implements Serializable {
             "id=" + id +
             ", examId=" + examId +
             ", paperNumber=" + paperNumber +
-            ", groupNumber=" + groupNumber +
+            ", questionId=" + questionId +
             ", userId=" + userId +
-            ", mode=" + mode +
             ", topCount=" + topCount +
             ", finishCount=" + finishCount +
             ", validCount=" + validCount +

+ 36 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/QuestionModel.java

@@ -0,0 +1,36 @@
+package com.qmth.teachcloud.mark.enums;
+
+/**
+ * 评卷方式
+ */
+public enum QuestionModel {
+
+    SINGLE("单题阅"),
+    MULTI("多题阅");
+
+    private String name;
+
+
+    private QuestionModel(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+
+    public boolean equals(String type) {
+        return toString().equalsIgnoreCase(type);
+    }
+
+    public static QuestionModel findByText(String text) {
+        for (QuestionModel type : values()) {
+            if (type.equals(text)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+}

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

@@ -19,11 +19,11 @@ import java.util.List;
  */
 public interface MarkArbitrateHistoryMapper extends BaseMapper<MarkArbitrateHistory> {
 
-    IPage<MarkArbitrateDto> pageArbitrate(@Param("page") Page<MarkArbitrateDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("status") String status, @Param("className") String className);
+    IPage<MarkArbitrateDto> pageArbitrate(@Param("page") Page<MarkArbitrateDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("status") String status, @Param("className") String className);
 
-    MarkArbitrateHistory getArbitrateWaitingOne(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
+    MarkArbitrateHistory getArbitrateWaitingOne(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
 
-    List<MarkArbitrateHistory> getHistory(@Param("page") Page<MarkArbitrateHistory> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("status") String status, @Param("userId") Long userId);
+    List<MarkArbitrateHistory> getHistory(@Param("page") Page<MarkArbitrateHistory> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("status") String status, @Param("userId") Long userId);
 
-    Integer waitArbitrateCount(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("status") String status, @Param("className") String className);
+    Integer waitArbitrateCount(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("status") String status, @Param("className") String className);
 }

+ 0 - 16
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkGroupMapper.java

@@ -1,16 +0,0 @@
-package com.qmth.teachcloud.mark.mapper;
-
-import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
-import com.qmth.teachcloud.mark.entity.MarkGroup;
-
-/**
- * <p>
- * 评卷分组表 Mapper 接口
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public interface MarkGroupMapper extends MppBaseMapper<MarkGroup> {
-
-}

+ 0 - 16
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkGroupStudentMapper.java

@@ -1,16 +0,0 @@
-package com.qmth.teachcloud.mark.mapper;
-
-import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
-import com.qmth.teachcloud.mark.entity.MarkGroupStudent;
-
-/**
- * <p>
- * 考生分组状态表 Mapper 接口
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public interface MarkGroupStudentMapper extends MppBaseMapper<MarkGroupStudent> {
-
-}

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

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

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

@@ -17,5 +17,5 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface MarkRejectHistoryMapper extends BaseMapper<MarkRejectHistory> {
 
-    IPage<MarkRejectHistoryDto> pageRejectHistory(@Param("page") Page<MarkRejectHistoryDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("loginName") String loginName, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName);
+    IPage<MarkRejectHistoryDto> pageRejectHistory(@Param("page") Page<MarkRejectHistoryDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName);
 }

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

@@ -77,7 +77,7 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
 
     List<MarkStudent> listAbsentOrBreachMarkTaskStudent(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 
-    IPage<MarkStudent> listUnMarkTaskStudent(@Param("page") Page<MarkStudent> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
+    IPage<MarkStudent> listUnMarkTaskStudent(@Param("page") Page<MarkStudent> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
 
     StudentVo findOne(@Param("query") StudentQuery query);
 

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

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkTaskDto;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -28,22 +29,24 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     List<MarkerInfoDto> listUserMarkedCount(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
 
-    MarkTask getLastOneByUserIdAndStatus(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("userId") Long userId, @Param("status") String status);
+    MarkTask getLastOneByUserIdAndStatus(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("status") String status);
 
-	IPage<MarkTask> listPageHistory(@Param("page")Page<MarkTask> page,@Param("userId") Long userId,@Param("examId") Long examId, @Param("paperNumber")String paperNumber,
-			@Param("groupNumber")Integer groupNumber,@Param("secretNumber") String secretNumber,@Param("markerScore") Double markerScore);
+    IPage<MarkTask> listPageHistory(@Param("page") Page<MarkTask> page, @Param("userId") Long userId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+                                    @Param("groupNumber") Integer groupNumber, @Param("secretNumber") String secretNumber, @Param("markerScore") Double markerScore);
 
-	List<MarkTask> findUnMarked(@Param("page")Page<MarkTask> page,@Param("examId") Long examId, @Param("paperNumber")String paperNumber, @Param("groupNumber")Integer groupNumber,
-			@Param("userId")Long userId);
+    List<MarkTask> findUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+                                @Param("userId") Long userId, @Param("questionModel") QuestionModel questionModel);
 
-	List<MarkTask> findUnMarkedFilterClass(@Param("page")Page<MarkTask> page,@Param("examId") Long examId, @Param("paperNumber")String paperNumber, @Param("groupNumber")Integer groupNumber,
-			@Param("userId")Long userId);
+    List<MarkTask> findUnMarkedFilterClass(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
+                                           @Param("userId") Long userId, @Param("questionModel") QuestionModel questionModel);
 
-    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("userId") Long userId, @Param("className") String className);
+    List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
 
-    int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndAndClassNameStatusIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("statusList") MarkTaskStatus[] statusList);
+    int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("statusList") MarkTaskStatus[] statusList);
 
-    IPage<MarkTaskDto> pageMarkTask(@Param("page") Page<Object> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("loginName") String loginName, @Param("status") MarkTaskStatus status, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName, @Param("subScore") Double subScore);
+    IPage<MarkTaskDto> pageMarkTask(@Param("page") Page<Object> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("status") MarkTaskStatus status, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName, @Param("subScore") Double subScore);
 
     MarkManageDto selectMarkedCountAndTotalCount(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+
+    Long minQuestionIdByExamIdAndPaperNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("statusList") MarkTaskStatus[] statusList);
 }

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

@@ -20,7 +20,7 @@ import java.util.List;
  */
 public interface MarkUserClassMapper extends BaseMapper<MarkUserClass> {
 
-    List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("className") String className);
+    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);

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserGroupMapper.java → teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserQuestionMapper.java

@@ -20,17 +20,17 @@ import java.util.List;
  * @author xf
  * @since 2023-09-22
  */
-public interface MarkUserGroupMapper extends BaseMapper<MarkUserQuestion> {
+public interface MarkUserQuestionMapper extends BaseMapper<MarkUserQuestion> {
 
     IPage<MarkEntranceDto> listEntranceGroup(@Param("page") Page<MarkUserQuestion> page, @Param("examId") Long examId, @Param("openCollegeId") Long openCollegeId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("status") String status);
 
-    List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("className") String className);
+    List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("className") String className);
 
-    IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndGroupNumber(@Param("page") Page<MarkUserGroupProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("loginName") String loginName, @Param("className") String className);
+    IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(@Param("page") Page<MarkUserGroupProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("className") String className);
 
-    IPage<MarkQualityDto> pageQuality(@Param("page") Page<MarkQualityDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("loginName") String loginName);
+    IPage<MarkQualityDto> pageQuality(@Param("page") Page<MarkQualityDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName);
 
     int countByMarkTask(@Param("userId") Long userId, @Param("status") String status);
 
-    void updateRejectCountByExamIdAndPaperNumberAndGroupNumberAndUserId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("userId") Long userId);
+    void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId);
 }

+ 209 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/ArbitrateResult.java

@@ -0,0 +1,209 @@
+package com.qmth.teachcloud.mark.params;
+
+import com.qmth.teachcloud.common.enums.mark.MarkProblemType;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
+import com.qmth.teachcloud.mark.entity.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 标准评卷结果对象
+ * 
+ */
+public class ArbitrateResult {
+
+    public static final String SPLIT = ",";
+
+    /**
+     * 考生编号
+     */
+    private Long studentId;
+
+    /**
+     * 评卷任务编号
+     */
+    private Long taskId;
+
+    /**
+     * 总分
+     */
+    private double markerScore;
+
+    /**
+     * 分值列表
+     */
+    private Double[] scoreList;
+
+    /**
+     * 阅卷轨迹列表
+     */
+    private TrackDTO[] trackList;
+
+    /**
+     * 特殊标记列表
+     */
+    private SpecialTagDTO[] specialTagList;
+
+    /**
+     * 所花时间
+     */
+    private int spent;
+
+    /**
+     * 是否问题卷
+     */
+    private boolean problem;
+
+    /**
+     * 问题类型
+     */
+    private MarkProblemType problemType;
+    
+    /**
+     * 问题卷备注
+     */
+    private String problemRemark;
+
+    private boolean unselective;
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    public double getMarkerScore() {
+        return markerScore;
+    }
+
+    public void setMarkerScore(double markerScore) {
+        this.markerScore = markerScore;
+    }
+
+    public String getScoreList() {
+        List<Object> list = new ArrayList<Object>();
+        for (int i = 0; i < scoreList.length; i++) {
+            Double d = scoreList[i];
+            if (d % 1 == 0) {
+                list.add(d.intValue());
+            } else {
+                list.add(d);
+            }
+        }
+        return StringUtils.join(list, SPLIT);
+    }
+
+    public void setScoreList(Double[] scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public TrackDTO[] getTrackList() {
+        return trackList;
+    }
+
+    public void setTrackList(TrackDTO[] trackList) {
+        this.trackList = trackList;
+    }
+    public SpecialTagDTO[] getSpecialTagList() {
+        return specialTagList;
+    }
+
+    public void setSpecialTagList(SpecialTagDTO[] specialTagList) {
+        this.specialTagList = specialTagList;
+    }
+    public int getSpent() {
+        return spent;
+    }
+
+    public void setSpent(int spent) {
+        this.spent = spent;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public List<MarkHeaderTrack> getTrackList(MarkArbitrateHistory history) {
+        List<MarkHeaderTrack> list = new LinkedList<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                list.add(dto.transform(history));
+            }
+        }
+        return list;
+    }
+
+    public List<MarkTrack> getTrackList(MarkTask markTask, Long userId) {
+        List<MarkTrack> list = new LinkedList<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                list.add(dto.transform(markTask, userId));
+            }
+        }
+        return list;
+    }
+
+    public List<MarkHeaderTag> getHeaderTagList(MarkArbitrateHistory library) {
+        List<MarkHeaderTag> list = new LinkedList<>();
+        if (specialTagList != null) {
+            for (SpecialTagDTO dto : specialTagList) {
+                list.add(dto.transform(library));
+            }
+        }
+        return list;
+    }
+
+    public List<MarkSpecialTag> getSpecialTagList(MarkTask markTask) {
+        List<MarkSpecialTag> list = new LinkedList<>();
+        if (specialTagList != null) {
+            for (SpecialTagDTO dto : specialTagList) {
+                list.add(dto.transform(markTask));
+            }
+        }
+        return list;
+    }
+
+    public boolean isProblem() {
+        return problem;
+    }
+
+    public void setProblem(boolean problem) {
+        this.problem = problem;
+    }
+
+
+    public MarkProblemType getProblemType() {
+		return problemType;
+	}
+
+	public void setProblemType(MarkProblemType problemType) {
+		this.problemType = problemType;
+	}
+
+	public boolean isUnselective() {
+        return unselective;
+    }
+
+    public void setUnselective(boolean unselective) {
+        this.unselective = unselective;
+    }
+
+	public String getProblemRemark() {
+		return problemRemark;
+	}
+
+	public void setProblemRemark(String problemRemark) {
+		this.problemRemark = problemRemark;
+	}
+
+}

+ 50 - 42
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkHeaderGroupResult.java

@@ -16,7 +16,8 @@ public class MarkHeaderGroupResult {
 
     public static final String SPLIT = ",";
 
-    private Integer groupNumber;
+    private Long taskId;
+    private Long questionId;
 
     /**
      * 考生编号
@@ -26,13 +27,14 @@ public class MarkHeaderGroupResult {
     /**
      * 总分
      */
-    private List<MarkScoreList> markerScore;
-    private double groupScore;
+    private Integer mainNumber;
+
+    private Integer subNumber;
 
     /**
-     * 分值列表
+     * 
      */
-    private Double[] scoreList;
+    private double score;
 
     /**
      * 阅卷轨迹列表
@@ -50,70 +52,76 @@ public class MarkHeaderGroupResult {
      */
     private int spent;
 
+    public Long getTaskId() {
+        return taskId;
+    }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
     }
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public TrackDTO[] getTrackList() {
+        return trackList;
     }
 
-    public List<MarkScoreList> getMarkerScore() {
-        return markerScore;
+    public void setTrackList(TrackDTO[] trackList) {
+        this.trackList = trackList;
     }
 
-    public void setMarkerScore(List<MarkScoreList> markerScore) {
-        this.markerScore = markerScore;
+    public int getSpent() {
+        return spent;
     }
 
-    public double getGroupScore() {
-        return groupScore;
+    public void setSpent(int spent) {
+        this.spent = spent;
     }
 
-    public void setGroupScore(double groupScore) {
-        this.groupScore = groupScore;
+    public Long getStudentId() {
+        return studentId;
     }
 
-    public String getScoreList() {
-        List<Object> list = new ArrayList<Object>();
-        for (int i = 0; i < scoreList.length; i++) {
-            Double d = scoreList[i];
-            if (d % 1 == 0) {
-                list.add(d.intValue());
-            } else {
-                list.add(d);
-            }
-        }
-        return StringUtils.join(list, SPLIT);
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
     }
 
-    public void setScoreList(Double[] scoreList) {
-        this.scoreList = scoreList;
+    public Long getQuestionId() {
+        return questionId;
     }
 
-    public TrackDTO[] getTrackList() {
-        return trackList;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
 
-    public void setTrackList(TrackDTO[] trackList) {
-        this.trackList = trackList;
+    public Integer getMainNumber() {
+        return mainNumber;
     }
 
-    public int getSpent() {
-        return spent;
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
     }
 
-    public void setSpent(int spent) {
-        this.spent = spent;
+    public Integer getSubNumber() {
+        return subNumber;
     }
 
-    public Long getStudentId() {
-        return studentId;
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
     }
 
-    public void setStudentId(Long studentId) {
-        this.studentId = studentId;
+    public double getScore() {
+        return score;
+    }
+
+    public void setScore(double score) {
+        this.score = score;
+    }
+
+    public SpecialTagDTO[] getSpecialTagList() {
+        return specialTagList;
+    }
+
+    public void setSpecialTagList(SpecialTagDTO[] specialTagList) {
+        this.specialTagList = specialTagList;
     }
 
     public List<MarkHeaderTrack> getTrackList(MarkArbitrateHistory history) {

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

@@ -1,21 +1,7 @@
 package com.qmth.teachcloud.mark.params;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.qmth.teachcloud.common.enums.mark.MarkProblemType;
-import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
-import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
-import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
-import com.qmth.teachcloud.mark.entity.MarkHeaderTag;
-import com.qmth.teachcloud.mark.entity.MarkHeaderTrack;
-import com.qmth.teachcloud.mark.entity.MarkSpecialTag;
-import com.qmth.teachcloud.mark.entity.MarkTask;
-import com.qmth.teachcloud.mark.entity.MarkTrack;
-
 /**
  * 标准评卷结果对象
  * 
@@ -29,59 +15,24 @@ public class MarkResult {
      */
     private Long studentId;
 
-    /**
-     * 评卷任务编号
-     */
-    private Long taskId;
-
     /**
      * 总分
      */
     private double markerScore;
 
-    /**
-     * 分值列表
-     */
-    private Double[] scoreList;
-
-    /**
-     * 阅卷轨迹列表
-     */
-    private TrackDTO[] trackList;
-
-    /**
-     * 特殊标记列表
-     */
-    private SpecialTagDTO[] specialTagList;
-
     /**
      * 所花时间
      */
     private int spent;
 
-    /**
-     * 是否问题卷
-     */
-    private boolean problem;
+    private List<MarkResultQuestion> questionList;
 
-    /**
-     * 问题类型
-     */
-    private MarkProblemType problemType;
-    
-    /**
-     * 问题卷备注
-     */
-    private String problemRemark;
-
-    private boolean unselective;
-
-    public Long getTaskId() {
-        return taskId;
+    public Long getStudentId() {
+        return studentId;
     }
 
-    public void setTaskId(Long taskId) {
-        this.taskId = taskId;
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
     }
 
     public double getMarkerScore() {
@@ -92,37 +43,6 @@ public class MarkResult {
         this.markerScore = markerScore;
     }
 
-    public String getScoreList() {
-        List<Object> list = new ArrayList<Object>();
-        for (int i = 0; i < scoreList.length; i++) {
-            Double d = scoreList[i];
-            if (d % 1 == 0) {
-                list.add(d.intValue());
-            } else {
-                list.add(d);
-            }
-        }
-        return StringUtils.join(list, SPLIT);
-    }
-
-    public void setScoreList(Double[] scoreList) {
-        this.scoreList = scoreList;
-    }
-
-    public TrackDTO[] getTrackList() {
-        return trackList;
-    }
-
-    public void setTrackList(TrackDTO[] trackList) {
-        this.trackList = trackList;
-    }
-    public SpecialTagDTO[] getSpecialTagList() {
-        return specialTagList;
-    }
-
-    public void setSpecialTagList(SpecialTagDTO[] specialTagList) {
-        this.specialTagList = specialTagList;
-    }
     public int getSpent() {
         return spent;
     }
@@ -131,85 +51,11 @@ public class MarkResult {
         this.spent = spent;
     }
 
-    public Long getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Long studentId) {
-        this.studentId = studentId;
-    }
-
-    public List<MarkHeaderTrack> getTrackList(MarkArbitrateHistory history) {
-        List<MarkHeaderTrack> list = new LinkedList<>();
-        if (trackList != null) {
-            for (TrackDTO dto : trackList) {
-                list.add(dto.transform(history));
-            }
-        }
-        return list;
-    }
-
-    public List<MarkTrack> getTrackList(MarkTask markTask, Long userId) {
-        List<MarkTrack> list = new LinkedList<>();
-        if (trackList != null) {
-            for (TrackDTO dto : trackList) {
-                list.add(dto.transform(markTask, userId));
-            }
-        }
-        return list;
+    public List<MarkResultQuestion> getQuestionList() {
+        return questionList;
     }
 
-    public List<MarkHeaderTag> getHeaderTagList(MarkArbitrateHistory library) {
-        List<MarkHeaderTag> list = new LinkedList<>();
-        if (specialTagList != null) {
-            for (SpecialTagDTO dto : specialTagList) {
-                list.add(dto.transform(library));
-            }
-        }
-        return list;
+    public void setQuestionList(List<MarkResultQuestion> questionList) {
+        this.questionList = questionList;
     }
-
-    public List<MarkSpecialTag> getSpecialTagList(MarkTask markTask) {
-        List<MarkSpecialTag> list = new LinkedList<>();
-        if (specialTagList != null) {
-            for (SpecialTagDTO dto : specialTagList) {
-                list.add(dto.transform(markTask));
-            }
-        }
-        return list;
-    }
-
-    public boolean isProblem() {
-        return problem;
-    }
-
-    public void setProblem(boolean problem) {
-        this.problem = problem;
-    }
-
-
-    public MarkProblemType getProblemType() {
-		return problemType;
-	}
-
-	public void setProblemType(MarkProblemType problemType) {
-		this.problemType = problemType;
-	}
-
-	public boolean isUnselective() {
-        return unselective;
-    }
-
-    public void setUnselective(boolean unselective) {
-        this.unselective = unselective;
-    }
-
-	public String getProblemRemark() {
-		return problemRemark;
-	}
-
-	public void setProblemRemark(String problemRemark) {
-		this.problemRemark = problemRemark;
-	}
-
 }

+ 198 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResultQuestion.java

@@ -0,0 +1,198 @@
+package com.qmth.teachcloud.mark.params;
+
+import com.qmth.teachcloud.common.enums.mark.MarkProblemType;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
+import com.qmth.teachcloud.mark.entity.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 标准评卷结果对象
+ * 
+ */
+public class MarkResultQuestion {
+
+    public static final String SPLIT = ",";
+
+
+    /**
+     * 评卷任务编号
+     */
+    private Long taskId;
+
+    /**
+     * 题目ID
+     */
+    private Long questionId;
+
+    private Integer mainNumber;
+    private Integer subNumber;
+
+    /**
+     * 总分
+     */
+    private double markerScore;
+
+    /**
+     * 阅卷轨迹列表
+     */
+    private TrackDTO[] trackList;
+
+    /**
+     * 特殊标记列表
+     */
+    private SpecialTagDTO[] specialTagList;
+
+    /**
+     * 所花时间
+     */
+    private int spent;
+
+    /**
+     * 是否问题卷
+     */
+    private boolean problem;
+
+    /**
+     * 问题类型
+     */
+    private MarkProblemType problemType;
+    
+    /**
+     * 问题卷备注
+     */
+    private String problemRemark;
+
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public double getMarkerScore() {
+        return markerScore;
+    }
+
+    public void setMarkerScore(double markerScore) {
+        this.markerScore = markerScore;
+    }
+
+    public TrackDTO[] getTrackList() {
+        return trackList;
+    }
+
+    public void setTrackList(TrackDTO[] trackList) {
+        this.trackList = trackList;
+    }
+    public SpecialTagDTO[] getSpecialTagList() {
+        return specialTagList;
+    }
+
+    public void setSpecialTagList(SpecialTagDTO[] specialTagList) {
+        this.specialTagList = specialTagList;
+    }
+
+    public List<MarkHeaderTrack> getTrackList(MarkArbitrateHistory history) {
+        List<MarkHeaderTrack> list = new LinkedList<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                list.add(dto.transform(history));
+            }
+        }
+        return list;
+    }
+
+    public List<MarkTrack> getTrackList(MarkTask markTask, Long userId) {
+        List<MarkTrack> list = new LinkedList<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                list.add(dto.transform(markTask, userId));
+            }
+        }
+        return list;
+    }
+
+    public List<MarkHeaderTag> getHeaderTagList(MarkArbitrateHistory library) {
+        List<MarkHeaderTag> list = new LinkedList<>();
+        if (specialTagList != null) {
+            for (SpecialTagDTO dto : specialTagList) {
+                list.add(dto.transform(library));
+            }
+        }
+        return list;
+    }
+
+    public List<MarkSpecialTag> getSpecialTagList(MarkTask markTask) {
+        List<MarkSpecialTag> list = new LinkedList<>();
+        if (specialTagList != null) {
+            for (SpecialTagDTO dto : specialTagList) {
+                list.add(dto.transform(markTask));
+            }
+        }
+        return list;
+    }
+
+    public boolean isProblem() {
+        return problem;
+    }
+
+    public void setProblem(boolean problem) {
+        this.problem = problem;
+    }
+
+
+    public MarkProblemType getProblemType() {
+		return problemType;
+	}
+
+	public void setProblemType(MarkProblemType problemType) {
+		this.problemType = problemType;
+	}
+
+	public String getProblemRemark() {
+		return problemRemark;
+	}
+
+	public void setProblemRemark(String problemRemark) {
+		this.problemRemark = problemRemark;
+	}
+
+    public int getSpent() {
+        return spent;
+    }
+
+    public void setSpent(int spent) {
+        this.spent = spent;
+    }
+}

+ 8 - 9
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArbitrateHistoryService.java

@@ -8,6 +8,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkArbitrateSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 
 import java.util.List;
@@ -22,25 +23,23 @@ import java.util.List;
  */
 public interface MarkArbitrateHistoryService extends IService<MarkArbitrateHistory> {
 
-    IPage<MarkArbitrateDto> pageArbitrate(Long examId, String paperNumber, Integer groupNumber, String status, String className, Integer pageNumber, Integer pageSize);
+    IPage<MarkArbitrateDto> pageArbitrate(Long examId, String paperNumber, Long questionId, String status, String className, Integer pageNumber, Integer pageSize);
 
     void clearArbitrate(Long arbitrateId);
 
     List<MarkArbitrateMarkerDto> listMarkerArbitrateRecord(Long arbitrateId);
 
-    MarkArbitrateSettingDto getArbitrateSetting(Long arbitrateId, Long examId, String paperNumber, Integer groupNumber);
+    MarkArbitrateSettingDto getArbitrateSetting(Long arbitrateId, Long examId, String paperNumber, Long questionId);
 
-    Task getArbitrateTask(Long arbitrateId, Long examId, String paperNumber, Integer groupNumber);
+    Task getArbitrateTask(Long arbitrateId, Long examId, String paperNumber, Long questionId);
 
-    void saveArbitrateTask(MarkResult markResult);
+    void saveArbitrateTask(MarkHeaderGroupResult markResult);
 
     void deleteByStudentId(Long studentId);
 
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    JSONObject getArbitrateStatus(Long examId, String paperNumber, Long questionId);
 
-    JSONObject getArbitrateStatus(Long examId, String paperNumber, Integer groupNumber);
+    List<Task> getHistory(Long examId, String paperNumber, Long questionId, Integer pageNumber, Integer pageSize);
 
-    List<Task> getHistory(Long examId, String paperNumber, Integer groupNumber, Integer pageNumber, Integer pageSize);
-
-    Integer waitArbitrateCount(Long examId, String paperNumber, Integer groupNumber, String className);
+    Integer waitArbitrateCount(Long examId, String paperNumber, Long questionId, String className);
 }

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

@@ -1,57 +0,0 @@
-package com.qmth.teachcloud.mark.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupQuestionsDto;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupSummaryProgressDto;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupSingleDto;
-import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
-import com.qmth.teachcloud.common.bean.params.mark.group.GroupPictureConfigParams;
-import com.qmth.teachcloud.mark.entity.MarkGroup;
-
-import java.util.List;
-
-/**
- * <p>
- * 评卷分组表 服务类
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public interface MarkGroupService extends IService<MarkGroup> {
-
-    MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber);
-    List<MarkGroup> listGroupByExamIdAndPaperNumber(Long examId, String paperNumber);
-
-    void deleteGroupByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
-
-    void updatePicListByExamIdAndPaperNumberAndGroupNumber(GroupPictureConfigParams groupPictureConfigParams);
-
-    void updateOpenMarkClassByExamIdAndPaperNumber(Long examId, String paperNumber, Boolean openMarkClass);
-
-    MarkGroup getByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
-
-    MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber);
-
-    IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize);
-
-    void updateMarkedCount(Long examId, String paperNumber, Integer groupNumber, int count);
-
-    MarkGroup saveGroup(MarkGroupSingleDto markGroupSingleDto);
-
-    MarkGroup updateGroup(MarkGroupSingleDto markGroupSingleDto);
-
-    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);
-
-    void updateTotalScore(Long examId, String paperNumber, Integer groupNumber, Double totalScore);
-
-    Integer countCurrentCountByExamIdAndPaperNumber(Long examId, String paperNumber);
-}

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

@@ -1,24 +0,0 @@
-package com.qmth.teachcloud.mark.service;
-
-import com.github.jeffreyning.mybatisplus.service.IMppService;
-import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
-import com.qmth.teachcloud.mark.entity.MarkGroupStudent;
-
-/**
- * <p>
- * 考生分组状态表 服务类
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public interface MarkGroupStudentService extends IMppService<MarkGroupStudent> {
-
-    long countByStudentIdAndStatus(Long studentId, SubjectiveStatus marked);
-
-    void deleteByStudentId(Long studentId);
-
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
-
-	MarkGroupStudent getByStudentIdAndGroupNumber(Long studentId, Integer groupNumber);
-}

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

@@ -1,10 +1,10 @@
 package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkProblemDto;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.enums.mark.MarkProblemStatus;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkProblemDto;
 import com.qmth.teachcloud.mark.entity.MarkProblemHistory;
-import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
 
@@ -26,7 +26,7 @@ public interface MarkProblemHistoryService extends IService<MarkProblemHistory>
 
     void deleteByStudentId(Long studentId);
 
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 
 	MarkProblemHistory findByTaskIdAndStatus(Long taskId, MarkProblemStatus status);
 

+ 28 - 9
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java

@@ -1,8 +1,15 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
+import com.qmth.teachcloud.mark.dto.mark.SubjectiveAnswerFileDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupQuestionsDto;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupSummaryProgressDto;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
 import com.qmth.teachcloud.mark.params.MarkObjectiveQuestionParams;
 import com.qmth.teachcloud.mark.params.MarkQuestionParams;
@@ -41,9 +48,6 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     void saveQuestions(MarkQuestionParams markQuestionParams);
 
-    List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number,
-                                                                        Boolean isObjective);
-
     /**
      * 客观题标答模板导出
      *
@@ -66,11 +70,11 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     void saveObjectiveQuestions(MarkObjectiveQuestionParams markObjectiveQuestionParams);
 
-    String uploadSubjectiveFile(Long examId, String paperNumber, MultipartFile file, String md5);
+    String uploadSubjectiveFile(Long examId, String paperNumber, String paperType, MultipartFile file, String md5);
 
-    String previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber);
+    List<SubjectiveAnswerFileDto> previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    double sumTotalScoreByGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    double sumTotalScoreByQuestionId(Long examId, String paperNumber, Long questionId);
 
     MarkQuestion getByExamIdAndPaperNumberAndMainNumberAndSubNumberAndObjective(Long examId, String paperNumber, Integer mainNumber, Integer subNumber, boolean isObjective);
 
@@ -78,9 +82,6 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     MarkQuestionDto pageQuestionsByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    void updateGroupNumberByExamIdAndPaperNumberAndGroupNumber(Integer newGroupNumber, Long examId, String paperNumber,
-                                                               Integer groupNumber);
-
     long countByExamIdAndPaperNumberAndObjectiveAndGroupNumberIsNull(Long examId, String paperNumber, boolean objective);
 
     List<MarkQuestion> listByExamIdAndPaperNumberAndObjective(Long examId, String paperNumber, Boolean objective);
@@ -100,4 +101,22 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
     List<MarkQuestion> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     void deleteByExamIdAndPaperNumberAndObjective(Long examId, String paperNumber, boolean objective);
+
+    MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    void updatePicListByQuestionId(QuestionPictureConfigParams groupPictureConfigParams);
+
+    Integer countCurrentCountByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber);
+
+    IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize);
+
+    List<MarkGroupQuestionsDto> listGroupQuestions(Long examId, String paperNumber);
+
+    void updateTaskCount(Long questionId, int taskCount);
+
+    void updateMarkedCount(Long questionId, int count);
+
+    void updateDoubleMarkByQuestionId(MarkQuestion markQuestion);
 }

+ 3 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkRejectHistoryService.java

@@ -1,13 +1,13 @@
 package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkRejectHistoryDto;
 import com.qmth.teachcloud.mark.entity.MarkRejectHistory;
-import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
  * <p>
- *  服务类
+ * 服务类
  * </p>
  *
  * @author xf
@@ -15,7 +15,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface MarkRejectHistoryService extends IService<MarkRejectHistory> {
 
-    IPage<MarkRejectHistoryDto> pageRejectHistory(Long examId, String paperNumber, Integer groupNumber, String loginName, String studentCode, String secretNumber, String teachClassName, Integer pageNumber, Integer pageSize);
+    IPage<MarkRejectHistoryDto> pageRejectHistory(Long examId, String paperNumber, Long questionId, String loginName, String studentCode, String secretNumber, String teachClassName, Integer pageNumber, Integer pageSize);
 
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

+ 18 - 20
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java

@@ -1,13 +1,14 @@
 package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkGroupDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkSettingDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkStatusDto;
 import com.qmth.teachcloud.mark.dto.mark.mark.SubmitResult;
 import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.params.MarkResult;
 import io.lettuce.core.GeoArgs.Sort;
@@ -24,31 +25,30 @@ public interface MarkService {
      * 释放某个评卷员已完成的评卷任务
      *
      * @param submitResult  评卷结果
-     * @param markUserGroup 评卷员
      */
-    void releaseTask(SubmitResult submitResult, MarkUserQuestion markUserGroup);
+    void releaseTask(SubmitResult submitResult, Long userId);
 
-    int applyCurrentCount(MarkGroup markGroup);
+    int applyCurrentCount(MarkQuestion markQuestion);
 
     void releaseByMarkUserGroup(MarkUserQuestion markUserGroup);
 
-    int applyCurrentCount(MarkGroup markGroup, Long markUserGroupId);
+    int applyCurrentCount(MarkQuestion markQuestion, Long markUserGroupId);
 
     void resetMarker(MarkUserQuestion markUserGroup);
 
-    void updateMarkedCount(Long examId, String paperNumber, Integer groupNumber);
+    void updateMarkedCount(Long examId, String paperNumber, Long questionId);
 
     boolean rejectMarkTask(MarkProblemHistory markProblemHistory, MarkTask markTask, Long userId);
 
-    String getGroupKey(MarkGroup markGroup);
+    String getGroupKey(MarkQuestion markQuestion);
 
     void updateQuality(MarkUserQuestion markUserGroup);
 
     boolean needUpdateQuality(MarkUserQuestion marker, int expireMinutes);
 
-    void processArbitrate(MarkResult markResult, Long userId);
+    void processArbitrate(MarkHeaderGroupResult markResult, Long userId);
 
-    void checkStudentSubjective(Long studentId, long groupCount, long unGroupQuestionCount);
+    void checkStudentSubjective(Long studentId, long unGroupQuestionCount);
 
     void buildMarkTask(MarkPaper markPaper);
 
@@ -56,22 +56,20 @@ public interface MarkService {
 
     void updateGroupAllCount(Long examId, String paperNumber);
 
-    MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber, Integer groupNumber);
+    MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber);
 
-    MarkStatusDto getStatus(Long userId, Long examId, String paperNumber, Integer groupNumber);
+    MarkStatusDto getStatus(Long userId, Long examId, String paperNumber);
 
-    List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber);
+//    List<MarkGroupDto> getGroup(Long userId, Long examId, String paperNumber);
 
-    Task getTask(Long userId, Long examId, String paperNumber, Integer groupNumber);
+    Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel);
 
-    void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo);
+//    void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo);
 
     /**
      * /** 释放某个大题的锁定任务
-     *
-     * @param markGroup
      */
-    void releaseByMarkGroup(MarkGroup markGroup);
+//    void releaseByMarkGroup(MarkGroup markGroup);
 
     void releaseByStudent(MarkStudent student);
 
@@ -85,9 +83,9 @@ public interface MarkService {
     IPage<Task> getHistory(Long userId, int pageNumber, int pageSize, Sort sort, String order, Long examId, String paperNumber,
                            Integer groupNumber, String secretNumber, Double markerScore);
 
-    SubmitResult saveTask(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkResult markResult);
+    SubmitResult saveTask(Long examId, String paperNumber, Long userId, MarkResult markResult);
 
-    void clear(Long userId, Long examId, String paperNumber, Integer groupNumber);
+    void clear(Long userId, Long examId, String paperNumber);
 
     boolean applyTask(MarkTask t, Long userId);
 
@@ -99,7 +97,7 @@ public interface MarkService {
 
     void updateMarkGroupStatus(Long examId, String paperNumber);
 
-    void checkStudentSubjectiveScore(Long examId, String coursePaperId, long groupCount, long unGroupQuestionCount);
+    void checkStudentSubjectiveScore(Long examId, String coursePaperId, long unGroupQuestionCount);
 
     boolean rejectMarkTask(MarkTask markTask, Long userId, String reason);
 }

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

@@ -132,7 +132,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     List<MarkStudent> listAbsentOrBreachMarkTaskStudent(Long examId, String paperNumber);
 
-    List<MarkStudent> listUnMarkTaskStudent(Long examId, String paperNumber, Integer groupNumber, int pageSize);
+    List<MarkStudent> listUnMarkTaskStudent(Long examId, String paperNumber, Long questionId, int pageSize);
 
     void calculateObjectiveScore(MarkStudent student);
 

+ 3 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java

@@ -17,7 +17,8 @@ import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
  */
 public interface MarkSubjectiveScoreService extends IMppService<MarkSubjectiveScore> {
 
-    List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber);
+    List<MarkSubjectiveScore> listByStudentIdAndQuestionId(Long studentId, Long questionId);
+    MarkSubjectiveScore getByStudentIdAndQuestionId(Long studentId, Long questionId);
 
     Set<Integer> listMainNumberByStudentIdAndUncalculate(Long studentId, boolean uncalculate);
 
@@ -25,11 +26,9 @@ public interface MarkSubjectiveScoreService extends IMppService<MarkSubjectiveSc
 
     void deleteByStudentId(Long studentId);
 
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
-
 	List<QuestionVo> getSubjectiveVo(List<Long> studentIds);
 	
 	  List<MarkSubjectiveScore> listByStudentId(Long studentId);
 
-    void updateRejected(Long studentId, Integer groupNumber, boolean rejectd);
+    void updateRejected(Long studentId, Long questionId, boolean rejectd);
 }

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

@@ -1,6 +1,5 @@
 package com.qmth.teachcloud.mark.service;
 
-import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import org.slf4j.Logger;
@@ -16,7 +15,7 @@ public interface MarkSyncService {
 
     void updateQuality(List<MarkUserQuestion> markUserGroups, String lockKey);
 
-    void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo);
+//    void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo);
 
     void calcObjectiveScore(MarkPaper markPaper);
 }

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

@@ -7,11 +7,15 @@ import javax.servlet.http.HttpServletResponse;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkManageDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
+import com.qmth.teachcloud.mark.params.MarkResultQuestion;
 
 /**
  * <p>
@@ -27,68 +31,67 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     void exportMarker(Long examId, Long courseId, String paperNumber, HttpServletResponse response);
 
-    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(Long examId, String paperNumber, Integer groupNumber, Long userId, String className);
+    List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(Long examId, String paperNumber, Long questionId, Long userId, String className);
 
     Integer markedCount(List<MarkTask> groupNumberMarkTask);
 
-    int countByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId);
+    int countByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId);
 
-    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusNotIn(Long examId, String paperNumber, Integer groupNumber, Long userId, List<MarkTaskStatus> statusList);
+    List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndStatusNotIn(Long examId, String paperNumber, Long questionId, Long userId, List<MarkTaskStatus> statusList);
 
     boolean resetById(Long markTaskId, Long userId, String rejectReason, Long rejectId, Long date, MarkTaskStatus newStatus);
 
-    int countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(Long examId, String paperNumber, Integer groupNumber, List<MarkTaskStatus> statusList);
+    int countByExamIdAndPaperNumberAndQuestionIdAndStatusIn(Long examId, String paperNumber, Long questionId, List<MarkTaskStatus> statusList);
 
     int countByExamIdAndPaperNumberAndStatusIn(Long examId, String paperNumber, List<MarkTaskStatus> statusList);
 
-    MarkTask getLastOneByUserIdAndStatus(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkTaskStatus status);
+    MarkTask getLastOneByUserIdAndStatus(Long examId, String paperNumber, Long questionId, Long userId, MarkTaskStatus status);
 
-    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndStudentId(Long examId, String paperNumber, Integer groupNumber, Long studentId);
+    List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndStudentId(Long examId, String paperNumber, Long questionId, Long studentId);
 
-    List<MarkTask> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber);
+    List<MarkTask> listByStudentIdAndQuestionId(Long studentId, Long questionId);
 
-    void updateHeaderResult(Long examId, String paperNumber, Integer groupNumber, Long studentId, Long updateUserId, Double totalScore, String scoreList, Long updateTime, MarkTaskStatus arbitrated);
+    void updateHeaderResult(Long examId, String paperNumber, Long questionId, Long studentId, Long updateUserId, Double markerScore, TrackDTO[] tracks, SpecialTagDTO[] specialTags, Long updateTime, MarkTaskStatus arbitrated);
 
     void deleteByStudentId(Long studentId);
 
-    int countByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
-
-    int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Integer groupNumber, Long userId, List<String> className, MarkTaskStatus... status);
-
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, Long userId, List<String> className, MarkTaskStatus... status);
 
     IPage<MarkTask> listPageHistory(Page<MarkTask> page, Long userId, Long examId, String paperNumber,
                                     Integer groupNumber, String secretNumber, Double markerScore);
 
-    List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Integer groupNumber, Long userId);
+    List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
 
-    List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Integer groupNumber,
-                                           Long userId);
+    List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, QuestionModel questionModel);
 
     int countByIdAndStatus(Long id, MarkTaskStatus status);
 
-    List<MarkTask> findByStudentIdAndGroupNumberAndStatus(Long studentId, Integer groupNumber, MarkTaskStatus... status);
+    List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status);
 
     boolean updateProblemResult(Long taskId, Long userId, Long now, int spent);
 
-    boolean updateStatusByStudentIdAndGroupNumber(Long studentId, Integer groupNumber, MarkTaskStatus status);
+    boolean updateStatusByStudentIdAndQuestionId(Long studentId, Long questionId, MarkTaskStatus status);
 
-    int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long examId, String paperNumber, Integer groupNumber, Long userId, Long taskId);
+    int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long examId, String paperNumber, Long questionId, Long userId, Long taskId);
 
-    boolean updateMarkerResult(Long taskId, MarkTaskStatus marked, Long userId, Double markerScore, String scoreList,
-                               Long now, int spent, MarkTaskStatus... inStatus);
+    boolean updateMarkerResult(Long taskId, MarkTaskStatus marked, Long userId, MarkResultQuestion result,
+                               Long now, MarkTaskStatus... inStatus);
 
-    int countByExamIdAndPaperNumberAndGroupNumberAndTaskNumber(Long examId, String paperNumber, Integer groupNumber, int taskNumber);
+    int countByExamIdAndPaperNumberAndQuestionIdAndTaskNumber(Long examId, String paperNumber, Long questionId, int taskNumber);
 
     int countByStudentId(Long studentId);
 
     int countByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Integer groupNumber, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize);
+    IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize);
 
     void rejectMarkTask(Long id, String rejectReason);
 
     Task getMarkTrack(Long id);
 
     MarkManageDto selectMarkedCountAndTotalCount(Long examId, String paperNumber);
+
+    List<MarkTask> listByStudentId(Long studentId);
+
+    Long minQuestionIdByExamIdAndPaperNumber(Long examId, String paperNumber, MarkTaskStatus...statuses);
 }

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

@@ -21,11 +21,13 @@ import java.util.List;
  */
 public interface MarkUserClassService extends IService<MarkUserClass> {
 
+    MarkUserClassDto updateOpenMarkClassByExamIdAndPaperNumber(Long examId, String paperNumber, Boolean classMark);
+
     void deleteByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber);
+//    MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(Long examId, String paperNumber, Integer groupNumber, String className);
+    List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className);
 
     boolean saveMarkClassUser(MarkClassUserParams markClassUserParams);
 

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

@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface MarkUserPaperService extends IService<MarkUserPaper> {
 
+    MarkUserPaper getByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
 }

+ 17 - 18
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserGroupService.java → teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserQuestionService.java

@@ -10,6 +10,7 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 
 import java.util.List;
 
@@ -21,25 +22,23 @@ import java.util.List;
  * @author xf
  * @since 2023-09-22
  */
-public interface MarkUserGroupService extends IService<MarkUserQuestion> {
+public interface MarkUserQuestionService extends IService<MarkUserQuestion> {
 
     IPage<MarkEntranceDto> listEntranceGroup(Long examId, Long openCollegeId, Long courseCode, String paperNumber,
             Integer pageNumber, Integer pageSize);
 
-    List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(Long examId, String paperNumber,
-            Integer number, String className);
+    List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className);
 
-    IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber,
-            Integer groupNumber, String loginName, String className, Integer pageNumber, Integer pageSize);
+    IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber,
+            Long questionId, String loginName, String className, Integer pageNumber, Integer pageSize);
 
-    void addMarkUserGroup(Long examId, String paperNumber, Integer groupNumber, List<Long> userIds);
+    void addMarkUserQuestion(Long examId, String paperNumber, List<Long> questionIds, List<Long> userIds);
 
-    void setTopCount(List<Long> markUserGroupIds, Integer topCount);
+    void setTopCount(List<Long> markUserQuestionIds, Integer topCount);
 
-    MarkUserQuestion getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber,
-                                                                      Long userId);
+    MarkUserQuestion getByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId);
 
-    void deleteMarker(Long markUserGroupId);
+    void deleteMarker(MarkUserQuestion markUserQuestion);
 
     void releaseMarker(List<Long> markUserGroupIds);
 
@@ -47,24 +46,24 @@ public interface MarkUserGroupService extends IService<MarkUserQuestion> {
 
     void resetById(Long id);
 
-    IPage<MarkQualityDto> pageQuality(Long examId, String paperNumber, Integer groupNumber, String loginName, Integer pageNumber, Integer pageSize);
+    IPage<MarkQualityDto> pageQuality(Long examId, String paperNumber, Long questionId, String loginName, Integer pageNumber, Integer pageSize);
 
-    void updateQuality(Long examId, String paperNumber, Integer groupNumber);
+    void updateQuality(Long examId, String paperNumber, Long questionId);
 
-    List<MarkUserQuestion> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    List<MarkUserQuestion> listByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 
     void updateQualityById(Long markUserGroupId, int finishCount, int headerFinishCount, int validCount, double v,
             double avgScore, double stdevScore, double maxScore, double minScore);
 
-    List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Integer groupNumber);
+    List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Long questionId);
 
     List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
 
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 
-    void updateMode(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkMode mode);
+    void updateMode(Long examId, String paperNumber, Long userId, MarkMode mode, QuestionModel questionModel);
 
-    List<String> listBindMarkers(Long examId, String paperNumber, Integer groupNumber);
+    List<String> listBindMarkers(Long examId, String paperNumber, Long questionId);
 
     /**
      * 查询评卷任务待办/已办数量
@@ -75,5 +74,5 @@ public interface MarkUserGroupService extends IService<MarkUserQuestion> {
      */
     int countByMarkTask(Long userId, MarkPaperStatus status);
 
-    void updateRejectCountByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId);
+    void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId);
 }

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

@@ -1,12 +1,12 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.entity.MarkArbitrateHistory;
-import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 
 public interface TaskService {
-    Task build(MarkArbitrateHistory markArbitrateHistory, MarkGroup markGroup);
+    Task build(MarkArbitrateHistory markArbitrateHistory, MarkQuestion markQuestion);
 
     Task build(Long studentId);
 

+ 29 - 37
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkArbitrateStatus;
@@ -20,11 +21,14 @@ 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.entity.MarkArbitrateHistory;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
+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.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkArbitrateHistoryMapper;
-import com.qmth.teachcloud.mark.params.MarkResult;
+import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
 import com.qmth.teachcloud.mark.service.*;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -52,13 +56,11 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     @Resource
     private MarkQuestionService markQuestionService;
     @Resource
-    private MarkGroupService markGroupService;
-    @Resource
     private MarkStudentService markStudentService;
     @Resource
     private MarkTaskService markTaskService;
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserQuestionService;
     @Resource
     private SysUserService sysUserService;
     @Resource
@@ -71,9 +73,9 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     private LockService lockService;
 
     @Override
-    public IPage<MarkArbitrateDto> pageArbitrate(Long examId, String paperNumber, Integer groupNumber, String status, String className, Integer pageNumber, Integer pageSize) {
+    public IPage<MarkArbitrateDto> pageArbitrate(Long examId, String paperNumber, Long questionId, String status, String className, Integer pageNumber, Integer pageSize) {
         Page<MarkArbitrateDto> page = new Page<>(pageNumber, pageSize);
-        IPage<MarkArbitrateDto> markArbitrateDtoIPage = this.baseMapper.pageArbitrate(page, examId, paperNumber, groupNumber, status, className);
+        IPage<MarkArbitrateDto> markArbitrateDtoIPage = this.baseMapper.pageArbitrate(page, examId, paperNumber, questionId, status, className);
         for (MarkArbitrateDto arbitrateDto : markArbitrateDtoIPage.getRecords()) {
             if (arbitrateDto.getStudentId() != null) {
                 MarkStudentVo markStudent = markStudentService.getMarkStudentVoByStudentId(arbitrateDto.getStudentId());
@@ -101,11 +103,11 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     @Override
     public List<MarkArbitrateMarkerDto> listMarkerArbitrateRecord(Long arbitrateId) {
         MarkArbitrateHistory markArbitrateHistory = this.getById(arbitrateId);
-        List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndStudentId(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber(), markArbitrateHistory.getStudentId());
+        List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndStudentId(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getQuestionId(), markArbitrateHistory.getStudentId());
         List<MarkArbitrateMarkerDto> markArbitrateMarkerDtoList = new ArrayList<>();
         for (MarkTask markTask : markTaskList) {
             MarkArbitrateMarkerDto markArbitrateMarkerDto = new MarkArbitrateMarkerDto();
-            MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(markTask.getExamId(), markTask.getPaperNumber(), markTask.getGroupNumber(), markTask.getUserId());
+            MarkUserQuestion markUserGroup = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(markTask.getExamId(), markTask.getPaperNumber(), markTask.getQuestionId(), markTask.getUserId());
             if (markUserGroup != null) {
                 markArbitrateMarkerDto.setUserId(markTask.getUserId());
                 SysUser sysUser = sysUserService.getById(markTask.getUserId());
@@ -114,7 +116,6 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
                     markArbitrateMarkerDto.setUserName(sysUser.getRealName());
                 }
                 markArbitrateMarkerDto.setMarkTime(markTask.getMarkerTime());
-                markArbitrateMarkerDto.setScoreList(markTask.getMarkerScoreList());
                 markArbitrateMarkerDto.setTotalScore(markTask.getMarkerScore());
             }
             markArbitrateMarkerDtoList.add(markArbitrateMarkerDto);
@@ -123,7 +124,7 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     }
 
     @Override
-    public MarkArbitrateSettingDto getArbitrateSetting(Long arbitrateId, Long examId, String paperNumber, Integer groupNumber) {
+    public MarkArbitrateSettingDto getArbitrateSetting(Long arbitrateId, Long examId, String paperNumber, Long questionId) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         MarkArbitrateHistory markArbitrateHistory;
         if (arbitrateId != null) {
@@ -134,7 +135,7 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
             examId = markArbitrateHistory.getExamId();
             paperNumber = markArbitrateHistory.getPaperNumber();
         } else {
-            if (examId == null || StringUtils.isBlank(paperNumber) || groupNumber == null) {
+            if (examId == null || StringUtils.isBlank(paperNumber) || questionId == null) {
                 throw ExceptionResultEnum.ERROR.exception("参数有误");
             }
         }
@@ -164,7 +165,7 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     }
 
     @Override
-    public Task getArbitrateTask(Long arbitrateId, Long examId, String paperNumber, Integer groupNumber) {
+    public Task getArbitrateTask(Long arbitrateId, Long examId, String paperNumber, Long questionId) {
         MarkArbitrateHistory markArbitrateHistory;
         if (arbitrateId != null) {
             markArbitrateHistory = this.getById(arbitrateId);
@@ -172,32 +173,32 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
                 throw ExceptionResultEnum.ERROR.exception("数据已处理,请刷新数据列表");
             }
         } else {
-            if (examId == null || StringUtils.isBlank(paperNumber) || groupNumber == null) {
+            if (examId == null || StringUtils.isBlank(paperNumber) || questionId == null) {
                 throw ExceptionResultEnum.ERROR.exception("参数有误");
             }
-            markArbitrateHistory = this.baseMapper.getArbitrateWaitingOne(examId, paperNumber, groupNumber);
+            markArbitrateHistory = this.baseMapper.getArbitrateWaitingOne(examId, paperNumber, questionId);
         }
         if (markArbitrateHistory == null) {
             return null;
         }
-        MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber());
-        return taskService.build(markArbitrateHistory, markGroup);
+        MarkQuestion markQuestion = markQuestionService.getById(markArbitrateHistory.getQuestionId());
+        return taskService.build(markArbitrateHistory, markQuestion);
     }
 
     @Override
-    public void saveArbitrateTask(MarkResult markResult) {
+    public void saveArbitrateTask(MarkHeaderGroupResult markResult) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         MarkArbitrateHistory markArbitrateHistory = this.getById(markResult.getTaskId());
         if (markArbitrateHistory != null) {
             try {
                 lockService.watch(LockType.EXAM_SUBJECT, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber());
-                lockService.watch(LockType.GROUP, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber());
+                lockService.watch(LockType.GROUP, markArbitrateHistory.getQuestionId());
                 markService.processArbitrate(markResult, sysUser.getId());
                 releaseTask(markArbitrateHistory.getId());
             } catch (Exception e) {
                 log.error("ArbitrateController-处理仲裁卷出错", e);
             } finally {
-                lockService.unwatch(LockType.GROUP, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber(), markArbitrateHistory.getGroupNumber());
+                lockService.unwatch(LockType.GROUP,  markArbitrateHistory.getQuestionId());
                 lockService.unwatch(LockType.EXAM_SUBJECT, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber());
             }
         } else {
@@ -213,21 +214,12 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     }
 
     @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);
-    }
-
-    @Override
-    public JSONObject getArbitrateStatus(Long examId, String paperNumber, Integer groupNumber) {
+    public JSONObject getArbitrateStatus(Long examId, String paperNumber, Long questionId) {
         Long userId = ServletUtil.getRequestUserId();
         QueryWrapper<MarkArbitrateHistory> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkArbitrateHistory::getExamId, examId)
                 .eq(MarkArbitrateHistory::getPaperNumber, paperNumber)
-                .eq(MarkArbitrateHistory::getGroupNumber, groupNumber);
+                .eq(MarkArbitrateHistory::getQuestionId, questionId);
         List<MarkArbitrateHistory> markArbitrateHistoryList = this.list(queryWrapper);
         JSONObject jsonObject = new JSONObject();
         if (CollectionUtils.isEmpty(markArbitrateHistoryList)) {
@@ -245,14 +237,14 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     }
 
     @Override
-    public List<Task> getHistory(Long examId, String paperNumber, Integer groupNumber, Integer pageNumber, Integer pageSize) {
+    public List<Task> getHistory(Long examId, String paperNumber, Long questionId, Integer pageNumber, Integer pageSize) {
         Long userId = ServletUtil.getRequestUserId();
         Page<MarkArbitrateHistory> page = new Page<>(pageNumber, pageSize);
-        List<MarkArbitrateHistory> markArbitrateHistoryList = this.baseMapper.getHistory(page, examId, paperNumber, groupNumber, MarkArbitrateStatus.MARKED.name(), userId);
+        List<MarkArbitrateHistory> markArbitrateHistoryList = this.baseMapper.getHistory(page, examId, paperNumber, questionId, MarkArbitrateStatus.MARKED.name(), userId);
         List<Task> taskList = new ArrayList<>();
-        MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+        MarkQuestion markQuestion = markQuestionService.getById(questionId);
         for (MarkArbitrateHistory history : markArbitrateHistoryList) {
-            Task task = taskService.build(history, markGroup);
+            Task task = taskService.build(history, markQuestion);
             task.setPrevious(true);
             taskList.add(task);
         }
@@ -260,8 +252,8 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     }
 
     @Override
-    public Integer waitArbitrateCount(Long examId, String paperNumber, Integer groupNumber, String className) {
-        return this.baseMapper.waitArbitrateCount(examId, paperNumber, groupNumber, MarkArbitrateStatus.WAITING.name(), className);
+    public Integer waitArbitrateCount(Long examId, String paperNumber, Long questionId, String className) {
+        return this.baseMapper.waitArbitrateCount(examId, paperNumber, questionId, MarkArbitrateStatus.WAITING.name(), className);
     }
 
     private void releaseTask(Long taskId) {

+ 0 - 557
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java

@@ -1,557 +0,0 @@
-package com.qmth.teachcloud.mark.service.impl;
-
-import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-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.github.jeffreyning.mybatisplus.service.MppServiceImpl;
-import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
-import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
-import com.qmth.teachcloud.common.bean.params.mark.group.GroupPictureConfigParams;
-import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.mark.bean.answercard.CardFile;
-import com.qmth.teachcloud.mark.dto.mark.manage.*;
-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.MarkGroup;
-import com.qmth.teachcloud.mark.entity.MarkPaper;
-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.common.enums.ScorePolicy;
-import com.qmth.teachcloud.mark.lock.LockService;
-import com.qmth.teachcloud.mark.mapper.MarkGroupMapper;
-import com.qmth.teachcloud.mark.service.*;
-import com.qmth.teachcloud.mark.utils.Calculator;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- * 评卷分组表 服务实现类
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@Service
-public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGroup> implements MarkGroupService {
-
-    @Resource
-    private MarkQuestionService markQuestionService;
-    @Resource
-    private MarkGroupService markGroupService;
-    @Resource
-    private MarkPaperService markPaperService;
-    @Resource
-    private MarkUserGroupService markUserGroupService;
-    @Resource
-    private MarkUserClassService markUserClassService;
-    @Resource
-    private MarkArbitrateHistoryService markArbitrateHistoryService;
-    @Resource
-    private MarkTaskService markTaskService;
-    @Resource
-    private MarkStudentService markStudentService;
-    @Resource
-    private MarkService markService;
-    @Resource
-    private MarkSyncService markSyncService;
-    @Resource
-    private LockService lockService;
-
-    @Override
-    public MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber) {
-        MarkGroupTaskDto markGroupTaskDto = new MarkGroupTaskDto();
-        markGroupTaskDto.setExamId(examId);
-        markGroupTaskDto.setPaperNumber(paperNumber);
-
-        // 分组信息
-        List<MarkGroup> groupList = listGroupByExamIdAndPaperNumber(examId, paperNumber);
-        if (CollectionUtils.isNotEmpty(groupList)) {
-            List<MarkGroupDto> markGroupDtoList = new ArrayList<>();
-            for (MarkGroup markGroup : groupList) {
-                MarkGroupDto markGroupDto = new MarkGroupDto();
-                markGroupDto.setGroupNumber(markGroup.getNumber());
-                markGroupDto.setDoubleEnable(markGroup.getDoubleEnable());
-                markGroupDto.setDoubleRate(markGroup.getDoubleRate());
-                markGroupDto.setArbitrateThreshold(markGroup.getArbitrateThreshold());
-                markGroupDto.setScorePolicy(markGroup.getScorePolicy());
-                if (StringUtils.isNotBlank(markGroup.getPicList())) {
-                    markGroupDto.setPictureConfigs(JSON.parseArray(markGroup.getPicList(), PictureConfig.class));
-                }
-                // 评卷员
-                markGroupDto.setMarkers(markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, markGroup.getNumber(), null));
-                // 题目
-                markGroupDto.setQuestions(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber(), false));
-                markGroupDto.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, markGroup.getNumber()));
-                markGroupDtoList.add(markGroupDto);
-            }
-            markGroupTaskDto.setGroups(markGroupDtoList);
-        }
-        // 分班阅参数
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        markGroupTaskDto.setOpenMarkClass(markPaper != null && markPaper.getOpenMarkClass());
-        markGroupTaskDto.setOpenDoubleMarking(markPaper != null && markPaper.getDoubleMark());
-        return markGroupTaskDto;
-    }
-
-    @Override
-    public List<MarkGroup> listGroupByExamIdAndPaperNumber(Long examId, String paperNumber) {
-        QueryWrapper<MarkGroup> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkGroup::getExamId, examId)
-                .eq(MarkGroup::getPaperNumber, paperNumber)
-                .orderByAsc(MarkGroup::getNumber);
-        return this.list(queryWrapper);
-    }
-
-    @Transactional
-    @Override
-    public void deleteGroupByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        List<MarkTaskStatus> markTaskStatuses = Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM, MarkTaskStatus.ARBITRATED);
-        if (markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber, groupNumber, markTaskStatuses) > 0) {
-            throw ExceptionResultEnum.ERROR.exception("该分组已开始评卷,不允许删除");
-        }
-        MarkGroup markGroup = this.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-        if (lockService.trylock(LockType.GROUP_DELETE, examId, paperNumber, groupNumber)) {
-            markSyncService.deleteMarkGroup(markGroup, true);
-        }
-
-    }
-
-    @Override
-    public void updatePicListByExamIdAndPaperNumberAndGroupNumber(GroupPictureConfigParams groupPictureConfigParams) {
-        List<PictureConfig> pictureConfigs = groupPictureConfigParams.getPictureConfigs();
-        if (CollectionUtils.isEmpty(pictureConfigs)) {
-            throw ExceptionResultEnum.ERROR.exception("没有评卷区数据");
-        }
-        UpdateWrapper<MarkGroup> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkGroup::getPicList, JSON.toJSONString(pictureConfigs))
-                .eq(MarkGroup::getExamId, groupPictureConfigParams.getExamId())
-                .eq(MarkGroup::getPaperNumber, groupPictureConfigParams.getPaperNumber())
-                .eq(MarkGroup::getNumber, groupPictureConfigParams.getGroupNumber());
-        this.update(updateWrapper);
-    }
-
-    @Transactional
-    @Override
-    public void updateOpenMarkClassByExamIdAndPaperNumber(Long examId, String paperNumber, Boolean openMarkClass) {
-        UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkPaper::getOpenMarkClass, openMarkClass)
-                .eq(MarkPaper::getExamId, examId)
-                .eq(MarkPaper::getPaperNumber, paperNumber);
-        markPaperService.update(updateWrapper);
-
-        if (openMarkClass != null) {
-            // 开启分班阅,根据任课老师自动绑定班级
-            if (openMarkClass) {
-                markUserClassService.autoBindTeacherIdAndTeachClassName(examId, paperNumber);
-            } else {
-                // 禁用,删除分班数据
-                markUserClassService.deleteByExamIdAndPaperNumber(examId, paperNumber);
-            }
-        }
-    }
-
-    @Override
-    public MarkGroup getByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        QueryWrapper<MarkGroup> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkGroup::getExamId, examId)
-                .eq(MarkGroup::getPaperNumber, paperNumber)
-                .eq(MarkGroup::getNumber, groupNumber);
-        return this.getOne(queryWrapper);
-    }
-
-    @Override
-    public MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber) {
-        MarkGroupSummaryProgressDto markGroupSummaryProgressDto = new MarkGroupSummaryProgressDto();
-
-        // totalInfo
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        if (markPaper == null) {
-            return markGroupSummaryProgressDto;
-        }
-        markGroupSummaryProgressDto.setOpenMarkClass(markPaper.getOpenMarkClass());
-        MarkGroupTotalProgressDto markGroupTotalProgressDto = new MarkGroupTotalProgressDto();
-        markGroupTotalProgressDto.setStudentCount(markPaper.getStudentCount());
-        markGroupTotalProgressDto.setUploadCount(markStudentService.countUploadedByExamIdAndPaperNumber(examId, paperNumber));
-        markGroupTotalProgressDto.setAbsentCount(markStudentService.countAbsentByExamIdAndPaperNumber(examId, paperNumber));
-
-        int totalCount = markTaskService.countByExamIdAndPaperNumber(examId, paperNumber);
-        int markedCount = markTaskService.countByExamIdAndPaperNumberAndStatusIn(examId, paperNumber, Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
-        markGroupTotalProgressDto.setPercent(Calculator.divide2String(Calculator.multiply(markedCount, 100), Double.valueOf(totalCount), 2));
-        markGroupSummaryProgressDto.setTotalInfo(markGroupTotalProgressDto);
-
-        // groupInfo
-        List<MarkGroupProgressDto> markGroupProgressDtoList = new ArrayList<>();
-        List<MarkGroup> markGroupList = this.listGroupByExamIdAndPaperNumber(examId, paperNumber);
-        for (MarkGroup markGroup : markGroupList) {
-            MarkGroupProgressDto markGroupProgressDto = new MarkGroupProgressDto();
-            markGroupProgressDto.setGroupNumber(markGroup.getNumber());
-            markGroupProgressDto.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, markGroup.getNumber()));
-            List<MarkUser> markUserList = markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, markGroup.getNumber(), null);
-            markGroupProgressDto.setMarkerCount(markUserList.size());
-            markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber(), false));
-            markGroupProgressDto.setScoreList(markGroup.getScoreList());
-            markGroupProgressDto.setTaskCount(markGroup.getTaskCount());
-            markGroupProgressDto.setMarkedCount(markGroup.getMarkedCount());
-            markGroupProgressDto.setLeftCount(markGroupProgressDto.getTaskCount() - markGroupProgressDto.getMarkedCount());
-            markGroupProgressDto.setCurrentCount(markService.applyCurrentCount(markGroup));
-            markGroupProgressDto.setPercent(Calculator.divide2String(Calculator.multiply(markGroupProgressDto.getMarkedCount(), 100), Double.valueOf(markGroupProgressDto.getTaskCount()), 2));
-            markGroupProgressDto.setArbitrateCount(markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, markGroup.getNumber(), null));
-            markGroupProgressDtoList.add(markGroupProgressDto);
-        }
-        markGroupSummaryProgressDto.setGroupInfo(markGroupProgressDtoList);
-        return markGroupSummaryProgressDto;
-    }
-
-    @Override
-    public IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, String className, Integer pageNumber, Integer pageSize) {
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        if (markPaper.getOpenMarkClass()) {
-            Page<MarkGroupClassProgressDto> page = new Page<>(pageNumber, pageSize);
-            IPage<MarkGroupClassProgressDto> markGroupClassProgressDtoIPage = markUserClassService.pageClassByExamIdAndPaperNumber(page, examId, paperNumber, className);
-            for (MarkGroupClassProgressDto markGroupClassProgressDto : markGroupClassProgressDtoIPage.getRecords()) {
-                Integer groupNumber = markGroupClassProgressDto.getGroupNumber();
-                List<MarkTask> totalMarkTaskList = new ArrayList<>();
-                List<MarkUser> totalMarkUserList = new ArrayList<>();
-                totalMarkTaskList.addAll(markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(examId, paperNumber, groupNumber, null, markGroupClassProgressDto.getClassName()));
-                totalMarkUserList.addAll(markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, groupNumber, markGroupClassProgressDto.getClassName()));
-
-                MarkGroup markGroup = this.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-                markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber, false));
-                List<MarkUser> markUserList = markUserClassService.listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, groupNumber, markGroupClassProgressDto.getClassName());
-                int count = 0;
-                for (MarkUser markUser : markUserList) {
-                    MarkUserQuestion markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, markUser.getUserId());
-                    if (markUserGroup != null) {
-                        int markerCount = markService.applyCurrentCount(markGroup, markUserGroup.getId());
-                        count += markerCount;
-                    }
-                }
-
-                // 待仲裁数量
-                int arbitrateCount = markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, groupNumber, markGroupClassProgressDto.getClassName());
-                markGroupClassProgressDto.setGroupQuestions(markGroup.getGroupQuestions());
-                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);
-            }
-            return markGroupClassProgressDtoIPage;
-        }
-        return null;
-    }
-
-    @Override
-    public void updateMarkedCount(Long examId, String paperNumber, Integer groupNumber, int count) {
-        UpdateWrapper<MarkGroup> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkGroup::getMarkedCount, count)
-                .eq(MarkGroup::getExamId, examId)
-                .eq(MarkGroup::getPaperNumber, paperNumber)
-                .eq(MarkGroup::getNumber, groupNumber);
-        this.update(updateWrapper);
-    }
-
-    @Transactional
-    @Override
-    public MarkGroup saveGroup(MarkGroupSingleDto markGroupSingleDto) {
-        Long examId = markGroupSingleDto.getExamId();
-        String paperNumber = markGroupSingleDto.getPaperNumber();
-        MarkGroupDto markGroupDto = markGroupSingleDto.getGroupInfo();
-        if (lockService.isLocked(LockType.GROUP_DELETE, examId, paperNumber, markGroupDto.getGroupNumber())) {
-            throw ExceptionResultEnum.ERROR.exception("分组正删除中");
-        }
-        MarkGroup markGroup = this.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
-        if (markGroup != null) {
-            throw ExceptionResultEnum.ERROR.exception("数据已存在");
-        }
-        List<MarkQuestion> questions = markGroupDto.getQuestions();
-        // 分组
-        markGroup = new MarkGroup();
-        markGroup.setExamId(examId);
-        markGroup.setPaperNumber(paperNumber);
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        markGroup.setCourseId(markPaper.getCourseId());
-        markGroup.setNumber(markGroupDto.getGroupNumber());
-        markGroup.setPicList(CardFile.getMarkConfigAdd(markGroupDto.getPictureConfigs(), 0.015));
-        Double totalScore = questions.stream().mapToDouble(MarkQuestion::getTotalScore).sum();
-        markGroup.setTotalScore(totalScore);
-        markGroup.setDoubleEnable(markGroupDto.getDoubleEnable());
-        if (markGroupDto.getDoubleEnable()) {
-            if (markGroupDto.getDoubleRate() == null) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,双评比例必填");
-            }
-            if (markGroupDto.getArbitrateThreshold() == null) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,仲裁阀值必填");
-            } else if (markGroupDto.getArbitrateThreshold() < 0) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,仲裁阀值大于等于0");
-            }
-            if (markGroupDto.getScorePolicy() == null) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,合分规则必填");
-            }
-            markGroup.setDoubleRate(Calculator.round(markGroupDto.getDoubleRate(), 2));
-            markGroup.setArbitrateThreshold(markGroupDto.getArbitrateThreshold());
-            markGroup.setScorePolicy(markGroupDto.getScorePolicy());
-        } else {
-            markGroup.setDoubleRate(null);
-            markGroup.setArbitrateThreshold(null);
-            markGroup.setScorePolicy(ScorePolicy.AVG);
-        }
-
-        markGroup.setTaskCount(0);
-        markGroup.setMarkedCount(0);
-        this.saveOrUpdateByMultiId(markGroup);
-
-        // 题目
-        for (MarkQuestion markQuestion : questions) {
-            MarkQuestion question = markQuestionService.getByExamIdAndPaperNumberAndMainNumberAndSubNumberAndObjective(examId, paperNumber, markQuestion.getMainNumber(), markQuestion.getSubNumber(), false);
-            if (question == null) {
-                throw ExceptionResultEnum.ERROR.exception("大题号[" + markQuestion.getMainNumber() + "],小题号[" + markQuestion.getSubNumber() + "]数据不存在");
-            } else if (question.getGroupNumber() != null) {
-                throw ExceptionResultEnum.ERROR.exception("大题号[" + markQuestion.getMainNumber() + "],小题号[" + markQuestion.getSubNumber() + "]存在评阅题目");
-            }
-            question.setGroupNumber(markGroupDto.getGroupNumber());
-            markQuestionService.updateById(question);
-        }
-
-        // 评卷员
-        List<MarkUser> markers = markGroupDto.getMarkers();
-        if (CollectionUtils.isEmpty(markers)) {
-            throw ExceptionResultEnum.ERROR.exception("请选择评卷员");
-        }
-        List<MarkUserQuestion> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
-        List<Long> userIds = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(markUserGroupList)) {
-            userIds = markUserGroupList.stream().map(MarkUserQuestion::getUserId).collect(Collectors.toList());
-        }
-        List<MarkUserQuestion> markUserGroups = new ArrayList<>();
-        for (MarkUser marker : markGroupDto.getMarkers()) {
-            if (userIds.contains(marker.getUserId())) {
-                continue;
-            }
-            markUserGroups.add(new MarkUserQuestion(examId, paperNumber, markGroupDto.getGroupNumber(), marker.getUserId()));
-        }
-        if (CollectionUtils.isNotEmpty(markUserGroups)) {
-            markUserGroupService.saveBatch(markUserGroups);
-        }
-
-        // 更新MarkPaper中groupStatus
-        markService.updateMarkGroupStatus(examId, paperNumber);
-        return markGroup;
-    }
-
-    @Transactional
-    @Override
-    public MarkGroup updateGroup(MarkGroupSingleDto markGroupSingleDto) {
-        Long examId = markGroupSingleDto.getExamId();
-        String paperNumber = markGroupSingleDto.getPaperNumber();
-        MarkGroupDto markGroupDto = markGroupSingleDto.getGroupInfo();
-        MarkGroup markGroup = this.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
-        Boolean doubleEnable = markGroup.getDoubleEnable();
-        Double doubleRate = markGroup.getDoubleRate();
-        if (markGroup == null) {
-            throw ExceptionResultEnum.ERROR.exception("数据不存在");
-        }
-        if (markGroupDto.getDoubleEnable()) {
-            if (markGroupDto.getDoubleRate() == null) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,双评比例必填");
-            }
-            if (markGroupDto.getArbitrateThreshold() == null) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,仲裁阀值必填");
-            } else if (markGroupDto.getArbitrateThreshold() < 0) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,仲裁阀值大于等于0");
-            }
-            if (markGroupDto.getScorePolicy() == null) {
-                throw ExceptionResultEnum.ERROR.exception("开启双评,合分规则必填");
-            }
-        }
-        markGroup.setDoubleEnable(markGroupDto.getDoubleEnable());
-        markGroup.setDoubleRate(markGroupDto.getDoubleRate());
-        markGroup.setScorePolicy(markGroupDto.getScorePolicy());
-        markGroup.setArbitrateThreshold(markGroupDto.getArbitrateThreshold());
-        markGroup.setPicList(JSON.toJSONString(markGroupDto.getPictureConfigs()));
-        this.updateByMultiId(markGroup);
-
-        List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber(), false);
-        boolean isEqual = compareMarkGroupQuestion(markQuestionList, markGroupDto.getQuestions());
-        if (!isEqual) {
-            // 结构分组号
-            markQuestionService.updateGroupNumberByExamIdAndPaperNumberAndGroupNumber(null, examId, paperNumber, markGroupDto.getGroupNumber());
-            for (MarkQuestion markQuestion : markGroupDto.getQuestions()) {
-                markQuestion.setGroupNumber(markGroupDto.getGroupNumber());
-                markQuestionService.updateById(markQuestion);
-            }
-
-            // 修改分组题目总分
-            List<MarkQuestion> updateMarkQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber(), false);
-            Double totalScore = updateMarkQuestionList.stream().collect(Collectors.summingDouble(MarkQuestion::getTotalScore));
-            markGroupService.updateTotalScore(examId, paperNumber, markGroupDto.getGroupNumber(), totalScore);
-        }
-
-        // 更新MarkPaper中groupStatus
-        markService.updateMarkGroupStatus(examId, paperNumber);
-
-        boolean isClear = !isEqual || !doubleEnable.equals(markGroupDto.getDoubleEnable()) || (markGroupDto.getDoubleEnable() && (doubleRate == null || markGroupDto.getDoubleRate().doubleValue() != doubleRate.doubleValue()));
-        updateMarkUserGroup(isClear, examId, paperNumber, markGroupDto);
-
-        // 增加或减少分组内题目数量和题目变动、单双评切换、开启双评且双评比例值修改过。则删除任务
-        if (isClear) {
-            List<MarkTaskStatus> markTaskStatuses = Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM, MarkTaskStatus.REJECTED, MarkTaskStatus.ARBITRATED);
-            if (markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(examId, paperNumber, markGroupDto.getGroupNumber(), markTaskStatuses) > 0) {
-                throw ExceptionResultEnum.ERROR.exception("该分组已开始评卷,不允许修改");
-            }
-            this.updateMarkedCount(examId, paperNumber, markGroupDto.getGroupNumber(), 0);
-            this.updateTaskCount(examId, paperNumber, markGroupDto.getGroupNumber(), 0);
-            if (lockService.trylock(LockType.GROUP_DELETE, examId, paperNumber, markGroupDto.getGroupNumber())) {
-                markSyncService.deleteMarkGroup(markGroup, false);
-            }
-        }
-        return markGroup;
-    }
-
-    private void updateMarkUserGroup(boolean isClear, Long examId, String paperNumber, MarkGroupDto markGroupDto) {
-        List<MarkUser> markUserList = markGroupDto.getMarkers();
-        if (CollectionUtils.isEmpty(markUserList)) {
-            throw ExceptionResultEnum.ERROR.exception("请选择评卷员");
-        }
-        List<MarkUserQuestion> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroupDto.getGroupNumber());
-        if (CollectionUtils.isEmpty(markUserGroupList)) {
-            markUserGroupList = new ArrayList<>();
-        }
-        List<Long> oldUserIds = markUserGroupList.stream().map(MarkUserQuestion::getUserId).collect(Collectors.toList());
-        List<Long> userIds = markUserList.stream().map(MarkUser::getUserId).collect(Collectors.toList());
-
-        // 需要删除的用户
-        Collection<Long> deleteUserIds = CollectionUtils.subtract(oldUserIds, userIds);
-        if (CollectionUtils.isNotEmpty(deleteUserIds)) {
-            markUserGroupList.stream().filter(m -> deleteUserIds.contains(m.getUserId())).forEach(m -> {
-                markUserGroupService.deleteMarker(m.getId());
-            });
-        }
-
-        // 需要新增的用户
-        List<MarkUserQuestion> markUserGroups = new ArrayList<>();
-        Collection<Long> addUserIds = CollectionUtils.subtract(userIds, oldUserIds);
-        for (Long addUserId : addUserIds) {
-            markUserGroups.add(new MarkUserQuestion(examId, paperNumber, markGroupDto.getGroupNumber(), addUserId));
-        }
-        if (CollectionUtils.isNotEmpty(markUserGroups)) {
-            markUserGroupService.saveBatch(markUserGroups);
-        }
-
-        if (isClear) {
-            // 需要修改的用户
-            Collection<Long> updateUserIds = CollectionUtils.intersection(oldUserIds, userIds);
-            if (CollectionUtils.isNotEmpty(updateUserIds)) {
-                markUserGroupList.stream().filter(m -> updateUserIds.contains(m.getUserId())).forEach(m -> {
-                    markUserGroupService.resetById(m.getId());
-                });
-            }
-        }
-
-    }
-
-    /**
-     * 校验修改前后分组内题目是否一致
-     *
-     * @param oldQuestions 修改前题目
-     * @param questions    修改后题目
-     * @return boolean
-     */
-    private boolean compareMarkGroupQuestion(List<MarkQuestion> oldQuestions, List<MarkQuestion> questions) {
-        if (CollectionUtils.isEmpty(oldQuestions) || CollectionUtils.isEmpty(questions)) {
-            throw ExceptionResultEnum.ERROR.exception("评卷题目异常");
-        }
-        List<String> oldQuestionNumbers = oldQuestions.stream().map(m -> m.getMainNumber() + "." + m.getSubNumber()).collect(Collectors.toList());
-        List<String> questionNumbers = questions.stream().map(m -> m.getMainNumber() + "." + m.getSubNumber()).collect(Collectors.toList());
-        // 不相同,返回false
-        if (!CollectionUtils.isEqualCollection(oldQuestionNumbers, questionNumbers)) {
-            return false;
-        }
-        // 取交集,与其中任意一个list不相同,返回false
-        List<String> intersectionList = (List<String>) CollectionUtils.intersection(oldQuestionNumbers, questionNumbers);
-        if (CollectionUtils.isEmpty(intersectionList) || !CollectionUtils.isEqualCollection(oldQuestionNumbers, intersectionList)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public void updateTaskCount(Long examId, String paperNumber, Integer groupNumber, int taskCount) {
-        UpdateWrapper<MarkGroup> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkGroup::getTaskCount, taskCount)
-                .eq(MarkGroup::getExamId, examId)
-                .eq(MarkGroup::getPaperNumber, paperNumber)
-                .eq(MarkGroup::getNumber, groupNumber);
-        this.update(updateWrapper);
-    }
-
-    @Override
-    public List<MarkGroupQuestionsDto> listGroupQuestions(Long examId, String paperNumber) {
-        List<MarkGroup> markGroupList = this.listGroupByExamIdAndPaperNumber(examId, paperNumber);
-        List<MarkGroupQuestionsDto> markGroupQuestionsDtoList = new ArrayList<>();
-        for (MarkGroup markGroup : markGroupList) {
-            MarkGroupQuestionsDto markGroupQuestionsDto = new MarkGroupQuestionsDto();
-            List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber(), false);
-            markGroup.setQuestionList(markQuestionList);
-            markGroupQuestionsDto.setGroupNumber(markGroup.getNumber());
-            markGroupQuestionsDto.setGroupQuestions(markGroup.getGroupQuestions());
-            markGroupQuestionsDtoList.add(markGroupQuestionsDto);
-        }
-        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);
-    }
-
-    @Override
-    public void updateTotalScore(Long examId, String paperNumber, Integer groupNumber, Double totalScore) {
-        UpdateWrapper<MarkGroup> markGroupUpdateWrapper = new UpdateWrapper<>();
-        markGroupUpdateWrapper.lambda().set(MarkGroup::getTotalScore, totalScore)
-                .eq(MarkGroup::getExamId, examId)
-                .eq(MarkGroup::getPaperNumber, paperNumber)
-                .eq(MarkGroup::getNumber, groupNumber);
-        this.update(markGroupUpdateWrapper);
-    }
-
-    @Override
-    public Integer countCurrentCountByExamIdAndPaperNumber(Long examId, String paperNumber) {
-        int total = 0;
-        List<MarkGroup> markGroupList = this.listGroupByExamIdAndPaperNumber(examId, paperNumber);
-        if (CollectionUtils.isNotEmpty(markGroupList)) {
-            for (MarkGroup markGroup : markGroupList) {
-                total += markService.applyCurrentCount(markGroup);
-            }
-        }
-        return total;
-    }
-}

+ 0 - 55
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupStudentServiceImpl.java

@@ -1,55 +0,0 @@
-package com.qmth.teachcloud.mark.service.impl;
-
-import org.springframework.stereotype.Service;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
-import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
-import com.qmth.teachcloud.mark.entity.MarkGroupStudent;
-import com.qmth.teachcloud.mark.mapper.MarkGroupStudentMapper;
-import com.qmth.teachcloud.mark.service.MarkGroupStudentService;
-
-/**
- * <p>
- * 考生分组状态表 服务实现类
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@Service
-public class MarkGroupStudentServiceImpl extends MppServiceImpl<MarkGroupStudentMapper, MarkGroupStudent> implements MarkGroupStudentService {
-
-    @Override
-    public long countByStudentIdAndStatus(Long studentId, SubjectiveStatus marked) {
-        QueryWrapper<MarkGroupStudent> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkGroupStudent::getStudentId, studentId)
-                .eq(MarkGroupStudent::getStatus, marked);
-        return this.count(queryWrapper);
-    }
-
-    @Override
-    public void deleteByStudentId(Long studentId) {
-        UpdateWrapper<MarkGroupStudent> updateWrapper = new UpdateWrapper<>();
-        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);
-    }
-
-	@Override
-	public MarkGroupStudent getByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
-		QueryWrapper<MarkGroupStudent> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkGroupStudent::getStudentId, studentId)
-                .eq(MarkGroupStudent::getGroupNumber, groupNumber);
-        return this.getOne(queryWrapper);
-	}
-}

+ 21 - 20
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -1,7 +1,6 @@
 package com.qmth.teachcloud.mark.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -16,7 +15,6 @@ import com.qmth.teachcloud.common.bean.dto.mark.MarkSettingDto;
 import com.qmth.teachcloud.common.bean.params.mark.setting.MarkPaperSettingConfig;
 import com.qmth.teachcloud.common.bean.params.mark.setting.MarkPaperSettingList;
 import com.qmth.teachcloud.common.bean.params.mark.setting.MarkPaperSettingParam;
-import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.BasicExam;
@@ -30,7 +28,6 @@ import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
-import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.FileUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -48,7 +45,10 @@ import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
 import com.qmth.teachcloud.mark.dto.mark.score.CheckScoreListDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
-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.ScanAnswerCard;
+import com.qmth.teachcloud.mark.entity.ScanPackage;
 import com.qmth.teachcloud.mark.enums.CardSource;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
 import com.qmth.teachcloud.mark.enums.PaperTypeCheckStatus;
@@ -73,7 +73,6 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Function;
@@ -107,7 +106,7 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
     @Resource
     private MarkStudentService markStudentService;
     @Resource
-    private MarkUserGroupService markUserGroupService;
+    private MarkUserQuestionService markUserQuestionService;
     @Resource
     private MarkDocumentService markDocumentService;
     @Resource
@@ -162,14 +161,15 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 .set(MarkPaper::getSheetView, markPaper.getSheetView())
                 .set(MarkPaper::getShowObjectScore, markPaper.getShowObjectScore())
                 .set(MarkPaper::getAutoScroll, markPaper.getAutoScroll())
-                .set(MarkPaper::getOpenDoubleMarking, markPaper.getOpenDoubleMarking())
+                .set(MarkPaper::getDoubleMark, markPaper.getDoubleMark())
+                .set(MarkPaper::getMergeMarker, markPaper.getMergeMarker())
                 .eq(MarkPaper::getExamId, markPaper.getExamId())
                 .eq(MarkPaper::getPaperNumber, markPaper.getPaperNumber());
         if (StringUtils.isNotBlank(markPaper.getSheetConfig())) {
             lambda.set(MarkPaper::getSheetConfig, markPaper.getSheetConfig());
         }
         // 更新评卷员模式
-        markUserGroupService.updateMode(markPaper.getExamId(), markPaper.getPaperNumber(), null, null, MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode());
+        markUserQuestionService.updateMode(markPaper.getExamId(), markPaper.getPaperNumber(), null, MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode(), null);
         this.update(updateWrapper);
     }
 
@@ -206,11 +206,12 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                     .set(MarkPaper::getExcellentScore, config.getExcellentScore())
                     .set(MarkPaper::getShowObjectScore, config.getShowObjectScore())
                     .set(MarkPaper::getAutoScroll, config.getAutoScroll())
-                    .set(MarkPaper::getOpenDoubleMarking, config.getOpenDoubleMarking())
+                    .set(MarkPaper::getDoubleMark, config.getDoubleMark())
+                    .set(MarkPaper::getMergeMarker, config.getMergeMarker())
                     .eq(MarkPaper::getExamId, markPaperSettingList.getExamId())
                     .eq(MarkPaper::getPaperNumber, markPaperSettingList.getPaperNumber());
             // 更新评卷员模式
-            markUserGroupService.updateMode(markPaperSettingList.getExamId(), markPaperSettingList.getPaperNumber(), null, null, MarkMode.UNLIMITED.equals(config.getMarkMode()) ? MarkMode.TRACK : config.getMarkMode());
+            markUserQuestionService.updateMode(markPaperSettingList.getExamId(), markPaperSettingList.getPaperNumber(), null, MarkMode.UNLIMITED.equals(config.getMarkMode()) ? MarkMode.TRACK : config.getMarkMode(), null);
             this.update(updateWrapper);
         }
     }
@@ -237,13 +238,13 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 }
 
                 // 主观题是否全部分组
-                List<MarkQuestion> markQuestionSubjectiveList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, null, false);
+                List<MarkQuestion> markQuestionSubjectiveList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
                 // 没有主观题,不校验考生评卷
                 if (CollectionUtils.isNotEmpty(markQuestionSubjectiveList)) {
-                    if (markQuestionSubjectiveList.stream().filter(m -> m.getGroupNumber() == null).count() > 0) {
-                        stringJoiner.add(courseInfo + "主观题未全部分组,无法结束评卷");
-                        continue;
-                    }
+//                    if (markQuestionSubjectiveList.stream().filter(m -> m.getGroupNumber() == null).count() > 0) {
+//                        stringJoiner.add(courseInfo + "主观题未全部分组,无法结束评卷");
+//                        continue;
+//                    }
                     // 未缺考、未违纪且已上传图片的考生全部评完
                     if (markStudentService.countByExamIdAndPaperNumberAndMarkStatus(examId, paperNumber, SubjectiveStatus.UNMARK) > 0) {
                         stringJoiner.add(courseInfo + "考生未全部评完,无法结束评卷");
@@ -326,7 +327,7 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
 
 
         // 主观题是否全部分组
-        List<MarkQuestion> markQuestionSubjectiveList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, null, false);
+        List<MarkQuestion> markQuestionSubjectiveList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
         // 没有主观题,不校验考生评卷
         if (CollectionUtils.isNotEmpty(markQuestionSubjectiveList)) {
             // 识别缺考未确认完,不能结束
@@ -618,10 +619,10 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 }
 
                 // 主观题已分组,跳过导入
-                List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, markPaper.getPaperNumber(), false);
-                if (CollectionUtils.isNotEmpty(markQuestionList) && markQuestionList.stream().filter(m -> m.getGroupNumber() != null).count() > 1) {
-                    continue;
-                }
+//                List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, markPaper.getPaperNumber(), false);
+//                if (CollectionUtils.isNotEmpty(markQuestionList) && markQuestionList.stream().filter(m -> m.getGroupNumber() != null).count() > 1) {
+//                    continue;
+//                }
 
                 // 上传电子卡格式
                 String jsonPath = rootPath + File.separator + SystemConstant.getDbUuid() + SystemConstant.JSON_PREFIX;

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

@@ -1,36 +1,29 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.service.TeachcloudCommonService;
-import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
-import org.springframework.stereotype.Service;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.MarkProblemStatus;
 import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.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.MarkQuestionService;
-import com.qmth.teachcloud.mark.service.MarkService;
-import com.qmth.teachcloud.mark.service.MarkStudentService;
-import com.qmth.teachcloud.mark.service.MarkTaskService;
+import com.qmth.teachcloud.mark.service.*;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -101,16 +94,14 @@ public class MarkProblemHistoryServiceImpl extends ServiceImpl<MarkProblemHistor
             if (markTask != null) {
                 try {
                     lockService.watch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
-                    lockService.watch(LockType.GROUP, markTask.getExamId(), markTask.getPaperNumber(),
-                            markTask.getGroupNumber());
+                    lockService.watch(LockType.GROUP, markTask.getQuestionId());
                     if (markTask.getStatus().equals(MarkTaskStatus.PROBLEM)) {
                         markService.rejectMarkTask(markProblemHistory, markTask, sysUser.getId());
                     }
                 } catch (Exception e) {
                     log.error("问题卷打回失败", e);
                 } finally {
-                    lockService.unwatch(LockType.GROUP, markTask.getExamId(), markTask.getPaperNumber(),
-                            markTask.getGroupNumber());
+                    lockService.unwatch(LockType.GROUP, markTask.getQuestionId());
                     lockService.unwatch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
                 }
             }
@@ -135,11 +126,11 @@ public class MarkProblemHistoryServiceImpl extends ServiceImpl<MarkProblemHistor
     }
 
     @Override
-    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+    public void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
         UpdateWrapper<MarkProblemHistory> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().eq(MarkProblemHistory::getExamId, examId)
                 .eq(MarkProblemHistory::getPaperNumber, paperNumber)
-                .eq(MarkProblemHistory::getGroupNumber, groupNumber);
+                .eq(MarkProblemHistory::getQuestionId, questionId);
         this.remove(updateWrapper);
     }
 

+ 244 - 61
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -1,11 +1,18 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.common.bean.dto.mark.MarkUser;
 import com.qmth.teachcloud.common.bean.dto.mark.ObjectiveAnswerDto;
+import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
+import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
 import com.qmth.teachcloud.common.bean.result.ExcelResult;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -16,15 +23,21 @@ import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
+import com.qmth.teachcloud.mark.dto.mark.SubjectiveAnswerFileDto;
+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.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.MarkTaskStatus;
 import com.qmth.teachcloud.mark.mapper.MarkQuestionMapper;
 import com.qmth.teachcloud.mark.params.MarkObjectiveQuestionParams;
 import com.qmth.teachcloud.mark.params.MarkQuestionParams;
 import com.qmth.teachcloud.mark.service.*;
+import com.qmth.teachcloud.mark.utils.Calculator;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -52,10 +65,18 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     @Resource
     private MarkPaperService markPaperService;
     @Resource
-    private MarkGroupService markGroupService;
-    @Resource
     private MarkQuestionAnswerService markQuestionAnswerService;
     @Resource
+    private MarkUserQuestionService markUserQuestionService;
+    @Resource
+    private MarkUserClassService markUserClassService;
+    @Resource
+    private MarkStudentService markStudentService;
+    @Resource
+    private MarkTaskService markTaskService;
+    @Resource
+    private MarkArbitrateHistoryService markArbitrateHistoryService;
+    @Resource
     private MarkService markService;
     @Resource
     private FileStoreUtil fileStoreUtil;
@@ -131,14 +152,12 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                     Optional<MarkQuestion> questionOptional = markQuestionList.stream().filter(m -> m.getId().equals(question.getId())).findFirst();
                     if (questionOptional.isPresent()) {
                         MarkQuestion markQuestion = questionOptional.get();
-                        if (markQuestion.getGroupNumber() != null && markQuestion.getGroupNumber().intValue() > 0) {
-                            if (markQuestion.getTotalScore().doubleValue() - question.getTotalScore().doubleValue() != 0) {
-                                throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改小题满分");
-                            }
-                            // 主观题改客观题
-                            if (!markQuestion.getObjective() && question.getObjective()) {
-                                throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改为客观题题型");
-                            }
+                        if (markQuestion.getTotalScore().doubleValue() - question.getTotalScore().doubleValue() != 0) {
+                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改小题满分");
+                        }
+                        // 主观题改客观题
+                        if (!markQuestion.getObjective() && question.getObjective()) {
+                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改为客观题题型");
                         }
                         if (question.getTotalScore() < 0) {
                             throw ExceptionResultEnum.ERROR.exception("小题满分不能小于0");
@@ -215,45 +234,20 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                 .eq(MarkPaper::getPaperNumber, paperNumber);
         markPaperService.update(updateWrapper);
 
-        // 修改分组题目总分
-        Map<Integer, Double> collectGroupScoreMap = markQuestions.stream().filter(m -> m.getGroupNumber() != null).collect(Collectors.groupingBy(m -> m.getGroupNumber(), Collectors.summingDouble(m -> m.getTotalScore())));
-        if (MapUtils.isNotEmpty(collectGroupScoreMap)) {
-            for (Map.Entry<Integer, Double> entry : collectGroupScoreMap.entrySet()) {
-                markGroupService.updateTotalScore(examId, paperNumber, entry.getKey(), entry.getValue());
-            }
-        }
-
         // 主观题结构有变动
         List<MarkQuestion> subjectiveQuestions = questions.stream().filter(m -> m.getObjective()).collect(Collectors.toList());
         List<MarkQuestion> subjectiveMarkQuestionList = markQuestionList.stream().filter(m -> m.getObjective()).collect(Collectors.toList());
         if (!CollectionUtils.isEqualCollection(subjectiveQuestions, subjectiveMarkQuestionList)) {
             // 未分组的题目
             long unGroupQuestionCount = this.countByExamIdAndPaperNumberAndObjectiveAndGroupNumberIsNull(examId, paperNumber, false);
-            long groupCount = CollectionUtils.size(markGroupService.listGroupByExamIdAndPaperNumber(examId, paperNumber));
             // 考生主观题重新统分
-            markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId(), groupCount, unGroupQuestionCount);
+            markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId(), unGroupQuestionCount);
         }
 
         // 更新分组状态
         markService.updateMarkGroupStatus(examId, paperNumber);
     }
 
-    @Override
-    public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number, Boolean isObjective) {
-        LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = new QueryWrapper<MarkQuestion>().lambda();
-        lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
-                .eq(MarkQuestion::getPaperNumber, paperNumber);
-        if (number != null) {
-            lambdaQueryWrapper.eq(MarkQuestion::getGroupNumber, number);
-        }
-        if (isObjective != null) {
-            lambdaQueryWrapper.eq(MarkQuestion::getObjective, isObjective);
-        }
-        lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
-                .orderByAsc(MarkQuestion::getSubNumber);
-        return this.list(lambdaQueryWrapper);
-    }
-
     @Override
     public void objectiveAnswerSettingModelExport(Long examId, String paperNumber, String paperType, HttpServletResponse response)
             throws Exception {
@@ -415,10 +409,34 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     }
 
     @Override
-    public String uploadSubjectiveFile(Long examId, String paperNumber, MultipartFile file, String md5) {
+    public String uploadSubjectiveFile(Long examId, String paperNumber, String paperType, MultipartFile file, String md5) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if (markPaper == null) {
+            throw ExceptionResultEnum.ERROR.exception("课程不存在");
+        }
+        List<SubjectiveAnswerFileDto> subjectiveAnswerFileDtoList = new ArrayList<>();
+        if (StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
+            subjectiveAnswerFileDtoList = JSON.parseArray(markPaper.getAnswerFilePath(), SubjectiveAnswerFileDto.class);
+        }
         String answerFilePath = fileStoreUtil.uploadFile(file, md5, UploadFileEnum.PDF);
+
+        SubjectiveAnswerFileDto subjectiveAnswerFileDto = null;
+        for (SubjectiveAnswerFileDto answerFileDto : subjectiveAnswerFileDtoList) {
+            if (paperType.equals(answerFileDto.getPaperType())) {
+                answerFileDto.setFilePathVo(JSON.parseObject(answerFilePath, FilePathVo.class));
+                subjectiveAnswerFileDto = answerFileDto;
+            }
+        }
+
+        if (subjectiveAnswerFileDto == null) {
+            subjectiveAnswerFileDto = new SubjectiveAnswerFileDto();
+            subjectiveAnswerFileDto.setPaperType(paperType);
+            subjectiveAnswerFileDto.setFilePathVo(JSON.parseObject(answerFilePath, FilePathVo.class));
+            subjectiveAnswerFileDtoList.add(subjectiveAnswerFileDto);
+        }
+
         UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkPaper::getAnswerFilePath, answerFilePath)
+        updateWrapper.lambda().set(MarkPaper::getAnswerFilePath, JSON.toJSONString(subjectiveAnswerFileDtoList))
                 .eq(MarkPaper::getExamId, examId)
                 .eq(MarkPaper::getPaperNumber, paperNumber);
         markPaperService.update(updateWrapper);
@@ -426,17 +444,22 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     }
 
     @Override
-    public String previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber) {
+    public List<SubjectiveAnswerFileDto> previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        if (markPaper != null) {
-            return teachcloudCommonService.filePreview(markPaper.getAnswerFilePath());
+        List<SubjectiveAnswerFileDto> subjectiveAnswerFileDtoList = new ArrayList<>();
+        if (markPaper != null && StringUtils.isNotBlank(markPaper.getAnswerFilePath())) {
+            subjectiveAnswerFileDtoList = JSON.parseArray(markPaper.getAnswerFilePath(), SubjectiveAnswerFileDto.class);
+            for (SubjectiveAnswerFileDto answerFileDto : subjectiveAnswerFileDtoList) {
+                answerFileDto.setUrl(teachcloudCommonService.filePreview(JSON.toJSONString(answerFileDto.getFilePathVo())));
+                answerFileDto.setFilePathVo(null);
+            }
         }
-        return null;
+        return subjectiveAnswerFileDtoList;
     }
 
     @Override
-    public double sumTotalScoreByGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        Double score = this.baseMapper.sumTotalScoreByGroupNumber(examId, paperNumber, groupNumber);
+    public double sumTotalScoreByQuestionId(Long examId, String paperNumber, Long questionId) {
+        Double score = this.baseMapper.sumTotalScoreByQuestionId(examId, paperNumber, questionId);
         return score != null ? score.doubleValue() : 0d;
     }
 
@@ -477,24 +500,16 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         return markQuestionDto;
     }
 
-    @Override
-    public void updateGroupNumberByExamIdAndPaperNumberAndGroupNumber(Integer newGroupNumber, Long examId, String paperNumber, Integer groupNumber) {
-        UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkQuestion::getGroupNumber, newGroupNumber)
-                .eq(MarkQuestion::getExamId, examId)
-                .eq(MarkQuestion::getPaperNumber, paperNumber)
-                .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);
+        // todo 2025-02-25
+//        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);
+        return 0;
     }
 
     @Override
@@ -557,4 +572,172 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         this.remove(updateWrapper);
     }
 
+    @Override
+    public MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        MarkGroupTaskDto markGroupTaskDto = new MarkGroupTaskDto();
+        markGroupTaskDto.setExamId(examId);
+        markGroupTaskDto.setPaperNumber(paperNumber);
+
+        // 主观题信息
+        List<MarkQuestion> markQuestionList = listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+        for (MarkQuestion m : markQuestionList) {
+            if (StringUtils.isNotBlank(m.getPicList())) {
+                m.setPictureConfigs(JSON.parseArray(m.getPicList(), PictureConfig.class));
+            }
+            // 评卷员
+            m.setMarkers(markUserQuestionService.listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, m.getId(), null));
+        }
+        markGroupTaskDto.setQuestions(markQuestionList);
+        // 分班阅参数
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        markGroupTaskDto.setClassMark(markPaper != null && markPaper.getClassMark());
+        markGroupTaskDto.setDoubleMark(markPaper != null && markPaper.getDoubleMark());
+        markGroupTaskDto.setMergeMarker(markPaper != null && markPaper.getMergeMarker());
+        return markGroupTaskDto;
+    }
+
+    @Override
+    public void updatePicListByQuestionId(QuestionPictureConfigParams questionPictureConfigParams) {
+        List<PictureConfig> pictureConfigs = questionPictureConfigParams.getPictureConfigs();
+        if (CollectionUtils.isEmpty(pictureConfigs)) {
+            throw ExceptionResultEnum.ERROR.exception("没有评卷区数据");
+        }
+        UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkQuestion::getPicList, JSON.toJSONString(pictureConfigs))
+                .eq(MarkQuestion::getId, questionPictureConfigParams.getExamId());
+        this.update(updateWrapper);
+    }
+
+    @Override
+    public Integer countCurrentCountByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        int total = 0;
+        List<MarkQuestion> markQuestionList = this.listByExamIdAndPaperNumber(examId, paperNumber);
+        if (CollectionUtils.isNotEmpty(markQuestionList)) {
+            for (MarkQuestion markQuestion : markQuestionList) {
+                total += markService.applyCurrentCount(markQuestion);
+            }
+        }
+        return total;
+    }
+
+    @Override
+    public MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber) {
+        MarkGroupSummaryProgressDto markGroupSummaryProgressDto = new MarkGroupSummaryProgressDto();
+
+        // totalInfo
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if (markPaper == null) {
+            return markGroupSummaryProgressDto;
+        }
+        markGroupSummaryProgressDto.setClassMark(markPaper.getClassMark());
+        MarkGroupTotalProgressDto markGroupTotalProgressDto = new MarkGroupTotalProgressDto();
+        markGroupTotalProgressDto.setStudentCount(markPaper.getStudentCount());
+        markGroupTotalProgressDto.setUploadCount(markStudentService.countUploadedByExamIdAndPaperNumber(examId, paperNumber));
+        markGroupTotalProgressDto.setAbsentCount(markStudentService.countAbsentByExamIdAndPaperNumber(examId, paperNumber));
+
+        int totalCount = markTaskService.countByExamIdAndPaperNumber(examId, paperNumber);
+        int markedCount = markTaskService.countByExamIdAndPaperNumberAndStatusIn(examId, paperNumber, Arrays.asList(MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
+        markGroupTotalProgressDto.setPercent(Calculator.divide2String(Calculator.multiply(markedCount, 100), Double.valueOf(totalCount), 2));
+        markGroupSummaryProgressDto.setTotalInfo(markGroupTotalProgressDto);
+
+        // groupInfo
+        List<MarkGroupProgressDto> markGroupProgressDtoList = new ArrayList<>();
+        List<MarkQuestion> markQuestionList = this.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+        for (MarkQuestion markQuestion : markQuestionList) {
+            MarkGroupProgressDto markGroupProgressDto = new MarkGroupProgressDto();
+            markGroupProgressDto.setQuestionId(markQuestion.getId());
+            markGroupProgressDto.setTotalScore(markQuestion.getTotalScore());
+            markGroupProgressDto.setQuestionNumber(markQuestion.getQuestionNumber());
+            List<MarkUser> markUserList = markUserQuestionService.listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, markQuestion.getId(), null);
+            markGroupProgressDto.setMarkerCount(markUserList.size());
+            markGroupProgressDto.setTaskCount(markQuestion.getTaskCount());
+            markGroupProgressDto.setMarkedCount(markQuestion.getMarkedCount());
+            markGroupProgressDto.setLeftCount(markGroupProgressDto.getTaskCount() - markGroupProgressDto.getMarkedCount());
+            markGroupProgressDto.setCurrentCount(markService.applyCurrentCount(markQuestion));
+            markGroupProgressDto.setPercent(Calculator.divide2String(Calculator.multiply(markGroupProgressDto.getMarkedCount(), 100), Double.valueOf(markGroupProgressDto.getTaskCount()), 2));
+            markGroupProgressDto.setArbitrateCount(markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, markQuestion.getId(), null));
+            markGroupProgressDtoList.add(markGroupProgressDto);
+        }
+        markGroupSummaryProgressDto.setGroupInfo(markGroupProgressDtoList);
+        return markGroupSummaryProgressDto;
+    }
+
+    @Override
+    public IPage<MarkGroupClassProgressDto> 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();
+                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.getId());
+                        count += markerCount;
+                    }
+                }
+
+                // 待仲裁数量
+                int arbitrateCount = markArbitrateHistoryService.waitArbitrateCount(examId, paperNumber, questionId, markGroupClassProgressDto.getClassName());
+                markGroupClassProgressDto.setQuestionNumber(markQuestion.getQuestionNumber());
+                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);
+            }
+            return markGroupClassProgressDtoIPage;
+        }
+        return null;
+    }
+
+    @Override
+    public List<MarkGroupQuestionsDto> listGroupQuestions(Long examId, String paperNumber) {
+        List<MarkQuestion> markQuestionList = this.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+        List<MarkGroupQuestionsDto> markGroupQuestionsDtoList = new ArrayList<>();
+        for (MarkQuestion markQuestion : markQuestionList) {
+            MarkGroupQuestionsDto markGroupQuestionsDto = new MarkGroupQuestionsDto();
+            markGroupQuestionsDto.setQuestionId(markQuestion.getId());
+            markGroupQuestionsDto.setQuestionNumber(markQuestion.getQuestionNumber());
+            markGroupQuestionsDtoList.add(markGroupQuestionsDto);
+        }
+        return markGroupQuestionsDtoList;
+    }
+
+    @Override
+    public void updateTaskCount(Long questionId, int taskCount) {
+        UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkQuestion::getTaskCount, taskCount)
+                .eq(MarkQuestion::getId, questionId);
+        this.update(updateWrapper);
+    }
+
+    @Override
+    public void updateMarkedCount(Long questionId, int count) {
+        UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkQuestion::getMarkedCount, count)
+                .eq(MarkQuestion::getId, questionId);
+        this.update(updateWrapper);
+    }
+
+    @Override
+    public void updateDoubleMarkByQuestionId(MarkQuestion markQuestion) {
+        UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkQuestion::getDoubleRate, markQuestion.getDoubleRate())
+                .set(MarkQuestion::getArbitrateThreshold, markQuestion.getArbitrateThreshold())
+                .set(MarkQuestion::getScorePolicy, markQuestion.getScorePolicy())
+                .eq(MarkQuestion::getId, markQuestion.getId());
+        this.update(updateWrapper);
+    }
 }

+ 6 - 12
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkRejectHistoryServiceImpl.java

@@ -3,12 +3,13 @@ package com.qmth.teachcloud.mark.service.impl;
 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.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkRejectHistoryDto;
 import com.qmth.teachcloud.mark.entity.MarkRejectHistory;
 import com.qmth.teachcloud.mark.mapper.MarkRejectHistoryMapper;
 import com.qmth.teachcloud.mark.service.MarkQuestionService;
 import com.qmth.teachcloud.mark.service.MarkRejectHistoryService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -28,21 +29,14 @@ public class MarkRejectHistoryServiceImpl extends ServiceImpl<MarkRejectHistoryM
     private MarkQuestionService markQuestionService;
 
     @Override
-    public IPage<MarkRejectHistoryDto> pageRejectHistory(Long examId, String paperNumber, Integer groupNumber, String loginName, String studentCode, String secretNumber, String teachClassName, Integer pageNumber, Integer pageSize) {
-        IPage<MarkRejectHistoryDto> rejectHistoryDtoIPage = this.baseMapper.pageRejectHistory(new Page<>(pageNumber, pageSize), examId, paperNumber, groupNumber, loginName, studentCode, secretNumber, teachClassName);
+    public IPage<MarkRejectHistoryDto> pageRejectHistory(Long examId, String paperNumber, Long questionId, String loginName, String studentCode, String secretNumber, String teachClassName, Integer pageNumber, Integer pageSize) {
+        IPage<MarkRejectHistoryDto> rejectHistoryDtoIPage = this.baseMapper.pageRejectHistory(new Page<>(pageNumber, pageSize), examId, paperNumber, questionId, loginName, studentCode, secretNumber, teachClassName);
         for (MarkRejectHistoryDto record : rejectHistoryDtoIPage.getRecords()) {
             // 分组题目
-            record.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(record.getExamId(), record.getPaperNumber(), record.getGroupNumber()));
+            MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
+            record.setQuestionNumber(markQuestion.getQuestionNumber());
         }
         return rejectHistoryDtoIPage;
     }
 
-    @Override
-    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        UpdateWrapper<MarkRejectHistory> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(MarkRejectHistory::getExamId, examId)
-                .eq(MarkRejectHistory::getPaperNumber, paperNumber)
-                .eq(MarkRejectHistory::getGroupNumber, groupNumber);
-        this.remove(updateWrapper);
-    }
 }

文件差異過大導致無法顯示
+ 283 - 445
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java


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

@@ -256,15 +256,6 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             // 原图
             scoreDetailDto.setSheetUrls(buildSheetUrls(scoreDetailDto.getStudentId()));
             scoreDetailDto.setSheetPath(null);
-            // 状态
-//            if (ScanStatus.UNEXIST.equals(scoreDetailDto.getScanStatus())) {
-//                scoreDetailDto.setStatusDisplay("未扫描");
-//            } else if (ScanStatus.MANUAL_ABSENT.equals(scoreDetailDto.getScanStatus()) || scoreDetailDto.getAbsent() || scoreDetailDto.getOmrAbsent()) {
-//                scoreDetailDto.setStatusDisplay("缺考");
-//            } else if (!scoreDetailDto.getAbsent() && !scoreDetailDto.getOmrAbsent() && scoreDetailDto.getUpload() && ScanStatus.SCANNED.equals(scoreDetailDto.getScanStatus())) {
-//                scoreDetailDto.setStatusDisplay("正常");
-//            }
-
             // 扫描状态
             if (BasicExamStudentStatusEnum.M.equals(scoreDetailDto.getStudentStatus()) || scoreDetailDto.getAbsent() || scoreDetailDto.getOmrAbsent() || scoreDetailDto.getManualAbsent()) {
                 scoreDetailDto.setStudentStatusDisplay("缺考");
@@ -370,8 +361,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         HttpServletResponse response = ServletUtil.getResponse();
         //生成表头
         String[] columnName = new String[]{"姓名", "学号", "学院", "教学班", "行政班", "课程代码", "课程名称", "状态", "违纪状态", "客观分", "主观分", "成绩"};
-        List<MarkQuestion> oQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, null, true);
-        List<MarkQuestion> sQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, null, false);
+        List<MarkQuestion> oQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, true);
+        List<MarkQuestion> sQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
         List<String> columnNameList = new ArrayList<>(Arrays.asList(columnName));
         for (MarkQuestion question : oQuestionList) {
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "选项");
@@ -868,11 +859,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Override
-    public List<MarkStudent> listUnMarkTaskStudent(Long examId, String paperNumber, Integer groupNumber,
-                                                   int pageSize) {
+    public List<MarkStudent> listUnMarkTaskStudent(Long examId, String paperNumber, Long questionId, int pageSize) {
         Page<MarkStudent> page = new Page<>(1, pageSize);
         IPage<MarkStudent> markStudentIPage = this.baseMapper.listUnMarkTaskStudent(page, examId, paperNumber,
-                groupNumber);
+                questionId);
         return markStudentIPage.getRecords();
     }
 
@@ -1284,8 +1274,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         //生成表头
         String[] columnName = new String[]{"姓名", "学号", "学院", "教学班", "行政班", "课程代码", "课程名称", "状态", "违纪状态", "客观分", "主观分", "成绩"};
-        List<MarkQuestion> oQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(query.getExamId(), query.getPaperNumber(), null, true);
-        List<MarkQuestion> sQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(query.getExamId(), query.getPaperNumber(), null, false);
+        List<MarkQuestion> oQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(query.getExamId(), query.getPaperNumber(), true);
+        List<MarkQuestion> sQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(query.getExamId(), query.getPaperNumber(), false);
         List<String> columnNameList = new ArrayList<>(Arrays.asList(columnName));
         for (MarkQuestion question : oQuestionList) {
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "选项");

+ 13 - 15
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java

@@ -26,13 +26,13 @@ import java.util.Set;
 public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiveScoreMapper, MarkSubjectiveScore> implements MarkSubjectiveScoreService {
 
     @Override
-    public List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
+    public List<MarkSubjectiveScore> listByStudentIdAndQuestionId(Long studentId, Long questionId) {
         QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
                 .orderByAsc(MarkSubjectiveScore::getMainNumber)
                 .orderByAsc(MarkSubjectiveScore::getSubNumber);
-        if (groupNumber != null) {
-            queryWrapper.lambda().eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
+        if (questionId != null) {
+            queryWrapper.lambda().eq(MarkSubjectiveScore::getQuestionId, questionId);
         }
 
         List<MarkSubjectiveScore> list = this.list(queryWrapper);
@@ -40,6 +40,14 @@ public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiv
         return list;
     }
 
+    @Override
+    public MarkSubjectiveScore getByStudentIdAndQuestionId(Long studentId, Long questionId) {
+        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
+                .eq(MarkSubjectiveScore::getQuestionId, questionId);
+        return this.getOne(queryWrapper);
+    }
+
     @Override
     public Set<Integer> listMainNumberByStudentIdAndUncalculate(Long studentId, boolean uncalculate) {
         Set<Integer> mainNumbers = new HashSet<Integer>();
@@ -54,7 +62,6 @@ public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiv
     public List<MarkSubjectiveScore> listByStudentIdAndUncalculate(Long studentId, boolean uncalculate) {
         QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
-                .eq(MarkSubjectiveScore::getUncalculate, uncalculate)
                 .orderByAsc(MarkSubjectiveScore::getMainNumber)
                 .orderByAsc(MarkSubjectiveScore::getSubNumber);
         return this.list(queryWrapper);
@@ -67,15 +74,6 @@ public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiv
         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();
@@ -116,11 +114,11 @@ public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiv
     }
 
     @Override
-    public void updateRejected(Long studentId, Integer groupNumber, boolean rejectd) {
+    public void updateRejected(Long studentId, Long questionId, boolean rejectd) {
         UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(MarkSubjectiveScore::getRejected, rejectd)
                 .eq(MarkSubjectiveScore::getStudentId, studentId)
-                .eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
+                .eq(MarkSubjectiveScore::getQuestionId, questionId);
         this.update(updateWrapper);
     }
 

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

@@ -1,6 +1,5 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.enums.LockType;
@@ -25,35 +24,35 @@ public class MarkSyncServiceImpl implements MarkSyncService {
     /**
      * 评卷员重置
      *
-     * @param markUserGroup
+     * @param markUserQuestion
      */
     @Async
     @Override
-    public void markerResetSync(MarkUserQuestion markUserGroup) {
+    public void markerResetSync(MarkUserQuestion markUserQuestion) {
         try {
-            if (markUserGroup != null) {
-                lockService.waitlock(LockType.EXAM_SUBJECT, markUserGroup.getExamId(), markUserGroup.getPaperNumber());
-                lockService.waitlock(LockType.MARK_USER_GROUP, markUserGroup.getId());
-                lockService.watch(LockType.GROUP, markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber());
-                markService.resetMarker(markUserGroup);
+            if (markUserQuestion != null) {
+                lockService.waitlock(LockType.EXAM_SUBJECT, markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
+                lockService.waitlock(LockType.MARK_USER_GROUP, markUserQuestion.getId());
+                lockService.watch(LockType.GROUP, markUserQuestion.getQuestionId());
+                markService.resetMarker(markUserQuestion);
             }
         } catch (Exception e) {
             log.error("reset marker error", e);
         } finally {
-            lockService.unwatch(LockType.GROUP, markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber());
-            lockService.unlock(LockType.MARK_USER_GROUP, markUserGroup.getId());
-            lockService.unlock(LockType.EXAM_SUBJECT, markUserGroup.getExamId(), markUserGroup.getPaperNumber());
-            lockService.unlock(LockType.MARKER_RESET, markUserGroup.getId());
+            lockService.unwatch(LockType.GROUP, markUserQuestion.getQuestionId());
+            lockService.unlock(LockType.MARK_USER_GROUP, markUserQuestion.getId());
+            lockService.unlock(LockType.EXAM_SUBJECT, markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
+            lockService.unlock(LockType.MARKER_RESET, markUserQuestion.getId());
         }
     }
 
     @Async
     @Override
-    public void updateQuality(List<MarkUserQuestion> markUserGroups, String lockKey) {
-        if (CollectionUtils.isNotEmpty(markUserGroups)) {
-            for (MarkUserQuestion markUserGroup : markUserGroups) {
+    public void updateQuality(List<MarkUserQuestion> markUserQuestions, String lockKey) {
+        if (CollectionUtils.isNotEmpty(markUserQuestions)) {
+            for (MarkUserQuestion markUserQuestion : markUserQuestions) {
                 try {
-                    markService.updateQuality(markUserGroup);
+                    markService.updateQuality(markUserQuestion);
                 } catch (Exception e) {
                     log.error("marker quality thread error", e);
                 }
@@ -62,24 +61,24 @@ public class MarkSyncServiceImpl implements MarkSyncService {
         lockService.unlock(LockType.BATCH_QUALITY, lockKey);
     }
 
-    @Async
-    @Override
-    public void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo) {
-        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, deleteGroupInfo);
-        } 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());
-        }
-    }
+//    @Async
+//    @Override
+//    public void deleteMarkGroup(MarkGroup markGroup, boolean deleteGroupInfo) {
+//        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, deleteGroupInfo);
+//        } 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());
+//        }
+//    }
 
     @Async
     @Override

+ 74 - 75
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -7,20 +8,22 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkProblemStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
-import com.qmth.teachcloud.mark.entity.MarkGroup;
-import com.qmth.teachcloud.mark.entity.MarkProblemHistory;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkTaskMapper;
+import com.qmth.teachcloud.mark.params.MarkResultQuestion;
 import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.Calculator;
 import org.springframework.stereotype.Service;
@@ -42,8 +45,6 @@ import java.util.List;
 @Service
 public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> implements MarkTaskService {
 
-    @Resource
-    private MarkGroupService markGroupService;
     @Resource
     private MarkQuestionService markQuestionService;
     @Resource
@@ -67,7 +68,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         for (MarkManageDto record : markManageDtoIPage.getRecords()) {
             record.setStatusDisplay(record.getStatus() == null ? null : record.getStatus().getName());
             MarkManageDto markManageDto = this.selectMarkedCountAndTotalCount(record.getExamId(), record.getPaperNumber());
-            if(markManageDto != null) {
+            if (markManageDto != null) {
                 record.setMarkedCount(markManageDto.getMarkedCount());
                 record.setTotalCount(markManageDto.getTotalCount());
                 record.setPercent(Calculator.divide2String(Calculator.multiply(markManageDto.getMarkedCount(), 100), Double.valueOf(markManageDto.getTotalCount()), 2));
@@ -79,7 +80,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
             // 问题卷数量
             record.setProblemCount(markProblemHistoryService.countByExamIdAndPaperNumberAndStatus(examId, record.getPaperNumber(), MarkProblemStatus.WAITING));
             // 正在评卷数量
-            record.setCurrentCount(markGroupService.countCurrentCountByExamIdAndPaperNumber(examId, record.getPaperNumber()));
+            record.setCurrentCount(markQuestionService.countCurrentCountByExamIdAndPaperNumber(examId, record.getPaperNumber()));
         }
         return markManageDtoIPage;
     }
@@ -88,10 +89,9 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     public void exportMarker(Long examId, Long courseId, String paperNumber, HttpServletResponse response) {
         List<MarkerInfoDto> markerInfoDtoList = this.baseMapper.listUserMarkedCount(examId, courseId, paperNumber);
         for (MarkerInfoDto markerInfoDto : markerInfoDtoList) {
-            MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, markerInfoDto.getPaperNumber(), markerInfoDto.getGroupNumber());
-            markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, markerInfoDto.getPaperNumber(), markerInfoDto.getGroupNumber(), false));
-            markerInfoDto.setGroupName(markGroup.getQuestionTitle());
-            markerInfoDto.setTotalScore(markQuestionService.sumTotalScoreByGroupNumber(examId, markerInfoDto.getPaperNumber(), markerInfoDto.getGroupNumber()));
+            MarkQuestion markQuestion = markQuestionService.getById(markerInfoDto.getQuestionId());
+            markerInfoDto.setQuestionName(markQuestion.getMainTitle());
+            markerInfoDto.setTotalScore(markQuestion.getTotalScore());
         }
         try {
             ExcelUtil.excelExport("评卷员工作量", MarkerInfoDto.class, markerInfoDtoList, response);
@@ -101,8 +101,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(Long examId, String paperNumber, Integer groupNumber, Long userId, String className) {
-        return this.baseMapper.listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(examId, paperNumber, groupNumber, userId, className);
+    public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(Long examId, String paperNumber, Long questionId, Long userId, String className) {
+        return this.baseMapper.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, questionId, userId, className);
     }
 
     @Override
@@ -115,12 +115,12 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+    public int countByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         LambdaQueryWrapper<MarkTask> lambdaQueryWrapper = queryWrapper.lambda();
         lambdaQueryWrapper.eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber);
+                .eq(MarkTask::getQuestionId, questionId);
         if (userId != null) {
             lambdaQueryWrapper.eq(MarkTask::getUserId, userId);
         }
@@ -128,11 +128,11 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndStatusNotIn(Long examId, String paperNumber, Integer groupNumber, Long userId, List<MarkTaskStatus> statusList) {
+    public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndStatusNotIn(Long examId, String paperNumber, Long questionId, Long userId, List<MarkTaskStatus> statusList) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .eq(MarkTask::getUserId, userId)
                 .notIn(MarkTask::getStatus, statusList);
         return this.list(queryWrapper);
@@ -145,23 +145,25 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getUserId, userId)
                 .set(MarkTask::getMarkerTime, null)
                 .set(MarkTask::getMarkerScore, null)
-                .set(MarkTask::getMarkerScoreList, null)
+                .set(MarkTask::getMarkerTrackList, null)
+                .set(MarkTask::getMarkerTagList, null)
                 .set(MarkTask::getMarkerSpent, null)
                 .set(MarkTask::getHeaderId, rejectId)
                 .set(MarkTask::getHeaderTime, date)
                 .set(MarkTask::getHeaderScore, null)
-                .set(MarkTask::getHeaderScoreList, null)
+                .set(MarkTask::getHeaderTrackList, null)
+                .set(MarkTask::getHeaderTagList, null)
                 .set(MarkTask::getRejectReason, rejectReason)
                 .eq(MarkTask::getId, markTaskId);
         return this.update(updateWrapper);
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndGroupNumberAndStatusIn(Long examId, String paperNumber, Integer groupNumber, List<MarkTaskStatus> statusList) {
+    public int countByExamIdAndPaperNumberAndQuestionIdAndStatusIn(Long examId, String paperNumber, Long questionId, List<MarkTaskStatus> statusList) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .in(MarkTask::getStatus, statusList);
         return this.count(queryWrapper);
     }
@@ -176,39 +178,40 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public MarkTask getLastOneByUserIdAndStatus(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkTaskStatus status) {
-        return this.baseMapper.getLastOneByUserIdAndStatus(examId, paperNumber, groupNumber, userId, status.name());
+    public MarkTask getLastOneByUserIdAndStatus(Long examId, String paperNumber, Long questionId, Long userId, MarkTaskStatus status) {
+        return this.baseMapper.getLastOneByUserIdAndStatus(examId, paperNumber, questionId, userId, status.name());
     }
 
     @Override
-    public List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndStudentId(Long examId, String paperNumber, Integer groupNumber, Long studentId) {
+    public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndStudentId(Long examId, String paperNumber, Long questionId, Long studentId) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .eq(MarkTask::getStudentId, studentId);
         return this.list(queryWrapper);
     }
 
     @Override
-    public List<MarkTask> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
+    public List<MarkTask> listByStudentIdAndQuestionId(Long studentId, Long questionId) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-                .eq(MarkTask::getGroupNumber, groupNumber);
+                .eq(MarkTask::getQuestionId, questionId);
         return this.list(queryWrapper);
     }
 
     @Override
-    public void updateHeaderResult(Long examId, String paperNumber, Integer groupNumber, Long studentId, Long updateUserId, Double totalScore, String scoreList, Long updateTime, MarkTaskStatus arbitrated) {
+    public void updateHeaderResult(Long examId, String paperNumber, Long questionId, Long studentId, Long updateUserId, Double markerScore, TrackDTO[] tracks, SpecialTagDTO[] specialTags, Long updateTime, MarkTaskStatus arbitrated) {
         UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(MarkTask::getHeaderId, updateUserId)
-                .set(MarkTask::getHeaderScore, totalScore)
-                .set(MarkTask::getHeaderScoreList, scoreList)
+                .set(MarkTask::getHeaderScore, markerScore)
+                .set(MarkTask::getHeaderTrackList, JSON.toJSONString(tracks))
+                .set(MarkTask::getHeaderTagList, JSON.toJSONString(specialTags))
                 .set(MarkTask::getHeaderTime, updateTime)
                 .set(MarkTask::getStatus, arbitrated)
                 .eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .eq(MarkTask::getStudentId, studentId);
         this.update(updateWrapper);
     }
@@ -221,26 +224,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkTask::getExamId, examId)
-                .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber);
-        return this.count(queryWrapper);
-    }
-
-    @Override
-    public int countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Integer groupNumber, Long userId, List<String> className, MarkTaskStatus... status) {
-        return this.baseMapper.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndAndClassNameStatusIn(examId, paperNumber, groupNumber, userId, className, status);
-    }
-
-    @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);
+    public int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, Long userId, List<String> className, MarkTaskStatus... status) {
+        return this.baseMapper.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId, paperNumber, questionId, userId, className, status);
     }
 
     @Override
@@ -250,15 +235,15 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Integer groupNumber,
-                                       Long userId) {
-        return this.baseMapper.findUnMarked(page, examId, paperNumber, groupNumber, userId);
+    public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber,
+                                       Long userId, QuestionModel questionModel) {
+        return this.baseMapper.findUnMarked(page, examId, paperNumber, userId, questionModel);
     }
 
     @Override
     public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber,
-                                                  Integer groupNumber, Long userId) {
-        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, groupNumber, userId);
+                                                  Long userId, QuestionModel questionModel) {
+        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, questionModel);
     }
 
     @Override
@@ -270,11 +255,10 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> findByStudentIdAndGroupNumberAndStatus(Long studentId, Integer groupNumber,
-                                                                 MarkTaskStatus... status) {
+    public List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .in(MarkTask::getStatus, Arrays.asList(status));
         return this.list(queryWrapper);
     }
@@ -287,45 +271,47 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getStatus, MarkTaskStatus.PROBLEM)
                 .set(MarkTask::getUserId, userId)
                 .set(MarkTask::getMarkerScore, 0)
-                .set(MarkTask::getMarkerScoreList, null)
+                .set(MarkTask::getMarkerTagList, null)
+                .set(MarkTask::getMarkerTagList, null)
                 .set(MarkTask::getMarkerTime, now)
                 .set(MarkTask::getMarkerSpent, spent);
         return this.update(updateWrapper);
     }
 
     @Override
-    public boolean updateStatusByStudentIdAndGroupNumber(Long studentId, Integer groupNumber, MarkTaskStatus status) {
+    public boolean updateStatusByStudentIdAndQuestionId(Long studentId, Long questionId, MarkTaskStatus status) {
         UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .set(MarkTask::getStatus, status);
         return this.update(updateWrapper);
     }
 
     @Override
-    public int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long examId, String paperNumber, Integer groupNumber, Long userId, Long taskId) {
+    public int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long examId, String paperNumber, Long questionId, Long userId, Long taskId) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
                 .eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .eq(MarkTask::getUserId, userId)
                 .ne(MarkTask::getId, taskId);
         return this.count(queryWrapper);
     }
 
     @Override
-    public boolean updateMarkerResult(Long taskId, MarkTaskStatus status, Long userId, Double markerScore,
-                                      String scoreList, Long now, int spent, MarkTaskStatus... inStatus) {
+    public boolean updateMarkerResult(Long taskId, MarkTaskStatus status, Long userId,
+                                      MarkResultQuestion result, Long now, MarkTaskStatus... inStatus) {
         UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().eq(MarkTask::getId, taskId)
                 .in(MarkTask::getStatus, Arrays.asList(inStatus))
                 .set(MarkTask::getStatus, status)
                 .set(MarkTask::getUserId, userId)
-                .set(MarkTask::getMarkerScore, markerScore)
-                .set(MarkTask::getMarkerScoreList, scoreList)
+                .set(MarkTask::getMarkerScore, result.getMarkerScore())
+                .set(MarkTask::getMarkerTrackList, JSON.toJSONString(result.getTrackList()))
+                .set(MarkTask::getMarkerTagList, JSON.toJSONString(result.getSpecialTagList()))
                 .set(MarkTask::getMarkerTime, now)
-                .set(MarkTask::getMarkerSpent, spent)
+                .set(MarkTask::getMarkerSpent, result.getSpent())
                 .set(MarkTask::getHeaderId, null)
                 .set(MarkTask::getHeaderTime, null)
                 .set(MarkTask::getRejectReason, null);
@@ -333,11 +319,11 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndGroupNumberAndTaskNumber(Long examId, String paperNumber, Integer groupNumber, int taskNumber) {
+    public int countByExamIdAndPaperNumberAndQuestionIdAndTaskNumber(Long examId, String paperNumber, Long questionId, int taskNumber) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
-                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getQuestionId, questionId)
                 .eq(MarkTask::getTaskNumber, taskNumber);
         return this.count(queryWrapper);
     }
@@ -358,12 +344,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Integer groupNumber, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize) {
-        IPage<MarkTaskDto> markTaskDtoIPage = this.baseMapper.pageMarkTask(new Page<>(pageNumber, pageSize), examId, paperNumber, groupNumber, loginName, status, studentCode, secretNumber, teachClassName, subScore);
+    public IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize) {
+        IPage<MarkTaskDto> markTaskDtoIPage = this.baseMapper.pageMarkTask(new Page<>(pageNumber, pageSize), examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore);
         for (MarkTaskDto record : markTaskDtoIPage.getRecords()) {
             record.setStatusDisplay(record.getStatus().getName());
             // 分组题目
-            record.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(record.getExamId(), record.getPaperNumber(), record.getGroupNumber()));
+            MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
+            record.setQuestionNumber(markQuestion.getQuestionNumber());
         }
         return markTaskDtoIPage;
     }
@@ -377,7 +364,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         }
         try {
             lockService.watch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
-            lockService.watch(LockType.GROUP, markTask.getExamId(), markTask.getPaperNumber(), markTask.getGroupNumber());
+            lockService.watch(LockType.GROUP, markTask.getQuestionId());
             lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
             if (!markTask.getStatus().equals(MarkTaskStatus.MARKED)) {
                 throw ExceptionResultEnum.ERROR.exception("当前任务不允许打回");
@@ -387,7 +374,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
             log.error("打回失败", e);
         } finally {
             lockService.unlock(LockType.STUDENT, markTask.getStudentId());
-            lockService.unwatch(LockType.GROUP, markTask.getExamId(), markTask.getPaperNumber(), markTask.getGroupNumber());
+            lockService.unwatch(LockType.GROUP, markTask.getQuestionId());
             lockService.unwatch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
         }
     }
@@ -410,4 +397,16 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     public MarkManageDto selectMarkedCountAndTotalCount(Long examId, String paperNumber) {
         return this.baseMapper.selectMarkedCountAndTotalCount(examId, paperNumber);
     }
+
+    @Override
+    public List<MarkTask> listByStudentId(Long studentId) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId);
+        return this.list(queryWrapper);
+    }
+
+    @Override
+    public Long minQuestionIdByExamIdAndPaperNumber(Long examId, String paperNumber, MarkTaskStatus... statusList) {
+        return this.baseMapper.minQuestionIdByExamIdAndPaperNumber(examId, paperNumber, statusList);
+    }
 }

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

@@ -10,13 +10,14 @@ import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
 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.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.setting.MarkUserClassDetailDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDto;
-import com.qmth.teachcloud.mark.entity.MarkGroup;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkUserClass;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.mapper.MarkUserClassMapper;
@@ -41,31 +42,40 @@ import java.util.stream.Collectors;
  */
 @Service
 public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, MarkUserClass> implements MarkUserClassService {
-    @Resource
-    MarkUserGroupService markUserGroupService;
 
     @Resource
-    MarkStudentService markStudentService;
+    private MarkPaperService markPaperService;
+    @Resource
+    MarkUserQuestionService markUserQuestionService;
 
     @Resource
-    MarkGroupService markGroupService;
+    MarkStudentService markStudentService;
 
     @Resource
     MarkQuestionService markQuestionService;
 
+    @Transactional
     @Override
-    public void deleteByExamIdAndPaperNumber(Long examId, String paperNumber) {
-        UpdateWrapper<MarkUserClass> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(MarkUserClass::getExamId, examId)
-                .eq(MarkUserClass::getPaperNumber, paperNumber);
-        this.remove(updateWrapper);
-    }
+    public MarkUserClassDto updateOpenMarkClassByExamIdAndPaperNumber(Long examId, String paperNumber, Boolean classMark) {
+        UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkPaper::getClassMark, classMark)
+                .eq(MarkPaper::getExamId, examId)
+                .eq(MarkPaper::getPaperNumber, paperNumber);
+        markPaperService.update(updateWrapper);
+
+        if (classMark != null) {
+            // 开启分班阅,根据任课老师自动绑定班级
+            if (classMark) {
+                this.autoBindTeacherIdAndTeachClassName(examId, paperNumber);
+            } else {
+                // 禁用,删除分班数据
+                this.deleteByExamIdAndPaperNumber(examId, paperNumber);
+            }
+        }
 
-    @Override
-    public MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber) {
         // 课程下所有班级数据
         List<String> paperNumberClassList = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
-        List<MarkUser> markUserList = markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, null, null);
+        List<MarkUser> markUserList = markUserQuestionService.listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, null, null);
 
         MarkUserClassDto markUserClassDto = new MarkUserClassDto();
         markUserClassDto.setClassNames(paperNumberClassList);
@@ -86,8 +96,40 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
     }
 
     @Override
-    public List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(Long examId, String paperNumber, Integer groupNumber, String className) {
-        return this.baseMapper.listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, groupNumber, className);
+    public void deleteByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        UpdateWrapper<MarkUserClass> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkUserClass::getExamId, examId)
+                .eq(MarkUserClass::getPaperNumber, paperNumber);
+        this.remove(updateWrapper);
+    }
+
+//    @Override
+//    public MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber) {
+//        // 课程下所有班级数据
+//        List<String> paperNumberClassList = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
+//        List<MarkUser> markUserList = markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, null, null);
+//
+//        MarkUserClassDto markUserClassDto = new MarkUserClassDto();
+//        markUserClassDto.setClassNames(paperNumberClassList);
+//
+//        List<MarkUserClassDetailDto> markUserClassDetailDtos = new ArrayList<>();
+//        for (MarkUser marker : markUserList) {
+//            MarkUserClassDetailDto markUserClassDetailDto = new MarkUserClassDetailDto();
+//            markUserClassDetailDto.setMarker(marker);
+//            List<MarkUserClass> markUserClasses = this.baseMapper.listMarkerClassByExamIdAndPaperNumberAndUserId(examId, paperNumber, marker.getUserId());
+//            // 剔除掉已经更名的班级
+//            List<String> markUserClassSelectList = markUserClasses.stream().map(MarkUserClass::getClassName).collect(Collectors.toList());
+//            List<String> intersectionList = (List<String>) CollectionUtils.intersection(paperNumberClassList, markUserClassSelectList);
+//            markUserClassDetailDto.setMarkerClassList(intersectionList);
+//            markUserClassDetailDtos.add(markUserClassDetailDto);
+//        }
+//        markUserClassDto.setMarkerClass(markUserClassDetailDtos);
+//        return markUserClassDto;
+//    }
+
+    @Override
+    public List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className) {
+        return this.baseMapper.listClassMarkerByExamIdAndPaperNumberAndQuestionIdAndClassName(examId, paperNumber, questionId, className);
     }
 
     @Transactional
@@ -99,20 +141,19 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
         // 校验班级是否绑定完成
         List<String> listUserClass = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
         if (CollectionUtils.isNotEmpty(listUserClass)) {
-            List<MarkGroup> markGroupList = markGroupService.listGroupByExamIdAndPaperNumber(examId, paperNumber);
-            for (MarkGroup markGroup : markGroupList) {
-                markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber(), false));
+            List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+            for (MarkQuestion markQuestion : markQuestionList) {
                 Set<String> groupBindClassSet = new HashSet<>();
-                List<MarkUserQuestion> markUserGroupList = markUserGroupService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber());
+                List<MarkUserQuestion> markUserQuestionList = markUserQuestionService.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, markQuestion.getId());
                 for (MarkGroupClassUserParams groupUserClassInfo : markClassUserParams.getGroupMarkerClass()) {
-                    if (markUserGroupList.stream().filter(m -> m.getUserId().equals(groupUserClassInfo.getMarker().getUserId())).count() > 0) {
+                    if (markUserQuestionList.stream().filter(m -> m.getUserId().equals(groupUserClassInfo.getMarker().getUserId())).count() > 0) {
                         groupBindClassSet.addAll(groupUserClassInfo.getMarkerClassList());
                     }
                 }
 
                 Collection<String> subtractList = CollectionUtils.subtract(listUserClass, groupBindClassSet);
                 if (CollectionUtils.isNotEmpty(subtractList)) {
-                    throw ExceptionResultEnum.ERROR.exception(String.format("班级[%s]在评阅题目[%s]中未被任何评卷员绑定", String.join(",", subtractList), markGroup.getGroupQuestions()));
+                    throw ExceptionResultEnum.ERROR.exception(String.format("班级[%s]在评阅题目[%s]中未被任何评卷员绑定", String.join(",", subtractList), markQuestion.getQuestionNumber()));
                 }
             }
         }
@@ -180,7 +221,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
 
             List<MarkUserClass> markUserClassList = new ArrayList<>();
             for (Map.Entry<String, Long> entry : map.entrySet()) {
-                if (CollectionUtils.size(markUserGroupService.listByExamIdAndPaperNumberAndUserId(examId, paperNumber, entry.getValue())) > 0) {
+                if (CollectionUtils.size(markUserQuestionService.listByExamIdAndPaperNumberAndUserId(examId, paperNumber, entry.getValue())) > 0) {
                     MarkUserClass markUserClass = new MarkUserClass();
                     markUserClass.setId(SystemConstant.getDbUuid());
                     markUserClass.setExamId(examId);

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

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.teachcloud.mark.entity.MarkUserPaper;
 import com.qmth.teachcloud.mark.mapper.MarkUserPaperMapper;
 import com.qmth.teachcloud.mark.service.MarkUserPaperService;
@@ -17,4 +18,12 @@ import org.springframework.stereotype.Service;
 @Service
 public class MarkUserPaperServiceImpl extends ServiceImpl<MarkUserPaperMapper, MarkUserPaper> implements MarkUserPaperService {
 
+    @Override
+    public MarkUserPaper getByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId) {
+        QueryWrapper<MarkUserPaper> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserPaper::getExamId, examId)
+                .eq(MarkUserPaper::getPaperNumber, paperNumber)
+                .eq(MarkUserPaper::getUserId, userId);
+        return this.getOne(queryWrapper);
+    }
 }

+ 100 - 92
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserGroupServiceImpl.java → teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkMode;
@@ -20,8 +21,9 @@ import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
 import com.qmth.teachcloud.mark.lock.LockService;
-import com.qmth.teachcloud.mark.mapper.MarkUserGroupMapper;
+import com.qmth.teachcloud.mark.mapper.MarkUserQuestionMapper;
 import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.Calculator;
 import org.apache.commons.collections4.CollectionUtils;
@@ -44,19 +46,19 @@ import java.util.stream.Collectors;
  * @since 2023-09-22
  */
 @Service
-public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, MarkUserQuestion> implements MarkUserGroupService {
+public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMapper, MarkUserQuestion> implements MarkUserQuestionService {
 
     @Resource
     private MarkQuestionService markQuestionService;
     @Resource
-    private MarkGroupService markGroupService;
-    @Resource
     private MarkTaskService markTaskService;
     @Resource
     private MarkPaperService markPaperService;
     @Resource
     private MarkUserClassService markUserClassService;
     @Resource
+    private MarkUserPaperService markUserPaperService;
+    @Resource
     private MarkSyncService markSyncService;
     @Resource
     private SysUserService sysUserService;
@@ -74,17 +76,19 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
             int taskCount = record.getTaskCount();
             int markedCount = record.getMarkedCount();
             MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(record.getExamId(), record.getPaperNumber());
-            if (markPaper != null && markPaper.getOpenMarkClass() != null && markPaper.getOpenMarkClass()) {
+            // 分班阅
+            List<String> classNames = null;
+            if (markPaper != null && markPaper.getClassMark() != null && markPaper.getClassMark()) {
                 List<MarkUserClass> markUserClassList = markUserClassService.listByExamIdAndPaperNumberAndUserId(record.getExamId(), record.getPaperNumber(), sysUser.getId());
-                List<String> classNames = null;
                 if (CollectionUtils.isNotEmpty(markUserClassList)) {
                     classNames = markUserClassList.stream().map(MarkUserClass::getClassName).collect(Collectors.toList());
                 }
-                taskCount = markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndAndClassNameStatusIn(record.getExamId(), record.getPaperNumber(), record.getGroupNumber(), null, classNames);
-                record.setTaskCount(taskCount);
-                markedCount = markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserIdAndAndClassNameStatusIn(record.getExamId(), record.getPaperNumber(), record.getGroupNumber(), null, classNames, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED);
-                record.setMarkedCount(markedCount);
             }
+            taskCount = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(record.getExamId(), record.getPaperNumber(), null, null, classNames);
+            record.setTaskCount(taskCount);
+            markedCount = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(record.getExamId(), record.getPaperNumber(), null, null, classNames, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED);
+            record.setMarkedCount(markedCount);
+
             record.setLeftCount(taskCount == 0 ? 0 : taskCount - markedCount);
             // 评卷进度
             if (taskCount == 0) {
@@ -94,83 +98,89 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
                 record.setPercent(bigDecimal.doubleValue());
             }
             // 分组题目
-            record.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(record.getExamId(), record.getPaperNumber(), record.getGroupNumber()));
+            MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
+            record.setQuestionNumber(markQuestion.getQuestionNumber());
         }
 
         return markEntranceDtoIPage;
     }
 
     @Override
-    public List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumberAndClassName(Long examId, String paperNumber, Integer groupNumber, String className) {
-        return this.baseMapper.listGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber, className);
+    public List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className) {
+        return this.baseMapper.listGroupUserByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId, className);
     }
 
     @Override
-    public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber, String loginName, String className, Integer pageNumber, Integer pageSize) {
+    public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId, String loginName, String className, Integer pageNumber, Integer pageSize) {
         Page<MarkUserGroupProgressDto> page = new Page<>(pageNumber, pageSize);
-        IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndGroupNumber(page, examId, paperNumber, groupNumber, loginName, className);
+        IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndQuestionId(page, examId, paperNumber, questionId, loginName, className);
         for (MarkUserGroupProgressDto record : markUserGroupProgressDtoIPage.getRecords()) {
-            record.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, record.getGroupNumber()));
-            List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndUserIdAndClassName(examId, paperNumber, record.getGroupNumber(), record.getUserId(), null);
+            MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
+            record.setQuestionNumber(markQuestion.getQuestionNumber());
+            List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, record.getQuestionId(), record.getUserId(), null);
             record.setResetting(lockService.isLocked(LockType.MARKER_RESET, record.getMarkUserGroupId()));
             record.setMarkedCount(markTaskService.markedCount(markTaskList));
-            MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, record.getGroupNumber());
-            record.setCurrentCount(markService.applyCurrentCount(markGroup, record.getMarkUserGroupId()));
+            record.setCurrentCount(markService.applyCurrentCount(markQuestion, record.getMarkUserGroupId()));
         }
         return markUserGroupProgressDtoIPage;
     }
 
     @Override
-    public void addMarkUserGroup(Long examId, String paperNumber, Integer groupNumber, List<Long> userIds) {
+    public void addMarkUserQuestion(Long examId, String paperNumber, List<Long> questionIds, List<Long> userIds) {
         if (CollectionUtils.isNotEmpty(userIds)) {
             List<MarkUserQuestion> markUserGroups = new ArrayList<>();
             for (Long userId : userIds) {
-                MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
-                if (markUserGroup == null) {
-                    markUserGroups.add(new MarkUserQuestion(examId, paperNumber, groupNumber, userId));
+                for (Long questionId : questionIds) {
+                    MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, questionId, userId);
+                    if (markUserGroup == null) {
+                        markUserGroups.add(new MarkUserQuestion(examId, paperNumber, questionId, userId));
+                    } else if (!markUserGroup.getEnable()) {
+                        markUserGroup.setEnable(true);
+                        markUserGroups.add(markUserGroup);
+                    }
                 }
             }
             if (CollectionUtils.isNotEmpty(markUserGroups)) {
-                this.saveBatch(markUserGroups);
+                this.saveOrUpdateBatch(markUserGroups);
             }
         }
     }
 
     @Override
-    public void setTopCount(List<Long> markUserGroupIds, Integer topCount) {
-        for (Long markUserGroupId : markUserGroupIds) {
-            MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
-            if (markUserGroup != null) {
-                markUserGroup.setTopCount(topCount);
-                this.updateById(markUserGroup);
+    public void setTopCount(List<Long> markUserQuestionIds, Integer topCount) {
+        for (Long markUserQuestionId : markUserQuestionIds) {
+            MarkUserQuestion markUserQuestion = this.getById(markUserQuestionId);
+            if (markUserQuestion != null) {
+                markUserQuestion.setTopCount(topCount);
+                this.updateById(markUserQuestion);
             }
         }
     }
 
     @Override
-    public MarkUserQuestion getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+    public MarkUserQuestion getByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
         QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
                 .eq(MarkUserQuestion::getPaperNumber, paperNumber)
-                .eq(MarkUserQuestion::getGroupNumber, groupNumber)
+                .eq(MarkUserQuestion::getQuestionId, questionId)
                 .eq(MarkUserQuestion::getUserId, userId);
         return this.getOne(queryWrapper);
     }
 
     @Override
-    public void deleteMarker(Long markUserGroupId) {
-        MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
-        if (markUserGroup == null) {
-            throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
-        }
-        int count = markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserId(markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber(), markUserGroup.getUserId());
-        if (count > 0) {
-            throw ExceptionResultEnum.ERROR.exception("删除评卷员失败,该评卷员已开始评卷");
-        } else {
+    public void deleteMarker(MarkUserQuestion markUserQuestion) {
+        // 已评卷也可解绑 2025-02-26
+//        int count = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserId(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(), markUserQuestion.getId(), markUserQuestion.getUserId());
+//        if (count > 0) {
+//            throw ExceptionResultEnum.ERROR.exception("删除评卷员失败,该评卷员已开始评卷");
+//        } else {
             // 先回收,再删除
-            releaseMarker(Arrays.asList(markUserGroupId));
-            this.removeById(markUserGroupId);
-        }
+            releaseMarker(Arrays.asList(markUserQuestion.getId()));
+            // 逻辑解绑
+            UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(MarkUserQuestion::getEnable, false).eq(MarkUserQuestion::getId, markUserQuestion.getId());
+            this.update(updateWrapper);
+//        }
     }
 
     @Override
@@ -191,10 +201,10 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public boolean resetMarker(MarkUserQuestion markUserGroup) {
-        if (markUserGroup != null) {
-            if (lockService.trylock(LockType.MARKER_RESET, markUserGroup.getId())) {
-                markSyncService.markerResetSync(markUserGroup);
+    public boolean resetMarker(MarkUserQuestion markUserQuestion) {
+        if (markUserQuestion != null) {
+            if (lockService.trylock(LockType.MARKER_RESET, markUserQuestion.getId())) {
+                markSyncService.markerResetSync(markUserQuestion);
                 return true;
             } else {
                 throw ExceptionResultEnum.ERROR.exception("评卷员正在重置");
@@ -219,13 +229,12 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public IPage<MarkQualityDto> pageQuality(Long examId, String paperNumber, Integer groupNumber, String loginName, Integer pageNumber, Integer pageSize) {
+    public IPage<MarkQualityDto> pageQuality(Long examId, String paperNumber, Long questionId, String loginName, Integer pageNumber, Integer pageSize) {
         Page<MarkQualityDto> page = new Page<>(pageNumber, pageSize);
-        IPage<MarkQualityDto> markQualityDtoIPage = this.baseMapper.pageQuality(page, examId, paperNumber, groupNumber, loginName);
+        IPage<MarkQualityDto> markQualityDtoIPage = this.baseMapper.pageQuality(page, examId, paperNumber, questionId, loginName);
         for (MarkQualityDto qualityDto : markQualityDtoIPage.getRecords()) {
-            MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, qualityDto.getGroupNumber());
-            markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, qualityDto.getGroupNumber(), false));
-            qualityDto.setGroupQuestions(markGroup.getGroupQuestions());
+            MarkQuestion markQuestion = markQuestionService.getById(qualityDto.getQuestionId());
+            qualityDto.setQuestionNumber(markQuestion.getQuestionNumber());
             if (qualityDto.getUserId() != null) {
                 SysUser sysUser = sysUserService.getByUserId(qualityDto.getUserId());
                 qualityDto.setLoginName(sysUser.getLoginName());
@@ -239,25 +248,25 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public void updateQuality(Long examId, String paperNumber, Integer groupNumber) {
-        if (groupNumber == null) {
+    public void updateQuality(Long examId, String paperNumber, Long questionId) {
+        if (questionId == null) {
             throw ExceptionResultEnum.ERROR.exception("请选择评阅题目");
         }
-        MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-        if (markGroup != null) {
-            String lockKey = markService.getGroupKey(markGroup);
+        MarkQuestion markQuestion = markQuestionService.getById(questionId);
+        if (markQuestion != null) {
+            String lockKey = markService.getGroupKey(markQuestion);
             if (lockService.trylock(LockType.BATCH_QUALITY, lockKey)) {
-                markSyncService.updateQuality(this.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber), lockKey);
+                markSyncService.updateQuality(this.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId), lockKey);
             }
         }
     }
 
     @Override
-    public List<MarkUserQuestion> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+    public List<MarkUserQuestion> listByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
         QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
                 .eq(MarkUserQuestion::getPaperNumber, paperNumber)
-                .eq(MarkUserQuestion::getGroupNumber, groupNumber)
+                .eq(MarkUserQuestion::getQuestionId, questionId)
                 .orderByAsc(MarkUserQuestion::getId);
         return this.list(queryWrapper);
     }
@@ -278,23 +287,23 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Integer groupNumber) {
-        if (groupNumber == null) {
-            throw ExceptionResultEnum.ERROR.exception("请选择对应的科目及分组,再查看给分曲线");
+    public List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Long questionId) {
+        if (questionId == null) {
+            throw ExceptionResultEnum.ERROR.exception("请选择对应的科目及题目,再查看给分曲线");
         }
         List<MarkQualityChartDto> markQualityChartDtoList = new ArrayList<>();
-        List<MarkUserQuestion> markUserGroupList = this.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
-        Double totalAvgScore = markUserGroupList.stream().filter(m -> m.getAvgScore() != null).collect(Collectors.averagingDouble(MarkUserQuestion::getAvgScore));
-        for (MarkUserQuestion markUserGroup : markUserGroupList) {
+        List<MarkUserQuestion> markUserQuestionList = this.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
+        Double totalAvgScore = markUserQuestionList.stream().filter(m -> m.getAvgScore() != null).collect(Collectors.averagingDouble(MarkUserQuestion::getAvgScore));
+        for (MarkUserQuestion markUserQuestion : markUserQuestionList) {
             MarkQualityChartDto markQualityChartDto = new MarkQualityChartDto();
-            markQualityChartDto.setUserId(markUserGroup.getUserId());
-            SysUser sysUser = sysUserService.getById(markUserGroup.getUserId());
+            markQualityChartDto.setUserId(markUserQuestion.getUserId());
+            SysUser sysUser = sysUserService.getById(markUserQuestion.getUserId());
             markQualityChartDto.setLoginName(sysUser.getLoginName());
             markQualityChartDto.setName(sysUser.getRealName());
             markQualityChartDto.setTotalAvgScore(Calculator.round(totalAvgScore, 2));
-            markQualityChartDto.setAvgScore(markUserGroup.getAvgScore() == null ? null : Calculator.round(markUserGroup.getAvgScore(), 2));
-            markQualityChartDto.setMaxScore(markUserGroup.getMaxScore() == null ? null : Calculator.round(markUserGroup.getMaxScore(), 2));
-            markQualityChartDto.setMinScore(markUserGroup.getMinScore() == null ? null : Calculator.round(markUserGroup.getMinScore(), 2));
+            markQualityChartDto.setAvgScore(markUserQuestion.getAvgScore() == null ? null : Calculator.round(markUserQuestion.getAvgScore(), 2));
+            markQualityChartDto.setMaxScore(markUserQuestion.getMaxScore() == null ? null : Calculator.round(markUserQuestion.getMaxScore(), 2));
+            markQualityChartDto.setMinScore(markUserQuestion.getMinScore() == null ? null : Calculator.round(markUserQuestion.getMinScore(), 2));
             markQualityChartDtoList.add(markQualityChartDto);
         }
         return markQualityChartDtoList;
@@ -311,39 +320,38 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+    public void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
         UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
         LambdaUpdateWrapper<MarkUserQuestion> lambda = updateWrapper.lambda();
         lambda.eq(MarkUserQuestion::getExamId, examId)
                 .eq(MarkUserQuestion::getPaperNumber, paperNumber);
-        if (groupNumber != null) {
-            lambda.eq(MarkUserQuestion::getGroupNumber, groupNumber);
+        if (questionId != null) {
+            lambda.eq(MarkUserQuestion::getQuestionId, questionId);
         }
         this.remove(updateWrapper);
     }
 
     @Override
-    public void updateMode(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkMode mode) {
-        UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<MarkUserQuestion> lambdaUpdateWrapper = updateWrapper.lambda();
-        lambdaUpdateWrapper.set(MarkUserQuestion::getMode, mode)
-                .eq(MarkUserQuestion::getExamId, examId)
-                .eq(MarkUserQuestion::getPaperNumber, paperNumber);
-        if (groupNumber != null) {
-            lambdaUpdateWrapper.eq(MarkUserQuestion::getGroupNumber, groupNumber);
-        }
+    public void updateMode(Long examId, String paperNumber, Long userId, MarkMode mode, QuestionModel questionModel) {
+        UpdateWrapper<MarkUserPaper> updateWrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<MarkUserPaper> lambdaUpdateWrapper = updateWrapper.lambda();
+        lambdaUpdateWrapper.set(MarkUserPaper::getMode, mode)
+                .set(questionModel != null, MarkUserPaper::getQuestionModel, questionModel)
+                .eq(MarkUserPaper::getExamId, examId)
+                .eq(MarkUserPaper::getPaperNumber, paperNumber)
+                .eq(MarkUserPaper::getUserId, userId);
         if (userId != null) {
-            lambdaUpdateWrapper.eq(MarkUserQuestion::getUserId, userId);
+            lambdaUpdateWrapper.eq(MarkUserPaper::getUserId, userId);
         }
-        this.update(updateWrapper);
+        markUserPaperService.update(updateWrapper);
     }
 
     @Override
-    public List<String> listBindMarkers(Long examId, String paperNumber, Integer groupNumber) {
-        List<MarkUserQuestion> markUserGroups = listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
+    public List<String> listBindMarkers(Long examId, String paperNumber, Long questionId) {
+        List<MarkUserQuestion> markUserQuestions = listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
         List<String> userIds = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(markUserGroups)) {
-            userIds = markUserGroups.stream().map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(markUserQuestions)) {
+            userIds = markUserQuestions.stream().map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
         }
         return userIds;
     }
@@ -354,7 +362,7 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     }
 
     @Override
-    public void updateRejectCountByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
-        this.baseMapper.updateRejectCountByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
+    public void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
+        this.baseMapper.updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, questionId, userId);
     }
 }

+ 65 - 132
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java

@@ -1,29 +1,26 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.util.*;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
 import com.alibaba.fastjson.JSON;
+import com.qmth.teachcloud.common.bean.marking.MarkConfigItem;
+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.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
-import com.qmth.teachcloud.mark.bean.mark.MarkConfigItem;
+import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
 import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import com.qmth.teachcloud.mark.service.*;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
 
 @Service
 public class TaskServiceImpl implements TaskService {
@@ -45,8 +42,6 @@ public class TaskServiceImpl implements TaskService {
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
     @Resource
-    private MarkGroupService markGroupService;
-    @Resource
     private MarkHeaderTagService markHeaderTagService;
     @Resource
     private MarkSpecialTagService markSpecialTagService;
@@ -54,15 +49,13 @@ public class TaskServiceImpl implements TaskService {
     private SysUserService sysUserService;
 
     @Override
-    public Task build(MarkArbitrateHistory markArbitrateHistory, MarkGroup markGroup) {
+    public Task build(MarkArbitrateHistory markArbitrateHistory, MarkQuestion markQuestion) {
         MarkStudent markStudent = markStudentService.getById(markArbitrateHistory.getStudentId());
         Task task = new Task();
         task.setStudentId(markArbitrateHistory.getStudentId());
         task.setTaskId(markArbitrateHistory.getId());
         task.setSecretNumber(markArbitrateHistory.getSecretNumber());
-        task.setQuestionList(buildArbitrateStep(markGroup, markArbitrateHistory));
-//        task.setSpecialTagList(getHeaderTagList(history.getStudentId(), group.getNumber()));
-//        task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
+        task.setQuestionList(buildArbitrateStep(markQuestion, markArbitrateHistory));
         if (StringUtils.isNotBlank(markStudent.getObjectiveScoreList())) {
             task.setObjectiveScore(markStudent.getObjectiveScore());
         }
@@ -73,8 +66,8 @@ public class TaskServiceImpl implements TaskService {
         if (markArbitrateHistory.getTotalScore() != null) {
             task.setMarkerScore(markArbitrateHistory.getTotalScore());
         }
-        if (StringUtils.isNotBlank(markGroup.getPicList())) {
-            task.setSliceConfig(JSON.parseArray(markGroup.getPicList(), MarkConfigItem.class));
+        if (StringUtils.isNotBlank(markQuestion.getPicList())) {
+            task.setSliceConfig(JSON.parseArray(markQuestion.getPicList(), MarkConfigItem.class));
         }
         return task;
     }
@@ -94,7 +87,6 @@ public class TaskServiceImpl implements TaskService {
             task.setPaperNumber(markStudent.getPaperNumber());
 
             // 原图
-//            task.setSheetUrls(teachcloudCommonService.filePreview(markStudent.getSheetPathList()));
             task.setSheetUrls(teachcloudCommonService.fileMarkPreview(markStudent.getSheetPathList()));
 
             if (!markStudent.getSubjectiveStatus().equals(SubjectiveStatus.UNMARK)) {
@@ -115,12 +107,10 @@ public class TaskServiceImpl implements TaskService {
         Long examId = markStudent.getExamId();
         String paperNumber = markStudent.getPaperNumber();
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
-        List<MarkQuestion> sList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId,
-                paperNumber, null, false);
+        List<MarkQuestion> sList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
         Set<Integer> mainList = markSubjectiveScoreService.listMainNumberByStudentIdAndUncalculate(markStudent.getId(),
                 true);
-        List<MarkSubjectiveScore> scoreList = markSubjectiveScoreService
-                .listByStudentIdAndGroupNumber(markStudent.getId(), null);
+        List<MarkSubjectiveScore> scoreList = markSubjectiveScoreService.listByStudentIdAndQuestionId(markStudent.getId(), null);
         for (int i = 0; i < scoreList.size(); i++) {
             MarkQuestion question = sList.get(i);
             String questionNumber = question.getQuestionNumber();
@@ -132,18 +122,13 @@ public class TaskServiceImpl implements TaskService {
                 }
             }
             // 增加阅卷轨迹列表获取
-            List<MarkTask> markTaskList = markTaskService.listByStudentIdAndGroupNumber(markStudent.getId(), question.getGroupNumber());
+            List<MarkTask> markTaskList = markTaskService.listByStudentIdAndQuestionId(markStudent.getId(), question.getId());
             // 仲裁轨迹
             List<MarkHeaderTrack> headerTracks = markHeaderTrackService.listByStudentIdAndQuestionNumber(markStudent.getId(), questionNumber);
             Map<Long, String> userNameMap = new HashMap<>();
             // 不管单评还是多评显示所有评卷员给分轨迹
             for (MarkTask markTask : markTaskList) {
-                List<MarkTrack> tracks = markTrackService.listByTaskIdAndQuestionNumber(markTask.getId(), questionNumber);
-//                if (!questionList.contains(questionNumber)) {
-//                    questionList.add(questionNumber);
-//                } else if (CollectionUtils.isNotEmpty(headerTracks)) {
-//                    continue;
-//                }
+                List<MarkTrack> tracks = markTask.listMarkerTrack();
                 for (MarkTrack track : tracks) {
                     if (userNameMap.get(track.getUserId()) == null) {
                         SysUser user = sysUserService.getByUserId(track.getUserId());
@@ -153,13 +138,9 @@ public class TaskServiceImpl implements TaskService {
                 }
 
                 // 普通模式无轨迹数据。单独处理评卷员每题得分
-                if (CollectionUtils.isEmpty(tracks) && StringUtils.isNotBlank(markTask.getMarkerScoreList())) {
-                    List<String> questionNumberList = sList.stream().filter(m -> m.getGroupNumber() == markTask.getGroupNumber()).map(m -> m.getQuestionNumber()).collect(Collectors.toList());
-                    int index = questionNumberList.indexOf(questionNumber);
-
+                if (CollectionUtils.isEmpty(tracks) && markTask.getMarkerScore() != null) {
                     // 评卷员
-                    String[] scoreLists = markTask.getMarkerScoreList().split(SystemConstant.COMMA);
-                    if (scoreLists.length >= index) {
+                    if (markTask.getMarkerScore() != null) {
                         MarkerScoreDTO markerScoreDTO = new MarkerScoreDTO();
                         markerScoreDTO.setUserId(markTask.getUserId());
                         SysUser sysUser = sysUserService.getByUserId(markTask.getUserId());
@@ -167,26 +148,23 @@ public class TaskServiceImpl implements TaskService {
                             markerScoreDTO.setLoginName(sysUser.getLoginName());
                             markerScoreDTO.setUserName(sysUser.getRealName());
                         }
-                        markerScoreDTO.setScore(Double.parseDouble(scoreLists[index]));
+                        markerScoreDTO.setScore(markTask.getMarkerScore());
                         markerScoreDTO.setHeader(false);
                         step.addMarkerList(markerScoreDTO);
                     }
                     // 科组长
-                    if(StringUtils.isNotBlank(markTask.getHeaderScoreList())) {
-                        String[] headerScoreLists = markTask.getHeaderScoreList().split(SystemConstant.COMMA);
-                        if (headerScoreLists.length >= index) {
-                            if(Double.parseDouble(scoreLists[index]) != Double.parseDouble(headerScoreLists[index])) {
-                                MarkerScoreDTO markerScoreDTO = new MarkerScoreDTO();
-                                markerScoreDTO.setUserId(markTask.getHeaderId());
-                                SysUser sysUser = sysUserService.getByUserId(markTask.getHeaderId());
-                                if (sysUser != null) {
-                                    markerScoreDTO.setLoginName(sysUser.getLoginName());
-                                    markerScoreDTO.setUserName(sysUser.getRealName());
-                                }
-                                markerScoreDTO.setScore(Double.parseDouble(headerScoreLists[index]));
-                                markerScoreDTO.setHeader(true);
-                                step.addMarkerList(markerScoreDTO);
+                    if (markTask.getHeaderScore() != null) {
+                        if (markTask.getMarkerScore() != markTask.getHeaderScore()) {
+                            MarkerScoreDTO markerScoreDTO = new MarkerScoreDTO();
+                            markerScoreDTO.setUserId(markTask.getHeaderId());
+                            SysUser sysUser = sysUserService.getByUserId(markTask.getHeaderId());
+                            if (sysUser != null) {
+                                markerScoreDTO.setLoginName(sysUser.getLoginName());
+                                markerScoreDTO.setUserName(sysUser.getRealName());
                             }
+                            markerScoreDTO.setScore(markTask.getHeaderScore());
+                            markerScoreDTO.setHeader(true);
+                            step.addMarkerList(markerScoreDTO);
                         }
                     }
                 }
@@ -219,33 +197,24 @@ public class TaskServiceImpl implements TaskService {
         return markerTrackDTO;
     }
 
-    private List<MarkStepDTO> buildArbitrateStep(MarkGroup group, MarkArbitrateHistory markArbitrateHistory) {
+    private List<MarkStepDTO> buildArbitrateStep(MarkQuestion markQuestion, MarkArbitrateHistory markArbitrateHistory) {
         List<MarkStepDTO> list = new LinkedList<>();
-        List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(
-                group.getExamId(), group.getPaperNumber(), group.getNumber(), false);
-        List<MarkHeaderTrack> tracks = markHeaderTrackService.listByExamAndPaperNumberAndGroupNumberAndStudentId(
-                group.getExamId(), group.getPaperNumber(), group.getNumber(), markArbitrateHistory.getStudentId());
+
+        List<MarkTask> markTaskList = markTaskService.listByStudentIdAndQuestionId(markArbitrateHistory.getStudentId(), markArbitrateHistory.getQuestionId());
         List<ScoreItem> sItems = new ArrayList<ScoreItem>();
+        MarkStepDTO step = buildStep(markQuestion);
         if (markArbitrateHistory != null) {
-            sItems = markArbitrateHistory.getScoreItemList();
-        }
-        for (int i = 0; i < markQuestionList.size(); i++) {
-            MarkQuestion question = markQuestionList.get(i);
-            MarkStepDTO step = buildStep(question);
-            if (markArbitrateHistory != null) {
-                if (!sItems.isEmpty() && sItems.size() == markQuestionList.size()) {
-                    step.setScore(sItems.get(i).getScore());
-                }
-                // 增加阅卷轨迹列表获取
-                String questionNumber = question.getQuestionNumber();
-                for (MarkHeaderTrack track : tracks) {
-                    if (track.getQuestionNumber().equals(questionNumber)) {
-                        step.addTrack(new TrackDTO(track));
-                    }
-                }
-            }
-            list.add(step);
+            step.setScore(sItems.get(0).getScore());
+            // 增加阅卷轨迹列表获取
+            String questionNumber = markQuestion.getQuestionNumber();
+            // todo 轨迹 2025-02-25
+//            for (MarkHeaderTrack track : tracks) {
+//                if (track.getQuestionNumber().equals(questionNumber)) {
+//                    step.addTrack(new TrackDTO(track));
+//                }
+//            }
         }
+        list.add(step);
         return list;
     }
 
@@ -253,7 +222,7 @@ public class TaskServiceImpl implements TaskService {
         MarkStepDTO step = new MarkStepDTO();
         step.setMainNumber(question.getMainNumber());
         step.setSubNumber(String.valueOf(question.getSubNumber()));
-        step.setGroupNumber(question.getGroupNumber());
+        step.setQuestionId(question.getId());
         step.setTitle(question.getMainTitle());
         step.setDefaultScore(0d);
         step.setMaxScore(question.getTotalScore());
@@ -267,7 +236,7 @@ public class TaskServiceImpl implements TaskService {
     public Task build(MarkTask t) {
         Task task = new Task();
         task.setTaskId(t.getId());
-        task.setGroupNumber(task.getGroupNumber());
+        task.setQuestionId(t.getQuestionId());
         task.setSecretNumber(t.getSecretNumber());
         task.setMarkerTime(t.getMarkerTime());
         task.setPaperNumber(t.getPaperNumber());
@@ -280,11 +249,9 @@ public class TaskServiceImpl implements TaskService {
         task.setSpecialTagList(getMarkSpecialTagList(t));
         MarkStudent student = markStudentService.getById(t.getStudentId());
         task.setPaperType(student.getPaperType());
-//        task.setSheetUrls(teachcloudCommonService.filePreview(student.getSheetPathList()));
         task.setSheetUrls(teachcloudCommonService.fileMarkPreview(student.getSheetPathList()));
-        MarkGroup group = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(t.getExamId(), t.getPaperNumber(),
-                t.getGroupNumber());
-        task.setSliceConfig(group.getPictureConfigList());
+        MarkQuestion markQuestion = markQuestionService.getById(t.getQuestionId());
+        task.setSliceConfig(markQuestion.getPictureConfigList());
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(t.getExamId(), t.getPaperNumber());
         task.setObjectiveScore(markPaper.getShowObjectScore() ? student.getObjectiveScore() : null);
         return task;
@@ -292,46 +259,17 @@ public class TaskServiceImpl implements TaskService {
 
     private List<MarkStepDTO> buildMarkStep(MarkTask task) {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
-        List<MarkQuestion> sList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(
-                task.getExamId(), task.getPaperNumber(), task.getGroupNumber(), false);
-        List<MarkTrack> tracks = new ArrayList<MarkTrack>();
-        List<ScoreItem> sItems = new ArrayList<ScoreItem>();
-//		List<ScoreItem> rItems = null;
+        MarkQuestion markQuestion = markQuestionService.getById(task.getQuestionId());
+        List<MarkTrack> tracks = task.listMarkerTrack();
+        MarkStepDTO step = buildStep(markQuestion);
         if (task != null) {
-            tracks = markTrackService.listByTaskId(task.getId());
-            sItems = task.getMarkerScoreItem();
-        }
-        for (int i = 0; i < sList.size(); i++) {
-            MarkQuestion question = sList.get(i);
-            MarkStepDTO step = buildStep(question);
-            if (task != null) {
-                if (!sItems.isEmpty() && sItems.size() == sList.size()) {
-                    step.setScore(sItems.get(i).getScore());
-                }
-//				if (rItems == null) {
-//					// 无打回记录
-//					step.setRejected(false);
-//				} else if (rItems != null && rItems.isEmpty()) {
-//					// 全打回
-//					step.setRejected(true);
-//				} else if (rItems != null && !rItems.isEmpty() && rItems.size() == sList.size()) {
-//					// 部分打回
-//					step.setRejected(rItems.get(i).getScore() == null);
-//				}
-                // 未选做
-//                if (task.getMarkerScore() != null && task.getMarkerScore() == UN_SELECTIVE_SCORE) {
-//                    step.setScore(UN_SELECTIVE_SCORE);
-//                }
-                // 增加阅卷轨迹列表获取
-                String questionNumber = question.getQuestionNumber();
-                for (MarkTrack track : tracks) {
-                    if (track.getQuestionNumber().equals(questionNumber)) {
-                        step.addTrack(new TrackDTO(track));
-                    }
-                }
+            step.setScore(task.getMarkerScore());
+            // 增加阅卷轨迹列表获取
+            for (MarkTrack track : tracks) {
+                step.addTrack(new TrackDTO(track));
             }
-            list.add(step);
         }
+        list.add(step);
         return list;
     }
 
@@ -345,9 +283,9 @@ public class TaskServiceImpl implements TaskService {
         return specialTags;
     }
 
-    public SpecialTagDTO[] getMarkSpecialTagList(MarkTask library) {
+    public SpecialTagDTO[] getMarkSpecialTagList(MarkTask t) {
         SpecialTagDTO[] specialTags = null;
-        List<MarkSpecialTag> list = markSpecialTagService.findByTaskId(library.getId());
+        List<MarkSpecialTag> list = t.listMarkerTag();
         if (!list.isEmpty()) {
             specialTags = new SpecialTagDTO[list.size()];
             for (int i = 0; i < list.size(); i++) {
@@ -360,17 +298,12 @@ public class TaskServiceImpl implements TaskService {
 
     private SpecialTagDTO[] getMarkSpecialTagList(MarkStudent student) {
         List<SpecialTagDTO> list = new LinkedList<>();
-        List<MarkGroup> groups = markGroupService.listGroupByExamIdAndPaperNumber(student.getExamId(),
-                student.getPaperNumber());
-        for (MarkGroup group : groups) {
-            List<MarkTask> libraryList = markTaskService.listByStudentIdAndGroupNumber(student.getId(),
-                    group.getNumber());
-            // 不管单评还是多评显示所有评卷员特殊标记
-            for (MarkTask library : libraryList) {
-                List<MarkSpecialTag> tagList = markSpecialTagService.findByTaskId(library.getId());
-                for (MarkSpecialTag specialTag : tagList) {
-                    list.add(new MarkerSpecialTagDTO(library.getUserId(), library.getGroupNumber(), specialTag));
-                }
+        List<MarkTask> taskList = markTaskService.listByStudentId(student.getId());
+        // 不管单评还是多评显示所有评卷员特殊标记
+        for (MarkTask t : taskList) {
+            List<MarkSpecialTag> tagList = t.listMarkerTag();
+            for (MarkSpecialTag specialTag : tagList) {
+                list.add(new MarkerSpecialTagDTO(t.getUserId(), t.getQuestionId(), specialTag));
             }
         }
         return list.toArray(new SpecialTagDTO[0]);

+ 8 - 8
teachcloud-mark/src/main/resources/mapper/MarkArbitrateHistoryMapper.xml

@@ -23,7 +23,7 @@
             mah.id,
             mah.exam_id examId,
             mah.paper_number paperNumber,
-            mah.group_number groupNumber,
+            mah.question_id questionId,
             mah.student_id studentId,
             mah.status,
             mah.update_user_id updateUserId,
@@ -37,8 +37,8 @@
             sys_user su ON mah.update_user_id = su.id
         where mah.exam_id = #{examId}
             AND mah.paper_number = #{paperNumber}
-            <if test="groupNumber != null and groupNumber != ''">
-                AND group_number = #{groupNumber}
+            <if test="questionId != null">
+                AND question_id = #{questionId}
             </if>
             <if test="status != null and status != ''">
                 AND status = #{status}
@@ -49,11 +49,11 @@
                         FROM
                             mark_user_class muc
                                 join
-                            mark_user_group mug ON muc.exam_id = mug.exam_id AND muc.paper_number = mug.paper_number AND muc.user_id = mug.user_id
+                            mark_user_question muq ON muc.exam_id = muq.exam_id AND muc.paper_number = muq.paper_number AND muc.user_id = muq.user_id
                         WHERE
                             mah.exam_id = muc.exam_id
                             AND mah.paper_number = muc.paper_number
-                            AND mah.group_number = mug.group_number
+                            AND mah.question_id = muq.question_id
                             AND muc.class_name = #{className}
                             AND EXISTS( SELECT
                                     1
@@ -72,7 +72,7 @@
             mark_arbitrate_history
         WHERE
             exam_id = #{examId} AND paper_number = #{paperNumber}
-          AND group_number = #{groupNumber}
+          AND question_id = #{questionId}
           AND status = 'WAITING'
             ORDER BY id
             LIMIT 1
@@ -84,7 +84,7 @@
             mark_arbitrate_history t
         WHERE
             t.exam_id = #{examId} AND t.paper_number = #{paperNumber}
-          AND t.group_number = #{groupNumber}
+          AND t.question_id = #{questionId}
           AND t.status = #{status}
         ORDER BY t.update_time DESC
     </select>
@@ -96,7 +96,7 @@
         WHERE
             mah.exam_id = #{examId}
           AND mah.paper_number = #{paperNumber}
-          AND mah.group_number = #{groupNumber}
+          AND mah.question_id = #{questionId}
           AND mah.status = #{status}
           <if test="className != null and className != ''">
               AND EXISTS( SELECT

+ 0 - 20
teachcloud-mark/src/main/resources/mapper/MarkGroupMapper.xml

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.qmth.teachcloud.mark.mapper.MarkGroupMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkGroup">
-        <id column="exam_id" property="examId" />
-        <id column="paper_number" property="paperNumber" />
-        <id column="number" property="number" />
-        <result column="pic_list" property="picList" />
-        <result column="total_score" property="totalScore" />
-        <result column="double_rate" property="doubleRate" />
-        <result column="arbitrate_threshold" property="arbitrateThreshold" />
-        <result column="score_policy" property="scorePolicy" />
-        <result column="task_count" property="taskCount" />
-        <result column="marked_count" property="markedCount" />
-        <result column="left_count" property="leftCount" />
-    </resultMap>
-
-</mapper>

+ 0 - 15
teachcloud-mark/src/main/resources/mapper/MarkGroupStudentMapper.xml

@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.qmth.teachcloud.mark.mapper.MarkGroupStudentMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkGroupStudent">
-        <id column="id" property="id" />
-        <result column="student_id" property="studentId" />
-        <result column="group_number" property="groupNumber" />
-        <result column="exam_id" property="examId" />
-        <result column="paper_number" property="paperNumber" />
-        <result column="status" property="status" />
-    </resultMap>
-
-</mapper>

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

@@ -31,7 +31,7 @@
           AND mq.objective = false
         ORDER BY mq.main_number , mq.sub_number
     </select>
-    <select id="sumTotalScoreByGroupNumber" resultType="java.lang.Double">
+    <select id="sumTotalScoreByQuestionId" resultType="java.lang.Double">
         SELECT
             SUM(CAST(q.total_score AS DECIMAL (10 , 3 )))
         FROM

部分文件因文件數量過多而無法顯示