Browse Source

3.4.4 update-20250331,bug修改

xiaofei 2 months ago
parent
commit
61a61edf92

+ 12 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java

@@ -133,6 +133,10 @@ public class ExamDetail extends BaseEntity implements Serializable {
     @TableField("task_id")
     private Long taskId;
 
+    @ApiModelProperty(value = "考场合并所有文件后的文件路径")
+    @TableField("merge_pdf_path")
+    private String mergePdfPath;
+
     public Long getSchoolId() {
         return schoolId;
     }
@@ -345,8 +349,6 @@ public class ExamDetail extends BaseEntity implements Serializable {
         this.cardAttachmentId = cardAttachmentId;
     }
 
-
-
     public Double getBackupCount() {
         return backupCount;
     }
@@ -362,4 +364,12 @@ public class ExamDetail extends BaseEntity implements Serializable {
     public void setTaskId(Long taskId) {
         this.taskId = taskId;
     }
+
+    public String getMergePdfPath() {
+        return mergePdfPath;
+    }
+
+    public void setMergePdfPath(String mergePdfPath) {
+        this.mergePdfPath = mergePdfPath;
+    }
 }

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java

@@ -196,4 +196,6 @@ public interface ExamDetailService extends IService<ExamDetail> {
     int countByPrintPlanId(String printPlanId);
 
     void updateTotalSubjects(Long id, int totalSubjects);
+
+    void updateMergePdfPath(Long id, String toJSONString);
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1172,4 +1173,12 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
                 .eq(ExamDetail::getId, id);
         this.update(updateWrapper);
     }
+
+    @Override
+    public void updateMergePdfPath(Long id, String mergePdfPath) {
+        UpdateWrapper<ExamDetail> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(ExamDetail::getMergePdfPath, mergePdfPath)
+                .eq(ExamDetail::getId, id);
+        this.update(updateWrapper);
+    }
 }

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintFinishServiceImpl.java

@@ -259,6 +259,7 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                 List<String> markQuestionListString = markQuestionList.stream().map(m -> SystemConstant.mergeString("#", m.getMainNumber(), m.getSubNumber(), m.getQuestionType())).collect(Collectors.toList());
                 if (!CollectionUtils.isEqualCollection(structListString, markQuestionListString)) {
                     markQuestionService.deleteByExamIdAndPaperNumber(examId, paperNumber);
+                    markUserQuestionService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, null);
                     markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
                 }
             }

+ 76 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/PdfTaskLogicServiceImpl.java

@@ -18,6 +18,7 @@ import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
+import com.qmth.teachcloud.common.bean.vo.PrintPathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicCourse;
@@ -39,6 +40,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -149,6 +152,8 @@ public class PdfTaskLogicServiceImpl implements PdfTaskLogicService {
             // 更新文件路径、更新考场状态、印刷计划状态
             createPdfUtil.mergePdfSaveDb(dirNamePaper, dirNameCardA3, tbTaskPdf);
             SystemConstant.addSummary(stringJoinerSummary, "上传PDF文件并更新状态完成");
+            // 合并考场内所有文件
+            mergeExamDetailPdf(tbTaskPdf.getId());
         } catch (Exception e) {
             examDetailStatusEnum = ExamDetailStatusEnum.NEW;
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
@@ -160,6 +165,77 @@ public class PdfTaskLogicServiceImpl implements PdfTaskLogicService {
 
     }
 
+    private void mergeExamDetailPdf(Long id) {
+        ExamDetail examDetail = examDetailService.getById(id);
+        if (examDetail != null) {
+            List<InputStream> inputStreamList = new ArrayList<>();
+            String attachmentPath = examDetail.getAttachmentPath();
+            if (StringUtils.isNotBlank(attachmentPath)) {
+                JSONObject jsonObject = JSONObject.parseObject(attachmentPath);
+                List<PrintPathVo> pathList = JSONObject.parseArray(jsonObject.getString("path"), PrintPathVo.class);
+                for (PrintPathVo printPathVo : pathList) {
+                    InputStream inputStream = fileUploadService.downloadFile(printPathVo.getPdfPath(), printPathVo.getUploadType(), printPathVo.getType());
+                    if (inputStream == null) {
+                        throw ExceptionResultEnum.ERROR.exception("读取印品文件失败:" + printPathVo.getPdfPath());
+                    }
+                    inputStream = PdfUtil.addPdfEmptyPageForWholePdf(inputStream);
+                    inputStreamList.add(inputStream);
+                }
+            }
+
+            // 试卷(试卷+备用试卷)
+            Long attachmentId = examDetail.getAttachmentId();
+            if (attachmentId != null) {
+                BasicAttachment basicAttachment = basicAttachmentService.getById(attachmentId);
+                if (basicAttachment == null) {
+                    throw ExceptionResultEnum.ERROR.exception("未找到试卷,附件ID:" + attachmentId);
+                }
+                if (StringUtils.isNotBlank(basicAttachment.getPath())) {
+                    FilePathVo filePathVo = JSON.parseObject(basicAttachment.getPath(), FilePathVo.class);
+                    InputStream inputStream = fileUploadService.downloadFile(filePathVo.getPath(), filePathVo.getUploadType(), filePathVo.getType());
+                    if (inputStream == null) {
+                        throw ExceptionResultEnum.ERROR.exception("读取试卷文件失败:" + filePathVo.getPath());
+                    }
+                    inputStreamList.add(inputStream);
+                }
+            }
+
+            // 题卡(题卡+备用题卡)
+            Long cardAttachmentId = examDetail.getCardAttachmentId();
+            if (cardAttachmentId != null) {
+                BasicAttachment basicAttachment = basicAttachmentService.getById(cardAttachmentId);
+                if (basicAttachment == null) {
+                    throw ExceptionResultEnum.ERROR.exception("未找到题卡,附件ID:" + cardAttachmentId);
+                }
+                if (StringUtils.isNotBlank(basicAttachment.getPath())) {
+                    FilePathVo filePathVo = JSON.parseObject(basicAttachment.getPath(), FilePathVo.class);
+                    InputStream inputStream = fileUploadService.downloadFile(filePathVo.getPath(), filePathVo.getUploadType(), filePathVo.getType());
+                    if (inputStream == null) {
+                        throw ExceptionResultEnum.ERROR.exception("读取题卡文件失败:" + filePathVo.getPath());
+                    }
+                    inputStreamList.add(inputStream);
+                }
+            }
+            File pdfFileTemp = null;
+            try {
+                pdfFileTemp = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
+                String mergePdf = PdfUtil.mergeWholePdf(inputStreamList, pdfFileTemp.getAbsolutePath());
+                if (StringUtils.isNotBlank(mergePdf)) {
+                    File localPaperPdfFile = new File(FileUtil.replaceSplit(mergePdf));
+                    String uploadFileName = PdfUtil.md5FileName(CreatePdfTypeEnum.ALL.name() + examDetail.getId()) + SystemConstant.PDF_PREFIX;
+                    FilePathVo filePathVo = fileUploadService.uploadFile(localPaperPdfFile, UploadFileEnum.PDF, uploadFileName);
+                    examDetailService.updateMergePdfPath(id, JSON.toJSONString(filePathVo));
+                }
+            } catch (IOException e) {
+                throw ExceptionResultEnum.ERROR.exception("合并pdf失败");
+            } finally {
+                if (pdfFileTemp != null) {
+                    pdfFileTemp.delete();
+                }
+            }
+        }
+    }
+
     private void updatePdfDataStatus(TBTaskPdf tbTaskPdf) {
         //查询printPlan
         ExamPrintPlan examPrintPlan = examPrintPlanService.getById(tbTaskPdf.getPrintPlanId());

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -25,6 +25,7 @@ import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
 import com.qmth.teachcloud.common.bean.dto.excel.export.SysUserErrorExportDto;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.bean.result.DictionaryResult;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.bean.vo.PrintPathVo;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -214,6 +215,16 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                             }
                         }
                     }
