Sfoglia il codice sorgente

add: 教研分析计算逻辑

caozixuan 3 anni fa
parent
commit
fd92b9bf9d

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperServiceImpl.java

@@ -57,6 +57,9 @@ public class GradePaperServiceImpl extends ServiceImpl<GradePaperMapper, GradePa
                 .eq(GradeModuleDefine::getPaperType, paperType));
 
         GradePaperDefineResult gradePaperDefineResult = new GradePaperDefineResult();
+        if (Objects.isNull(gradePaper) && Objects.isNull(gradeModuleDefineList)){
+            return null;
+        }
         if (Objects.nonNull(gradePaper)) {
             gradePaperDefineResult.setTotalScore(gradePaper.getTotalScore());
             gradePaperDefineResult.setPassScore(gradePaper.getPassScore());

+ 11 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/CalculateParams.java

@@ -34,6 +34,9 @@ public class CalculateParams implements Serializable {
     @ApiModelProperty(value = "异步任务")
     private TBSyncTask tbSyncTask;
 
+    @ApiModelProperty(value = "需要重算的课程编号")
+    private List<String> repeatCalculateCourseCodeList;
+
     /**
      * 参数校验
      */
@@ -75,4 +78,12 @@ public class CalculateParams implements Serializable {
     public void setCourseCode(List<String> courseCode) {
         this.courseCode = courseCode;
     }
+
+    public List<String> getRepeatCalculateCourseCodeList() {
+        return repeatCalculateCourseCodeList;
+    }
+
+    public void setRepeatCalculateCourseCodeList(List<String> repeatCalculateCourseCodeList) {
+        this.repeatCalculateCourseCodeList = repeatCalculateCourseCodeList;
+    }
 }

+ 61 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/enums/DataCalculateSequenceEnum.java

@@ -0,0 +1,61 @@
+package com.qmth.teachcloud.report.business.enums;
+
+/**
+ * @Description: 教研分析分析计算方法顺序枚举类 - 必须和 AnalyzeForReportService中的计算方法名一致
+ * @Author: CaoZixuan
+ * @Date: 2022-06-10
+ */
+public enum DataCalculateSequenceEnum {
+    BUILD_ANALYZE_EXAM_COURSE("buildAnalyzeExamCourse", 1, 1),
+    BUILD_ANALYZE_EXAM_COURSE_RECORD("buildAnalyzeExamCourseRecord", 2, 1),
+    BUILD_ANALYZE_EXAM_COURSE_COLLEGE_INSPECT("buildAnalyzeExamCourseCollegeInspect", 3, 1),
+    BUILD_ANALYZE_EXAM_COURSE_CLAZZ("buildAnalyzeExamCourseClazz", 4, 1),
+    BUILD_ANALYZE_POINT_SCORE_RATE("buildAnalyzePointScoreRate", 5, 3),
+    BUILD_ANALYZE_EXAM_COURSE_COLLEGE_INSPECT_DIO("buildAnalyzeExamCourseCollegeInspectDio", 6, 1),
+    BUILD_ANALYZE_EXAM_COURSE_TEACHER_DIO("buildAnalyzeExamCourseTeacherDio", 7, 1),
+    BUILD_ANALYZE_PAPER_STRUCT("buildAnalyzePaperStruct", 8, 1),
+    BUILD_EXAM_PAPER_DIFFICULT("buildExamPaperDifficult", 9, 1),
+    BUILD_EXAM_PAPER_TEACHER_DIFFICULT("buildExamPaperTeacherDifficult", 10, 1),
+    BUILD_ANALYZE_EXAM_TOTAL("buildAnalyzeExamTotal", 11, 1),
+    BUILD_ANALYZE_EXAM_COURSE_COLLEGE_TEACHER("buildAnalyzeExamCourseCollegeTeacher", 12, 1),
+    BUILD_ANALYZE_EXAM_COURSE_TEACHER("buildAnalyzeExamCourseTeacher", 13, 1),
+    BUILD_ANALYZE_EXAM_COURSE_TEACHER_COLLEGE_DIO("buildAnalyzeExamCourseTeacherCollegeDio", 14, 1),
+    BUILD_ANALYZE_EXAM_COURSE_TEACHER_COLLEGE_DIFFICULT("buildAnalyzeExamCourseTeacherCollegeDifficult", 15, 1),
+    BUILD_ANALYZE_COLLEGE_PAPER_STRUCT("buildAnalyzeCollegePaperStruct", 16, 1),
+    BUILD_ANALYZE_TEACHER_PAPER_STRUCT("buildAnalyzeTeacherPaperStruct", 17, 1),
+    BUILD_ANALYZE_TEACHER_COLLEGE_PAPER_STRUCT("buildAnalyzeTeacherCollegePaperStruct", 18, 1),
+    ;
+    private final String methodName;
+    private final int index;
+    private final int weight;
+
+    DataCalculateSequenceEnum(String methodName, int index, int weight) {
+        this.methodName = methodName;
+        this.index = index;
+        this.weight = weight;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public int getWeight() {
+        return weight;
+    }
+
+    /**
+     * 获取总权重
+     * @return 权重
+     */
+    public static Integer getTotalWeight(){
+        int result = 0;
+        for (DataCalculateSequenceEnum value : DataCalculateSequenceEnum.values()) {
+            result = result + value.getWeight();
+        }
+        return result;
+    }
+}

+ 14 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeDataCalculateService.java

@@ -0,0 +1,14 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.qmth.teachcloud.report.business.bean.params.CalculateParams;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @Description: 教研分析分析计算接口(进度控制回调)
+ * @Author: CaoZixuan
+ * @Date: 2022-06-10
+ */
+public interface AnalyzeDataCalculateService {
+    void dataCalculateStart(CalculateParams calculateParams) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException;
+}

+ 1 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java

@@ -162,7 +162,7 @@ public interface AnalyzeForReportService {
      * @param examId 考试id
      * @return 结果
      */
-    String buildAnalyzeExamTotal(Long examId);
+    String buildAnalyzeExamTotal(Long examId,String courseCode);
 
     /**
      * 构建表 't_a_exam_course_college_teacher'

+ 10 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBExamCourseService.java

@@ -65,4 +65,14 @@ public interface TBExamCourseService extends IService<TBExamCourse> {
      * @param teachCollegeName 开课学院名称
      */
     void createCourse(Long schoolId, Long examId, String courseCode, String courseName, String paperType, String teachCollegeName);
+
+    /**
+     * 检验某课程是否完成已计算
+     *
+     * @param schoolId   学校id
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @return true:已完成过计算 false:未完成计算
+     */
+    boolean checkFinishCalculate(Long schoolId, Long examId, String courseCode);
 }

+ 95 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeDataCalculateServiceImpl.java

@@ -0,0 +1,95 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.report.business.bean.params.CalculateParams;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
+import com.qmth.teachcloud.report.business.enums.DataCalculateSequenceEnum;
+import com.qmth.teachcloud.report.business.service.AnalyzeDataCalculateService;
+import com.qmth.teachcloud.report.business.service.AnalyzeForReportService;
+import com.qmth.teachcloud.report.business.service.TBExamCourseService;
+
+import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Description: 分析计算及进度控制及断点续算服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-06-10
+ */
+public class AnalyzeDataCalculateServiceImpl implements AnalyzeDataCalculateService {
+    @Resource
+    private TBExamCourseService tbExamCourseService;
+
+    @Override
+    public void dataCalculateStart(CalculateParams calculateParams) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
+        Long examId = calculateParams.getExamId();
+        Long schoolId = calculateParams.getSchoolId();
+        List<String> courseCodeList = calculateParams.getCourseCode();
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+        List<String> needRepeatCourseCodeList = calculateParams.getRepeatCalculateCourseCodeList();
+
+        // 上次计算失败的课程和表
+        String errorCourseCode = tbSyncTask.getObj();
+
+        // 总任务数
+        AtomicInteger totalTask = new AtomicInteger(courseCodeList.size() * DataCalculateSequenceEnum.getTotalWeight());
+        AtomicInteger currentTask = new AtomicInteger(0);
+
+
+        for (String courseCode : courseCodeList) {
+            // 判断是否不需要计算
+            if (!needRepeatCourseCodeList.contains(courseCode)){
+                // 如果不用重算,判断是否已经算过
+                if (tbExamCourseService.checkFinishCalculate(schoolId,examId,courseCode)){
+                    // 如果不用重算且已经算过(记录进度)
+                    currentTask.addAndGet(DataCalculateSequenceEnum.getTotalWeight());
+                    continue;
+                }
+            }
+            // 上次计算异常且不需要重算的 - 断点续算
+            if (courseCode.equals(errorCourseCode) && needRepeatCourseCodeList.contains(courseCode)){
+                // 上次计算异常的课程,且不需要重算
+                String errorMethod = tbSyncTask.getRemark();
+                DataCalculateSequenceEnum error = DataCalculateSequenceEnum.valueOf(errorMethod);
+                int errorIndex = error.getIndex();
+
+                for (DataCalculateSequenceEnum dataCalculateSequenceEnum : DataCalculateSequenceEnum.values()) {
+                    int currentIndex = dataCalculateSequenceEnum.getIndex();
+                    if (currentIndex < errorIndex){
+                        // 已经计算过的方法,不用重算,但进度需要累加
+                        currentTask.addAndGet(dataCalculateSequenceEnum.getWeight());
+                        continue;
+                    }
+                    // 没有计算的方法和断点的方法都需要重新计算
+                    tbSyncTask.setRemark(dataCalculateSequenceEnum.name());
+                    String currentMethodName = dataCalculateSequenceEnum.getMethodName();
+                    AnalyzeForReportService analyzeForReportService = SpringContextHolder.getBean(AnalyzeForReportService.class);
+                    Method currenMethod = analyzeForReportService.getClass().getDeclaredMethod(currentMethodName,Long.class,String.class);
+                    currenMethod.invoke(analyzeForReportService,examId,courseCode); // 实例化对象,参数
+                    currentTask.addAndGet(dataCalculateSequenceEnum.getWeight());
+                    tbSyncTask.setProgress(BigDecimal.valueOf(currentTask.get()).divide(BigDecimal.valueOf(totalTask.get()),2, RoundingMode.HALF_UP));
+                    // TODO: 2022/6/10 回调 ↓
+                }
+            } else {
+                // 正常计算和重算
+                for (DataCalculateSequenceEnum dataCalculateSequenceEnum : DataCalculateSequenceEnum.values()) {
+                    // 没有计算的方法和断点的方法都需要重新计算
+                    tbSyncTask.setRemark(dataCalculateSequenceEnum.name());
+                    String currentMethodName = dataCalculateSequenceEnum.getMethodName();
+                    AnalyzeForReportService analyzeForReportService = SpringContextHolder.getBean(AnalyzeForReportService.class);
+                    Method currenMethod = analyzeForReportService.getClass().getDeclaredMethod(currentMethodName,Long.class,String.class);
+                    currenMethod.invoke(analyzeForReportService,examId,courseCode); // 实例化对象,参数
+                    currentTask.addAndGet(dataCalculateSequenceEnum.getWeight());
+                    tbSyncTask.setProgress(BigDecimal.valueOf(currentTask.get()).divide(BigDecimal.valueOf(totalTask.get()),2, RoundingMode.HALF_UP));
+                    // TODO: 2022/6/10 回调 ↓
+                }
+            }
+        }
+
+    }
+}

+ 2 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java

@@ -1604,7 +1604,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamTotal(Long examId) {
+    public String buildAnalyzeExamTotal(Long examId,String courseCode) {
         // 删除原数据
         taExamTotalService.remove(new QueryWrapper<TAExamTotal>().lambda()
                 .eq(TAExamTotal::getExamId, examId));
@@ -1983,7 +1983,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
         analyzeForReportService.buildAnalyzePaperStruct(examId, courseCode);
         analyzeForReportService.buildExamPaperDifficult(examId, courseCode);
         analyzeForReportService.buildExamPaperTeacherDifficult(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamTotal(examId);
+        analyzeForReportService.buildAnalyzeExamTotal(examId,courseCode);
         analyzeForReportService.buildAnalyzeExamCourseCollegeTeacher(examId, courseCode);
         analyzeForReportService.buildAnalyzeExamCourseTeacher(examId, courseCode);
         analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDio(examId, courseCode);

+ 12 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseServiceImpl.java

@@ -171,4 +171,16 @@ public class TBExamCourseServiceImpl extends ServiceImpl<TBExamCourseMapper, TBE
         tbExamCourse.setTeachCollegeName(teachCollegeName);
         this.save(tbExamCourse);
     }
+
+    @Override
+    public boolean checkFinishCalculate(Long schoolId, Long examId, String courseCode) {
+        TBExamCourse tbExamCourse = this.getOne(new QueryWrapper<TBExamCourse>().lambda()
+                .eq(TBExamCourse::getSchoolId,schoolId)
+                .eq(TBExamCourse::getExamId,examId)
+                .eq(TBExamCourse::getCourseCode,courseCode));
+        if (Objects.isNull(tbExamCourse)){
+            throw ExceptionResultEnum.ERROR.exception("未找到基础分析课程");
+        }
+        return !PublishStatusEnum.UN_COMPUTE.equals(tbExamCourse.getPublishStatus());
+    }
 }

+ 13 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CourseCodeSyncTaskService.java

@@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
+import java.util.List;
 
 /**
  * @Description: 科目(试卷)计算service
@@ -34,7 +35,11 @@ public class CourseCodeSyncTaskService extends CalculateTaskTemplate {
         updateProgress(calculateParams);
 
         //TODO 此处加校验数据具体逻辑方法,推荐service方法然后加@Transactional注解
-
+//        List<String> courseCodeLIst = calculateParams.getCourseCode();
+//        for (String s : courseCodeLIst) {
+//            --- ---
+//
+//        }
     }
 
     /**
@@ -50,6 +55,13 @@ public class CourseCodeSyncTaskService extends CalculateTaskTemplate {
         tbSyncTask.setStatus(TaskStatusEnum.RUNNING);
         updateProgress(calculateParams);
 
+//        for (String s : courseCodeLIst) {
+//            --- ---
+//                    -- --  ----  -
+//        }
+//        tbSyncTask.setProgress();
+//        updateProgress(calculateParams);
+
 //        tbSyncTask.setObj(calculateParams.getCourseCode().get(0));//科目名称
 //        tbSyncTask.setRemark("tableName");//表名称
 

+ 1 - 1
teachcloud-report/src/test/java/com/qmth/teachcloud/report/AnalyzeForStudentServiceTest.java

@@ -84,7 +84,7 @@ public class AnalyzeForStudentServiceTest {
     @Test
     public void buildAnalyzeExamTotal() {
         Long examId = 1L;
-        System.out.println(analyzeForReportService.buildAnalyzeExamTotal(examId));
+        System.out.println(analyzeForReportService.buildAnalyzeExamTotal(examId,null));
     }
 
     @Test