浏览代码

Merge branch 'dev_v3.1.0' of http://git.qmth.com.cn/wangliang/distributed-print-service into dev_v3.1.0

xiaof 3 年之前
父节点
当前提交
372d50ce6c
共有 15 个文件被更改,包括 292 次插入104 次删除
  1. 11 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperStructParam.java
  2. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeInitResult.java
  3. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java
  4. 17 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperStructService.java
  5. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java
  6. 11 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncReportServiceImpl.java
  7. 33 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java
  8. 19 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeInitializeServiceImpl.java
  9. 80 50
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java
  10. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java
  11. 19 17
      distributed-print-business/src/main/resources/mapper/GradeBatchPaperMapper.xml
  12. 9 8
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java
  13. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  14. 6 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeDataCheckServiceImpl.java
  15. 51 10
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseDeleteServiceImpl.java

+ 11 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperStructParam.java

@@ -1,7 +1,6 @@
 package com.qmth.distributed.print.business.bean.params.analyze;
 
 import io.swagger.annotations.ApiModelProperty;
-import org.hibernate.validator.constraints.Range;
 
 import javax.validation.constraints.NotNull;
 import java.util.List;
@@ -25,6 +24,9 @@ public class GradePaperStructParam {
     @NotNull(message = "缺少试卷名称")
     private String paperName;
 
+    @ApiModelProperty(value = "使用云阅卷试卷结构?")
+    private Boolean useExamCloudStruct;
+
     @ApiModelProperty(value = "分析试卷数据集")
     @NotNull(message = "请填写试卷结构")
     private List<GradePaperStructDatasource> datasource;
@@ -60,4 +62,12 @@ public class GradePaperStructParam {
     public void setDatasource(List<GradePaperStructDatasource> datasource) {
         this.datasource = datasource;
     }
+
+    public Boolean getUseExamCloudStruct() {
+        return useExamCloudStruct;
+    }
+
+    public void setUseExamCloudStruct(Boolean useExamCloudStruct) {
+        this.useExamCloudStruct = useExamCloudStruct;
+    }
 }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeInitResult.java

@@ -35,6 +35,9 @@ public class GradeInitResult {
     @ApiModelProperty(value = "分析课程发布状态")
     private Boolean publishStatus;
 
+    @ApiModelProperty(value = "更新试卷权限按钮显示开关")
+    private Boolean useExamCloudStruct;
+
     public String getSemesterName() {
         return semesterName;
     }
@@ -106,4 +109,12 @@ public class GradeInitResult {
     public void setPublishStatus(Boolean publishStatus) {
         this.publishStatus = publishStatus;
     }
+
+    public Boolean getUseExamCloudStruct() {
+        return useExamCloudStruct;
+    }
+
+    public void setUseExamCloudStruct(Boolean useExamCloudStruct) {
+        this.useExamCloudStruct = useExamCloudStruct;
+    }
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.marking.CardJpgResult;
 import com.qmth.distributed.print.business.bean.marking.EvaluationParameters;
+import com.qmth.distributed.print.business.bean.marking.Question;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.QuestionType;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -31,6 +33,13 @@ public interface ExamPaperStructureService extends IService<ExamPaperStructure>
 
     List<Map> preStructure(Long id);
 
+    /**
+     * 解析云阅卷试卷结构
+     * @param examPaperStructId 知学知考-评卷参数试卷结构id
+     * @return 标准题目集合 <OBJECTIVE,list> <SUBJECTIVE,list>
+     */
+    Map<QuestionType,List<Question>> parseExamCloudPaperStruct(Long examPaperStructId);
+
     long countByPropositionTeacherId();
 
     /**

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

@@ -24,12 +24,13 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
     /**
      * 查找分析试卷结构列表
      *
-     * @param paperNumber 试卷编号
-     * @param paperType   试卷类型
-     * @param requestUser 请求的用户
+     * @param paperNumber        试卷编号
+     * @param paperType          试卷类型
+     * @param useExamCloudStruct 使用云阅卷结构
+     * @param requestUser        请求的用户
      * @return 结果
      */
-    List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, SysUser requestUser);
+    List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser);
 
     /**
      * 批量保存分析试卷结构
@@ -42,23 +43,25 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
     /**
      * 分析 - 试卷结构数据导入
      *
-     * @param file        excel 文件
-     * @param paperNumber 试卷编号
-     * @param paperType   试卷类型
-     * @param paperName   试卷名称
-     * @param requestUser 请求用户
+     * @param file               excel 文件
+     * @param paperNumber        试卷编号
+     * @param paperType          试卷类型
+     * @param paperName          试卷名称
+     * @param useExamCloudStruct 使用云阅卷结构
+     * @param requestUser        请求用户
      */
-    void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
+    void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, Boolean useExamCloudStruct, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷结构模板导出
      *
-     * @param paperNumber 试卷编号
-     * @param paperType   试卷类型
-     * @param requestUser 请求用户
+     * @param paperNumber        试卷编号
+     * @param paperType          试卷类型
+     * @param useExamCloudStruct 使用云阅卷结构
+     * @param requestUser        请求用户
      * @throws Exception 异常
      */
-    void exportGradePaperStructTemplate(String paperNumber, String paperType, SysUser requestUser) throws Exception;
+    void exportGradePaperStructTemplate(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser) throws Exception;
 
     List<PaperStructure> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, String paperNumber, String paperType);
 }

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java

