Ver Fonte

修正多试卷类型导致的 教研分析计算中各种检验报错的提示和补救措施

caozixuan há 2 anos atrás
pai
commit
7f70539e5d

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperStructService.java

@@ -71,6 +71,7 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
      *
      * @param schoolId    学校id
      * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
      */
-    void updateExamCloudPaperStruct(Long schoolId, String paperNumber);
+    void updateExamCloudPaperStruct(Long schoolId, String paperNumber, String paperType);
 }

+ 17 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncReportServiceImpl.java

@@ -24,7 +24,6 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -149,7 +148,7 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
         TaskResultEnum result = null;
         TaskStatusEnum status;
         String errorMessage = null;
-        String source = null;
+        String source;
         String remark = null;
         Long schoolId = tbSyncTask.getSchoolId();
         try {
@@ -164,13 +163,10 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
                 throw ExceptionResultEnum.ERROR.exception("没有可分析的课程");
             }
 
-            List<String> courseCodes = gradeBatchPaperList.stream().map(m -> m.getPaperNumber() + m.getPaperType()).collect(Collectors.toList());
-            Collections.sort(courseCodes);
+            List<String> courseCodes = gradeBatchPaperList.stream().map(m -> m.getPaperNumber() + m.getPaperType()).sorted().collect(Collectors.toList());
             source = Base64Util.encode(ShaUtils.sha1(gradeBatch.getThirdExamId() + courseCodes.toString()));
             UpdateWrapper<GradeBatch> gradeBatchUpdateWrapper = new UpdateWrapper<>();
-            if (source != null) {
-                gradeBatchUpdateWrapper.lambda().set(GradeBatch::getSource, source);
-            }
+            gradeBatchUpdateWrapper.lambda().set(GradeBatch::getSource, source);
             gradeBatchUpdateWrapper.lambda().set(GradeBatch::getReportFilePath, null).eq(GradeBatch::getId, gradeBatch.getId());
             gradeBatchService.update(gradeBatchUpdateWrapper);
             teachCloudReportTaskUtils.startCalc(schoolId, gradeBatch.getThirdExamId(), courseCodes);
@@ -180,16 +176,23 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
             result = TaskResultEnum.ERROR;
             errorMessage = e.getMessage();
             if (e instanceof ApiException) {
-                ApiException apiException = (ApiException) e;
-                if (SystemConstant.strNotNull(errorMessage) && errorMessage.contains("(") && errorMessage.contains("(") && errorMessage.contains("【") && errorMessage.contains("】")) {
-                    String code = errorMessage.substring(errorMessage.indexOf("(") + 1, errorMessage.indexOf(")"));
+                // "...【试卷编号】(试卷类型)...[异常代码]"
+                if (SystemConstant.strNotNull(errorMessage) && errorMessage.contains("【") && errorMessage.contains("】") && errorMessage.contains("[") && errorMessage.contains("]")) {
+                    String code = errorMessage.substring(errorMessage.indexOf("[") + 1, errorMessage.indexOf("]"));
+
                     if (String.valueOf(ExceptionResultEnum.PAPER_STRUCT_EXCEPTION.getCode()).equals(code)) {
                         // 截取试卷编号当做remark
-                        remark = errorMessage.substring(errorMessage.indexOf("【") + 1, errorMessage.indexOf("】"));
-                        errorMessage = errorMessage.substring(0, errorMessage.indexOf("("));
+                        String paperNumber = errorMessage.substring(errorMessage.indexOf("【") + 1, errorMessage.indexOf("】"));
+                        remark = paperNumber;
+                        errorMessage = errorMessage.substring(0, errorMessage.indexOf("["));
                         // 更新状态(structureChange)
                         UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
-                        updateWrapper.lambda().set(ExamPaperStructure::getStructureChange, true).eq(ExamPaperStructure::getSchoolId, schoolId).eq(ExamPaperStructure::getPaperNumber, remark);
+                        updateWrapper.lambda().set(ExamPaperStructure::getStructureChange, true).eq(ExamPaperStructure::getSchoolId, schoolId).eq(ExamPaperStructure::getPaperNumber, paperNumber);
+                        if (errorMessage.contains("(") && errorMessage.contains(")")) {
+                            String paperType = errorMessage.substring(errorMessage.indexOf("(") + 1, errorMessage.indexOf(")"));
+                            remark = paperNumber + "(" + paperType + ")";
+                            updateWrapper.lambda().eq(ExamPaperStructure::getPaperType, paperType);
+                        }
                         examPaperStructureService.update(updateWrapper);
                     }
                 }
@@ -277,7 +280,7 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
                         }
                     }
                     // 删除批次
