|
@@ -1,6 +1,7 @@
|
|
|
package com.qmth.distributed.print.upgrade;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
+import com.qmth.boot.data.upgrade.annotation.DataUpgradeVersion;
|
|
|
import com.qmth.boot.data.upgrade.service.DataUpgradeService;
|
|
|
import com.qmth.boot.data.upgrade.utils.ResourceFileHelper;
|
|
|
import com.qmth.distributed.print.business.entity.ExamCard;
|
|
@@ -22,6 +23,7 @@ import com.qmth.teachcloud.mark.entity.*;
|
|
|
import com.qmth.teachcloud.mark.enums.CardSource;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.commons.lang3.time.DateFormatUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
|
@@ -33,6 +35,7 @@ import java.io.FileInputStream;
|
|
|
import java.io.FileNotFoundException;
|
|
|
import java.sql.PreparedStatement;
|
|
|
import java.sql.SQLException;
|
|
|
+import java.sql.Types;
|
|
|
import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -40,31 +43,37 @@ import java.util.stream.Collectors;
|
|
|
/**
|
|
|
* 升级3.4.4后,3.4.3及以前历史数据的归档
|
|
|
*/
|
|
|
-//@DataUpgradeVersion("3.4.4")
|
|
|
+@DataUpgradeVersion("3.4.4")
|
|
|
public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(DataUpgrade_3_4_4.class);
|
|
|
|
|
|
// 一页1000条
|
|
|
private static int PAGE_SIZE = 500;
|
|
|
+ private static String DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
|
|
|
|
|
@Override
|
|
|
public void process(JdbcTemplate jdbcTemplate) {
|
|
|
- log.info("process...");
|
|
|
StringJoiner sj = new StringJoiner(File.separator);
|
|
|
sj.add(System.getProperty("user.dir")).add("distributed-print").add("install").add("mysql").add("upgrade");
|
|
|
String upgradePath = sj.toString();
|
|
|
log.info("数据库脚本根目录:" + upgradePath);
|
|
|
// 执行升级脚本
|
|
|
+// log.info("开始处理3.4.3历史数据,更新脚本1;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
// String upgrade_sql1 = upgradePath + File.separator + "3.4.4-upgrade-1.sql";
|
|
|
// this.execUpgradeSql(jdbcTemplate, upgrade_sql1);
|
|
|
+// log.info("结束处理3.4.3历史数据,更新脚本1;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
|
|
|
- // 执行历史数据归档
|
|
|
+// log.info("开始处理3.4.3历史数据,数据归档;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
+// 执行历史数据归档
|
|
|
// this.execDataArchive(jdbcTemplate);
|
|
|
+// log.info("结束处理3.4.3历史数据,数据归档;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
|
|
|
// 归档后中间数据重命名,创建新表
|
|
|
+// log.info("开始处理3.4.4升级脚本2;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
// String upgrade_sql2 = upgradePath + File.separator + "3.4.4-upgrade-2.sql";
|
|
|
// this.execUpgradeSql(jdbcTemplate, upgrade_sql2);
|
|
|
+// log.info("结束处理3.4.4升级脚本2;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
|
|
|
}
|
|
|
|
|
@@ -72,39 +81,53 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
// 用户数据
|
|
|
Map<Long, SysUser> sysUserMap = this.mapSysUserSql(jdbcTemplate);
|
|
|
|
|
|
+ log.info("1.1开始查询待归档课程数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
List<MarkPaper> markPaperList = this.listMarkPaper(jdbcTemplate);
|
|
|
+ log.info("1.1结束查询待归档课程数据,共" + markPaperList.size() + "条数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
for (MarkPaper markPaper : markPaperList) {
|
|
|
Long examId = markPaper.getExamId();
|
|
|
BasicExam basicExam = getBasicExam(jdbcTemplate, examId);
|
|
|
String paperNumber = markPaper.getPaperNumber();
|
|
|
List<MarkStudent> markStudentList = this.listMarkStudent(jdbcTemplate, examId, paperNumber);
|
|
|
- // 客观题数据
|
|
|
- Map<String, List<MarkQuestionAnswerVo>> objectiveQuestionMap = this.mapObjectiveMarkQuestion(jdbcTemplate, examId, paperNumber);
|
|
|
- // 主观题数据
|
|
|
- List<MarkQuestion> markQuestionList = this.listSubjectiveMarkQuestionSql(jdbcTemplate, examId, paperNumber);
|
|
|
-
|
|
|
- List<MarkArchiveStudent> markArchiveStudents = new ArrayList<>();
|
|
|
- for (MarkStudent markStudent : markStudentList) {
|
|
|
- MarkArchiveStudent markArchiveStudent = new MarkArchiveStudent();
|
|
|
- markArchiveStudent.setStudentId(markStudent.getId());
|
|
|
- markArchiveStudent.setExamId(examId);
|
|
|
- markArchiveStudent.setPaperNumber(paperNumber);
|
|
|
- markArchiveStudent.setBasicStudentId(markStudent.getBasicStudentId());
|
|
|
- markArchiveStudent.setStudentCode(markStudent.getStudentCode());
|
|
|
- markArchiveStudent.setSheetUrls(buildSheetUrls(jdbcTemplate, markStudent));
|
|
|
- markArchiveStudent.setSubjectiveQuestions(buildSubjectiveQuestions(jdbcTemplate, markStudent, markQuestionList, sysUserMap));
|
|
|
- markArchiveStudent.setObjectiveQuestions(buildObjectiveQuestions(objectiveQuestionMap, markStudent));
|
|
|
- markArchiveStudent.setCardContent(getCardContent(jdbcTemplate, markStudent, basicExam));
|
|
|
- markArchiveStudent.setCreateTime(System.currentTimeMillis());
|
|
|
- markArchiveStudents.add(markArchiveStudent);
|
|
|
+ log.info("1.1.1开始归档考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
+ List<MarkArchiveStudent> markArchiveStudents = null;
|
|
|
+ long count = 0;
|
|
|
+ try {
|
|
|
+ // 客观题数据
|
|
|
+ Map<String, List<MarkQuestionAnswerVo>> objectiveQuestionMap = this.mapObjectiveMarkQuestion(jdbcTemplate, examId, paperNumber);
|
|
|
+ // 主观题数据
|
|
|
+ List<MarkQuestion> markQuestionList = this.listSubjectiveMarkQuestionSql(jdbcTemplate, examId, paperNumber);
|
|
|
+
|
|
|
+ markArchiveStudents = new ArrayList<>();
|
|
|
+ for (MarkStudent markStudent : markStudentList) {
|
|
|
+ MarkArchiveStudent markArchiveStudent = new MarkArchiveStudent();
|
|
|
+ markArchiveStudent.setStudentId(markStudent.getId());
|
|
|
+ markArchiveStudent.setExamId(examId);
|
|
|
+ markArchiveStudent.setPaperNumber(paperNumber);
|
|
|
+ markArchiveStudent.setBasicStudentId(markStudent.getBasicStudentId());
|
|
|
+ markArchiveStudent.setStudentCode(markStudent.getStudentCode());
|
|
|
+ markArchiveStudent.setSheetUrls(buildSheetUrls(jdbcTemplate, markStudent));
|
|
|
+ markArchiveStudent.setSubjectiveQuestions(buildSubjectiveQuestions(jdbcTemplate, markStudent, markQuestionList, sysUserMap));
|
|
|
+ markArchiveStudent.setObjectiveQuestions(buildObjectiveQuestions(objectiveQuestionMap, markStudent));
|
|
|
+ markArchiveStudent.setCardContent(getCardContent(jdbcTemplate, markStudent, basicExam));
|
|
|
+ markArchiveStudent.setCreateTime(System.currentTimeMillis());
|
|
|
+ markArchiveStudents.add(markArchiveStudent);
|
|
|
+ }
|
|
|
+ count = this.batchInsert(jdbcTemplate, markArchiveStudents);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 删除错误数据
|
|
|
+ log.info("1.1.1归档失败,删除数据开始。考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
+ this.deleteMarkArchiveStudentByExamIdAndPaperNumber(jdbcTemplate, examId, paperNumber);
|
|
|
+ log.info("1.1.1归档失败,删除数据结束。考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
+ throw new RuntimeException(e.getMessage());
|
|
|
}
|
|
|
- long count = this.batchInsert(jdbcTemplate, markArchiveStudents);
|
|
|
+ log.info("1.1.1结束归档考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
+ log.info("1.1.2开始更新课程归档状态:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "];时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
if (count == markArchiveStudents.size()) {
|
|
|
// 更新归档状态
|
|
|
this.updateMarkPaperArchive(jdbcTemplate, markPaper.getId());
|
|
|
- } else {
|
|
|
- // 回滚事务
|
|
|
}
|
|
|
+ log.info("1.1.2结束更新课程归档状态:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "];时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -152,6 +175,9 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
* 客观题信息
|
|
|
*/
|
|
|
private String buildObjectiveQuestions(Map<String, List<MarkQuestionAnswerVo>> objectiveQuestionMap, MarkStudent markStudent) {
|
|
|
+ if (objectiveQuestionMap.isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
List<String> answers = markStudent.getAnswerList();
|
|
|
List<String> answerScores = markStudent.getAnswerScoreList();
|
|
|
List<MarkQuestionAnswerVo> questions = objectiveQuestionMap.get(markStudent.getPaperType());
|
|
@@ -190,6 +216,9 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
List<TaskQuestion> taskQuestions = new ArrayList<>();
|
|
|
List<MarkSubjectiveScore> scoreList = this.listMarkSubjectiveScore(jdbcTemplate, studentId);
|
|
|
for (int i = 0; i < scoreList.size(); i++) {
|
|
|
+ if (sList.size() < i + 1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
MarkQuestion question = sList.get(i);
|
|
|
String questionNumber = question.getMainNumber() + "." + question.getSubNumber();
|
|
|
TaskQuestion step = buildStep(question);
|
|
@@ -426,7 +455,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
sql.append(" FROM ");
|
|
|
sql.append(" mark_question ");
|
|
|
sql.append(" WHERE ");
|
|
|
- sql.append(" exam_id = " + examId + " AND paper_number = " + paperNumber + " ");
|
|
|
+ sql.append(" exam_id = " + examId + " AND paper_number = '" + paperNumber + "' ");
|
|
|
sql.append(" AND objective = TRUE) mq ");
|
|
|
sql.append(" LEFT JOIN ");
|
|
|
sql.append(" (SELECT ");
|
|
@@ -434,7 +463,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
sql.append(" FROM ");
|
|
|
sql.append(" mark_question_answer ");
|
|
|
sql.append(" WHERE ");
|
|
|
- sql.append(" exam_id = " + examId + " AND paper_number = " + paperNumber + ") mqa ");
|
|
|
+ sql.append(" exam_id = " + examId + " AND paper_number = '" + paperNumber + "') mqa ");
|
|
|
sql.append(" ON mq.main_number = mqa.main_number ");
|
|
|
sql.append(" AND mq.sub_number = mqa.sub_number ");
|
|
|
sql.append(" ORDER BY mq.main_number , mq.sub_number ");
|
|
@@ -451,7 +480,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
sql.append(" FROM ");
|
|
|
sql.append(" mark_question mq ");
|
|
|
sql.append(" WHERE ");
|
|
|
- sql.append(" mq.exam_id = " + examId + " AND mq.paper_number = " + paperNumber + " ");
|
|
|
+ sql.append(" mq.exam_id = " + examId + " AND mq.paper_number = '" + paperNumber + "' ");
|
|
|
sql.append(" AND mq.objective = FALSE ");
|
|
|
sql.append(" ORDER BY mq.main_number , mq.sub_number ");
|
|
|
return this.listData(jdbcTemplate, sql.toString(), MarkQuestion.class);
|
|
@@ -491,7 +520,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
}
|
|
|
|
|
|
private List<MarkHeaderTrack> listMarkHeaderTrack(JdbcTemplate jdbcTemplate, Long studentId, String questionNumber) {
|
|
|
- String sql = "select * from mark_header_track where task_id = " + studentId + " and question_number = '" + questionNumber + "' order by number";
|
|
|
+ String sql = "select * from mark_header_track where student_id = " + studentId + " and question_number = '" + questionNumber + "' order by number";
|
|
|
return this.listData(jdbcTemplate, sql, MarkHeaderTrack.class);
|
|
|
}
|
|
|
|
|
@@ -503,7 +532,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
}
|
|
|
|
|
|
private List<MarkPaper> listMarkPaper(JdbcTemplate jdbcTemplate) {
|
|
|
- String sql = "select * from mark_paper where status = 'FINISH'";
|
|
|
+ String sql = "select * from mark_paper where status = 'FINISH' and archive = 0";
|
|
|
return this.listData(jdbcTemplate, sql, MarkPaper.class);
|
|
|
}
|
|
|
|
|
@@ -542,6 +571,11 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
return this.update(jdbcTemplate, sql);
|
|
|
}
|
|
|
|
|
|
+ private int deleteMarkArchiveStudentByExamIdAndPaperNumber(JdbcTemplate jdbcTemplate, Long examId, String paperNumber) {
|
|
|
+ String sql = "delete from mark_archive_student where exam_id = " + examId + " and paper_number = '" + paperNumber + "'";
|
|
|
+ return this.update(jdbcTemplate, sql);
|
|
|
+ }
|
|
|
+
|
|
|
private long batchInsert(JdbcTemplate jdbcTemplate, List<MarkArchiveStudent> markArchiveStudents) {
|
|
|
String sql = "insert into mark_archive_student(student_id, exam_id, paper_number, student_code, basic_student_id, sheet_urls, subjective_questions, objective_questions, card_content, create_time) values (?,?,?,?,?,?,?,?,?,?)";
|
|
|
int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
|
|
@@ -549,15 +583,51 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
|
|
|
public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
|
|
|
final MarkArchiveStudent mas = markArchiveStudents.get(i);
|
|
|
// 参数赋值的时候,序号是从 1 开始的,这一点要注意
|
|
|
- preparedStatement.setLong(1, mas.getStudentId());
|
|
|
- preparedStatement.setLong(2, mas.getExamId());
|
|
|
- preparedStatement.setString(3, mas.getPaperNumber());
|
|
|
- preparedStatement.setString(4, mas.getStudentCode());
|
|
|
- preparedStatement.setLong(5, mas.getBasicStudentId());
|
|
|
- preparedStatement.setString(6, mas.getSheetUrls());
|
|
|
- preparedStatement.setString(7, mas.getSubjectiveQuestions());
|
|
|
- preparedStatement.setString(8, mas.getObjectiveQuestions());
|
|
|
- preparedStatement.setString(9, mas.getCardContent());
|
|
|
+ if (mas.getStudentId() != null) {
|
|
|
+ preparedStatement.setLong(1, mas.getStudentId());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(1, Types.BIGINT);
|
|
|
+ }
|
|
|
+ if (mas.getExamId() != null) {
|
|
|
+ preparedStatement.setLong(2, mas.getExamId());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(2, Types.BIGINT);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(mas.getPaperNumber())) {
|
|
|
+ preparedStatement.setString(3, mas.getPaperNumber());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(3, Types.VARCHAR);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(mas.getStudentCode())) {
|
|
|
+ preparedStatement.setString(4, mas.getStudentCode());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(4, Types.VARCHAR);
|
|
|
+ }
|
|
|
+ if (mas.getBasicStudentId() != null) {
|
|
|
+ preparedStatement.setLong(5, mas.getBasicStudentId());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(5, Types.BIGINT);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(mas.getSheetUrls())) {
|
|
|
+ preparedStatement.setString(6, mas.getSheetUrls());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(6, Types.VARCHAR);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(mas.getSubjectiveQuestions())) {
|
|
|
+ preparedStatement.setString(7, mas.getSubjectiveQuestions());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(7, Types.VARCHAR);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(mas.getObjectiveQuestions())) {
|
|
|
+ preparedStatement.setString(8, mas.getObjectiveQuestions());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(8, Types.VARCHAR);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(mas.getCardContent())) {
|
|
|
+ preparedStatement.setString(9, mas.getCardContent());
|
|
|
+ } else {
|
|
|
+ preparedStatement.setNull(9, Types.VARCHAR);
|
|
|
+ }
|
|
|
preparedStatement.setLong(10, System.currentTimeMillis());
|
|
|
}
|
|
|
|