Ver código fonte

Merge remote-tracking branch 'origin/dev_v3.4.4' into dev_v3.4.4

wangliang 3 meses atrás
pai
commit
8babfa9f3a

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

@@ -288,3 +288,5 @@ WHERE id=1193;
 ALTER TABLE `mark_paper` ADD INDEX `index3` (`status` ASC, `upload_count` ASC);
 
 ALTER TABLE `mark_student` ADD INDEX `index7` (`subjective_status` ASC);
+ALTER TABLE `mark_user_paper` ADD INDEX `index1` (`exam_id` ASC, `paper_number` ASC, `user_id` ASC);
+ALTER TABLE `mark_user_paper` ADD COLUMN `marked_question_id` BIGINT(20) NULL COMMENT '正在阅卷的题目ID' AFTER `mode`;

+ 12 - 23
distributed-print/src/main/java/com/qmth/distributed/print/api/SysAdminSetController.java

@@ -680,14 +680,8 @@ public class SysAdminSetController {
     @ApiResponses({@ApiResponse(code = 200, message = "识别配置信息", response = SysAdminSetResult.class)})
     @RequestMapping(value = "/objective/omr/select", method = RequestMethod.POST)
     public Result objectiveOmrSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
-        SysConfig sysConfigOpenFlowMsgPush = commonCacheService.addSysConfigCache(schoolId, SystemConstant.OPEN_FLOW_MESSAGE_PUSH);
-        List<SysConfigResult> sysConfigResultList = new ArrayList<>();
-        if (Objects.nonNull(sysConfigOpenFlowMsgPush)) {
-            sysConfigResultList.add(new SysConfigResult(sysConfigOpenFlowMsgPush));
-        } else {
-            sysConfigResultList.add(new SysConfigResult(null, SystemConstant.SINGLE_QUESTION_OMR_TASK, "特定条件是否进入客观题检查", "true", 1));
-        }
-        return ResultUtil.ok(new SysAdminSetResult(schoolId, sysConfigResultList));
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SINGLE_QUESTION_OMR_TASK);
+        return ResultUtil.ok(Objects.nonNull(sysConfig) ? new SysConfigResult(sysConfig) : new SysConfigResult(null, SystemConstant.SINGLE_QUESTION_OMR_TASK, "客观题检查扩展条件", null, 1));
     }
 
     @ApiOperation(value = "识别配置保存")
@@ -695,23 +689,18 @@ public class SysAdminSetController {
     @RequestMapping(value = "/objective/omr/save", method = RequestMethod.POST)
     @Transactional
     @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
-    public Result objectiveOmrSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
-        if (bindingResult.hasErrors()) {
-            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+    public Result objectiveOmrSave(@ApiParam(value = "学校ID", required = true) @RequestParam Long schoolId,
+                                   @ApiParam(value = "单选题有且只有一个识别结果时不进客观题检查", required = true) @RequestParam Boolean enable) {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SINGLE_QUESTION_OMR_TASK);
+        if(sysConfig==null){
+            sysConfig = new SysConfig(schoolId, new SysConfigResult(null, SystemConstant.SINGLE_QUESTION_OMR_TASK, "客观题检查扩展条件", enable, 1));
+        }else {
+            sysConfig.setConfigValue(String.valueOf(enable));
         }
-        Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("配置不能为空"));
-
-        List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
-        List<SysConfig> sysConfigList = new ArrayList<>();
-        for (SysConfigResult s : sysConfigResultList) {
-            sysConfigList.add(new SysConfig(sysAdminSetParam.getSchoolId(), s));
-        }
-        sysConfigService.saveOrUpdateBatch(sysConfigList);
-
-        for (SysConfigResult s : sysConfigResultList) {
-            commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
+        if (sysConfigService.saveOrUpdate(sysConfig)) {
+            commonCacheService.updateSysConfigCache(schoolId, sysConfig.getConfigKey());
         }
-        return ResultUtil.ok(true);
+        return ResultUtil.ok(new SysConfigResult(sysConfig));
     }
 
     @ApiOperation(value = "字体查询")

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

@@ -116,7 +116,7 @@ public class MarkController extends BaseController {
                                 @RequestParam QuestionModel questionModel) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
         userService.updateUiSetting(user.getId(), StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(uiSetting)));
