浏览代码

3.4.4 update-20250228,联调bug修复3

xiaofei 3 月之前
父节点
当前提交
6b61467c76

+ 4 - 1
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -132,4 +132,7 @@ CREATE TABLE `t_b_version` (
                                `update_id` bigint DEFAULT NULL COMMENT '更新人id',
                                `update_id` bigint DEFAULT NULL COMMENT '更新人id',
                                `update_time` bigint DEFAULT NULL COMMENT '更新时间',
                                `update_time` bigint DEFAULT NULL COMMENT '更新时间',
                                PRIMARY KEY (`id`)
                                PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='版本管理表';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='版本管理表';
+
+-- 2025-02-28
+UPDATE `sys_privilege` SET `name` = '评卷参数设置步骤状态', `url` = '/api/admin/mark/question/subjective/step/status' WHERE (`id` = '906');

+ 10 - 38
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionSubjectiveController.java

@@ -2,7 +2,6 @@ package com.qmth.distributed.print.api.mark;
 
 
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
 import com.qmth.teachcloud.common.bean.params.mark.group.QuestionPictureConfigParams;
@@ -41,6 +40,16 @@ public class MarkQuestionSubjectiveController extends BaseController {
     @Resource
     @Resource
     private MarkQuestionService markQuestionService;
     private MarkQuestionService markQuestionService;
 
 
+    /**
+     * 主观题评卷设置-各步骤状态
+     */
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/step/status", method = RequestMethod.POST)
+    public Result stepStatus(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                             @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        return ResultUtil.ok(markQuestionService.stepStatus(examId, paperNumber));
+    }
+
     /**
     /**
      * 主观题评卷设置-查询
      * 主观题评卷设置-查询
      */
      */
@@ -76,43 +85,6 @@ public class MarkQuestionSubjectiveController extends BaseController {
     }
     }
 
 
 
 
-    /**
-     * 新增
-     */
-//    @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);
-//    }
-
-
     /**
     /**
      * 进度列表查询
      * 进度列表查询
      */
      */

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

@@ -49,9 +49,10 @@ public class MarkUserQuestionController extends BaseController {
                                @ApiParam(value = "题目") @RequestParam(required = false) Long questionId,
                                @ApiParam(value = "题目") @RequestParam(required = false) Long questionId,
                                @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
                                @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
                                @ApiParam(value = "班级") @RequestParam(required = false) String className,
                                @ApiParam(value = "班级") @RequestParam(required = false) String className,
+                               @ApiParam(value = "是否已评卷") @RequestParam(defaultValue = "false") Boolean marked,
                                @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
                                @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkUserGroupProgressDto> markGroupClassProgressDtoIPage = markUserQuestionService.pageGroupUserByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId, loginName, className, pageNumber, pageSize);
+        IPage<MarkUserGroupProgressDto> markGroupClassProgressDtoIPage = markUserQuestionService.pageGroupUserByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId, loginName, className, marked, pageNumber, pageSize);
         return ResultUtil.ok(markGroupClassProgressDtoIPage);
         return ResultUtil.ok(markGroupClassProgressDtoIPage);
     }
     }
 
 

+ 10 - 10
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/marker/MarkerAddParam.java

@@ -8,8 +8,8 @@ public class MarkerAddParam {
 
 
     private Long examId;
     private Long examId;
     private String paperNumber;
     private String paperNumber;
-    private List<Long> questionIds;
-    private List<MarkUser> markers;
+    private Long questionId;
+    private List<Long> userIds;
 
 
     public Long getExamId() {
     public Long getExamId() {
         return examId;
         return examId;
@@ -27,19 +27,19 @@ public class MarkerAddParam {
         this.paperNumber = paperNumber;
         this.paperNumber = paperNumber;
     }
     }
 
 
-    public List<Long> getQuestionIds() {
-        return questionIds;
+    public Long getQuestionId() {
+        return questionId;
     }
     }
 
 
-    public void setQuestionIds(List<Long> questionIds) {
-        this.questionIds = questionIds;
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
     }
     }
 
 
-    public List<MarkUser> getMarkers() {
-        return markers;
+    public List<Long> getUserIds() {
+        return userIds;
     }
     }
 
 
-    public void setMarkers(List<MarkUser> markers) {
-        this.markers = markers;
+    public void setUserIds(List<Long> userIds) {
+        this.userIds = userIds;
     }
     }
 }
 }

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

