caozixuan 3 жил өмнө
parent
commit
d6c34e0c2d

+ 43 - 18
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeDataCalculateServiceImpl.java

@@ -1,6 +1,8 @@
 package com.qmth.teachcloud.report.business.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.enums.GradeAnalyzePaperStatusEnum;
 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;
@@ -10,7 +12,6 @@ import com.qmth.teachcloud.report.business.service.AnalyzeForReportService;
 import com.qmth.teachcloud.report.business.service.TBExamCourseService;
 import com.qmth.teachcloud.report.business.templete.strategy.CalculateTaskTemplate;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.io.IOException;
@@ -32,7 +33,6 @@ public class AnalyzeDataCalculateServiceImpl implements AnalyzeDataCalculateServ
     @Resource
     private TBExamCourseService tbExamCourseService;
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
     public void dataCalculateStart(CalculateParams calculateParams) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {
         AnalyzeForReportService analyzeForReportService = SpringContextHolder.getBean(AnalyzeForReportService.class);
@@ -43,7 +43,7 @@ public class AnalyzeDataCalculateServiceImpl implements AnalyzeDataCalculateServ
         Long schoolId = calculateParams.getSchoolId();
         List<String> courseCodeList = calculateParams.getCourseCode();
         List<String> needRepeatCourseCodeList = calculateParams.getRepeatCalculateCourseCodeList();
-        if (needRepeatCourseCodeList == null){
+        if (needRepeatCourseCodeList == null) {
             needRepeatCourseCodeList = new ArrayList<>();
         }
 
@@ -56,28 +56,34 @@ public class AnalyzeDataCalculateServiceImpl implements AnalyzeDataCalculateServ
 
 
         for (String courseCode : courseCodeList) {
+            // TODO: 2022/6/13 测试用全部重算
+//            needRepeatCourseCodeList.add(courseCode);
+
             // 判断是否不需要计算
-            if (!needRepeatCourseCodeList.contains(courseCode)){
+            if (!needRepeatCourseCodeList.contains(courseCode)) {
                 // 如果不用重算,判断是否已经算过
-                if (tbExamCourseService.checkFinishCalculate(schoolId,examId,courseCode)){
+                if (tbExamCourseService.checkFinishCalculate(schoolId, examId, courseCode)) {
                     // 如果不用重算且已经算过(记录进度)
                     currentTask.addAndGet(DataCalculateSequenceEnum.getTotalWeight());
+                    this.submitTBSyncTask(tbSyncTask, totalTask, currentTask, courseCode, GradeAnalyzePaperStatusEnum.FINISH_CALCULATE);
+                    calculateTaskTemplate.updateProgress(calculateParams);
                     continue;
                 }
             }
             // 准备计算
-            analyzeForReportService.realityForCalculate(examId,courseCode);
+            analyzeForReportService.realityForCalculate(examId, courseCode);
             // 上次计算异常且不需要重算的 - 断点续算
             try {
-                if (courseCode.equals(errorCourseCode) && !needRepeatCourseCodeList.contains(courseCode)){
+                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){
+                        if (currentIndex < errorIndex) {
                             // 已经计算过的方法,不用重算,但进度需要累加
                             currentTask.addAndGet(dataCalculateSequenceEnum.getWeight());
                             continue;
@@ -86,32 +92,51 @@ public class AnalyzeDataCalculateServiceImpl implements AnalyzeDataCalculateServ
                         tbSyncTask.setRemark(dataCalculateSequenceEnum.name());
                         String currentMethodName = dataCalculateSequenceEnum.getMethodName();
 
-                        Method currenMethod = analyzeForReportService.getClass().getDeclaredMethod(currentMethodName,Long.class,String.class);
-                        currenMethod.invoke(analyzeForReportService,examId,courseCode); // 实例化对象,参数
+                        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));
+                        this.submitTBSyncTask(tbSyncTask, totalTask, currentTask, courseCode, GradeAnalyzePaperStatusEnum.CALCULATING);
                         calculateTaskTemplate.updateProgress(calculateParams);
                     }
                 } else {
                     // 正常计算和重算
+                    // 表级计算
                     for (DataCalculateSequenceEnum dataCalculateSequenceEnum : DataCalculateSequenceEnum.values()) {
                         // 没有计算的方法和断点的方法都需要重新计算
                         tbSyncTask.setRemark(dataCalculateSequenceEnum.name());
                         String currentMethodName = dataCalculateSequenceEnum.getMethodName();
-                        Method currenMethod = analyzeForReportService.getClass().getDeclaredMethod(currentMethodName,Long.class,String.class);
-                        currenMethod.invoke(analyzeForReportService,examId,courseCode); // 实例化对象,参数
+                        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));
+                        this.submitTBSyncTask(tbSyncTask, totalTask, currentTask, courseCode, GradeAnalyzePaperStatusEnum.CALCULATING);
                         calculateTaskTemplate.updateProgress(calculateParams);
                     }
                 }
                 // 计算完成
-                analyzeForReportService.updateCoursePublishStatus(examId,courseCode, PublishStatusEnum.UN_PUBLISH);
-            }catch (Exception e){
+                analyzeForReportService.updateCoursePublishStatus(examId, courseCode, PublishStatusEnum.UN_PUBLISH);
+                this.submitTBSyncTask(tbSyncTask, totalTask, currentTask, courseCode, GradeAnalyzePaperStatusEnum.FINISH_CALCULATE);
+                calculateTaskTemplate.updateProgress(calculateParams);
+            } catch (Exception e) {
                 // 教研分析计算部分出错时,需要回归t_b_exam_course表状态为未计算 再向外抛出异常
-                analyzeForReportService.updateCoursePublishStatus(examId,courseCode, PublishStatusEnum.UN_COMPUTE);
+                analyzeForReportService.updateCoursePublishStatus(examId, courseCode, PublishStatusEnum.UN_COMPUTE);
                 throw e;
             }
-        }
+        } //所有科目计算完成后任务状态变成已完成并且清除obj和remark
+    }
+
+    /**
+     * 提交task变化
+     *
+     * @param tbSyncTask                  tbSyncTask
+     * @param totalTask                   总任务
+     * @param currentTask                 当前执行的任务量
+     * @param courseCode                  课程编号
+     * @param gradeAnalyzePaperStatusEnum 状态
+     */
+    private void submitTBSyncTask(TBSyncTask tbSyncTask, AtomicInteger totalTask, AtomicInteger currentTask, String courseCode, GradeAnalyzePaperStatusEnum gradeAnalyzePaperStatusEnum) {
+        tbSyncTask.setProgress(BigDecimal.valueOf(currentTask.get()).divide(BigDecimal.valueOf(totalTask.get()), 2, RoundingMode.HALF_UP));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put(courseCode, gradeAnalyzePaperStatusEnum);
+        tbSyncTask.setObj(jsonObject.toJSONString());
     }
 }