-        markUserPaperService.updateMode(examId, paperNumber, user.getId(), mode, questionModel);
+        markUserPaperService.update(examId, paperNumber, user.getId(), mode, questionModel, null);
         return ResultUtil.ok(true);
     }
 

+ 15 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkStatusDto.java

@@ -43,14 +43,20 @@ public class MarkStatusDto {
      */
     @JsonSerialize(using = ToStringSerializer.class)
     private Long questionId;
+    /**
+     * 正在证券的题目ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long markedQuestionId;
 
     public MarkStatusDto() {
     }
 
-    public MarkStatusDto(MarkQuestion markQuestion) {
+    public MarkStatusDto(MarkQuestion markQuestion, Long markedQuestionId) {
         this.mainNumber = markQuestion.getMainNumber();
         this.subNumber = markQuestion.getSubNumber();
         this.questionId = markQuestion.getId();
+        this.markedQuestionId = markedQuestionId;
     }
 
     public int getTotalCount() {
@@ -124,4 +130,12 @@ public class MarkStatusDto {
     public void setQuestionId(Long questionId) {
         this.questionId = questionId;
     }
+
+    public Long getMarkedQuestionId() {
+        return markedQuestionId;
+    }
+
+    public void setMarkedQuestionId(Long markedQuestionId) {
+        this.markedQuestionId = markedQuestionId;
+    }
 }

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserPaper.java

@@ -41,6 +41,9 @@ public class MarkUserPaper implements Serializable {
     @ApiModelProperty(value = "评卷模式(SINGLE:单题阅,MULTI:多题阅)")
     private QuestionModel questionModel;
 
+    @ApiModelProperty(value = "正在评卷的题目ID")
+    private Long markedQuestionId;
+
     public MarkUserPaper() {
     }
 
@@ -96,6 +99,14 @@ public class MarkUserPaper implements Serializable {
         this.questionModel = questionModel;
     }
 
+    public Long getMarkedQuestionId() {
+        return markedQuestionId;
+    }
+
+    public void setMarkedQuestionId(Long markedQuestionId) {
+        this.markedQuestionId = markedQuestionId;
+    }
+
     @Override
     public String toString() {
         return "MarkUserPaper{" +
@@ -105,6 +116,7 @@ public class MarkUserPaper implements Serializable {
             ", userId=" + userId +
             ", mode=" + mode +
             ", questionModel=" + questionModel +
+            ", markedQuestionId=" + markedQuestionId +
         "}";
     }
 }

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

@@ -36,7 +36,7 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
     List<MarkTask> findUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
                                 @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("classMark") Boolean classMark);
+    List<MarkTask> findUnMarkedFilterClass(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("questionId") Long questionId, @Param("classMark") Boolean classMark);
 
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
 

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

@@ -12,6 +12,7 @@ public class MarkResult {
      * 考生编号
      */
     private Long studentId;
+    private Long markedQuestionId;
 
     /**
      * 总分
@@ -33,6 +34,14 @@ public class MarkResult {
         this.studentId = studentId;
     }
 
+    public Long getMarkedQuestionId() {
+        return markedQuestionId;
+    }
+
+    public void setMarkedQuestionId(Long markedQuestionId) {
+        this.markedQuestionId = markedQuestionId;
+    }
+
     public double getMarkerScore() {
         return markerScore;
     }

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

@@ -63,7 +63,7 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId);
 
-    List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Boolean classMark);
+    List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Long questionId, Boolean classMark);
 
     int countByIdAndStatus(Long studentId, MarkTaskStatus status);
 

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

@@ -5,6 +5,8 @@ import com.qmth.teachcloud.mark.entity.MarkUserPaper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.mark.enums.QuestionModel;
 
+import java.util.List;
+
 /**
  * <p>
  * 试卷评卷员设置 服务类
@@ -15,7 +17,10 @@ import com.qmth.teachcloud.mark.enums.QuestionModel;
  */
 public interface MarkUserPaperService extends IService<MarkUserPaper> {
 
+    List<MarkUserPaper> listByExamIdAndPaperNumber(Long examId, String paperNumber);
     MarkUserPaper getByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId);
 
-    void updateMode(Long examId, String paperNumber, Long userId, MarkMode mode, QuestionModel questionModel);
+    void update(Long examId, String paperNumber, Long userId, MarkMode mode, QuestionModel questionModel, Long markedQuestionId);
+    void updateModeBatch(Long examId, String paperNumber, MarkMode mode);
+
 }

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

