|
@@ -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());
|
|
|
}
|
|
|
}
|