@@ -1,7 +1,11 @@
 package com.qmth.teachcloud.mark.dto.mark.manage;
 package com.qmth.teachcloud.mark.dto.mark.manage;
 
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
 public class MarkGroupQuestionsDto {
 public class MarkGroupQuestionsDto {
 
 
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long questionId;
     private Long questionId;
     private String questionNumber;
     private String questionNumber;
 
 

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

@@ -6,12 +6,13 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 public class MarkUserGroupProgressDto {
 public class MarkUserGroupProgressDto {
 
 
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long markUserGroupId;
+    private Long markUserQuestionId;
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     private Long userId;
     private Long userId;
     private String loginName;
     private String loginName;
     private String name;
     private String name;
     private String orgName;
     private String orgName;
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long questionId;
     private Long questionId;
     private String questionNumber;
     private String questionNumber;
     private Integer taskCount;
     private Integer taskCount;
@@ -20,13 +21,15 @@ public class MarkUserGroupProgressDto {
     private Integer currentCount;
     private Integer currentCount;
     // 重置状态
     // 重置状态
     private Boolean resetting;
     private Boolean resetting;
+    // 解绑为false, 正常为true
+    private Boolean enable;
 
 
-    public Long getMarkUserGroupId() {
-        return markUserGroupId;
+    public Long getMarkUserQuestionId() {
+        return markUserQuestionId;
     }
     }
 
 
-    public void setMarkUserGroupId(Long markUserGroupId) {
-        this.markUserGroupId = markUserGroupId;
+    public void setMarkUserQuestionId(Long markUserQuestionId) {
+        this.markUserQuestionId = markUserQuestionId;
     }
     }
 
 
     public Long getUserId() {
     public Long getUserId() {
@@ -116,4 +119,12 @@ public class MarkUserGroupProgressDto {
     public void setResetting(Boolean resetting) {
     public void setResetting(Boolean resetting) {
         this.resetting = resetting;
         this.resetting = resetting;
     }
     }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
 }
 }

+ 51 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkQuestionSubjectiveStepStatusDto.java

@@ -0,0 +1,51 @@
+package com.qmth.teachcloud.mark.dto.mark.setting;
+
+public class MarkQuestionSubjectiveStepStatusDto {
+
+    private Boolean subjectiveStruct;
+    private Boolean subjectiveMarker;
+    private Boolean subjectiveMarkerClass;
+    private Boolean objectiveAnswer;
+
+    public MarkQuestionSubjectiveStepStatusDto() {
+    }
+
+    public MarkQuestionSubjectiveStepStatusDto(Boolean subjectiveStruct, Boolean subjectiveMarker, Boolean subjectiveMarkerClass, Boolean objectiveAnswer) {
+        this.subjectiveStruct = subjectiveStruct;
+        this.subjectiveMarker = subjectiveMarker;
+        this.subjectiveMarkerClass = subjectiveMarkerClass;
+        this.objectiveAnswer = objectiveAnswer;
+    }
+
+    public Boolean getSubjectiveStruct() {
+        return subjectiveStruct;
+    }
+
+    public void setSubjectiveStruct(Boolean subjectiveStruct) {
+        this.subjectiveStruct = subjectiveStruct;
+    }
+
+    public Boolean getSubjectiveMarker() {
+        return subjectiveMarker;
+    }
+
+    public void setSubjectiveMarker(Boolean subjectiveMarker) {
+        this.subjectiveMarker = subjectiveMarker;
+    }
+
+    public Boolean getSubjectiveMarkerClass() {
+        return subjectiveMarkerClass;
+    }
+
+    public void setSubjectiveMarkerClass(Boolean subjectiveMarkerClass) {
+        this.subjectiveMarkerClass = subjectiveMarkerClass;
+    }
+
+    public Boolean getObjectiveAnswer() {
+        return objectiveAnswer;
+    }
+
+    public void setObjectiveAnswer(Boolean objectiveAnswer) {
+        this.objectiveAnswer = objectiveAnswer;
+    }
+}

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

@@ -27,7 +27,7 @@ public interface MarkUserQuestionMapper extends BaseMapper<MarkUserQuestion> {
 
 
     List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @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> 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<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, @Param("marked") Boolean marked);
 
 
     IPage<MarkQualityDto> pageQuality(@Param("page") Page<MarkQualityDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @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);
 
 
@@ -36,4 +36,6 @@ public interface MarkUserQuestionMapper extends BaseMapper<MarkUserQuestion> {
     void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId);
     void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId);
 
 
     List<SysUser> listDefaultMarkerByExamIdAndPaperNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
     List<SysUser> listDefaultMarkerByExamIdAndPaperNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+
+    List<String > countClassByExamIdAndPaperNumberAndQuestionId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
 }
 }

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

@@ -12,6 +12,7 @@ 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.manage.MarkGroupSummaryProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionSubjectiveStepStatusDto;
 import com.qmth.teachcloud.mark.params.MarkObjectiveQuestionParams;
 import com.qmth.teachcloud.mark.params.MarkObjectiveQuestionParams;
 import com.qmth.teachcloud.mark.params.MarkQuestionParams;
 import com.qmth.teachcloud.mark.params.MarkQuestionParams;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
@@ -120,4 +121,7 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
     void updateMarkedCount(Long questionId, int count);
     void updateMarkedCount(Long questionId, int count);
 
 
     void updateDoubleMarkByQuestionId(DoubleMarkParam doubleMarkParam);
     void updateDoubleMarkByQuestionId(DoubleMarkParam doubleMarkParam);
+
+    MarkQuestionSubjectiveStepStatusDto stepStatus(Long examId, String paperNumber);
+
 }
 }

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

@@ -32,7 +32,7 @@ public interface MarkUserQuestionService extends IService<MarkUserQuestion> {
     List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className);
     List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className);
 
 
     IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber,
     IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber,