@@ -22,6 +22,8 @@ public interface TBSyncTaskService extends IService<TBSyncTask> {
 
     void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage);
 
+    void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage, String remark);
+
     TBSyncTask savePushCommon(PushTypeEnum pushTypeEnum, Map map, SysUser sysUser);
 
     /**

+ 11 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncReportServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.entity.GradeBatch;
 import com.qmth.distributed.print.business.entity.GradeBatchPaper;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
@@ -9,6 +10,7 @@ import com.qmth.distributed.print.business.service.DataSyncReportService;
 import com.qmth.distributed.print.business.service.GradeBatchPaperService;
 import com.qmth.distributed.print.business.service.GradeBatchService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicSemester;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.GradeAnalyzePaperStatusEnum;
@@ -138,6 +140,7 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
         TaskStatusEnum status;
         String errorMessage = null;
         String source = null;
+        String remark = null;
         Long schoolId = tbSyncTask.getSchoolId();
         try {
             // 同步中
@@ -166,13 +169,20 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
         } catch (Exception e) {
             result = TaskResultEnum.ERROR;
             errorMessage = e.getMessage();
+            if (e instanceof ApiException){
+                ApiException apiException = (ApiException) e;
+                if (SystemConstant.PAPER_STRUCT_EXCEPTION_CODE.equals(apiException.getCode())){
+                    // 截取试卷编号当做remark
+                    remark = errorMessage.substring(errorMessage.indexOf("【") + 1,errorMessage.indexOf("】"));
+                }
+            }
 
             // 生成txt
             gradeBatchService.createTxt(gradeBatch, errorMessage);
         } finally {
             // 同步结束
             status = TaskStatusEnum.FINISH;
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), null, status, result, errorMessage);
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), null, status, result, errorMessage,remark);
         }
     }
 

+ 33 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java

@@ -24,6 +24,7 @@ import com.qmth.teachcloud.common.entity.BasicSemester;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
+import com.qmth.teachcloud.common.enums.QuestionType;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.service.BasicSemesterService;
@@ -43,6 +44,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -284,6 +286,37 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         return list;
     }
 
+    @Override
+    public Map<QuestionType, List<Question>> parseExamCloudPaperStruct(Long examPaperStructId) {
+        Map<QuestionType, List<Question>> result = new HashMap<>();
+        List<Question> objList = new ArrayList<>();
+        List<Question> subList = new ArrayList<>();
+        List<Map> examCloudStructMapList = this.preStructure(examPaperStructId);
+        for (Map examCloudStructMap : examCloudStructMapList) {
+            boolean objective = (boolean) examCloudStructMap.get("objective");
+            String mainTitle = String.valueOf(examCloudStructMap.get("mainTitle"));
+            Integer mainNumber = Integer.valueOf(String.valueOf(examCloudStructMap.get("mainNumber")));
+            Integer subNumber = Integer.valueOf(String.valueOf(examCloudStructMap.get("subNumber")));
+            double totalScore = Double.parseDouble(String.valueOf(examCloudStructMap.get("totalScore")));
+            String answer = String.valueOf(examCloudStructMap.get("answer"));
+
+            Question question = new Question();
+            question.setMainTitle(mainTitle);
+            question.setMainNumber(mainNumber);
+            question.setSubNumber(String.valueOf(subNumber));
+            question.setTotalScore(BigDecimal.valueOf(totalScore));
+            question.setAnswer(answer);
+            if (objective) {
+                objList.add(question);
+            } else {
+                subList.add(question);
+            }
+        }
+        result.put(QuestionType.OBJECTIVE, objList);
+        result.put(QuestionType.SUBJECTIVE, subList);
+        return result;
+    }
+
     @Override
     public long countByPropositionTeacherId() {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());

+ 19 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeInitializeServiceImpl.java

@@ -1,13 +1,18 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.distributed.print.business.bean.result.analyze.GradeInitResult;
+import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.mapper.GradeInitializeMapper;
 import com.qmth.distributed.print.business.service.GradeInitializeService;
+import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.GradeAnalyzePaperStatusEnum;
+import com.qmth.teachcloud.common.enums.PushTypeEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
 
@@ -25,18 +30,31 @@ import java.util.List;
 public class GradeInitializeServiceImpl implements GradeInitializeService {
     @Resource
     GradeInitializeMapper gradeInitializeMapper;
+    @Resource
+    TBSyncTaskService tbSyncTaskService;
 
 
     @Override
     public IPage<GradeInitResult> findNeedAnalyzedPaper(Long semesterId, Long examId, String courseCode, SysUser requestUser, int pageNumber, int pageSize) {
+
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
+        // 查询分析计算导致的错误的数据源
+        List<TBSyncTask> effectDatasource = tbSyncTaskService.list(new QueryWrapper<TBSyncTask>()
+                .lambda()
+                .eq(TBSyncTask::getSchoolId, schoolId)
+                .eq(TBSyncTask::getType, PushTypeEnum.CALCULATE)
+                .eq(TBSyncTask::getResult, TaskResultEnum.ERROR));
+
         List<String> finished = new ArrayList<>();
         finished.add(GradeAnalyzePaperStatusEnum.READY_TO_CALCULATE.name());
         finished.add(GradeAnalyzePaperStatusEnum.CALCULATING.name());
         finished.add(GradeAnalyzePaperStatusEnum.FINISH_CALCULATE.name());
         IPage<GradeInitResult> page = gradeInitializeMapper.findNeedAnalyzedPaper(new Page<>(pageNumber, pageSize), semesterId, examId, courseCode, userId, schoolId);
         for (GradeInitResult record : page.getRecords()) {
+            String paperNumber = record.getPaperNumber();
+            // 如果任意一个使用了该试卷配置的分析批次报试卷结构不一致地计算错误,则控制试卷结构配置页面显示更新试卷结构按钮
+            record.setUseExamCloudStruct(effectDatasource.stream().anyMatch(e -> paperNumber.equals(e.getRemark())));
             String status = record.getStatus();
             if (SystemConstant.strNotNull(status)) {
                 if (Arrays.stream(status.split(",")).anyMatch(finished::contains)) {
@@ -63,6 +81,6 @@ public class GradeInitializeServiceImpl implements GradeInitializeService {
     public IPage<GradeInitResult> listNeedAnalyzedPaperToWork(SysUser requestUser, Integer pageNumber, Integer pageSize) {
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
-        return gradeInitializeMapper.listNeedAnalyzedPaperToWork(new Page<>(pageNumber, pageSize),schoolId, userId);
+        return gradeInitializeMapper.listNeedAnalyzedPaperToWork(new Page<>(pageNumber, pageSize), schoolId, userId);
     }
 }

+ 80 - 50
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java

@@ -3,6 +3,7 @@ package com.qmth.distributed.print.business.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.qmth.distributed.print.business.bean.dto.excel.GradePaperStructDto;
@@ -14,11 +15,9 @@ import com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructR
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.entity.GradePaperStruct;
+import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.mapper.GradePaperStructMapper;
-import com.qmth.distributed.print.business.service.ExamPaperStructureService;
-import com.qmth.distributed.print.business.service.ExamTaskService;
-import com.qmth.distributed.print.business.service.GradeBatchPaperService;
-import com.qmth.distributed.print.business.service.GradePaperStructService;
+import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
@@ -33,10 +32,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -56,17 +52,23 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     private ExamPaperStructureService examPaperStructureService;
     @Resource
     private ExamTaskService examTaskService;
+    @Resource
+    private TBSyncTaskService tbSyncTaskService;
 
     @Override
-    public List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, SysUser requestUser) {
+    public List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         List<GradePaperStructResult> result = new ArrayList<>();
         // 先从分析试卷结构表取
         List<GradePaperStructResult> gradeStructDatasource = this.baseMapper.findStructByGradePaper(schoolId, paperNumber, paperType);
-        if (gradeStructDatasource != null && gradeStructDatasource.size() > 0) {
+        if (gradeStructDatasource != null && gradeStructDatasource.size() > 0 && !useExamCloudStruct) {
+            // 如果已经设置了试卷结构且没有使用云阅卷试卷结构(没有触发更新试卷结构按钮),查询之前配置好的分析参数-试卷结构
             result = gradeStructDatasource;
         } else {
-            // 如果老师还没设置过分析参数 则从评卷参数中把试卷结构取出来
+            // 构建客观题结构集合
+            List<Question> examPaperObjList = new ArrayList<>();
+            // 构建主观题结构集合
+            List<Question> examPaperSubList = new ArrayList<>();
             ExamPaperStructure examPaperStructure = examPaperStructureService.getOne(new QueryWrapper<ExamPaperStructure>()
                     .lambda()
                     .eq(ExamPaperStructure::getSchoolId, schoolId)
@@ -75,6 +77,25 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
             if (Objects.isNull(examPaperStructure)) {
                 throw ExceptionResultEnum.ERROR.exception("该试卷还没有上传评卷参数设置");
             }
+            if (useExamCloudStruct) {
+                // 如果使用云阅卷试卷结构
+                Map<QuestionType, List<Question>> examCloudPaperStructMap = examPaperStructureService.parseExamCloudPaperStruct(examPaperStructure.getId());
+                examPaperObjList = examCloudPaperStructMap.get(QuestionType.OBJECTIVE);
+                examPaperSubList = examCloudPaperStructMap.get(QuestionType.SUBJECTIVE);
+            } else {
+                // 如果老师还没设置过分析参数则从评卷参数中把试卷结构取出来
+                // 客观题
+                String examPaperObj = examPaperStructure.getObjectiveStructure();
+                if (SystemConstant.strNotNull(examPaperObj)) {
+                    examPaperObjList = JSON.parseArray(examPaperObj, Question.class);
+                }
+                // 主观题
+                String examPaperSub = examPaperStructure.getSubjectiveStructure();
+                if (SystemConstant.strNotNull(examPaperSub)) {
+                    examPaperSubList = JSON.parseArray(examPaperSub, Question.class);
+                }
+            }
+
             ExamTask examTask = examTaskService.getOne(new QueryWrapper<ExamTask>().lambda()
                     .eq(ExamTask::getSchoolId, schoolId)
                     .eq(ExamTask::getPaperNumber, paperNumber));
@@ -84,18 +105,6 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
             String courseCode = examTask.getCourseCode();
             String courseName = examTask.getCourseName();
 
-            // 客观题
-            List<Question> examPaperObjList = new ArrayList<>();
-            String examPaperObj = examPaperStructure.getObjectiveStructure();
-            if (SystemConstant.strNotNull(examPaperObj)) {
-                examPaperObjList = JSON.parseArray(examPaperObj, Question.class);
-            }
-            // 主观题
-            List<Question> examPaperSubList = new ArrayList<>();
-            String examPaperSub = examPaperStructure.getSubjectiveStructure();
-            if (SystemConstant.strNotNull(examPaperSub)) {
-                examPaperSubList = JSON.parseArray(examPaperSub, Question.class);
-            }
             // 按题号排序
             examPaperObjList = examPaperObjList.stream().sorted(Comparator.comparing(Question::getMainNumber).thenComparing(Question::getSubNumber)).collect(Collectors.toList());
             examPaperSubList = examPaperSubList.stream().sorted(Comparator.comparing(Question::getMainNumber).thenComparing(Question::getSubNumber)).collect(Collectors.toList());
@@ -137,11 +146,15 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         String paperNumber = gradePaperStructParam.getPaperNumber();
         String paperType = gradePaperStructParam.getPaperType();
         String paperName = gradePaperStructParam.getPaperName();
+        Boolean useExamCloudStruct = gradePaperStructParam.getUseExamCloudStruct();
+        if (useExamCloudStruct == null){
+            useExamCloudStruct = false;
+        }
         List<GradePaperStructDatasource> datasource = gradePaperStructParam.getDatasource();
         // 验证批次分析试卷是否在计算
         gradeBatchPaperService.checkOperateAuth(schoolId, paperNumber, paperType);
         // 检验结构正确性并构建分析试卷结构
-        List<GradePaperStruct> gradePaperStructList = this.checkAndBuildGradePaperStruct(datasource, paperNumber, paperType, paperName, requestUser);
+        List<GradePaperStruct> gradePaperStructList = this.checkAndBuildGradePaperStruct(datasource, paperNumber, paperType, paperName, useExamCloudStruct, requestUser);
         // 删除旧的试卷结构
         this.remove(new QueryWrapper<GradePaperStruct>()
                 .lambda()
@@ -149,11 +162,18 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                 .eq(GradePaperStruct::getPaperNumber, paperNumber)
                 .eq(GradePaperStruct::getPaperType, paperType));
         this.saveBatch(gradePaperStructList);
+        // 保存成功后如果是用了云阅卷结构的去t_b_sync_task表把该试卷编号的remark清掉
+        if (useExamCloudStruct){
+            UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
+            tbSyncTaskUpdateWrapper.lambda().eq(TBSyncTask::getSchoolId,schoolId).eq(TBSyncTask::getRemark,paperNumber);
+            tbSyncTaskUpdateWrapper.lambda().set(TBSyncTask::getRemark,null);
+            tbSyncTaskService.update(tbSyncTaskUpdateWrapper);
+        }
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
+    public void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, Boolean useExamCloudStruct, SysUser requestUser) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
@@ -168,6 +188,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         gradePaperStructParam.setPaperNumber(paperNumber);
         gradePaperStructParam.setPaperType(paperType);
         gradePaperStructParam.setPaperName(paperName);
+        gradePaperStructParam.setUseExamCloudStruct(useExamCloudStruct);
         List<GradePaperStructDatasource> gradePaperStructDatasourceList = new ArrayList<>();
 
         if (Objects.nonNull(finalList) && finalList.size() > 0) {
@@ -196,7 +217,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     }
 
     @Override
-    public void exportGradePaperStructTemplate(String paperNumber, String paperType, SysUser requestUser) throws Exception {
+    public void exportGradePaperStructTemplate(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser) throws Exception {
 
         ExamTask examTask = examTaskService.getOne(new QueryWrapper<ExamTask>().lambda()
                 .eq(ExamTask::getSchoolId, requestUser.getSchoolId())
@@ -207,7 +228,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         String courseCode = examTask.getCourseCode();
         String courseName = examTask.getCourseName();
 
-        List<GradePaperStructResult> datasource = this.findGradePaperStructureResultList(paperNumber, paperType, requestUser);
+        List<GradePaperStructResult> datasource = this.findGradePaperStructureResultList(paperNumber, paperType, useExamCloudStruct, requestUser);
         List<GradePaperStructDto> gradePaperStructDtoList = datasource.stream().flatMap(e -> {
             GradePaperStructDto cell = new GradePaperStructDto();
             cell.setCourseCode(courseCode);
@@ -234,16 +255,18 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     /**
      * 检验结构正确性并构建分析试卷结构
      *
-     * @param datasource  数据源
-     * @param paperNumber 试卷编号
-     * @param paperType   试卷类型
-     * @param paperName   试卷名称
-     * @param requestUser 请求用户
+     * @param datasource         数据源
+     * @param paperNumber        试卷编号
+     * @param paperType          试卷类型
+     * @param paperName          试卷名称
+     * @param useExamCloudStruct 使用云阅卷结构
+     * @param requestUser        请求用户
      * @return 创建好的分析试卷结构
      */
