Explorar o código

3.4.4 update-20250409,bug修改

xiaofei hai 2 meses
pai
achega
3579716cf4

+ 12 - 0
distributed-print/install/mysql/upgrade/3.4.2.sql

@@ -204,6 +204,18 @@ VALUES(1188, '共用接口-OBE专业', '/api/admin/basic/condition/list_professi
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('854', '指定用户添加课程', 'AssginCourseUser', 'BUTTON', '576', '6', 'AUTH', '1', '0', '1');
 UPDATE `sys_privilege` SET `related` = '157,1103' WHERE (`id` = '1111');
 
+ALTER TABLE `exam_task_detail` CHANGE COLUMN `id` `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键' ;
+ALTER TABLE `mark_question_answer` CHANGE COLUMN `id` `id` BIGINT NOT NULL AUTO_INCREMENT ;
+
+create table if not exists boot_app_info (
+    app_code varchar(20) not null,
+    app_version varchar(10) not null,
+    locked bit(1) not null default 0,
+    unique key(app_code)
+    );
+
+insert into boot_app_info (app_code,app_version) values('teachcloud','3.4.2');
+
 -- 2024-12-3
 CREATE INDEX t_c_final_score_culture_program_id_IDX USING BTREE ON t_c_final_score (culture_program_id,exam_id,course_id,paper_number);
 

+ 3 - 1
distributed-print/install/mysql/upgrade/3.4.3.sql

@@ -68,7 +68,7 @@ CREATE TABLE `t_sync_data_student`  (
 
 ALTER TABLE `basic_message`
     CHANGE COLUMN `user_id` `user_id` BIGINT NULL COMMENT '消息接收人用户' ,
-    CHANGE COLUMN `mobile_number` `mobile_number` VARCHAR(11) NOT NULL COMMENT '电话号码' ;
+    CHANGE COLUMN `mobile_number` `mobile_number` VARCHAR(11) NULL COMMENT '电话号码' ;
 
 ALTER TABLE `basic_message`
     CHANGE COLUMN `template_code` `template_code` VARCHAR(45) NULL COMMENT '消息模板代码' ;
@@ -95,3 +95,5 @@ ADD COLUMN `exam_time` VARCHAR(45) NULL COMMENT '考试时间' AFTER `exam_date`
 
 ALTER TABLE `basic_exam_student`
     ADD COLUMN `enable` TINYINT(1) NULL DEFAULT 1 COMMENT '是否启用' AFTER `extend_fields`;
+
+UPDATE `boot_app_info` SET `app_version` = '3.4.3' WHERE (`app_code` = 'teachcloud');

+ 18 - 22
distributed-print/install/mysql/upgrade/3.4.4-upgrade-1.sql

@@ -1,25 +1,21 @@
-USE teachcloud_db;
+-- USE teachcloud_db;
+ALTER TABLE `mark_paper` ADD COLUMN `archive` TINYINT(1) NULL DEFAULT 0 COMMENT '是否归档,1-已归档' AFTER `open_double_marking`;
 
-create table if not exists boot_app_info (
-    app_code varchar(20) not null,
-    app_version varchar(10) not null,
-    locked bit(1) not null default 0,
-    unique key(app_code)
-    );
+CREATE TABLE `mark_archive_student`
+(
+    `student_id`           BIGINT(20) NOT NULL,
+    `exam_id`              BIGINT(20) NULL,
+    `paper_number`         VARCHAR(100) NULL,
+    `student_code`         VARCHAR(45) NULL,
+    `basic_student_id`     BIGINT(20) NULL,
+    `sheet_urls`           MEDIUMTEXT NULL COMMENT '图片地址',
+    `subjective_questions` MEDIUMTEXT NULL,
+    `objective_questions`  MEDIUMTEXT NULL,
+    `card_content`         MEDIUMTEXT NULL,
+    `create_time`          BIGINT(20) NULL,
+    PRIMARY KEY (`student_id`)
+) COMMENT = '考生归档数据表';
 
-insert into boot_app_info (app_code,app_version) values('teachcloud','3.4.3');
+UPDATE `mark_student` SET `paper_type` = 'B' WHERE `id` = '539444443778908160' and student_code = '202201001274' and paper_type = 'A';
+UPDATE `mark_student` SET `paper_type` = 'B' WHERE `id` = '539444443850211328' and student_code = '202201001274' and paper_type = 'A';
 
-
-CREATE TABLE `mark_archive_student` (
-           `student_id` BIGINT(20) NOT NULL,
-           `exam_id` BIGINT(20) NULL,
-           `paper_number` VARCHAR(100) NULL,
-           `student_code` VARCHAR(45) NULL,
-           `basic_student_id` BIGINT(20) NULL,
-           `sheet_urls` MEDIUMTEXT NULL COMMENT '图片地址',
-           `subjective_questions` MEDIUMTEXT NULL,
-           `objective_questions` MEDIUMTEXT NULL,
-           `card_content` MEDIUMTEXT NULL,
-           `create_time` BIGINT(20) NULL,
-           PRIMARY KEY (`student_id`))
-    COMMENT = '考生归档数据表';

+ 0 - 1
distributed-print/install/mysql/upgrade/3.4.4-upgrade-2.sql

@@ -372,7 +372,6 @@ UPDATE `sys_privilege` SET `related` = '542,959,1139,1220' WHERE (`id` = '498');
 UPDATE `sys_privilege` SET `related` = '542,959,1139,1220' WHERE (`id` = '499');
 UPDATE `sys_privilege` SET `related` = '542,959,1139,1220' WHERE (`id` = '500');
 
-ALTER TABLE `mark_paper` ADD COLUMN `archive` TINYINT(1) NULL DEFAULT 0 COMMENT '是否归档,1-已归档' AFTER `merge_marker`;
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1221', '班级阅卷进度-详情', '/api/admin/mark/question/subjective/class/detail', 'URL', '917', '21', 'AUTH', '1', '1', '1');
 UPDATE `sys_privilege` SET `related` = '928,929,932,933,934,935,936,937,938,939,940,941,942,943,964,965,966,967,968,1008,1012,1183,1186,1221' WHERE (`id` = '944');
 UPDATE `sys_config` SET `config_value` = '[{"name":"A3","size":"297*420"}, {"name":"A4","size":"210*297"}, {"name":"A5","size":"148*210"}, {"name":"B3","size":"353*500"}, {"name":"B4","size":"250*353"}, {"name":"B5","size":"176*250"}, {"name":"8K","size":"270*390"}]' WHERE (`id` = '8');

+ 110 - 34
distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_2.java

@@ -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.ExamTask;
@@ -9,7 +10,6 @@ import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.mark.entity.MarkArchiveStudent;
 import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -25,12 +25,13 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
+import java.sql.Types;
 import java.util.*;
 
 /**
  * 升级3.4.2后,3.4.1及以前历史数据的处理
  */
-//@DataUpgradeVersion("3.4.2")
+@DataUpgradeVersion("3.4.2")
 public class DataUpgrade_3_4_2 implements DataUpgradeService {
 
     private static final Logger log = LoggerFactory.getLogger(DataUpgrade_3_4_2.class);
@@ -54,7 +55,7 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
 //        this.execUpgradeSql(jdbcTemplate, upgrade_sql1);
 
         // 执行历史数据归档
-//        this.execSerialNumber(jdbcTemplate);
+        this.execSerialNumber(jdbcTemplate);
     }
 
     private void execSerialNumber(JdbcTemplate jdbcTemplate) {
@@ -95,7 +96,6 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
                         continue;
                     }
                     ExamTaskDetail taskDetail = new ExamTaskDetail();
-                    taskDetail.setId(SystemConstant.getDbUuid());
                     taskDetail.setExamTaskId(examTaskDetail.getExamTaskId());
                     taskDetail.setSerialNumber(calcSerialNumber(type));
                     taskDetail.setPaperType(type);
@@ -152,7 +152,12 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
         // 拆分客观题标答
         List<MarkQuestionAnswer> markQuestionAnswerList = new ArrayList<>();
         for (MarkQuestion markQuestion : this.markQuestionList(jdbcTemplate)) {
-            MarkQuestionAnswer markQuestionAnswer = new MarkQuestionAnswer(markQuestion.getExamId(), markQuestion.getPaperNumber(), markQuestion.getPaperType(), markQuestion.getMainNumber(), markQuestion.getSubNumber());
+            MarkQuestionAnswer markQuestionAnswer = new MarkQuestionAnswer();
+            markQuestionAnswer.setExamId(markQuestion.getExamId());
+            markQuestionAnswer.setPaperNumber(markQuestion.getPaperNumber());
+            markQuestionAnswer.setPaperType(markQuestion.getPaperType());
+            markQuestionAnswer.setMainNumber(markQuestion.getMainNumber());
+            markQuestionAnswer.setSubNumber(markQuestion.getSubNumber());
             markQuestionAnswer.setAnswer(markQuestion.getAnswer());
             markQuestionAnswer.setObjectivePolicy(markQuestion.getObjectivePolicy());
             markQuestionAnswer.setObjectivePolicyScore(markQuestion.getObjectivePolicyScore());
@@ -255,7 +260,7 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
     }
 
     private List<ExamTaskDetail> examTaskDetailList(JdbcTemplate jdbcTemplate) {
-        String sql = "select * from exam_task_detail where paper_confirm_attachment_ids is not null";
+        String sql = "select * from exam_task_detail etd where etd.paper_confirm_attachment_ids is not null and etd.exam_task_id in (select id from exam_task)";
         return this.listData(jdbcTemplate, sql, ExamTaskDetail.class);
     }
 
@@ -311,23 +316,63 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
     }
 
     private long saveBatchExamTaskDetail(JdbcTemplate jdbcTemplate, List<ExamTaskDetail> list) {
-        String sql = "insert into exam_task_detail(id, exam_task_id, serial_number, paper_type, paper_attachment_ids, exposed, exposed_exam_id, create_id, create_time, update_id, update_time) values (?,?,?,?,?,?,?,?,?,?,?)";
+        String sql = "insert into exam_task_detail(exam_task_id, serial_number, paper_type, paper_attachment_ids, exposed, exposed_exam_id, create_id, create_time, update_id, update_time) values (?,?,?,?,?,?,?,?,?,?)";
         int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
             @Override
             public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
                 final ExamTaskDetail t = list.get(i);
                 // 参数赋值的时候,序号是从 1 开始的,这一点要注意
-                preparedStatement.setLong(1, t.getId());
-                preparedStatement.setLong(2, t.getExamTaskId());
-                preparedStatement.setInt(3, t.getSerialNumber());
-                preparedStatement.setString(4, t.getPaperType());
-                preparedStatement.setString(5, t.getPaperAttachmentIds());
-                preparedStatement.setBoolean(6, t.getExposed());
-                preparedStatement.setLong(7, t.getExposedExamId());
-                preparedStatement.setLong(8, t.getCreateId());
-                preparedStatement.setLong(9, t.getCreateTime());
-                preparedStatement.setLong(10, t.getUpdateId());
-                preparedStatement.setLong(11, t.getUpdateTime());
+                if (t.getExamTaskId() != null) {
+                    preparedStatement.setLong(1, t.getExamTaskId());
+                } else {
+                    preparedStatement.setNull(1, Types.BIGINT);
+                }
+                if (t.getSerialNumber() != null) {
+                    preparedStatement.setInt(2, t.getSerialNumber());
+                } else {
+                    preparedStatement.setNull(2, Types.INTEGER);
+                }
+                if (StringUtils.isNotBlank(t.getPaperType())) {
+                    preparedStatement.setString(3, t.getPaperType());
+                } else {
+                    preparedStatement.setNull(3, Types.VARCHAR);
+                }
+                if (StringUtils.isNotBlank(t.getPaperAttachmentIds())) {
+                    preparedStatement.setString(4, t.getPaperAttachmentIds());
+                } else {
+                    preparedStatement.setNull(4, Types.VARCHAR);
+                }
+                if (t.getExposed() != null) {
+                    preparedStatement.setBoolean(5, t.getExposed());
+                } else {
+                    preparedStatement.setNull(5, Types.BOOLEAN);
+                }
+                if (t.getExposedExamId() != null) {
+                    preparedStatement.setLong(6, t.getExposedExamId());
+                } else {
+                    preparedStatement.setNull(6, Types.INTEGER);
+                }
+                if (t.getCreateId() != null) {
+                    preparedStatement.setLong(7, t.getCreateId());
+                } else {
+                    preparedStatement.setNull(7, Types.BIGINT);
+                }
+                if (t.getCreateTime() != null) {
+                    preparedStatement.setLong(8, t.getCreateTime());
+                } else {
+                    preparedStatement.setNull(8, Types.BIGINT);
+                }
+                if (t.getUpdateId() != null) {
+                    preparedStatement.setLong(9, t.getUpdateId());
+                } else {
+                    preparedStatement.setNull(9, Types.BIGINT);
+                }
+                if (t.getUpdateTime() != null) {
+                    preparedStatement.setLong(10, t.getUpdateTime());
+                } else {
+                    preparedStatement.setNull(10, Types.BIGINT);
+                }
+
             }
 
             @Override
@@ -339,17 +384,37 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
     }
 
     private long updateBatchExamTaskDetail(JdbcTemplate jdbcTemplate, List<ExamTaskDetail> list) {
-        String sql = "update mark_archive_student set serial_number = ?, paper_type = ?, paper_attachment_ids = ?, exposed = ?, exposed_exam_id = ? where id = ?";
+        String sql = "update exam_task_detail set serial_number = ?, paper_type = ?, paper_attachment_ids = ?, exposed = ?, exposed_exam_id = ? where id = ?";
         int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
             @Override
             public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
                 final ExamTaskDetail t = list.get(i);
                 // 参数赋值的时候,序号是从 1 开始的,这一点要注意
-                preparedStatement.setInt(1, t.getSerialNumber());
-                preparedStatement.setString(2, t.getPaperType());
-                preparedStatement.setString(3, t.getPaperAttachmentIds());
-                preparedStatement.setBoolean(4, t.getExposed());
-                preparedStatement.setLong(5, t.getExposedExamId());
+                if (t.getSerialNumber() != null) {
+                    preparedStatement.setInt(1, t.getSerialNumber());
+                } else {
+                    preparedStatement.setNull(1, Types.INTEGER);
+                }
+                if (StringUtils.isNotBlank(t.getPaperType())) {
+                    preparedStatement.setString(2, t.getPaperType());
+                } else {
+                    preparedStatement.setNull(2, Types.VARCHAR);
+                }
+                if (StringUtils.isNotBlank(t.getPaperAttachmentIds())) {
+                    preparedStatement.setString(3, t.getPaperAttachmentIds());
+                } else {
+                    preparedStatement.setNull(3, Types.VARCHAR);
+                }
+                if (t.getExposed() != null) {
+                    preparedStatement.setBoolean(4, t.getExposed());
+                } else {
+                    preparedStatement.setNull(4, Types.BOOLEAN);
+                }
+                if (t.getExposedExamId() != null) {
+                    preparedStatement.setLong(5, t.getExposedExamId());
+                } else {
+                    preparedStatement.setNull(5, Types.BIGINT);
+                }
                 preparedStatement.setLong(6, t.getId());
             }
 
@@ -362,21 +427,32 @@ public class DataUpgrade_3_4_2 implements DataUpgradeService {
     }
 
     private long saveBatchMarkQuestionAnswer(JdbcTemplate jdbcTemplate, List<MarkQuestionAnswer> list) {
-        String sql = "insert into mark_question_answer(id, exam_id, paper_number, paper_type, main_number, sub_number, answer, objective_policy, objective_policy_score) values (?,?,?,?,?,?,?,?,?)";
+        String sql = "insert into mark_question_answer(exam_id, paper_number, paper_type, main_number, sub_number, answer, objective_policy, objective_policy_score) values (?,?,?,?,?,?,?,?)";
         int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
             @Override
             public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
                 final MarkQuestionAnswer mas = list.get(i);
                 // 参数赋值的时候,序号是从 1 开始的,这一点要注意
-                preparedStatement.setLong(1, mas.getId());
-                preparedStatement.setLong(2, mas.getExamId());
-                preparedStatement.setString(3, mas.getPaperNumber());
-                preparedStatement.setString(4, mas.getPaperType());
-                preparedStatement.setInt(5, mas.getMainNumber());
-                preparedStatement.setInt(6, mas.getSubNumber());
-                preparedStatement.setString(7, mas.getAnswer());
-                preparedStatement.setString(8, mas.getObjectivePolicy().name());
-                preparedStatement.setDouble(9, mas.getObjectivePolicyScore());
+                preparedStatement.setLong(1, mas.getExamId());
+                preparedStatement.setString(2, mas.getPaperNumber());
+                preparedStatement.setString(3, mas.getPaperType());
+                preparedStatement.setInt(4, mas.getMainNumber());
+                preparedStatement.setInt(5, mas.getSubNumber());
+                if (StringUtils.isNotBlank(mas.getAnswer())) {
+                    preparedStatement.setString(6, mas.getAnswer());
+                } else {
+                    preparedStatement.setNull(6, Types.VARCHAR);
+                }
+                if (mas.getObjectivePolicy() != null) {
+                    preparedStatement.setString(7, mas.getObjectivePolicy().name());
+                } else {
+                    preparedStatement.setNull(7, Types.VARCHAR);
+                }
+                if (mas.getObjectivePolicyScore() != null) {
+                    preparedStatement.setDouble(8, mas.getObjectivePolicyScore());
+                } else {
+                    preparedStatement.setNull(8, Types.DOUBLE);
+                }
             }
 
             @Override

+ 109 - 39
distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_4.java

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

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_5.java

@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
 /**
  * 升级3.4.4后,新版本数据的归档
  */
-@DataUpgradeVersion("3.4.4")
+//@DataUpgradeVersion("3.4.5")
 public class DataUpgrade_3_4_5 implements DataUpgradeService {
 
     private static final Logger log = LoggerFactory.getLogger(DataUpgrade_3_4_5.class);

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/OptionsEnum.java

@@ -99,7 +99,7 @@ public enum OptionsEnum {
         }
         List<String> codes = new ArrayList<>();
         for (OptionsEnum value : OptionsEnum.values()) {
-            if (value.index < optionCount - 1) {
+            if (value.index <= optionCount) {
                 codes.add(value.name());
             }
         }

+ 19 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/SpecialTagDTO.java

@@ -14,6 +14,9 @@ public class SpecialTagDTO implements Serializable {
     private static final long serialVersionUID = -5424015292124065736L;
 
     private String id;
+    private Integer mainNumber;
+
+    private Integer subNumber;
     private String tagName;
 
     private String tagType;
@@ -104,6 +107,22 @@ public class SpecialTagDTO implements Serializable {
         this.id = id;
     }
 
+    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 String getTagName() {
         return tagName;
     }

+ 2 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkerInfoDto.java

@@ -7,7 +7,7 @@ public class MarkerInfoDto {
     private Long examId;
     private Long questionId;
 
-    @ExcelProperty(name = "课程名称", width = 20, index = 1)
+    @ExcelProperty(name = "课程代码", width = 20, index = 1)
     private String courseCode;
 
     @ExcelProperty(name = "课程名称", width = 20, index = 2)
@@ -24,7 +24,7 @@ public class MarkerInfoDto {
     @ExcelProperty(name = "大题名称", width = 20, index = 6)
     private String questionName;
 
-    @ExcelProperty(name = "分组总分", width = 20, index = 7)
+    @ExcelProperty(name = "小题满分", width = 20, index = 7)
     private Double totalScore;
 
     @ExcelProperty(name = "登录名", width = 20, index = 8)

+ 1 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java

@@ -1,7 +1,6 @@
 package com.qmth.teachcloud.mark.mapper;
 
 import java.util.List;
-import java.util.Set;
 
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkTaskDto;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
@@ -27,7 +26,7 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     IPage<MarkManageDto> listPaperManage(@Param("page") Page<MarkManageDto> page, @Param("examId") Long examId, @Param("openCollegeId") Long openCollegeId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("progressStatus") Boolean progressStatus, @Param("dpr") DataPermissionRule dpr);
 
-    List<MarkerInfoDto> listUserMarkedCount(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
+    List<MarkerInfoDto> listUserMarkedCount(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("dpr") DataPermissionRule dpr);
 
     MarkTask getLastOneByUserIdAndStatus(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("status") String status);
 

+ 2 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -231,7 +231,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         // 更新客观题满分、主观题满分、总分
         this.updateMarkPaperScore(examId, paperNumber);
 
-        // 更新评卷员绑定状态
+        // 更新评卷设置中的状态
+        markPaperService.updateQuestionStatus(examId, paperNumber);
         markPaperService.updateGroupStatus(examId, paperNumber);
         // 命题老师,任课老师,默认为评卷员
         markUserQuestionService.saveDefaultMarker(examId, paperNumber);

+ 3 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -86,7 +86,9 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
 
     @Override
     public void exportMarker(Long examId, Long courseId, String paperNumber, HttpServletResponse response) {
-        List<MarkerInfoDto> markerInfoDtoList = this.baseMapper.listUserMarkedCount(examId, courseId, paperNumber);
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
+        List<MarkerInfoDto> markerInfoDtoList = this.baseMapper.listUserMarkedCount(examId, courseId, paperNumber, dpr);
         for (MarkerInfoDto markerInfoDto : markerInfoDtoList) {
             if (markerInfoDto.getQuestionId() != null) {
                 MarkQuestion markQuestion = markQuestionService.getById(markerInfoDto.getQuestionId());

+ 17 - 0
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -88,6 +88,8 @@
         FROM
             mark_task mt
                 LEFT JOIN
+            mark_paper mp ON mt.exam_id = mp.exam_id AND mt.paper_number = mp.paper_number
+                LEFT JOIN
             basic_course bc ON mt.course_id = bc.id
                 LEFT JOIN
             sys_user su ON mt.user_id = su.id
@@ -99,6 +101,21 @@
             <if test="paperNumber != null and paperNumber != ''">
                 and mt.paper_number = #{paperNumber}
             </if>
+            <if test="dpr != null">
+                <if test="dpr.requestUserId != null">
+                    and mp.user_id = #{dpr.requestUserId}
+                </if>
+                <if test="dpr.courseUserId != null">
+                    AND EXISTS( SELECT 1 FROM (select course_id from teach_course where exam_id = #{examId} and user_id = #{dpr.courseUserId}) tc WHERE tc.course_id = mp.course_id)
+                </if>
+                <if test="dpr.orgIdSet != null">
+                    AND bc.teaching_room_id IN
+                    <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
+                        #{item}
+                    </foreach>
+                </if>
+            </if>
+            and mt.user_id is not null
         </where>
         GROUP BY mt.exam_id , bc.code , bc.name , mt.paper_number , mt.question_id , su.login_name , su.code , su.real_name
     </select>