-            Long questionId, String loginName, String className, Integer pageNumber, Integer pageSize);
+                                                                                     Long questionId, String loginName, String className, Boolean marked, Integer pageNumber, Integer pageSize);
 
 
     void addMarkUserQuestion(MarkerAddParam markerAddParam);
     void addMarkUserQuestion(MarkerAddParam markerAddParam);
 
 
@@ -79,4 +79,6 @@ public interface MarkUserQuestionService extends IService<MarkUserQuestion> {
     void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId);
     void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId);
 
 
     void saveDefaultMarker(Long examId, String paperNumber, List<MarkQuestion> markQuestions);
     void saveDefaultMarker(Long examId, String paperNumber, List<MarkQuestion> markQuestions);
+
+    List<String> countClassByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 }
 }

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

@@ -23,11 +23,14 @@ import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.mark.DoubleMarkParam;
 import com.qmth.teachcloud.mark.bean.mark.DoubleMarkParam;
+import com.qmth.teachcloud.mark.bean.student.MarkStudentQuery;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
+import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.SubjectiveAnswerFileDto;
 import com.qmth.teachcloud.mark.dto.mark.SubjectiveAnswerFileDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
 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.MarkGroupTaskDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionSubjectiveStepStatusDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
 import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.entity.MarkTask;
@@ -741,4 +744,59 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                 .eq(MarkQuestion::getId, doubleMarkParam.getQuestionId());
                 .eq(MarkQuestion::getId, doubleMarkParam.getQuestionId());
         this.update(updateWrapper);
         this.update(updateWrapper);
     }
     }