-    private List<GradePaperStruct> checkAndBuildGradePaperStruct(List<GradePaperStructDatasource> datasource, String paperNumber, String paperType, String paperName, SysUser requestUser) {
+    private List<GradePaperStruct> checkAndBuildGradePaperStruct(List<GradePaperStructDatasource> datasource, String paperNumber, String paperType, String paperName, Boolean useExamCloudStruct, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
+
         ExamPaperStructure examPaperStructure = examPaperStructureService.getOne(new QueryWrapper<ExamPaperStructure>()
                 .lambda()
                 .eq(ExamPaperStructure::getSchoolId, schoolId)
@@ -252,12 +275,28 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         if (Objects.isNull(examPaperStructure)) {
             throw ExceptionResultEnum.ERROR.exception("该试卷还没有上传评卷参数设置");
         }
-
         // 客观题
         List<Question> examPaperObjList = new ArrayList<>();
-        String examPaperObj = examPaperStructure.getObjectiveStructure();
-        if (SystemConstant.strNotNull(examPaperObj)) {
-            examPaperObjList = JSON.parseArray(examPaperObj, Question.class);
+        // 主观题
+        List<Question> examPaperSubList = new ArrayList<>();
+        // 对比信息
+        String comparison = "知学知考";
+        if (useExamCloudStruct != null && useExamCloudStruct) {
+            // 应用云阅卷试卷结构
+            Map<QuestionType, List<Question>> questionTypeListMap = examPaperStructureService.parseExamCloudPaperStruct(examPaperStructure.getId());
+            examPaperObjList = questionTypeListMap.get(QuestionType.OBJECTIVE);
+            examPaperSubList = questionTypeListMap.get(QuestionType.SUBJECTIVE);
+            comparison = "云阅卷";
+        } else {
+            // 应用知学知考试卷结构
+            String examPaperObj = examPaperStructure.getObjectiveStructure();
+            if (SystemConstant.strNotNull(examPaperObj)) {
+                examPaperObjList = JSON.parseArray(examPaperObj, Question.class);
+            }
+            String examPaperSub = examPaperStructure.getSubjectiveStructure();
+            if (SystemConstant.strNotNull(examPaperSub)) {
+                examPaperSubList = JSON.parseArray(examPaperSub, Question.class);
+            }
         }
 
         List<Question> gradePaperObjList = datasource.stream()
@@ -269,18 +308,10 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                     cell.setSubNumber(e.getSmallQuestionNumber());
                     cell.setTotalScore(e.getFullScore());
                     return Stream.of(cell);
-                })
-                .collect(Collectors.toList());
+                }).collect(Collectors.toList());
         if (!Question.matchTwoQuestionList(examPaperObjList, gradePaperObjList)) {
             throw ExceptionResultEnum.ERROR.exception("试卷编号为【" + paperNumber + "】,试卷类型为【" + paperType +
-                    "】的分析试卷结构和 评卷参数试卷结构在【" + QuestionType.OBJECTIVE.getDesc() + "】上不一致");
-        }
-
-        // 主观题
-        List<Question> examPaperSubList = new ArrayList<>();
-        String examPaperSub = examPaperStructure.getSubjectiveStructure();
-        if (SystemConstant.strNotNull(examPaperSub)) {
-            examPaperSubList = JSON.parseArray(examPaperSub, Question.class);
+                    "】的分析试卷结构和 [" + comparison + "] 试卷结构在【" + QuestionType.OBJECTIVE.getDesc() + "】上不一致");
         }
 
         List<Question> gradePaperSubList = datasource.stream()
@@ -292,11 +323,10 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                     cell.setSubNumber(e.getSmallQuestionNumber());
                     cell.setTotalScore(e.getFullScore());
                     return Stream.of(cell);
-                })
-                .collect(Collectors.toList());
+                }).collect(Collectors.toList());
         if (!Question.matchTwoQuestionList(examPaperSubList, gradePaperSubList)) {
             throw ExceptionResultEnum.ERROR.exception("试卷编号为【" + paperNumber + "】,试卷类型为【" + paperType +
-                    "】的分析试卷结构和 评卷参数试卷结构在【" + QuestionType.SUBJECTIVE.getDesc() + "】上不一致");
+                    "】的分析试卷结构和 [" + comparison + "] 试卷结构在【" + QuestionType.SUBJECTIVE.getDesc() + "】上不一致");
         }
 
         return datasource.stream().flatMap(e -> {

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java

@@ -95,6 +95,18 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
         this.update(tbSyncTaskUpdateWrapper);
     }
 
+    @Override
+    public void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage, String remark) {
+        UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
+        tbSyncTaskUpdateWrapper.lambda().set(TBSyncTask::getStatus, status)
+                .set(TBSyncTask::getThirdRelateId, thirdRelateId)
+                .set(TBSyncTask::getResult, result)
+                .set(TBSyncTask::getErrorMessage, errorMessage)
+                .set(TBSyncTask::getRemark,remark)
+                .eq(TBSyncTask::getId, id);
+        this.update(tbSyncTaskUpdateWrapper);
+    }
+
     @Transactional
     @Override
     public TBSyncTask savePushCommon(PushTypeEnum pushTypeEnum, Map map, SysUser sysUser) {

+ 19 - 17
distributed-print-business/src/main/resources/mapper/GradeBatchPaperMapper.xml

@@ -69,24 +69,26 @@
     <select id="findAbleAnalyzePaper"
             resultType="com.qmth.distributed.print.business.bean.result.analyze.GradeBatchPaperResult">
         SELECT
-        bs.name AS semesterName,
-        be.name AS examName,
-        et.course_code AS courseCode,
-        et.course_name AS courseName,
-        et.teaching_room_id AS teachingRoomId,
-        et.teacher_name AS teacherName,
-        et.paper_number AS paperNumber,
-        etd.exposed_paper_type AS paperType
+            bs.name AS semesterName,
+            be.name AS examName,
+            et.course_code AS courseCode,
+            et.course_name AS courseName,
+            et.teaching_room_id AS teachingRoomId,
+            su.real_name AS teacherName,
+            et.paper_number AS paperNumber,
+            etd.exposed_paper_type AS paperType
         FROM
-        exam_task et
-        INNER JOIN
-        exam_task_detail etd ON et.id = etd.exam_task_id
-        LEFT JOIN
-        basic_exam be ON be.school_id = et.school_id
-        AND be.id = et.exam_id
-        LEFT JOIN
-        basic_semester bs ON bs.school_id = et.school_id
-        AND bs.id = be.semester_id
+            exam_task et
+                INNER JOIN
+            exam_task_detail etd ON et.id = etd.exam_task_id
+                LEFT JOIN
+            basic_exam be ON be.school_id = et.school_id
+                AND be.id = et.exam_id
+                LEFT JOIN
+            basic_semester bs ON bs.school_id = et.school_id
+                AND bs.id = be.semester_id
+                LEFT JOIN
+            sys_user su ON et.user_id = su.id
         <where>
             AND etd.exposed_paper_type != ''
             <if test="schoolId != null and schoolId != ''">

+ 9 - 8
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java

@@ -1,7 +1,5 @@
 package com.qmth.distributed.print.api;
 
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructResult;
@@ -43,13 +41,14 @@ public class GradePaperStructController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradePaperStructResult.class)})
     public Result findGradePaperStructList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                                           @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
+                                           @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType,
+                                           @ApiParam(value = "使用云阅卷试卷结构") @RequestParam(required = false) boolean useExamCloudStruct) {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(paperNumber, paperType)) {
             throw ExceptionResultEnum.ERROR.exception("试卷参数不完整");
         }
-        return ResultUtil.ok(gradePaperStructService.findGradePaperStructureResultList(paperNumber, paperType, requestUser));
+        return ResultUtil.ok(gradePaperStructService.findGradePaperStructureResultList(paperNumber, paperType, useExamCloudStruct, requestUser));
     }
 
     @ApiOperation(value = "成绩分析试卷结构-新建试卷结构")
@@ -70,13 +69,14 @@ public class GradePaperStructController {
     public Result gradePaperStructImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
                                          @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
                                          @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType,
-                                         @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName) throws IOException, NoSuchFieldException {
+                                         @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName,
+                                         @ApiParam(value = "使用云阅卷试卷结构") @RequestParam(required = false) boolean useExamCloudStruct) throws IOException, NoSuchFieldException {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(file, paperNumber, paperType, paperName)) {
             throw ExceptionResultEnum.ERROR.exception("参数不完整");
         }
-        gradePaperStructService.importGradePaperStruct(file, paperNumber, paperType, paperName, requestUser);
+        gradePaperStructService.importGradePaperStruct(file, paperNumber, paperType, paperName, useExamCloudStruct, requestUser);
         return ResultUtil.ok();
     }
 
@@ -84,13 +84,14 @@ public class GradePaperStructController {
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result gradePaperStructExport(@ApiParam(value = "课程编号", required = true) @RequestParam String paperNumber,
-                                         @ApiParam(value = "课程名称", required = true) @RequestParam String paperType) throws Exception {
+                                         @ApiParam(value = "课程名称", required = true) @RequestParam String paperType,
+                                         @ApiParam(value = "使用云阅卷试卷结构") @RequestParam(required = false) boolean useExamCloudStruct) throws Exception {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(paperNumber, paperType)) {
             throw ExceptionResultEnum.ERROR.exception("参数不完整");
         }
-        gradePaperStructService.exportGradePaperStructTemplate(paperNumber, paperType, requestUser);
+        gradePaperStructService.exportGradePaperStructTemplate(paperNumber, paperType, useExamCloudStruct, requestUser);
         return ResultUtil.ok();
     }
 }

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -95,7 +95,7 @@ public class SystemConstant {
     public static final BigDecimal PERCENT = new BigDecimal(100);
     public static final String HYPHEN = "-";
     public static final String DEFAULT_SIGN = "#";
-    public static final String PARENT_ORG = "武汉大学教务处";
+    public static final String PARENT_ORG = "教务处";
     public static final String SCHOOL_CODE = "wdfx";
     public static final String ADMIN_CODE = "admin";
     public static final String AUTH = "auth";//命题老师id
@@ -112,6 +112,7 @@ public class SystemConstant {
     public static final String COMMA_OF_ENGLISH = ",";
     public static final String COMMA_OF_CHINESE = ",";
     public static final String PAUSE_SIGN = "、";
+    public static final Integer PAPER_STRUCT_EXCEPTION_CODE = 5100003;
 
     /**
      * oss url过期时间

+ 6 - 1
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;
@@ -137,7 +138,11 @@ public class AnalyzeDataCheckServiceImpl implements AnalyzeDataCheckService {
             return Stream.of(answer);
         }).collect(Collectors.toList());
         if (!Answer.matchTwoAnswerList(al1,al2)){
-            throw ExceptionResultEnum.ERROR.exception("考生作答中的试卷结构和试卷结构不一致(检查内容 : 题目类型(主观题、客观题),大题号,小题号)");
+            String paperNumber = courseCode.substring(0,courseCode.length() - tbPaper.getPaperType().length());
+            throw ExceptionResultEnum.ERROR.exception(SystemConstant.PAPER_STRUCT_EXCEPTION_CODE, "考生作答中的试卷结构和分析参数中配置的试卷结构不一致(检查内容 : 题目类型(主观题、客观题),大题号,小题号)," +
+                    "请试卷编号为: 【" + paperNumber + "】的命题老师在知学知考教研分析板块下按照如下操作重新配置试卷结构:" +
+                    "数据初始化 -> 基础配置 -> 命题蓝图设置 -> 更新试卷结构 -> 保存。" +
+                    "之后管理员再重新计算该分析批次");
         }
     }
 

+ 51 - 10
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseDeleteServiceImpl.java

@@ -3,9 +3,7 @@ package com.qmth.teachcloud.report.business.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.teachcloud.common.bean.params.TBExamCourseDeleteParams;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.report.business.entity.TBCommonLevelConfig;
-import com.qmth.teachcloud.report.business.entity.TBCommonRankLevelConfig;
-import com.qmth.teachcloud.report.business.entity.TBDimension;
+import com.qmth.teachcloud.report.business.entity.*;
 import com.qmth.teachcloud.report.business.service.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -20,6 +18,7 @@ import java.util.List;
  */
 @Service
 public class TBExamCourseDeleteServiceImpl implements TBExamCourseDeleteService {
+    // 无关联的基础表
     @Resource
     TBCommonLevelConfigService tbCommonLevelConfigService;
     @Resource
@@ -35,27 +34,69 @@ public class TBExamCourseDeleteServiceImpl implements TBExamCourseDeleteService
     @Resource
     TBModuleProficiencyService tbModuleProficiencyService;
 
+    // 相关联的基础表
+    @Resource
+    TBPaperService tbPaperService;
+    @Resource
+    TBPaperStructService tbPaperStructService;
+    @Resource
+    TBExamRecordService tbExamRecordService;
+    @Resource
+    TBAnswerService tbAnswerService;
+
 
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void deleteBasicTableData(Long schoolId, Long examId, String courseCode) {
-        if (tbExamCourseService.verifyExamCourseCantDelete(schoolId,examId,courseCode)){
+        if (tbExamCourseService.verifyExamCourseCantDelete(schoolId, examId, courseCode)) {
             throw ExceptionResultEnum.ERROR.exception("考试id为【" + examId + "】,课程编号为【" + courseCode + "】的分析课程当前不能被删除");
         }
         // 基础且无关联表删除
         tbCommonLevelConfigService.remove(new QueryWrapper<TBCommonLevelConfig>()
                 .lambda()
-                .eq(TBCommonLevelConfig::getExamId,examId)
-                .eq(TBCommonLevelConfig::getCourseCode,courseCode));
+                .eq(TBCommonLevelConfig::getExamId, examId)
+                .eq(TBCommonLevelConfig::getCourseCode, courseCode));
         tbCommonRankLevelConfigService.remove(new QueryWrapper<TBCommonRankLevelConfig>()
                 .lambda()
-                .eq(TBCommonRankLevelConfig::getExamId,examId)
-                .eq(TBCommonRankLevelConfig::getCourseCode,courseCode));
+                .eq(TBCommonRankLevelConfig::getExamId, examId)
+                .eq(TBCommonRankLevelConfig::getCourseCode, courseCode));
         tbDimensionService.remove(new QueryWrapper<TBDimension>()
                 .lambda()
-                .eq(TBDimension::getExamId,examId)
-                .eq(TBDimension::getCourseCode,courseCode));
+                .eq(TBDimension::getExamId, examId)
+                .eq(TBDimension::getCourseCode, courseCode));
+        tbExamCourseService.remove(new QueryWrapper<TBExamCourse>()
+                .lambda()
+                .eq(TBExamCourse::getSchoolId, schoolId)
+                .eq(TBExamCourse::getExamId, examId)
+                .eq(TBExamCourse::getCourseCode, courseCode));
+        tbExamStudentService.remove(new QueryWrapper<TBExamStudent>()
+                .lambda()
+                .eq(TBExamStudent::getSchoolId, schoolId)
+                .eq(TBExamStudent::getExamId, examId)
+                .eq(TBExamStudent::getCourseCode, courseCode));
+        tbModuleConfigService.remove(new QueryWrapper<TBModuleConfig>()
+                .lambda()
+                .eq(TBModuleConfig::getExamId, examId)
+                .eq(TBModuleConfig::getCourseCode, courseCode));
+        tbModuleProficiencyService.remove(new QueryWrapper<TBModuleProficiency>()
+                .lambda()
+                .eq(TBModuleProficiency::getExamId, examId)
+                .eq(TBModuleProficiency::getCourseCode, courseCode));
+
+        // 基础且关联表删除
+        List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>()
+                .lambda()
+                .eq(TBPaper::getExamId, examId)
+                .eq(TBPaper::getCourseCode, courseCode));
+        if (tbPaperList != null && tbPaperList.size() > 0){
+            if (tbPaperList.size() > 1){
+                throw ExceptionResultEnum.ERROR.exception("考试id为【" + examId + "】,分析课程编号为【" + courseCode + "】存在多个试卷t_b_paper");
+            }
+            TBPaper tbPaper = tbPaperList.get(0);
+            // TODO: 2022/7/6  
+        }
+
     }
 
     @Transactional(rollbackFor = Exception.class)