@@ -172,7 +172,7 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
             lambda.set(MarkPaper::getSheetConfig, markPaper.getSheetConfig());
         }
         // 更新评卷员模式
-        markUserPaperService.updateMode(markPaper.getExamId(), markPaper.getPaperNumber(), null, MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode(), null);
+        markUserPaperService.updateModeBatch(markPaper.getExamId(), markPaper.getPaperNumber(), MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode());
         this.update(updateWrapper);
     }
 
@@ -214,7 +214,7 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                     .eq(MarkPaper::getExamId, markPaperSettingList.getExamId())
                     .eq(MarkPaper::getPaperNumber, markPaperSettingList.getPaperNumber());
             // 更新评卷员模式
-            markUserPaperService.updateMode(markPaperSettingList.getExamId(), markPaperSettingList.getPaperNumber(), null, MarkMode.UNLIMITED.equals(config.getMarkMode()) ? MarkMode.TRACK : config.getMarkMode(), null);
+            markUserPaperService.updateModeBatch(markPaperSettingList.getExamId(), markPaperSettingList.getPaperNumber(), MarkMode.UNLIMITED.equals(config.getMarkMode()) ? MarkMode.TRACK : config.getMarkMode());
             this.update(updateWrapper);
         }
     }

+ 5 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -700,9 +700,10 @@ public class MarkServiceImpl implements MarkService {
             if (questionId != null) {
                 markUserQuestionList = markUserQuestionList.stream().filter(m -> m.getQuestionId().equals(questionId)).collect(Collectors.toList());
             }
+            MarkUserPaper markUserPaper = markUserPaperService.getByExamIdAndPaperNumberAndUserId(examId, paperNumber, userId);
             MarkStatusDto dto;
             for (MarkUserQuestion question : markUserQuestionList) {
-                dto = new MarkStatusDto(markQuestionService.getById(question.getQuestionId()));
+                dto = new MarkStatusDto(markQuestionService.getById(question.getQuestionId()), markUserPaper.getMarkedQuestionId());
                 List<Long> questionIds = Arrays.asList(question.getQuestionId());
                 dtoList.add(getDto(dto, examId, paperNumber, userId, classNames, questionIds));
             }
@@ -873,7 +874,7 @@ public class MarkServiceImpl implements MarkService {
         while (task == null) {
             if (questionModel.equals(QuestionModel.SINGLE)) {
                 Set<Long> questions = new HashSet<>(Arrays.asList(questionId));
-                List<MarkTask> list = markTaskService.findUnMarkedFilterClass(new Page<>(pageNumber, 20), examId, paperNumber, userId, markPaper.getClassMark());
+                List<MarkTask> list = markTaskService.findUnMarkedFilterClass(new Page<>(pageNumber, 20), examId, paperNumber, userId, questionId, markPaper.getClassMark());
                 if (list.isEmpty()) {
                     break;
                 }
@@ -1079,6 +1080,8 @@ public class MarkServiceImpl implements MarkService {
             }
         }
         if (CollectionUtils.size(result.getQuestionList()) == count) {
+            // 更新当前正在阅卷的questionId
+            markUserPaperService.update(examId, paperNumber, userId, null, null, result.getMarkedQuestionId());
             return SubmitResult.success(result.getStudentId());
         } else {
             return SubmitResult.faile();

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

@@ -252,8 +252,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Boolean classMark) {
-        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, classMark);
+    public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Long questionId, Boolean classMark) {
+        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, questionId, classMark);
     }
 
     @Override

+ 24 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserPaperServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.mark.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.teachcloud.common.enums.mark.MarkMode;
 import com.qmth.teachcloud.mark.entity.MarkUserPaper;
@@ -11,6 +12,8 @@ import com.qmth.teachcloud.mark.service.MarkUserPaperService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 试卷评卷员设置 服务实现类
@@ -23,6 +26,13 @@ import org.springframework.stereotype.Service;
 public class MarkUserPaperServiceImpl extends ServiceImpl<MarkUserPaperMapper, MarkUserPaper> implements MarkUserPaperService {
 
     @Override
+    public List<MarkUserPaper> listByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        QueryWrapper<MarkUserPaper> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserPaper::getExamId, examId)
+                .eq(MarkUserPaper::getPaperNumber, paperNumber);
+        return this.list(queryWrapper);
+    }
+
     public MarkUserPaper getByExamIdAndPaperNumberAndUserId(Long examId, String paperNumber, Long userId) {
         QueryWrapper<MarkUserPaper> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkUserPaper::getExamId, examId)