-                    boolean batchDeleteResult = true;
+                    boolean batchDeleteResult;
                     batchDeleteResult = teachCloudReportTaskUtils.syncDeleteExam(schoolId, thirdExamId);
                     if (batchDeleteResult) {
                         gradeBatchService.removeById(gradeBatch.getId());

+ 16 - 9
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java

@@ -249,12 +249,18 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void updateExamCloudPaperStruct(Long schoolId, String paperNumber) {
+    public void updateExamCloudPaperStruct(Long schoolId, String paperNumber, String paperType) {
         // 更新试卷结构参数的云阅卷试卷结构
-        List<ExamPaperStructure> examPaperStructureList = examPaperStructureService.list(new QueryWrapper<ExamPaperStructure>()
-                .lambda()
+        QueryWrapper<ExamPaperStructure> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda()
                 .eq(ExamPaperStructure::getSchoolId, schoolId)
-                .eq(ExamPaperStructure::getPaperNumber, paperNumber));
+                .eq(ExamPaperStructure::getPaperNumber, paperNumber);
+        if (SystemConstant.strNotNull(paperType)){
+            queryWrapper.lambda().eq(ExamPaperStructure::getPaperType,paperType);
+        }
+
+        List<ExamPaperStructure> examPaperStructureList = examPaperStructureService.list(queryWrapper);
+
         if (examPaperStructureList.size() != 1) {
             throw ExceptionResultEnum.ERROR.exception("知学知考试卷结构异常");
         }
@@ -264,7 +270,6 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         // 科目代码(课程代码+卷型+课程序号)
         String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
 
-        String paperType = null;
         String examPaperObj = examPaperStructure.getObjectiveStructure();
         if (SystemConstant.strNotNull(examPaperObj)) {
             List<Question> examPaperObjList = JSON.parseArray(examPaperObj, Question.class);
@@ -279,10 +284,12 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         examPaperStructureService.updateById(examPaperStructure);
 
         // 更新grade_paper_struct
-        this.remove(new QueryWrapper<GradePaperStruct>()
-                .lambda()
-                .eq(GradePaperStruct::getSchoolId, schoolId)
-                .eq(GradePaperStruct::getPaperNumber, paperNumber));
+        QueryWrapper<GradePaperStruct> willDeleteQueryWrapper = new QueryWrapper<>();
+        willDeleteQueryWrapper.lambda().eq(GradePaperStruct::getSchoolId,schoolId).eq(GradePaperStruct::getPaperNumber,paperNumber);
+        if (SystemConstant.strNotNull(paperType)){
+            willDeleteQueryWrapper.lambda().eq(GradePaperStruct::getPaperType,paperType);
+        }
+        this.remove(willDeleteQueryWrapper);
     }
 
     /**

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

@@ -95,12 +95,13 @@ public class GradePaperStructController {
     @ApiOperation(value = "成绩分析试卷结构-更新试卷机构")
     @RequestMapping(value = "/change_paper_structure", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
-    public Result updateExamCloudPaperStruct(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+    public Result updateExamCloudPaperStruct(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                             @ApiParam(value = "试卷类型") @RequestParam(required = false) String paperType) {
         if (SystemConstant.isOneNull(paperNumber)){
             throw ExceptionResultEnum.ERROR.exception("缺少试卷编号");
         }
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        gradePaperStructService.updateExamCloudPaperStruct(requestUser.getSchoolId(),paperNumber);
+        gradePaperStructService.updateExamCloudPaperStruct(requestUser.getSchoolId(),paperNumber,paperType);
         return ResultUtil.ok();
     }
 }

+ 44 - 25
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeDataCheckServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.report.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.report.business.bean.dto.Answer;
@@ -63,11 +64,20 @@ public class AnalyzeDataCheckServiceImpl implements AnalyzeDataCheckService {
             sum = sum.add(tbPaperStruct.getFullScore());
         }
         if (totalScore.compareTo(sum) != 0) {
-            String paperNumber = courseCode.substring(0,courseCode.length() - tbPaper.getPaperType().length());
-            throw ExceptionResultEnum.ERROR.exception("试卷总分和试卷结构中各个题目分数之和不一致," +
-                    "请试卷编号为: 【" + paperNumber + "】的命题老师在知学知考教研分析板块下按照如下操作重新配置试卷总分和及格分:" +
+            String paperNumber = courseCode.substring(0, courseCode.length() - tbPaper.getPaperType().length());
+            String paperType = tbPaper.getPaperType();
+            final String regex = "T";
+            String errorMessage = "试卷总分和试卷结构中各个题目分数之和不一致," +
+                    "请试卷编号为: 【" + paperNumber + "】" + regex + "的命题老师在知学知考教研分析板块下按照如下操作重新配置试卷总分和及格分:" +
                     "数据初始化 -> 基础配置 -> 诊断规则定义 -> 更新满分,及格分,并检查满分为命题蓝图设置中各个题目分数之和 -> 保存。" +
-                    "之后管理员再重新计算该分析批次。");
+                    "之后管理员再重新计算该分析批次。";
+            if (SystemConstant.strNotNull(paperType)) {
+                //  试卷类型不为空 替换T
+                errorMessage = errorMessage.replaceAll(regex, ",试卷类型为: (" + paperType + ")");
+            } else {
+                errorMessage = errorMessage.replaceAll(regex, "");
+            }
+            throw ExceptionResultEnum.ERROR.exception(errorMessage);
         }
     }
 
@@ -75,26 +85,26 @@ public class AnalyzeDataCheckServiceImpl implements AnalyzeDataCheckService {
     @Override
     public void checkExamStudentAnswer(Long schoolId, Long examId, String courseCode) {
         TBPaper tbPaper = tbPaperService.getOne(new QueryWrapper<TBPaper>().lambda()
-                .eq(TBPaper::getExamId,examId)
-                .eq(TBPaper::getCourseCode,courseCode));
-        if (Objects.isNull(tbPaper)){
+                .eq(TBPaper::getExamId, examId)
+                .eq(TBPaper::getCourseCode, courseCode));
+        if (Objects.isNull(tbPaper)) {
             throw ExceptionResultEnum.ERROR.exception("未找到试卷信息");
         }
         Long paperId = tbPaper.getId();
         // 试卷结构蓝图
         List<TBPaperStruct> tbPaperStructList = tbPaperStructService.list(new QueryWrapper<TBPaperStruct>().lambda()
-                .eq(TBPaperStruct::getPaperId,paperId));
+                .eq(TBPaperStruct::getPaperId, paperId));
 
-        List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getPaperId,paperId));
-        if (tbExamRecordList.isEmpty()){
+        List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getPaperId, paperId));
+        if (tbExamRecordList.isEmpty()) {
             throw ExceptionResultEnum.ERROR.exception("没有找到考生成绩记录");
         }
         List<Long> examStudentIdList = tbExamRecordList.stream().map(TBExamRecord::getExamStudentId).collect(Collectors.toList());
 
         // 考生(不缺考的)
         List<TBExamStudent> tbExamStudentList = tbExamStudentService.list(new QueryWrapper<TBExamStudent>()
-                .lambda()
-                .in(TBExamStudent::getId,examStudentIdList))
+                        .lambda()
+                        .in(TBExamStudent::getId, examStudentIdList))
                 .stream()
                 .filter(e -> !e.getAbsent())
                 .collect(Collectors.toList());
@@ -102,22 +112,22 @@ public class AnalyzeDataCheckServiceImpl implements AnalyzeDataCheckService {
         // 有效的考生成绩记录
         List<TBExamRecord> effectTBExamRecordList = tbExamRecordList.stream().filter(e -> effectStudentIdList.contains(e.getExamStudentId())).collect(Collectors.toList());
         List<Long> effectRecordIdList = effectTBExamRecordList.stream().map(TBExamRecord::getId).collect(Collectors.toList());
-        if (effectRecordIdList.isEmpty()){
+        if (effectRecordIdList.isEmpty()) {
             throw ExceptionResultEnum.ERROR.exception("缺少有效的考生");
         }
 
         // 作答
         // 1.考生人数对应检查 - 本地试卷结构数量 * 考生数 =? 考生作答总记录数
-        List<TBAnswer> tbAnswerList = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId,effectRecordIdList));
-        Map<Integer,Long> recordAnswerCountCheckMap = new HashMap<>();
-        Map<Long,List<TBAnswer>> recordAnswerMap = new HashMap<>();
+        List<TBAnswer> tbAnswerList = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId, effectRecordIdList));
+        Map<Integer, Long> recordAnswerCountCheckMap = new HashMap<>();
+        Map<Long, List<TBAnswer>> recordAnswerMap = new HashMap<>();
         for (Long effectRecordId : effectRecordIdList) {
             List<TBAnswer> cell = tbAnswerList.stream().filter(e -> Objects.equals(e.getExamRecordId(), effectRecordId)).collect(Collectors.toList());
-            recordAnswerMap.put(effectRecordId,cell);
-            recordAnswerCountCheckMap.put(cell.size(),effectRecordId);
+            recordAnswerMap.put(effectRecordId, cell);
+            recordAnswerCountCheckMap.put(cell.size(), effectRecordId);
         }
 
-        if (recordAnswerCountCheckMap.keySet().size() > 1){
+        if (recordAnswerCountCheckMap.keySet().size() > 1) {
             throw ExceptionResultEnum.ERROR.exception("同一个试卷不同考生作答记录数量不一致");
         }
 
@@ -138,12 +148,21 @@ public class AnalyzeDataCheckServiceImpl implements AnalyzeDataCheckService {
             answer.setSubNumber(e.getSmallQuestionNumber());
             return Stream.of(answer);
         }).collect(Collectors.toList());
-        if (!Answer.matchTwoAnswerList(al1,al2)){
-            String paperNumber = courseCode.substring(0,courseCode.length() - tbPaper.getPaperType().length());
-            throw ExceptionResultEnum.PAPER_STRUCT_EXCEPTION.exception("考生作答中的试卷结构和分析参数中配置的试卷结构不一致(检查内容 : 题目类型(主观题、客观题),大题号,小题号)," +
-                    "请试卷编号为: 【" + paperNumber + "】的命题老师在知学知考教研分析板块下按照如下操作重新配置试卷结构:" +
+        if (!Answer.matchTwoAnswerList(al1, al2)) {
+            String paperNumber = courseCode.substring(0, courseCode.length() - tbPaper.getPaperType().length());
+            String paperType = tbPaper.getPaperType();
+            final String regex = "T";
+            String errorMessage = "考生作答中的试卷结构和分析参数中配置的试卷结构不一致(检查内容 : 题目类型(主观题、客观题),大题号,小题号)," +
+                    "请试卷编号为: 【" + paperNumber + "】" + regex + "的命题老师在知学知考教研分析板块下按照如下操作重新配置试卷结构:" +
                     "数据初始化 -> 基础配置 -> 命题蓝图设置 -> 更新试卷结构 -> 保存。" +
-                    "之后管理员再重新计算该分析批次。(" + ExceptionResultEnum.PAPER_STRUCT_EXCEPTION.getCode() + ")");
+                    "之后管理员再重新计算该分析批次。[" + ExceptionResultEnum.PAPER_STRUCT_EXCEPTION.getCode() + "]";
+            if (SystemConstant.strNotNull(paperType)) {
+                //  试卷类型不为空 替换T
+                errorMessage = errorMessage.replaceAll(regex, ",试卷类型为: (" + paperType + ")");
+            } else {
+                errorMessage = errorMessage.replaceAll(regex, "");
+            }
+            throw ExceptionResultEnum.PAPER_STRUCT_EXCEPTION.exception(errorMessage);
         }
     }
 
@@ -173,7 +192,7 @@ public class AnalyzeDataCheckServiceImpl implements AnalyzeDataCheckService {
         List<String> needRepeatCourseCodeList = new ArrayList<>();
         for (String courseCode : courseCodeList) {
             // 新增
-            if (analyzeDataGetAndEditService.dataGetAndEdit(examId, courseCode, schoolId)){
+            if (analyzeDataGetAndEditService.dataGetAndEdit(examId, courseCode, schoolId)) {
                 // 如果要重算 则记录该课程
                 needRepeatCourseCodeList.add(courseCode);
                 // 检查