+
+                    //考场所有文件合并的大pdf文件
+                    if (Objects.nonNull(e.getMergePdfPath())) {
+                        FilePathVo pathVo = JSON.parseObject(e.getMergePdfPath(), FilePathVo.class);
+                        String fileName = dirPath + PdfTypeEnum.MERGE_PDF.getTitle() + SystemConstant.PDF_PREFIX;
+                        File mergeFile = fileUploadService.downloadFile(pathVo.getType(), pathVo.getUploadType(), pathVo.getPath(), fileName);
+                        if (Objects.nonNull(mergeFile)) {
+                            sourceFileList.add(mergeFile);
+                        }
+                    }
                 }
                 if (!CollectionUtils.isEmpty(sourceFileList)) {
                     boolean oss = dictionaryConfig.sysDomain().isOss();

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

@@ -0,0 +1,25 @@
+USE teachcloud_db;
+
+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.3');
+
+
+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 = '考生归档数据表';

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

@@ -0,0 +1,381 @@
+USE teachcloud_db;
+
+ALTER TABLE `mark_task` RENAME TO  `mark_task_3.4.3` ;
+CREATE TABLE `mark_task`  (
+       `id` bigint NOT NULL COMMENT '主键',
+       `exam_id` bigint NOT NULL COMMENT '考试ID',
+       `course_id` bigint NULL DEFAULT NULL COMMENT '课程ID(basic_course表ID)',
+       `course_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '课程代码',
+       `course_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '课程名称',
+       `paper_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '试卷编号',
+       `question_id` bigint NULL DEFAULT NULL COMMENT '题目ID',
+       `main_number` int NULL DEFAULT NULL COMMENT '大题号',
+       `sub_number` int NULL DEFAULT NULL COMMENT '小题号',
+       `group_number` int NULL DEFAULT NULL COMMENT '大题号',
+       `student_id` bigint NOT NULL COMMENT '考生ID',
+       `basic_student_id` bigint NULL DEFAULT NULL COMMENT '考生管理ID',
+       `student_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学号',
+       `secret_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '考生密号',
+       `task_number` int NOT NULL COMMENT '多评任务序号',
+       `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态',
+       `user_id` bigint NULL DEFAULT NULL COMMENT '评卷员ID',
+       `marker_time` bigint NULL DEFAULT NULL COMMENT '评卷时间',
+       `marker_score` double NULL DEFAULT NULL COMMENT '评卷总分',
+       `marker_score_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '评卷给分明细',
+       `marker_track_list` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '评卷分数轨迹',
+       `marker_tag_list` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '评卷特殊标记',
+       `marker_spent` int NULL DEFAULT NULL COMMENT '评卷时长',
+       `header_id` bigint NULL DEFAULT NULL COMMENT '科组长ID',
+       `header_time` bigint NULL DEFAULT NULL COMMENT '科组长评卷时间',
+       `header_score` double NULL DEFAULT NULL COMMENT '科组长总分',
+       `header_score_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '科组长给分明细',
+       `header_track_list` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '复核轨迹',
+       `header_tag_list` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '复核特殊标记',
+       `reject_reason` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '打回原因',
+       PRIMARY KEY (`id`) USING BTREE,
+       UNIQUE INDEX `index2`(`student_id` ASC, `group_number` ASC, `task_number` ASC) USING BTREE,
+       INDEX `index3`(`user_id` ASC, `status` ASC, `marker_time` ASC) USING BTREE,
+       INDEX `index1`(`exam_id` ASC, `paper_number` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评卷任务表' ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `mark_question` RENAME TO  `mark_question_3.4.3` ;
+CREATE TABLE `mark_question`  (
+           `id` bigint NOT NULL COMMENT '主键',
+           `exam_id` bigint NOT NULL COMMENT '考试ID',
+           `course_id` bigint NULL DEFAULT NULL COMMENT '课程ID',
+           `paper_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '试卷类型',
+           `paper_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '卷型',
+           `objective` tinyint NOT NULL COMMENT '是否客观题',
+           `group_number` int NULL DEFAULT NULL COMMENT '分组序号',
+           `main_number` int NOT NULL COMMENT '大题号',
+           `sub_number` int NOT NULL COMMENT '小题号',
+           `main_title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '大题名称',
+           `answer` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '正确答案',
+           `total_score` double NULL DEFAULT NULL COMMENT '满分',
+           `option_count` int NULL DEFAULT NULL COMMENT '客观题答案数量',
+           `interval_score` double NULL DEFAULT NULL COMMENT '评卷间隔分',
+           `objective_policy` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客观题判分策略',
+           `question_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '题型',
+           `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+           `paper_index` int NULL DEFAULT NULL,
+           `page_index` int NULL DEFAULT NULL,
+           `objective_policy_score` double NULL DEFAULT NULL COMMENT '客观题判分策略计分',
+           `create_id` bigint NULL DEFAULT NULL,
+           `create_time` bigint NULL DEFAULT NULL,
+           `update_id` bigint NULL DEFAULT NULL,
+           `update_time` bigint NULL DEFAULT NULL,
+           `pic_list` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '评卷区坐标',
+           `double_rate` double NULL DEFAULT NULL COMMENT '双评比例',
+           `arbitrate_threshold` double NULL DEFAULT NULL COMMENT '仲裁阈值',
+           `score_policy` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '合分策略',
+           `task_count` int NULL DEFAULT 0 COMMENT '任务总量',
+           `marked_count` int NULL DEFAULT 0 COMMENT '已评数量',
+           `left_count` int NULL DEFAULT NULL COMMENT '剩余数量',
+           PRIMARY KEY (`id`) USING BTREE,
+           INDEX `index_1`(`exam_id` ASC, `paper_number` ASC, `main_number` ASC, `sub_number` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '小题信息表' ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `mark_user_question` RENAME TO  `mark_user_question_3.4.3` ;
+CREATE TABLE `mark_user_question`  (
+           `id` bigint NOT NULL COMMENT '主键',
+           `exam_id` bigint NOT NULL COMMENT '考试ID',
+           `paper_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '试卷编号',
+           `question_id` bigint NULL DEFAULT NULL COMMENT '题目ID',
+           `group_number` int NULL DEFAULT NULL COMMENT '分组编号',
+           `user_id` bigint NOT NULL COMMENT '用户ID',
+           `mode` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '强制评卷模式',
+           `top_count` int NULL DEFAULT NULL COMMENT '评卷数上限',
+           `finish_count` int NULL DEFAULT NULL COMMENT '完成数量',
+           `header_finish_count` int NULL DEFAULT NULL COMMENT '管理员直接打分数量',
+           `valid_count` int NULL DEFAULT NULL COMMENT '有效数量',
+           `avg_score` double NULL DEFAULT NULL COMMENT '平均分',
+           `avg_speed` double NULL DEFAULT NULL COMMENT '平均时长',
+           `stdev_score` double NULL DEFAULT NULL COMMENT '标准差',
+           `max_score` double NULL DEFAULT NULL COMMENT '最高分',
+           `min_score` double NULL DEFAULT NULL COMMENT '最低分',
+           `reject_count` int NULL DEFAULT NULL COMMENT '打回次数',
+           `enable` tinyint(1) NULL DEFAULT 1 COMMENT '是否启用',
+           PRIMARY KEY (`id`) USING BTREE,
+           INDEX `index2`(`exam_id` ASC, `paper_number` ASC, `group_number` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '评卷员表' ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `mark_subjective_score` RENAME TO  `mark_subjective_score_3.4.3` ;
+CREATE TABLE `mark_subjective_score`  (
+           `student_id` bigint NOT NULL COMMENT '考生ID',
+           `main_number` int NOT NULL COMMENT '大题号',
+           `sub_number` int NOT NULL COMMENT '小题号',
+           `exam_id` bigint NOT NULL COMMENT '考试ID',
+           `paper_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程代码',
+           `question_id` bigint NULL DEFAULT NULL COMMENT '题目ID',
+           `group_number` int NULL DEFAULT NULL COMMENT '分组序号',
+           `group_score` double NULL DEFAULT NULL COMMENT '分组得分',
+           `main_score` double NOT NULL COMMENT '大题得分',
+           `score` double NOT NULL COMMENT '小题得分',
+           `uncalculate` tinyint(1) NULL DEFAULT NULL COMMENT '是否合分',
+           `rejected` tinyint(1) NULL DEFAULT 0 COMMENT '是否打回',
+           PRIMARY KEY (`student_id`, `main_number`, `sub_number`) USING BTREE,
+           INDEX `index1`(`exam_id` ASC, `paper_number` ASC, `main_number` ASC, `main_score` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '主观题得分明细表' ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `mark_problem_history` RENAME TO  `mark_problem_history_3.4.3` ;
+CREATE TABLE `mark_problem_history`  (
+           `id` bigint NOT NULL COMMENT '自增主键',
+           `exam_id` bigint NOT NULL COMMENT '考试ID',
+           `paper_number` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '试卷编号',
+           `question_id` bigint NULL DEFAULT NULL COMMENT '题目ID',
+           `group_number` int NULL DEFAULT NULL COMMENT '大题号',
+           `student_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学号',
+           `secret_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '考生密号',
+           `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '问题类型',
+           `student_id` bigint NOT NULL COMMENT '考生ID',
+           `task_id` bigint NOT NULL COMMENT '评卷任务ID',
+           `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态',
+           `update_user_id` bigint NULL DEFAULT NULL COMMENT '处理人ID',
+           `user_id` bigint NULL DEFAULT NULL COMMENT '评卷员ID',
+           `score_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '给分明细',
+           `create_time` bigint NOT NULL COMMENT '创建时间',
+           `update_time` bigint NULL DEFAULT NULL COMMENT '处理时间',
+           `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '问题原因',
+           PRIMARY KEY (`id`) USING BTREE,
+           INDEX `index2`(`update_user_id` ASC, `status` ASC, `update_time` ASC) USING BTREE,
+           INDEX `index3`(`student_id` ASC, `status` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '问题卷历史表' ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `mark_arbitrate_history` RENAME TO  `mark_arbitrate_history_3.4.3` ;
+CREATE TABLE `mark_arbitrate_history`  (
+           `id` bigint NOT NULL COMMENT '自增主键',
+           `exam_id` bigint NOT NULL COMMENT '考试ID',
+           `paper_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '试卷编号',
+           `question_id` bigint NULL DEFAULT NULL COMMENT '题目ID',
+           `group_number` int NULL DEFAULT NULL COMMENT '大题号',
+           `student_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '准考证号',
+           `secret_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '考生密号',
+           `student_id` bigint NOT NULL COMMENT '考生ID',
+           `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态',
+           `update_user_id` bigint NULL DEFAULT NULL COMMENT '处理人ID',
+           `total_score` double NULL DEFAULT NULL COMMENT '总分',
+           `score_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '给分明细',
+           `create_time` bigint NOT NULL COMMENT '创建时间',
+           `update_time` bigint NULL DEFAULT NULL COMMENT '处理时间',
+           PRIMARY KEY (`id`) USING BTREE,
+           INDEX `index1`(`exam_id` ASC, `paper_number` ASC, `group_number` ASC, `status` ASC) USING BTREE,
+           INDEX `index3`(`student_id` ASC, `status` ASC) USING BTREE,
+           INDEX `index2`(`update_user_id` ASC, `status` ASC, `update_time` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '仲裁记录表' ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `mark_reject_history` RENAME TO  `mark_reject_history_3.4.3` ;
+CREATE TABLE `mark_reject_history`  (
+           `id` bigint NOT NULL,
+           `exam_id` bigint NULL DEFAULT NULL COMMENT '考试ID',
+           `paper_number` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '试卷编号',
+           `question_id` bigint NULL DEFAULT NULL COMMENT '题目ID',
+           `group_number` int NULL DEFAULT NULL COMMENT '分组号',
+           `task_id` bigint NULL DEFAULT NULL COMMENT '任务ID',
+           `student_id` bigint NULL DEFAULT NULL COMMENT '考生ID',
+           `basic_student_id` bigint NULL DEFAULT NULL COMMENT 'basic_exam_student表id',
+           `student_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学号',
+           `secret_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务密号',
+           `user_id` bigint NULL DEFAULT NULL COMMENT '评卷用户ID',
+           `reject_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '打回原因',
+           `reject_score_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '打回后分数列表',
+           `marker_score_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '打回前分数列表',
+           `marker_score` double NULL DEFAULT NULL COMMENT '总分',
+           `marker_time` bigint NULL DEFAULT NULL COMMENT '评卷时间',
+           `reject_user_id` bigint NULL DEFAULT NULL COMMENT '打回用户ID',
+           `reject_time` bigint NOT NULL COMMENT '打回时间',
+           PRIMARY KEY (`id`) USING BTREE,
+           INDEX `index2`(`task_id` ASC) USING BTREE,
+           INDEX `index1`(`exam_id` ASC, `paper_number` ASC, `group_number` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
+
+ALTER TABLE `basic_exam_student`
+    ADD COLUMN `exam_date` VARCHAR(20) NULL COMMENT '考试日期' AFTER `exam_end_time`,
+ADD COLUMN `exam_time` VARCHAR(20) NULL COMMENT '考试时间' AFTER `exam_date`;
+
+update basic_exam_student set exam_date = DATE_FORMAT(FROM_UNIXTIME(exam_start_time/1000), '%Y-%m-%d') where exam_start_time is not null and exam_date is null;
+update basic_exam_student set exam_time = concat(DATE_FORMAT(FROM_UNIXTIME(exam_start_time/1000), '%H:%i'),'-',DATE_FORMAT(FROM_UNIXTIME(exam_end_time/1000), '%H:%i')) where exam_start_time is not null and exam_time is null;
+
+ALTER TABLE `exam_detail`
+    ADD COLUMN `exam_date` VARCHAR(20) NULL COMMENT '考试日期' AFTER `exam_end_time`,
+ADD COLUMN `exam_time` VARCHAR(20) NULL COMMENT '考试时间' AFTER `exam_date`;
+
+update exam_detail set exam_date = DATE_FORMAT(FROM_UNIXTIME(exam_start_time/1000), '%Y-%m-%d') where exam_start_time is not null and exam_date is null;
+update exam_detail set exam_time = concat(DATE_FORMAT(FROM_UNIXTIME(exam_start_time/1000), '%H:%i'),'-',DATE_FORMAT(FROM_UNIXTIME(exam_end_time/1000), '%H:%i')) where exam_start_time is not null and exam_time is null;
+
+ALTER TABLE `sys_user_role` ADD INDEX `idx_1` (`role_id` ASC, `user_id` ASC);
+ALTER TABLE `t_f_flow_log` DROP INDEX `flow_log_idx` , ADD INDEX `flow_log_idx` USING BTREE (`flow_id`);
+ALTER TABLE `exam_task` ADD INDEX `idx_1` (`flow_id` ASC);
+
+ALTER TABLE `mark_paper`
+    ADD COLUMN `merge_marker` TINYINT(1) NULL DEFAULT '1' COMMENT '填空题是否合并设置评卷员' AFTER `double_mark`,
+CHANGE COLUMN `open_double_marking` `double_mark` TINYINT(1) NULL DEFAULT '0' COMMENT '是否开启双评:true-开启,false-关闭' ;
+
+CREATE TABLE `mark_user_paper` (
+               `id` BIGINT(20) NOT NULL,
+               `exam_id` BIGINT(20) NULL,
+               `paper_number` VARCHAR(100) NULL,
+               `user_id` BIGINT(20) NULL COMMENT '用户ID',
+               `question_model` VARCHAR(10) NULL COMMENT '评卷模式(SINGLE:单题阅,MULTI:多题阅)',
+               PRIMARY KEY (`id`))
+    COMMENT = '试卷评卷员设置';
+
+CREATE TABLE `mark_header_history` (
+               `id` BIGINT(20) NOT NULL,
+               `exam_id` BIGINT(20) NULL COMMENT '考试ID',
+               `paper_number` VARCHAR(100) NULL COMMENT '试卷编号',
+               `student_id` BIGINT(20) NULL COMMENT '考生ID',
+               `question_id` BIGINT(20) NULL COMMENT '题目ID',
+               `main_number` INT NULL COMMENT '大题号',
+               `sub_number` INT NULL COMMENT '小题号',
+               `user_id` BIGINT(20) NULL COMMENT '用户ID',
+               `score` DOUBLE NULL COMMENT '分数',
+               `track_list` MEDIUMTEXT NULL COMMENT '轨迹',
+               `original_score` DOUBLE NULL COMMENT '原分数',
+               `original_track_list` MEDIUMTEXT NULL COMMENT '原轨迹',
+               `create_time` BIGINT(20) NULL COMMENT '创建时间',
+               PRIMARY KEY (`id`))
+    COMMENT = '复核历史表';
+
+ALTER TABLE `mark_user_paper` ADD COLUMN `mode` VARCHAR(45) NULL COMMENT '阅卷模式' AFTER `question_model`;
+ALTER TABLE `mark_paper` CHANGE COLUMN `open_mark_class` `class_mark` TINYINT NULL DEFAULT '0' COMMENT '是否开启分班阅' AFTER `paper_type`;
+
+drop table if exists t_s_job_log;
+UPDATE `sys_privilege` SET `url` = '/api/admin/mark/question/subjective/list' WHERE (`id` = '904');
+UPDATE `sys_privilege` SET `related` = '672,902,903,904,905,906,907,908,909,910,911,912,913,962,963,965,1132,1133' WHERE (`id` = '901');
+UPDATE `sys_privilege` SET `name` = '单双评设置', `url` = '/api/admin/mark/question/subjective/double/mark/update' WHERE (`id` = '905');
+UPDATE `sys_privilege` SET `url` = '/api/admin/mark/question/subjective/picture/config/update' WHERE (`id` = '962');
+UPDATE `sys_privilege` SET `url` = '/api/admin/mark/class/update' WHERE (`id` = '963');
+UPDATE `sys_privilege` SET `url` = '/api/admin/mark/question/subjective/summary' WHERE (`id` = '928');
+UPDATE `sys_privilege` SET `url` = '/api/admin/mark/question/subjective/class/summary' WHERE (`id` = '964');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1012', '评阅题目列表', '/api/admin/mark/question/subjective/number/list', 'URL', '917', '28', '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' WHERE (`id` = '944');
+
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1189, '版本管理列表', '/api/admin/version/list', 'URL', 1, 18, 'SYS', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1190, '版本管理新增/修改', '/api/admin/version/save', 'URL', 1, 18, 'SYS', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1191, '版本管理编辑', '/api/admin/version/edit', 'URL', 1, 18, 'SYS', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1192, '版本管理删除', '/api/admin/version/delete', 'URL', 1, 18, 'SYS', NULL, 1, 1, 1);
+
+DROP TABLE IF EXISTS `t_b_version`;
+CREATE TABLE `t_b_version` (
+               `id` bigint NOT NULL COMMENT '主键',
+               `soft_version` varchar(200) NOT NULL COMMENT '服务端版本',
+               `client_version` varchar(100) NOT NULL COMMENT '客户端版本',
+               `create_id` bigint DEFAULT NULL COMMENT '创建人id',
+               `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+               `update_id` bigint DEFAULT NULL COMMENT '更新人id',
+               `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+               PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='版本管理表';
+
+UPDATE `sys_privilege` SET `name` = '评卷参数设置步骤状态', `url` = '/api/admin/mark/question/subjective/step/status' WHERE (`id` = '906');
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1193, '课程任课老师导入', '/api/admin/basic/course/import', 'URL', 13, 1, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1194, '课程任课老师导入', 'AssginCourseUserImport', 'BUTTON', 576, 7, 'AUTH', '1193', 1, 0, 1);
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1013', '新增考生', '/api/scan/student/save', 'URL', '970', '44', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1014', '复制卡格式', '/api/scan/answer/card/copy', 'URL', '970', '45', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1013,1014,1148,3072,3073,3074,3075' WHERE (`id` = '970');
+UPDATE sys_config SET school_id=NULL, org_id=NULL, config_key='attachment.type', config_name='附件类型', config_value='[.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml,.ttf,.otf,.pfm,.woff,.svg,.eot]', remark=NULL, enable=1, sort=1, create_id=1, create_time=NULL, update_id=NULL, update_time=NULL WHERE id=10;
+
+ALTER TABLE `basic_print_config` ADD COLUMN `default_serial_number` INT(2) NULL DEFAULT 0 COMMENT '默认抽取卷型(0-随机,1-卷1,2-卷2)' AFTER `draw_rule`;
+
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1195, '字体查询', '/api/admin/set/font/select', 'URL', 508, 21, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1196, '字体保存', '/api/admin/set/font/save', 'URL', 508, 21, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1197, '字体修改', '/api/admin/set/font/update', 'URL', 508, 21, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1198, '字体删除', '/api/admin/set/font/delete', 'URL', 508, 21, 'AUTH', NULL, 1, 0, 1);
+
+ALTER TABLE mark_student ADD version INTEGER DEFAULT 1 COMMENT '版本号' NOT NULL after miss_scan;
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1015', '获取识别对照任务', '/api/scan/task/omr/getTask', 'URL', '970', '44', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1013,1014,1015,1148,3072,3073,3074,3075' WHERE (`id` = '970');
+INSERT INTO sys_config(id, school_id, org_id, config_key, config_name, config_value, remark, enable, sort, create_id, create_time, update_id, update_time) VALUES(51, NULL, NULL, 'mark.score.calculate.job.db.limit', '统分查询考生条数', 'limit 0,500', NULL, 1, 20, 1, NULL, NULL, NULL);
+
+CREATE TABLE IF NOT EXISTS `exam_card_model_four` (
+        `id` bigint NOT NULL COMMENT '主键',
+        `school_id` bigint NOT NULL COMMENT '学校id',
+        `org_id` bigint DEFAULT NULL COMMENT '机构id',
+        `exam_id` bigint DEFAULT NULL COMMENT '考试id',
+        `course_id` bigint DEFAULT NULL COMMENT '课程ID(basic_course表ID)',
+        `title` varchar(200) NOT NULL COMMENT '标题',
+        `status` varchar(45) DEFAULT NULL COMMENT 'STAGE-暂存,SUBMIT-提交',
+        `content` mediumtext COMMENT '题卡工具制作题卡内容',
+        `stage_content` mediumtext COMMENT '暂存内容(提交后置空)',
+        `html_content` mediumtext COMMENT 'html格式内容',
+        `enable` tinyint(1) DEFAULT '1' COMMENT '1正常,0禁用',
+        `card_rule_id` bigint DEFAULT NULL COMMENT '题卡规则Id',
+        `jpg_attachment` text COMMENT '题卡转换成的jpg文件信息',
+        `create_id` bigint DEFAULT NULL COMMENT '创建人',
+        `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+        `update_id` bigint DEFAULT NULL COMMENT '更新人',
+        `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+        `page_size` varchar(10) DEFAULT NULL COMMENT '题卡纸张大小(A3,8K)',
+        `remark` mediumtext COMMENT '备注',
+        PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='模式4题卡';
+
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1199, '答题卡管理', 'CardModel4Manage', 'MENU', 3, 4, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1200, '查询', 'Select', 'BUTTON', 1199, 1, 'AUTH', '1209', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1201, '新增题卡', 'Add', 'BUTTON', 1199, 2, 'AUTH', '1210', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1202, '批量下载', 'BatchDownload', 'BUTTON', 1199, 3, 'AUTH', '1214', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1203, '查询条件', 'Condition', 'CONDITION', 1199, 4, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1204, '查看', 'Preview', 'LINK', 1199, 1, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1205, '生成图片/预览图片', 'ConvertImage', 'LINK', 1199, 2, 'AUTH', '1212', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1206, '编辑题卡/编辑信息', 'Edit', 'LINK', 1199, 3, 'AUTH', '1210', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1207, '下载', 'Download', 'LINK', 1199, 4, 'AUTH', '1213', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1208, '删除', 'Delete', 'LINK', 1199, 5, 'AUTH', '1211', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1209, '查询', '/api/admin/exam/model_4/card/page', 'URL', 1199, 1, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1210, '新增/修改', '/api/admin/exam/model_4/card/save_generic', 'URL', 1199, 2, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1211, '删除', '/api/admin/exam/model_4/card/delete_generic', 'URL', 1199, 3, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1212, '生成图片', '/api/admin/exam/model_4/card/convert_image', 'URL', 1199, 4, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1213, '下载', '/api/admin/exam/model_4/card/download_card', 'URL', 1199, 5, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1214, '批量下载', '/api/admin/exam/model_4/card/batch_download_card', 'URL', 1199, 6, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1215, '列表', 'List', 'LIST', 1199, 5, 'AUTH', '1209', 1, 0, 1);
+INSERT INTO sys_privilege(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(1216, '查看', '/api/admin/exam/model_4/card/get_one', 'URL', 1199, 7, 'AUTH', NULL, 1, 1, 1);
+UPDATE sys_privilege SET name='查看', url='Preview', `type`='LINK', parent_id=1199, `sequence`=1, property='AUTH', related='1216', enable=1, default_auth=0, front_display=1 WHERE id=1204;
+UPDATE sys_privilege SET name='答题卡管理', url='ModeCardManage', `type`='MENU', parent_id=3, `sequence`=4, property='AUTH', related=NULL, enable=1, default_auth=0, front_display=1 WHERE id=1199;
+INSERT INTO sys_config(id, school_id, org_id, config_key, config_name, config_value, remark, enable, sort, create_id, create_time, update_id, update_time) VALUES(52, NULL, NULL, 'sms.mark.task.create.code', '阅卷待办短信通知', 'SMS_480165252', NULL, 1, 21, 1, 1733878447209, NULL, 1733878447249);
+
+ALTER TABLE `basic_print_config` ADD COLUMN `two_paper_enable` TINYINT(1) NULL DEFAULT 0 COMMENT '是否提交两套卷子(0-否,1-是)' AFTER `output_file_type`;
+
+UPDATE sys_privilege SET name='课程任课老师导入', url='/api/admin/teach/course/import', `type`='URL', parent_id=13, `sequence`=1, property='AUTH', related=NULL, enable=1, default_auth=1, front_display=1 WHERE id=1193;
+
+ALTER TABLE `mark_paper` ADD INDEX `index3` (`status` ASC, `upload_count` ASC);
+
+ALTER TABLE `mark_student` ADD INDEX `index7` (`subjective_status` ASC);
+ALTER TABLE `mark_user_paper` ADD INDEX `index1` (`exam_id` ASC, `paper_number` ASC, `user_id` ASC);
+ALTER TABLE `mark_user_paper` ADD COLUMN `marked_question_id` BIGINT(20) NULL COMMENT '正在阅卷的题目ID' AFTER `mode`;
+ALTER TABLE teach_course DROP KEY teach_course_unique;
+ALTER TABLE teach_course ADD CONSTRAINT teach_course_unique UNIQUE KEY (school_id,exam_id,course_id,user_id);
+ALTER TABLE `mark_student` ADD COLUMN `teach_class_name` VARCHAR(100) NULL COMMENT '教学班' AFTER `exam_room`;
+
+INSERT INTO sys_privilege(id, name, url, parent_id, `type`, `sequence`, property, related, enable, default_auth, front_display) VALUES(1300, '获取评卷区', '/api/admin/mark/inspected/get_mark_area', 946, 'URL', 9, 'AUTH', NULL, 1, 1, 1);
+UPDATE sys_privilege SET name='成绩检查', url='ScoreCheck', `type`='MENU', parent_id=486, `sequence`=4, property='AUTH', related='1300', enable=1, default_auth=0, front_display=1 WHERE id=946;
+
+ALTER TABLE t_b_version ADD CONSTRAINT t_b_version_unique UNIQUE KEY (client_version);
+ALTER TABLE exam_card_model_four ADD CONSTRAINT exam_card_model_four_unique UNIQUE KEY (exam_id,course_id);
+ALTER TABLE `mark_task` CHANGE COLUMN `group_number` `group_number` INT NULL COMMENT '大题号' ;
+
+update basic_print_config set default_serial_number = 0 where default_serial_number is null;
+update basic_print_config set two_paper_enable = 0 where two_paper_enable is null;
+update mark_paper set merge_marker = 1 where merge_marker is null;
+update mark_paper set double_mark = 0 where double_mark is null;
+update mark_student set version = 1 where version is null;
+update mark_student ms left join basic_exam_student bes on ms.basic_student_id = bes.id set ms.teach_class_name = bes.teach_class_name where ms.teach_class_name is null;
+
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1217', '课程唯一性校验', '/api/admin/exam/model_4/card/valid_course', 'URL', '1199', '8', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '1210,1217' WHERE (`id` = '1201');
+UPDATE `sys_privilege` SET `related` = '1210,1217' WHERE (`id` = '1206');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1218', '复核记录导出', 'ExportScoreHistory', 'BUTTON', '946', '14', 'AUTH', '1219', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1219', '复核记录导出', '/api/admin/mark/archive/score/history/export', 'URL', '946', '14', 'AUTH', '1', '1', '1');
+ALTER TABLE `basic_template` ADD COLUMN `convert_a3` TINYINT(1) NULL DEFAULT 0 COMMENT '是否转换成A3' AFTER `font_size`;
+
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1220', '全卷轨迹信息', '/api/admin/mark/archive/student/question/track', 'URL', '487', '4', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '490,543,955,959,1139,1220' WHERE (`id` = '488');
+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');
+UPDATE `sys_config` SET `config_value` = '[{"name":"A3","size":"297*420"}, {"name":"8K","size":"270*390"}]' WHERE (`id` = '43');
+
+ALTER TABLE `exam_detail` ADD COLUMN `merge_pdf_path` VARCHAR(2000) NULL COMMENT '考场合并所有文件后的文件路径' AFTER `update_time`;

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

@@ -369,3 +369,5 @@ UPDATE `sys_privilege` SET `related` = '928,929,932,933,934,935,936,937,938,939,
 
 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');
 UPDATE `sys_config` SET `config_value` = '[{"name":"A3","size":"297*420"}, {"name":"8K","size":"270*390"}]' WHERE (`id` = '43');
+
+ALTER TABLE `exam_detail` ADD COLUMN `merge_pdf_path` VARCHAR(2000) NULL COMMENT '考场合并所有文件后的文件路径' AFTER `update_time`;

+ 19 - 6
distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_4_1.java

@@ -53,12 +53,21 @@ public class DataUpgrade_3_4_4_1 implements DataUpgradeService {
     @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);
         // 执行升级脚本
-//        this.execUpgradeSql(jdbcTemplate);
+//        String upgrade_sql1 = upgradePath + File.separator + "3.4.4-upgrade-1.sql";
+//        this.execUpgradeSql(jdbcTemplate, upgrade_sql1);
 
         // 执行历史数据归档
 //        this.execDataArchive(jdbcTemplate);
 
+        // 归档后中间数据重命名,创建新表
+//        String upgrade_sql2 = upgradePath + File.separator + "3.4.4-upgrade-2.sql";
+//        this.execUpgradeSql(jdbcTemplate, upgrade_sql2);
+
     }
 
     private void execDataArchive(JdbcTemplate jdbcTemplate) {
@@ -288,12 +297,16 @@ public class DataUpgrade_3_4_4_1 implements DataUpgradeService {
         return JSON.toJSONString(sheetUrls);
     }
 
-    private void execUpgradeSql(JdbcTemplate jdbcTemplate) {
-        String rootPath = System.getProperty("user.dir");
-        StringJoiner sj = new StringJoiner(File.separator);
-        sj.add(rootPath).add("distributed-print").add("install").add("mysql").add("upgrade").add("3.4.4.sql");
+    private void execUpgradeSql(JdbcTemplate jdbcTemplate, String upgradeSql) {
+        if (StringUtils.isBlank(upgradeSql)) {
+            throw new RuntimeException("没有配置升级sql脚本文件地址");
+        }
+        File file = new File(upgradeSql);
+        if (!file.exists()) {
+            throw new RuntimeException("升级sql脚本文件不存在");
+        }
         try {
-            FileInputStream inputStream = new FileInputStream(sj.toString());
+            FileInputStream inputStream = new FileInputStream(upgradeSql);
             String[] sqlList = StringUtils.split(ResourceFileHelper.readContent(inputStream), ";");
             Arrays.stream(sqlList).filter(StringUtils::isNotBlank).forEach(sql -> {
                 log.info(sql);

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

@@ -14,7 +14,8 @@ public enum PdfTypeEnum {
     CARD_A3("题卡A3合并文件", "题卡"),
     PACKAGE("卷袋贴文件", "卷袋贴"),
     SIGN("签到表文件", "签到表"),
-    CHECK_IN("登记表文件", "考试情况登记表");
+    CHECK_IN("登记表文件", "考试情况登记表"),
+    MERGE_PDF("考场合并文件", "考场合并文件");
 
     PdfTypeEnum(String desc, String title) {
         this.desc = desc;

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -75,7 +75,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     @Override
     public BasicCourse findByCourseCode(String courseCode, Long schoolId) {
         BasicCourse basicCourse = this.getOne(
-                new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getCode, courseCode).eq(BasicCourse::getSchoolId, schoolId));
+                new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getCode, courseCode.trim()).eq(BasicCourse::getSchoolId, schoolId));
         if (Objects.isNull(basicCourse)) {
             throw ExceptionResultEnum.ERROR.exception("未找到课程编号为[" + courseCode + "]的基础课程");
         }

+ 3 - 1
teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml

@@ -20,7 +20,7 @@
         FROM
             mark_user_class muc
                 LEFT JOIN
-            mark_user_question muq ON muc.exam_id = muq.exam_id AND muc.paper_number = muq.paper_number AND muc.user_id = muq.user_id
+            mark_user_question muq ON muc.exam_id = muq.exam_id AND muc.paper_number = muq.paper_number AND muc.user_id = muq.user_id AND muq.enable = true
                 LEFT JOIN
             sys_user su ON muc.user_id = su.id
                 LEFT JOIN
@@ -51,6 +51,8 @@
         FROM
             mark_user_class muc
         <where>
+            exam_id = #{examId}
+            AND paper_number = #{paperNumber}
             <if test="className != null and className != ''">
                 AND muc.class_name = #{className}
             </if>