@@ -32,18 +42,31 @@ public class MarkUserPaperServiceImpl extends ServiceImpl<MarkUserPaperMapper, M
     }
 
     @Override
-    public void updateMode(Long examId, String paperNumber, Long userId, MarkMode mode, QuestionModel questionModel) {
+    public void update(Long examId, String paperNumber, Long userId, MarkMode mode, QuestionModel questionModel, Long markedQuestionId) {
         MarkUserPaper markUserPaper = this.getByExamIdAndPaperNumberAndUserId(examId, paperNumber, userId);
         if (markUserPaper == null) {
             markUserPaper = new MarkUserPaper(examId, paperNumber, userId);
             markUserPaper.setMode(mode);
             markUserPaper.setQuestionModel(questionModel);
+            markUserPaper.setMarkedQuestionId(markedQuestionId);
         } else {
             markUserPaper.setMode(mode);
             if (questionModel != null) {
                 markUserPaper.setQuestionModel(questionModel);
             }
+            if (markedQuestionId != null) {
+                markUserPaper.setMarkedQuestionId(markedQuestionId);
+            }
         }
         this.saveOrUpdate(markUserPaper);
     }
+
+    @Override
+    public void updateModeBatch(Long examId, String paperNumber, MarkMode mode) {
+        UpdateWrapper<MarkUserPaper> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkUserPaper::getMode, mode)
+                .eq(MarkUserPaper::getExamId, examId)
+                .eq(MarkUserPaper::getPaperNumber, paperNumber);
+        this.update(updateWrapper);
+    }
 }

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

@@ -128,9 +128,9 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
             if (paper == null) {
                 throw new ParameterException("paper不存在");
             }
-            if (paper.getInvalid()) {
-                continue;
-            }
+//            if (paper.getInvalid()) {
+//                continue;
+//            }
             Long paperId = spe.getPaperId();
             ScanOmrTask task = new ScanOmrTask();
             task.setId(SystemConstant.getDbUuid());
@@ -147,6 +147,9 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
             retList.add(taskDto);
             // 循环试卷
             for (ScanPaperPage pageEntity : pageList) {
+                if(StringUtils.isBlank(pageEntity.getRecogData())){
+                    continue;
+                }
                 OmrTaskPageDto pageDto = new OmrTaskPageDto(pageEntity.getPageIndex());
                 taskDto.getPage().add(pageDto);
                 List<OmrTaskItem> items = pageDto.getItems();
@@ -159,7 +162,7 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
                         String result = pageEntity.getQuestion().getResult().get(i);
                         MarkQuestion question = questionList.get(i);
                         //单选题若开启配置,仅有一个选项的不参与识别对照
-                        String answer = result.replaceAll(OMR_SUSPECT,"");
+                        String answer = result.replaceAll("\\?","");
                         if (question.getQuestionType().equals(QuestionType.SINGLE.getValue()) && enableObjectiveOmr && answer.length()==1){
                             continue;
                         }

+ 4 - 14
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -179,19 +179,10 @@
             mark_task mt
         <where>
         	mt.exam_id = #{examId}
-		and mt.paper_number = #{paperNumber}
-		and mt.user_id is null
-		and (mt.status='WAITING' or mt.status='REJECTED')
-        AND EXISTS( SELECT
-            1
-            FROM
-            mark_user_question muq
-            WHERE
-            mt.exam_id = muq.exam_id
-            AND mt.paper_Number = muq.paper_number
-            AND mt.question_id = muq.question_id
-            AND muq.user_id = #{userId}
-            AND muq.enable = true)
+        AND mt.paper_number = #{paperNumber}
+        AND mt.question_id = #{questionId}
+        AND mt.user_id is null
+        AND (mt.status='WAITING' or mt.status='REJECTED')
 		AND NOT EXISTS ( 
 			SELECT t.id 
 			FROM
@@ -215,7 +206,6 @@
 			WHERE mt.student_id = s.id
 		)
         </if>
-        order by mt.main_number, mt.sub_number
         </where>
     </select>
     <select id="listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName"