Bläddra i källkod

bug
1.教研分析课程删除
2.知学知考试卷结构相关

caozixuan 3 år sedan
förälder
incheckning
64446ceba3
14 ändrade filer med 381 tillägg och 126 borttagningar
  1. 0 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperStructParam.java
  2. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeInitResult.java
  3. 6 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamPaperStructure.java
  4. 4 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java
  5. 26 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperStructService.java
  6. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncReportServiceImpl.java
  7. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java
  8. 9 9
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java
  9. 0 18
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeInitializeServiceImpl.java
  10. 65 41
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java
  11. 7 2
      distributed-print-business/src/main/resources/mapper/GradeInitializeMapper.xml
  12. 18 9
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java
  13. 63 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/ExamCloudPaperStructDto.java
  14. 176 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseDeleteServiceImpl.java

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

@@ -24,9 +24,6 @@ public class GradePaperStructParam {
     @NotNull(message = "缺少试卷名称")
     private String paperName;
 
-    @ApiModelProperty(value = "使用云阅卷试卷结构?")
-    private Boolean useExamCloudStruct;
-
     @ApiModelProperty(value = "分析试卷数据集")
     @NotNull(message = "请填写试卷结构")
     private List<GradePaperStructDatasource> datasource;
@@ -62,12 +59,4 @@ 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;
-    }
 }

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

@@ -36,7 +36,7 @@ public class GradeInitResult {
     private Boolean publishStatus;
 
     @ApiModelProperty(value = "更新试卷权限按钮显示开关")
-    private Boolean useExamCloudStruct;
+    private Boolean structureChange;
 
     public String getSemesterName() {
         return semesterName;
@@ -110,11 +110,11 @@ public class GradeInitResult {
         this.publishStatus = publishStatus;
     }
 
-    public Boolean getUseExamCloudStruct() {
-        return useExamCloudStruct;
+    public Boolean getStructureChange() {
+        return structureChange;
     }
 
-    public void setUseExamCloudStruct(Boolean useExamCloudStruct) {
-        this.useExamCloudStruct = useExamCloudStruct;
+    public void setStructureChange(Boolean structureChange) {
+        this.structureChange = structureChange;
     }
 }

+ 6 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamPaperStructure.java

@@ -127,8 +127,8 @@ public class ExamPaperStructure extends BaseEntity implements Serializable {
     private String cloudInfoJson;
 
     @ApiModelProperty(value = "云阅卷试卷结构和知学知考结构不一样(默认false)")
-    @TableField("structrue_change")
-    private Boolean structrueChange;
+    @TableField("structure_change")
+    private Boolean structureChange;
 
     @TableField(exist = false)
     private String paperNumberId;
@@ -320,11 +320,11 @@ public class ExamPaperStructure extends BaseEntity implements Serializable {
         this.cloudInfoJson = cloudInfoJson;
     }
 
-    public Boolean getStructrueChange() {
-        return structrueChange;
+    public Boolean getStructureChange() {
+        return structureChange;
     }
 
-    public void setStructrueChange(Boolean structrueChange) {
-        this.structrueChange = structrueChange;
+    public void setStructureChange(Boolean structureChange) {
+        this.structureChange = structureChange;
     }
 }

+ 4 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java

@@ -3,10 +3,10 @@ package com.qmth.distributed.print.business.service;
 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.bean.dto.stmms.ExamCloudPaperStructDto;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.QuestionType;
 import org.springframework.web.multipart.MultipartFile;
@@ -33,12 +33,13 @@ public interface ExamPaperStructureService extends IService<ExamPaperStructure>
 
     List<Map> preStructure(Long id);
 
+
     /**
      * 解析云阅卷试卷结构
-     * @param examPaperStructId 知学知考-评卷参数试卷结构id
+     * @param examCloudPaperStructDtoList 云阅卷试卷结构集合
      * @return 标准题目集合 <OBJECTIVE,list> <SUBJECTIVE,list>
      */
-    Map<QuestionType,List<Question>> parseExamCloudPaperStruct(Long examPaperStructId);
+    Map<QuestionType,List<Question>> parseExamCloudPaperStruct(List<ExamCloudPaperStructDto> examCloudPaperStructDtoList);
 
     long countByPropositionTeacherId();
 

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

@@ -24,13 +24,12 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
     /**
      * 查找分析试卷结构列表
      *
-     * @param paperNumber        试卷编号
-     * @param paperType          试卷类型
-     * @param useExamCloudStruct 使用云阅卷结构
-     * @param requestUser        请求的用户
+     * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
+     * @param requestUser 请求的用户
      * @return 结果
      */
-    List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser);
+    List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, SysUser requestUser);
 
     /**
      * 批量保存分析试卷结构
@@ -43,25 +42,35 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
     /**
      * 分析 - 试卷结构数据导入
      *
-     * @param file               excel 文件
-     * @param paperNumber        试卷编号
-     * @param paperType          试卷类型
-     * @param paperName          试卷名称
-     * @param useExamCloudStruct 使用云阅卷结构
-     * @param requestUser        请求用户
+     * @param file        excel 文件
+     * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
+     * @param paperName   试卷名称
+     * @param requestUser 请求用户
      */
-    void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, Boolean useExamCloudStruct, SysUser requestUser) throws IOException, NoSuchFieldException;
+    void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷结构模板导出
      *
-     * @param paperNumber        试卷编号
-     * @param paperType          试卷类型
-     * @param useExamCloudStruct 使用云阅卷结构
-     * @param requestUser        请求用户
+     * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
+     * @param requestUser 请求用户
      * @throws Exception 异常
      */
-    void exportGradePaperStructTemplate(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser) throws Exception;
+    void exportGradePaperStructTemplate(String paperNumber, String paperType, SysUser requestUser) throws Exception;
 
     List<PaperStructure> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, String paperNumber, String paperType);
+
+    /**
+     * 更新云阅卷试卷结构
+     * <p>
+     * 1.更新知学知考-试卷结构表云阅卷结构字段为最新,更新试卷结构变化状态为false
+     * 2.删除知学知考-分析配置试卷结构表该试卷结构下的数据
+     * </p>
+     *
+     * @param schoolId    学校id
+     * @param paperNumber 试卷编号
+     */
+    void updateExamCloudPaperStruct(Long schoolId, String paperNumber);
 }

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

@@ -178,7 +178,7 @@ public class DataSyncReportServiceImpl implements DataSyncReportService {
 
                     // 更新状态(structureChange)
                     UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
-                    updateWrapper.lambda().set(ExamPaperStructure::getStructrueChange, true).eq(ExamPaperStructure::getSchoolId, schoolId).eq(ExamPaperStructure::getPaperNumber, remark);
+                    updateWrapper.lambda().set(ExamPaperStructure::getStructureChange, true).eq(ExamPaperStructure::getSchoolId, schoolId).eq(ExamPaperStructure::getPaperNumber, remark);
                     examPaperStructureService.update(updateWrapper);
                 }
             }

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

@@ -407,7 +407,7 @@ public class DataSyncServiceImpl implements DataSyncService {
 
             String cloudInfoJson = cloudMarkingTaskUtils.queryPaperStructure(schoolId, examId, subjectCode, examPaperStructure.getPaperType());
             UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().set(ExamPaperStructure::getCloudInfoJson, cloudInfoJson).set(ExamPaperStructure::getStructrueChange, false).eq(ExamPaperStructure::getId, examPaperStructure.getId());
+            updateWrapper.lambda().set(ExamPaperStructure::getCloudInfoJson, cloudInfoJson).set(ExamPaperStructure::getStructureChange, false).eq(ExamPaperStructure::getId, examPaperStructure.getId());
             examPaperStructureService.update(updateWrapper);
 
             result = TaskResultEnum.SUCCESS;

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

@@ -18,6 +18,7 @@ import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import com.qmth.distributed.print.business.enums.ExamPrintPlanSyncStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamPaperStructureMapper;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.teachcloud.common.bean.dto.stmms.ExamCloudPaperStructDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicSemester;
@@ -288,18 +289,17 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
     }
 
     @Override
-    public Map<QuestionType, List<Question>> parseExamCloudPaperStruct(Long examPaperStructId) {
+    public Map<QuestionType, List<Question>> parseExamCloudPaperStruct(List<ExamCloudPaperStructDto> examCloudPaperStructDtoList) {
         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"));
+        for (ExamCloudPaperStructDto examCloudPaperStructDto : examCloudPaperStructDtoList) {
+            boolean objective = examCloudPaperStructDto.getObjective();
+            String mainTitle = examCloudPaperStructDto.getMainTitle();
+            Integer mainNumber = examCloudPaperStructDto.getMainNumber();
+            Integer subNumber = examCloudPaperStructDto.getSubNumber();
+            double totalScore = examCloudPaperStructDto.getTotalScore();
+            String answer = examCloudPaperStructDto.getAnswer();
 
             Question question = new Question();
             question.setMainTitle(mainTitle);

+ 0 - 18
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeInitializeServiceImpl.java

@@ -1,18 +1,13 @@
 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;
 
@@ -30,21 +25,11 @@ 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());
@@ -52,9 +37,6 @@ public class GradeInitializeServiceImpl implements GradeInitializeService {
         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)) {

+ 65 - 41
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java

@@ -3,7 +3,6 @@ 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;
@@ -15,15 +14,20 @@ 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.*;
+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.teachcloud.common.bean.dto.stmms.ExamCloudPaperStructDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.QuestionType;
+import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedMultiValueMap;
@@ -53,16 +57,16 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     @Resource
     private ExamTaskService examTaskService;
     @Resource
-    private TBSyncTaskService tbSyncTaskService;
+    private CloudMarkingTaskUtils cloudMarkingTaskUtils;
 
     @Override
-    public List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser) {
+    public List<GradePaperStructResult> findGradePaperStructureResultList(String paperNumber, String paperType, 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 && !useExamCloudStruct) {
-            // 如果已经设置了试卷结构且没有使用云阅卷试卷结构(没有触发更新试卷结构按钮),查询之前配置好的分析参数-试卷结构
+        if (gradeStructDatasource != null && gradeStructDatasource.size() > 0) {
+            // 如果已经设置了试卷结构查询之前配置好的分析参数-试卷结构
             result = gradeStructDatasource;
         } else {
             // 构建客观题结构集合
@@ -77,13 +81,15 @@ 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());
+            String cloudInfoJson = examPaperStructure.getCloudInfoJson();
+            if (SystemConstant.strNotNull(cloudInfoJson)) {
+                // 如果云阅卷同步回来的结构不为空,优先使用云阅卷的
+                List<ExamCloudPaperStructDto> examCloudPaperStructDtoList = JSON.parseArray(cloudInfoJson, ExamCloudPaperStructDto.class);
+                Map<QuestionType, List<Question>> examCloudPaperStructMap = examPaperStructureService.parseExamCloudPaperStruct(examCloudPaperStructDtoList);
                 examPaperObjList = examCloudPaperStructMap.get(QuestionType.OBJECTIVE);
                 examPaperSubList = examCloudPaperStructMap.get(QuestionType.SUBJECTIVE);
             } else {
-                // 如果老师还没设置过分析参数则从评卷参数中把试卷结构取出来
+                // 当客观题答案未上传导致云阅卷客观题结构不完整不同步时,使用知学知考试卷结构
                 // 客观题
                 String examPaperObj = examPaperStructure.getObjectiveStructure();
                 if (SystemConstant.strNotNull(examPaperObj)) {
@@ -146,15 +152,11 @@ 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, useExamCloudStruct, requestUser);
+        List<GradePaperStruct> gradePaperStructList = this.checkAndBuildGradePaperStruct(datasource, paperNumber, paperType, paperName, requestUser);
         // 删除旧的试卷结构
         this.remove(new QueryWrapper<GradePaperStruct>()
                 .lambda()
@@ -162,22 +164,14 @@ 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, Boolean useExamCloudStruct, SysUser requestUser) throws IOException, NoSuchFieldException {
+    public void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
-
         List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperStructDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
             if (finalExcelErrorList.size() > 0) {
                 throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
@@ -188,7 +182,6 @@ 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) {
@@ -217,7 +210,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     }
 
     @Override
-    public void exportGradePaperStructTemplate(String paperNumber, String paperType, boolean useExamCloudStruct, SysUser requestUser) throws Exception {
+    public void exportGradePaperStructTemplate(String paperNumber, String paperType, @NotNull SysUser requestUser) throws Exception {
 
         ExamTask examTask = examTaskService.getOne(new QueryWrapper<ExamTask>().lambda()
                 .eq(ExamTask::getSchoolId, requestUser.getSchoolId())
@@ -228,7 +221,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         String courseCode = examTask.getCourseCode();
         String courseName = examTask.getCourseName();
 
-        List<GradePaperStructResult> datasource = this.findGradePaperStructureResultList(paperNumber, paperType, useExamCloudStruct, requestUser);
+        List<GradePaperStructResult> datasource = this.findGradePaperStructureResultList(paperNumber, paperType, requestUser);
         List<GradePaperStructDto> gradePaperStructDtoList = datasource.stream().flatMap(e -> {
             GradePaperStructDto cell = new GradePaperStructDto();
             cell.setCourseCode(courseCode);
@@ -252,18 +245,45 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         return this.baseMapper.findBySchoolIdAndPaperNumberAndPaperType(schoolId, paperNumber, paperType);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateExamCloudPaperStruct(Long schoolId, String paperNumber) {
+        // 更新试卷结构参数的云阅卷试卷结构
+        List<ExamPaperStructure> examPaperStructureList = examPaperStructureService.list(new QueryWrapper<ExamPaperStructure>()
+                .lambda()
+                .eq(ExamPaperStructure::getSchoolId,schoolId)
+                .eq(ExamPaperStructure::getPaperNumber,paperNumber));
+        if (examPaperStructureList.size() != 1){
+            throw ExceptionResultEnum.ERROR.exception("知学知考试卷结构异常");
+        }
+        ExamPaperStructure examPaperStructure = examPaperStructureList.get(0);
+        // 云阅卷考试ID
+        String examId = String.valueOf(examPaperStructure.getThirdRelateId());
+        // 科目代码(课程代码+卷型+课程序号)
+        String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
+        String cloudInfoJson = cloudMarkingTaskUtils.queryPaperStructure(schoolId, examId, subjectCode, examPaperStructure.getPaperType());
+        examPaperStructure.setCloudInfoJson(cloudInfoJson);
+        examPaperStructure.setStructureChange(false);
+        examPaperStructureService.updateById(examPaperStructure);
+
+        // 更新grade_paper_struct
+        this.remove(new QueryWrapper<GradePaperStruct>()
+                .lambda()
+                .eq(GradePaperStruct::getSchoolId,schoolId)
+                .eq(GradePaperStruct::getPaperNumber,paperNumber));
+    }
+
     /**
      * 检验结构正确性并构建分析试卷结构
      *
-     * @param datasource         数据源
-     * @param paperNumber        试卷编号
-     * @param paperType          试卷类型
-     * @param paperName          试卷名称
-     * @param useExamCloudStruct 使用云阅卷结构
-     * @param requestUser        请求用户
+     * @param datasource  数据源
+     * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
+     * @param paperName   试卷名称
+     * @param requestUser 请求用户
      * @return 创建好的分析试卷结构
      */
-    private List<GradePaperStruct> checkAndBuildGradePaperStruct(List<GradePaperStructDatasource> datasource, String paperNumber, String paperType, String paperName, Boolean useExamCloudStruct, SysUser requestUser) {
+    private List<GradePaperStruct> checkAndBuildGradePaperStruct(List<GradePaperStructDatasource> datasource, String paperNumber, String paperType, String paperName, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
 
@@ -281,14 +301,18 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         List<Question> examPaperSubList = new ArrayList<>();
         // 对比信息
         String comparison = "知学知考";
-        if (useExamCloudStruct != null && useExamCloudStruct) {
-            // 应用云阅卷试卷结构
-            Map<QuestionType, List<Question>> questionTypeListMap = examPaperStructureService.parseExamCloudPaperStruct(examPaperStructure.getId());
+        int code = ExceptionResultEnum.ERROR.getCode();
+        String cloudInfoJson = examPaperStructure.getCloudInfoJson();
+        if (SystemConstant.strNotNull(cloudInfoJson)) {
+            // 优先与云阅卷对比
+            List<ExamCloudPaperStructDto> examCloudPaperStructDtoList = JSON.parseArray(cloudInfoJson, ExamCloudPaperStructDto.class);
+            Map<QuestionType, List<Question>> questionTypeListMap = examPaperStructureService.parseExamCloudPaperStruct(examCloudPaperStructDtoList);
             examPaperObjList = questionTypeListMap.get(QuestionType.OBJECTIVE);
             examPaperSubList = questionTypeListMap.get(QuestionType.SUBJECTIVE);
             comparison = "云阅卷";
+            code = SystemConstant.PAPER_STRUCT_EXCEPTION_CODE;
         } else {
-            // 应用知学知考试卷结构
+            // 当云阅卷试卷结构同步结果没有时与知学知考对比
             String examPaperObj = examPaperStructure.getObjectiveStructure();
             if (SystemConstant.strNotNull(examPaperObj)) {
                 examPaperObjList = JSON.parseArray(examPaperObj, Question.class);
@@ -310,7 +334,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                     return Stream.of(cell);
                 }).collect(Collectors.toList());
         if (!Question.matchTwoQuestionList(examPaperObjList, gradePaperObjList)) {
-            throw ExceptionResultEnum.ERROR.exception("试卷编号为【" + paperNumber + "】,试卷类型为【" + paperType +
+            throw ExceptionResultEnum.ERROR.exception(code,"试卷编号为【" + paperNumber + "】,试卷类型为【" + paperType +
                     "】的分析试卷结构和 [" + comparison + "] 试卷结构在【" + QuestionType.OBJECTIVE.getDesc() + "】上不一致");
         }
 
@@ -325,7 +349,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                     return Stream.of(cell);
                 }).collect(Collectors.toList());
         if (!Question.matchTwoQuestionList(examPaperSubList, gradePaperSubList)) {
-            throw ExceptionResultEnum.ERROR.exception("试卷编号为【" + paperNumber + "】,试卷类型为【" + paperType +
+            throw ExceptionResultEnum.ERROR.exception(code,"试卷编号为【" + paperNumber + "】,试卷类型为【" + paperType +
                     "】的分析试卷结构和 [" + comparison + "] 试卷结构在【" + QuestionType.SUBJECTIVE.getDesc() + "】上不一致");
         }
 

+ 7 - 2
distributed-print-business/src/main/resources/mapper/GradeInitializeMapper.xml

@@ -13,7 +13,8 @@
             pnpt.paper_type AS paperType,
             pnpt.paper_name AS paperName,
             pnpt.status AS status,
-            pnpt.publish_status AS publishStatus
+            pnpt.publish_status AS publishStatus,
+            eps.structure_change AS structureChange
         FROM
             exam_task et
                 INNER JOIN
@@ -29,7 +30,8 @@
              FROM
                  grade_batch_paper
              WHERE
-                 enable = true AND status NOT IN ('SETTING_GRADE_PAPER' , 'PUSH_GRADE_BATCH')
+                 enable = TRUE
+               AND status NOT IN ('SETTING_GRADE_PAPER' , 'PUSH_GRADE_BATCH')
              GROUP BY school_id , paper_number , paper_type) pnpt ON et.school_id = pnpt.school_id
                 AND et.paper_number = pnpt.paper_number
                 AND LOCATE(pnpt.paper_type, etd.relate_paper_type)
@@ -37,6 +39,9 @@
             basic_exam be ON et.exam_id = be.id
                 LEFT JOIN
             basic_semester bs ON bs.id = be.semester_id
+                LEFT JOIN
+            exam_paper_structure eps ON et.school_id = eps.school_id
+                AND et.paper_number = eps.paper_number
         <where>
             <if test="schoolId != null and schoolId != ''">
                 AND et.school_id = #{schoolId}

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

@@ -41,14 +41,13 @@ 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 = "使用云阅卷试卷结构") @RequestParam(required = false) boolean useExamCloudStruct) {
+                                           @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(paperNumber, paperType)) {
             throw ExceptionResultEnum.ERROR.exception("试卷参数不完整");
         }
-        return ResultUtil.ok(gradePaperStructService.findGradePaperStructureResultList(paperNumber, paperType, useExamCloudStruct, requestUser));
+        return ResultUtil.ok(gradePaperStructService.findGradePaperStructureResultList(paperNumber, paperType, requestUser));
     }
 
     @ApiOperation(value = "成绩分析试卷结构-新建试卷结构")
@@ -69,14 +68,13 @@ 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,
-                                         @ApiParam(value = "使用云阅卷试卷结构") @RequestParam(required = false) boolean useExamCloudStruct) throws IOException, NoSuchFieldException {
+                                         @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName) 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, useExamCloudStruct, requestUser);
+        gradePaperStructService.importGradePaperStruct(file, paperNumber, paperType, paperName, requestUser);
         return ResultUtil.ok();
     }
 
@@ -84,14 +82,25 @@ 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,
-                                         @ApiParam(value = "使用云阅卷试卷结构") @RequestParam(required = false) boolean useExamCloudStruct) throws Exception {
+                                         @ApiParam(value = "课程名称", required = true) @RequestParam String paperType) throws Exception {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(paperNumber, paperType)) {
             throw ExceptionResultEnum.ERROR.exception("参数不完整");
         }
-        gradePaperStructService.exportGradePaperStructTemplate(paperNumber, paperType, useExamCloudStruct, requestUser);
+        gradePaperStructService.exportGradePaperStructTemplate(paperNumber, paperType, requestUser);
+        return ResultUtil.ok();
+    }
+
+    @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) {
+        if (SystemConstant.isOneNull(paperNumber)){
+            throw ExceptionResultEnum.ERROR.exception("缺少试卷编号");
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradePaperStructService.updateExamCloudPaperStruct(requestUser.getSchoolId(),paperNumber);
         return ResultUtil.ok();
     }
 }

+ 63 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/ExamCloudPaperStructDto.java

@@ -0,0 +1,63 @@
+package com.qmth.teachcloud.common.bean.dto.stmms;
+
+/**
+ * @Description: 云阅卷试卷结构
+ * @Author: CaoZixuan
+ * @Date: 2022-07-08
+ */
+public class ExamCloudPaperStructDto {
+    private Boolean objective;
+    private String mainTitle;
+    private Integer mainNumber;
+    private Integer subNumber;
+    private Double totalScore;
+    private String answer;
+
+    public Boolean getObjective() {
+        return objective;
+    }
+
+    public void setObjective(Boolean objective) {
+        this.objective = objective;
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+}

+ 176 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseDeleteServiceImpl.java

@@ -10,6 +10,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 分析课程物理删除服务实现类
@@ -44,6 +45,43 @@ public class TBExamCourseDeleteServiceImpl implements TBExamCourseDeleteService
     @Resource
     TBAnswerService tbAnswerService;
 
+    // 相关联的分析表
+    @Resource
+    TAExamCourseRecordService taExamCourseRecordService;
+    @Resource
+    TAExamCourseService taExamCourseService;
+    @Resource
+    TAExamCourseClazzService taExamCourseClazzService;
+    @Resource
+    TAExamCourseCollegeInspectService taExamCourseCollegeInspectService;
+    @Resource
+    TAExamCourseCollegeInspectDioService taExamCourseCollegeInspectDioService;
+    @Resource
+    TAExamCourseCollegePaperStructService taExamCourseCollegePaperStructService;
+    @Resource
+    TAExamCourseCollegeTeacherService taExamCourseCollegeTeacherService;
+    @Resource
+    TAExamCourseDifficultService taExamCourseDifficultService;
+    @Resource
+    TAExamCourseDioService taExamCourseDioService;
+    @Resource
+    TAExamCourseRecordDioService taExamCourseRecordDioService;
+    @Resource
+    TAExamCourseRecordModService taExamCourseRecordModService;
+    @Resource
+    TAExamCourseTeacherService taExamCourseTeacherService;
+    @Resource
+    TAExamCourseTeacherCollegeDifficultService taExamCourseTeacherCollegeDifficultService;
+    @Resource
+    TAExamCourseTeacherCollegeDioService taExamCourseTeacherCollegeDioService;
+    @Resource
+    TAExamCourseTeacherCollegePaperStructService taExamCourseTeacherCollegePaperStructService;
+    @Resource
+    TAExamCourseTeacherDifficultService taExamCourseTeacherDifficultService;
+    @Resource
+    TAExamCourseTeacherDioService taExamCourseTeacherDioService;
+    @Resource
+    TAExamCourseTeacherPaperStructService taExamCourseTeacherPaperStructService;
 
 
     @Transactional(rollbackFor = Exception.class)
@@ -94,15 +132,150 @@ public class TBExamCourseDeleteServiceImpl implements TBExamCourseDeleteService
                 throw ExceptionResultEnum.ERROR.exception("考试id为【" + examId + "】,分析课程编号为【" + courseCode + "】存在多个试卷t_b_paper");
             }
             TBPaper tbPaper = tbPaperList.get(0);
-            // TODO: 2022/7/6  
+            Long paperId = tbPaper.getId();
+            List<TBPaperStruct> tbPaperStructList = tbPaperStructService.list(new QueryWrapper<TBPaperStruct>()
+                    .lambda()
+                    .eq(TBPaperStruct::getPaperId,paperId));
+            List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>()
+                    .lambda()
+                    .eq(TBExamRecord::getExamId,examId)
+                    .eq(TBExamRecord::getPaperId,paperId));
+            List<Long> tbExamRecordIdList = tbExamRecordList.stream().map(TBExamRecord::getId).collect(Collectors.toList());
+            if (tbExamRecordIdList.size() > 0){
+                List<TBAnswer> tbAnswerList = tbAnswerService.list(new QueryWrapper<TBAnswer>()
+                        .lambda()
+                        .in(TBAnswer::getExamRecordId,tbExamRecordIdList));
+                // 删除't_b_answer'表
+                tbAnswerService.removeByIds(tbAnswerList.stream().map(TBAnswer::getId).collect(Collectors.toList()));
+            }
+            // 删除't_b_exam_record'表
+            tbExamRecordService.removeByIds(tbExamRecordIdList);
+            // 删除't_b_paper_struct'表
+            tbPaperStructService.removeByIds(tbPaperStructList.stream().map(TBPaperStruct::getId).collect(Collectors.toList()));
+            // 删除't_b_paper'表
+            tbPaperService.removeById(tbPaper.getId());
         }
-
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void deleteAnalyzeTableData(Long schoolId, Long examId, String courseCode) {
-
+        // 关联的分析表↓
+        // 删除't_a_exam_course_record'
+        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);
+            Long paperId = tbPaper.getId();
+            List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>()
+                    .lambda()
+                    .eq(TBExamRecord::getExamId,examId)
+                    .eq(TBExamRecord::getPaperId,paperId));
+            List<Long> tbExamRecordIdList = tbExamRecordList.stream().map(TBExamRecord::getId).collect(Collectors.toList());
+            if (tbExamRecordIdList.size() > 0){
+                taExamCourseRecordService.remove(new QueryWrapper<TAExamCourseRecord>()
+                        .lambda()
+                        .in(TAExamCourseRecord::getExamRecordId,tbExamRecordIdList));
+            }
+        }
+        // 独立的分析表↓
+        // 删除't_a_exam_course'
+        taExamCourseService.remove(new QueryWrapper<TAExamCourse>().lambda()
+                .eq(TAExamCourse::getSchoolId,schoolId)
+                .eq(TAExamCourse::getExamId,examId)
+                .eq(TAExamCourse::getCourseCode,courseCode));
+        // 删除't_a_exam_course_clazz'
+        taExamCourseClazzService.remove(new QueryWrapper<TAExamCourseClazz>()
+                .lambda()
+                .eq(TAExamCourseClazz::getSchoolId,schoolId)
+                .eq(TAExamCourseClazz::getExamId,examId)
+                .eq(TAExamCourseClazz::getCourseCode,courseCode));
+        // 删除't_a_exam_course_college_inspect'
+        taExamCourseCollegeInspectService.remove(new QueryWrapper<TAExamCourseCollegeInspect>()
+                .lambda()
+                .eq(TAExamCourseCollegeInspect::getSchoolId,schoolId)
+                .eq(TAExamCourseCollegeInspect::getExamId,examId)
+                .eq(TAExamCourseCollegeInspect::getCourseCode,courseCode));
+        // 删除't_a_exam_course_college_inspect_dio'
+        taExamCourseCollegeInspectDioService.remove(new QueryWrapper<TAExamCourseCollegeInspectDio>()
+                .lambda()
+                .eq(TAExamCourseCollegeInspectDio::getSchoolId,schoolId)
+                .eq(TAExamCourseCollegeInspectDio::getExamId,examId)
+                .eq(TAExamCourseCollegeInspectDio::getCourseCode,courseCode));
+        // 删除't_a_exam_course_college_paper_struct'
+        taExamCourseCollegePaperStructService.remove(new QueryWrapper<TAExamCourseCollegePaperStruct>()
+                .lambda()
+                .eq(TAExamCourseCollegePaperStruct::getSchoolId,schoolId)
+                .eq(TAExamCourseCollegePaperStruct::getExamId,examId)
+                .eq(TAExamCourseCollegePaperStruct::getCourseCode,courseCode));
+        // 删除't_a_exam_course_college_teacher'
+        taExamCourseCollegeTeacherService.remove(new QueryWrapper<TAExamCourseCollegeTeacher>()
+                .lambda()
+                .eq(TAExamCourseCollegeTeacher::getSchoolId,schoolId)
+                .eq(TAExamCourseCollegeTeacher::getExamId,examId)
+                .eq(TAExamCourseCollegeTeacher::getCourseCode,courseCode));
+        // 删除't_a_exam_course_difficult'
+        taExamCourseDifficultService.remove(new QueryWrapper<TAExamCourseDifficult>()
+                .lambda()
+                .eq(TAExamCourseDifficult::getSchoolId,schoolId)
+                .eq(TAExamCourseDifficult::getExamId,examId)
+                .eq(TAExamCourseDifficult::getCourseCode,courseCode));
+        // 删除't_a_exam_course_dio'
+        taExamCourseDioService.remove(new QueryWrapper<TAExamCourseDio>().lambda()
+                .eq(TAExamCourseDio::getSchoolId,schoolId)
+                .eq(TAExamCourseDio::getExamId,examId)
+                .eq(TAExamCourseDio::getCourseCode,courseCode));
+        // 删除't_a_exam_course_record_dio'
+        taExamCourseRecordDioService.remove(new QueryWrapper<TAExamCourseRecordDio>().lambda()
+                .eq(TAExamCourseRecordDio::getSchoolId,schoolId)
+                .eq(TAExamCourseRecordDio::getExamId,examId)
+                .eq(TAExamCourseRecordDio::getCourseCode,courseCode));
+        // 删除't_a_exam_course_record_mod'
+        taExamCourseRecordModService.remove(new QueryWrapper<TAExamCourseRecordMod>().lambda()
+                .eq(TAExamCourseRecordMod::getSchoolId,schoolId)
+                .eq(TAExamCourseRecordMod::getExamId,examId)
+                .eq(TAExamCourseRecordMod::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher'
+        taExamCourseTeacherService.remove(new QueryWrapper<TAExamCourseTeacher>().lambda()
+                .eq(TAExamCourseTeacher::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacher::getExamId,examId)
+                .eq(TAExamCourseTeacher::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher_college_difficult'
+        taExamCourseTeacherCollegeDifficultService.remove(new QueryWrapper<TAExamCourseTeacherCollegeDifficult>().lambda()
+                .eq(TAExamCourseTeacherCollegeDifficult::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacherCollegeDifficult::getExamId,examId)
+                .eq(TAExamCourseTeacherCollegeDifficult::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher_college_dio'
+        taExamCourseTeacherCollegeDioService.remove(new QueryWrapper<TAExamCourseTeacherCollegeDio>().lambda()
+                .eq(TAExamCourseTeacherCollegeDio::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacherCollegeDio::getExamId,examId)
+                .eq(TAExamCourseTeacherCollegeDio::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher_college_paper_struct'
+        taExamCourseTeacherCollegePaperStructService.remove(new QueryWrapper<TAExamCourseTeacherCollegePaperStruct>().lambda()
+                .eq(TAExamCourseTeacherCollegePaperStruct::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacherCollegePaperStruct::getExamId,examId)
+                .eq(TAExamCourseTeacherCollegePaperStruct::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher_difficult'
+        taExamCourseTeacherDifficultService.remove(new QueryWrapper<TAExamCourseTeacherDifficult>().lambda()
+                .eq(TAExamCourseTeacherDifficult::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacherDifficult::getExamId,examId)
+                .eq(TAExamCourseTeacherDifficult::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher_dio'
+        taExamCourseTeacherDioService.remove(new QueryWrapper<TAExamCourseTeacherDio>().lambda()
+                .eq(TAExamCourseTeacherDio::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacherDio::getExamId,examId)
+                .eq(TAExamCourseTeacherDio::getCourseCode,courseCode));
+        // 删除't_a_exam_course_teacher_paper_struct'
+        taExamCourseTeacherPaperStructService.remove(new QueryWrapper<TAExamCourseTeacherPaperStruct>().lambda()
+                .eq(TAExamCourseTeacherPaperStruct::getSchoolId,schoolId)
+                .eq(TAExamCourseTeacherPaperStruct::getExamId,examId)
+                .eq(TAExamCourseTeacherPaperStruct::getCourseCode,courseCode));
+        // 删除''
     }
 
     @Transactional(rollbackFor = Exception.class)