+
+    @Override
+    public MarkQuestionSubjectiveStepStatusDto stepStatus(Long examId, String paperNumber) {
+        List<MarkQuestion> markQuestionList = this.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+        Boolean subjectiveStruct = false, subjectiveMarker = false, subjectiveMarkerClass = false, objectiveAnswer = false;
+        if (CollectionUtils.isNotEmpty(markQuestionList)) {
+            // 主观题结构,小题分是否设置
+            long countStruct = markQuestionList.stream().filter(m -> m.getTotalScore() == null || m.getIntervalScore() == null).count();
+            subjectiveStruct = countStruct == 0;
+
+            if (subjectiveStruct) {
+                // 主观题设置评卷员
+                long countPic = markQuestionList.stream().filter(m -> StringUtils.isBlank(m.getPicList())).count();
+                subjectiveMarker = countPic == 0;
+                if (subjectiveMarker) {
+                    for (MarkQuestion markQuestion : markQuestionList) {
+                        List<MarkUserQuestion> markUserQuestionList = markUserQuestionService.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, markQuestion.getId());
+                        if (CollectionUtils.isEmpty(markUserQuestionList)) {
+                            subjectiveMarker = false;
+                            break;
+                        }
+                    }
+                }
+
+                if (subjectiveMarker) {
+                    // 分班阅
+                    MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+                    subjectiveMarkerClass = markPaper != null && markPaper.getClassMark();
+                    if (subjectiveMarkerClass) {
+                        MarkStudentQuery markStudentQuery = new MarkStudentQuery();
+                        markStudentQuery.setExamId(examId);
+                        markStudentQuery.setPaperNumber(paperNumber);
+                        List<MarkStudentVo> markStudentList = markStudentService.listMarkStudentVo(markStudentQuery);
+                        List<String> teachClasses = markStudentList.stream().filter(m -> StringUtils.isNotBlank(m.getTeachClassName())).map(MarkStudentVo::getTeachClassName).distinct().collect(Collectors.toList());
+                        for (MarkQuestion markQuestion : markQuestionList) {
+                            List<String> classNames = markUserQuestionService.countClassByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, markQuestion.getId());
+                            if (!CollectionUtils.isEqualCollection(teachClasses, classNames)) {
+                                subjectiveMarkerClass = false;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (subjectiveMarkerClass) {
+                        // 客观题标答
+                        List<MarkQuestionAnswer> markQuestionAnswerList = markQuestionAnswerService.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, null);
+                        long countAnswer = markQuestionAnswerList.stream().filter(m -> StringUtils.isBlank(m.getAnswer()) || m.getObjectivePolicy() == null).count();
+                        objectiveAnswer = countAnswer == 0;
+                    }
+                }
+            }
+        }
+
+        return new MarkQuestionSubjectiveStepStatusDto(subjectiveStruct, subjectiveMarker, subjectiveMarkerClass, objectiveAnswer);
+    }
 }
 }

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

@@ -112,29 +112,32 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
     }
     }
 
 
     @Override
     @Override
-    public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId, String loginName, String className, Integer pageNumber, Integer pageSize) {
+    public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId, String loginName, String className, Boolean marked, Integer pageNumber, Integer pageSize) {
         Page<MarkUserGroupProgressDto> page = new Page<>(pageNumber, pageSize);
         Page<MarkUserGroupProgressDto> page = new Page<>(pageNumber, pageSize);
-        IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndQuestionId(page, examId, paperNumber, questionId, loginName, className);
+        IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndQuestionId(page, examId, paperNumber, questionId, loginName, className, marked);
         for (MarkUserGroupProgressDto record : markUserGroupProgressDtoIPage.getRecords()) {
         for (MarkUserGroupProgressDto record : markUserGroupProgressDtoIPage.getRecords()) {
             MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
             MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
             record.setQuestionNumber(markQuestion.getQuestionNumber());
             record.setQuestionNumber(markQuestion.getQuestionNumber());
             List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, record.getQuestionId(), record.getUserId(), null);
             List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, record.getQuestionId(), record.getUserId(), null);
-            record.setResetting(lockService.isLocked(LockType.MARKER_RESET, record.getMarkUserGroupId()));
+            record.setResetting(lockService.isLocked(LockType.MARKER_RESET, record.getMarkUserQuestionId()));
             record.setMarkedCount(markTaskService.markedCount(markTaskList));
             record.setMarkedCount(markTaskService.markedCount(markTaskList));
-            record.setCurrentCount(markService.applyCurrentCount(markQuestion, record.getMarkUserGroupId()));
+            record.setCurrentCount(markService.applyCurrentCount(markQuestion, record.getMarkUserQuestionId()));
         }
         }
         return markUserGroupProgressDtoIPage;
         return markUserGroupProgressDtoIPage;
     }
     }
 
 
     @Override
     @Override
     public void addMarkUserQuestion(MarkerAddParam markerAddParam) {
     public void addMarkUserQuestion(MarkerAddParam markerAddParam) {
-        if (CollectionUtils.isNotEmpty(markerAddParam.getMarkers())) {
+        if (CollectionUtils.isNotEmpty(markerAddParam.getUserIds())) {
+            // 根据是否合并设置评卷员参数,做合并
+            List<Long> questionIds = listMergeQuestionId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), markerAddParam.getQuestionId());
+
             List<MarkUserQuestion> markUserGroups = new ArrayList<>();
             List<MarkUserQuestion> markUserGroups = new ArrayList<>();
-            for (MarkUser markUser : markerAddParam.getMarkers()) {
-                for (Long questionId : markerAddParam.getQuestionIds()) {
-                    MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndQuestionIdAndUserId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, markUser.getUserId());
+            for (Long userId : markerAddParam.getUserIds()) {
+                for (Long questionId : questionIds) {
+                    MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndQuestionIdAndUserId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, userId);
                     if (markUserGroup == null) {
                     if (markUserGroup == null) {
-                        markUserGroups.add(new MarkUserQuestion(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, markUser.getUserId()));
+                        markUserGroups.add(new MarkUserQuestion(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, userId));
                     } else if (!markUserGroup.getEnable()) {
                     } else if (!markUserGroup.getEnable()) {
                         markUserGroup.setEnable(true);
                         markUserGroup.setEnable(true);
                         markUserGroups.add(markUserGroup);
                         markUserGroups.add(markUserGroup);
@@ -147,6 +150,24 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
         }
         }
     }
     }
 
 
+    private List<Long> listMergeQuestionId(Long examId, String paperNumber, Long questionId) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        List<Long> questionIds = new ArrayList<>();
+        if (markPaper != null && markPaper.getMergeMarker() != null && markPaper.getMergeMarker()) {
+            // 逻辑解绑
+            MarkQuestion markQuestion = markQuestionService.getById(questionId);
+            if (markQuestion == null) {
+                throw ExceptionResultEnum.ERROR.exception("题目不存在");
+            }
+            List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
+            // 填空题,整个大题一起解绑
+            return markQuestionList.stream().filter(m -> markQuestion.getMainNumber().equals(m.getMainNumber()) && "4".equals(m.getQuestionType())).map(MarkQuestion::getId).collect(Collectors.toList());
+        } else {
+            questionIds.add(questionId);
+        }
+        return questionIds;
+    }
+
     @Override
     @Override
     public void setTopCount(List<Long> markUserQuestionIds, Integer topCount) {
     public void setTopCount(List<Long> markUserQuestionIds, Integer topCount) {
         for (Long markUserQuestionId : markUserQuestionIds) {
         for (Long markUserQuestionId : markUserQuestionIds) {
@@ -170,18 +191,13 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
 
 
     @Override
     @Override
     public void deleteMarker(MarkUserQuestion markUserQuestion) {
     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(markUserQuestion.getId()));
         releaseMarker(Arrays.asList(markUserQuestion.getId()));
         // 逻辑解绑
         // 逻辑解绑
+        List<Long> ids = listMergeQuestionId(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(), markUserQuestion.getQuestionId());
         UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
         UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkUserQuestion::getEnable, false).eq(MarkUserQuestion::getId, markUserQuestion.getId());
+        updateWrapper.lambda().set(MarkUserQuestion::getEnable, false).in(MarkUserQuestion::getId, ids);
         this.update(updateWrapper);
         this.update(updateWrapper);
-//        }
     }
     }
 
 
     @Override
     @Override
@@ -352,7 +368,7 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
         List<MarkUserQuestion> markUserQuestions = listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
         List<MarkUserQuestion> markUserQuestions = listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
         List<String> userIds = new ArrayList<>();
         List<String> userIds = new ArrayList<>();
         if (CollectionUtils.isNotEmpty(markUserQuestions)) {
         if (CollectionUtils.isNotEmpty(markUserQuestions)) {
-            userIds = markUserQuestions.stream().map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
+            userIds = markUserQuestions.stream().filter(m -> m.getEnable()).map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
         }
         }
         return userIds;
         return userIds;
     }
     }
@@ -378,4 +394,9 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
         }
         }
         this.saveBatch(markUserQuestions);
         this.saveBatch(markUserQuestions);
     }
     }
+
+    @Override
+    public List<String> countClassByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
+        return this.baseMapper.countClassByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
+    }
 }
 }

+ 29 - 4
teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml

@@ -95,17 +95,18 @@
     <select id="pageGroupUserByExamIdAndPaperNumberAndQuestionId"
     <select id="pageGroupUserByExamIdAndPaperNumberAndQuestionId"
             resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto">
             resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto">
         SELECT
         SELECT
-            muq.id markUserGroupId,
+            muq.id markUserQuestionId,
             muq.question_id questionId,
             muq.question_id questionId,
             muq.top_count topCount,
             muq.top_count topCount,
             su.id userId,
             su.id userId,
             su.login_name loginName,
             su.login_name loginName,
             su.real_name name,
             su.real_name name,
-            so.name orgName
+            so.name orgName,
+            muq.enable
         FROM
         FROM
             mark_user_question muq
             mark_user_question muq
                 LEFT JOIN
                 LEFT JOIN
-            sys_user su ON mug.user_id = su.id
+            sys_user su ON muq.user_id = su.id
                 LEFT JOIN
                 LEFT JOIN
             sys_org so ON su.org_id = so.id
             sys_org so ON su.org_id = so.id
         <where>
         <where>
@@ -124,6 +125,13 @@
                         and muq.user_id = muc.user_id
                         and muq.user_id = muc.user_id
                         and muq.class_name = #{className})
                         and muq.class_name = #{className})
             </if>
             </if>
+            <if test="marked == true">
+                AND EXISTS (select 1 from mark_task mt
+                where muq.exam_id = mt.exam_id
+                and muq.paper_number = mt.paper_number
+                and muq.user_id = mt.user_id
+                and mt.status in ('MARKED','ARBITRATED','WAIT_ARBITRATE'))
+            </if>
         </where>
         </where>
     </select>
     </select>
     <select id="pageQuality" resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto">
     <select id="pageQuality" resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto">
@@ -139,7 +147,7 @@
             muq.avg_speed avgSpeed
             muq.avg_speed avgSpeed
         FROM
         FROM
             mark_user_question muq
             mark_user_question muq
-                LEFT JOIN sys_user su ON mug.user_id = su.id
+                LEFT JOIN sys_user su ON muq.user_id = su.id
         where
         where
             muq.exam_id = #{examId}
             muq.exam_id = #{examId}
             AND muq.paper_number = #{paperNumber}
             AND muq.paper_number = #{paperNumber}
@@ -198,6 +206,23 @@
                                         AND bes.id = es.basic_student_id)
                                         AND bes.id = es.basic_student_id)
                             AND bes.teacher_id IS NOT NULL)
                             AND bes.teacher_id IS NOT NULL)
     </select>
     </select>
+    <select id="countClassByExamIdAndPaperNumberAndQuestionId" resultType="java.lang.String">
+        SELECT DISTINCT
+            muc.class_name
+        FROM
+            mark_user_class muc
+        WHERE
+            muc.exam_id = #{examId} AND muc.paper_number = #{paperNumber}
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          mark_user_question muq
+                      WHERE
+                          muc.exam_id = muq.exam_id
+                        AND muc.paper_number = muq.paper_number
+                        AND muc.user_id = muq.user_id
+                        AND muq.question_id = #{questionId})
+    </select>
 
 
     <update id="updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId">
     <update id="updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId">
         UPDATE mark_user_question
         UPDATE mark_user_question