ソースを参照

3.4.4 update-20250409,bug修改

xiaofei 2 ヶ月 前
コミット
ae0e8903bc
19 ファイル変更240 行追加52 行削除
  1. 6 0
      distributed-print/install/mysql/upgrade/3.4.3.sql
  2. 10 2
      distributed-print/install/mysql/upgrade/3.4.4-upgrade-1.sql
  3. 0 5
      distributed-print/install/mysql/upgrade/3.4.4-upgrade-2.sql
  4. 7 1
      distributed-print/install/mysql/upgrade/3.4.4.sql
  5. 47 5
      distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_4.java
  6. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_5.java
  7. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/TBTaskMapper.java
  8. 2 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TBTaskServiceImpl.java
  9. 3 0
      teachcloud-common/src/main/resources/mapper/TBTaskMapper.xml
  10. 8 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArchiveStudent.java
  11. 51 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArchiveStudentCard.java
  12. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkArchiveStudentCardMapper.java
  13. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArchiveStudentCardService.java
  14. 20 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArchiveStudentCardServiceImpl.java
  15. 7 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  16. 7 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java
  17. 4 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java
  18. 11 0
      teachcloud-mark/src/main/resources/mapper/MarkArchiveStudentCardMapper.xml
  19. 21 24
      teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml

+ 6 - 0
distributed-print/install/mysql/upgrade/3.4.3.sql

@@ -96,4 +96,10 @@ 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`;
 
+ALTER TABLE `mark_paper` ADD INDEX `index3` (`status` ASC, `upload_count` ASC);
+
+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);
+
+
 UPDATE `boot_app_info` SET `app_version` = '3.4.3' WHERE (`app_code` = 'teachcloud');

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

@@ -1,4 +1,5 @@
--- 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 `mark_archive_student`
@@ -11,11 +12,18 @@ CREATE TABLE `mark_archive_student`
     `sheet_urls`           MEDIUMTEXT NULL COMMENT '图片地址',
     `subjective_questions` MEDIUMTEXT NULL,
     `objective_questions`  MEDIUMTEXT NULL,
-    `card_content`         MEDIUMTEXT NULL,
+    `archive_card_id`      VARCHAR(50) NULL,
     `create_time`          BIGINT(20) NULL,
     PRIMARY KEY (`student_id`)
 ) COMMENT = '考生归档数据表';
 
+
+CREATE TABLE `mark_archive_student_card` (
+        `id` VARCHAR(50) NOT NULL,
+        `card_content` MEDIUMTEXT NULL,
+        PRIMARY KEY (`id`));
+
+
 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';
 

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

@@ -75,7 +75,6 @@ CREATE TABLE `mark_question`  (
            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',
@@ -336,13 +335,9 @@ ALTER TABLE `basic_print_config` ADD COLUMN `two_paper_enable` TINYINT(1) NULL D
 
 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);

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

@@ -347,11 +347,17 @@ CREATE TABLE `mark_archive_student` (
            `sheet_urls` MEDIUMTEXT NULL COMMENT '图片地址',
            `subjective_questions` MEDIUMTEXT NULL,
            `objective_questions` MEDIUMTEXT NULL,
-           `card_content` MEDIUMTEXT NULL,
+           `archive_card_id` VARCHAR(50) NULL,
            `create_time` BIGINT(20) NULL,
            PRIMARY KEY (`student_id`))
     COMMENT = '考生归档数据表';
 
+
+CREATE TABLE `mark_archive_student_card` (
+         `id` VARCHAR(50) NOT NULL,
+         `card_content` MEDIUMTEXT NULL,
+         PRIMARY KEY (`id`));
+
 ALTER TABLE `mark_paper` ADD COLUMN `archive` TINYINT(1) NULL DEFAULT 0 COMMENT '是否归档,1-已归档' AFTER `merge_marker`;
 
 -- 2025-03-24

+ 47 - 5
distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_4.java

@@ -21,6 +21,7 @@ import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveAnswerDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
 import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.CardSource;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
@@ -66,7 +67,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
 
 //        log.info("开始处理3.4.3历史数据,数据归档;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
 //         执行历史数据归档
-//        this.execDataArchive(jdbcTemplate);
+        this.execDataArchive(jdbcTemplate);
 //        log.info("结束处理3.4.3历史数据,数据归档;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
 
         // 归档后中间数据重命名,创建新表
@@ -109,7 +110,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
                     markArchiveStudent.setSheetUrls(buildSheetUrls(jdbcTemplate, markStudent));
                     markArchiveStudent.setSubjectiveQuestions(buildSubjectiveQuestions(jdbcTemplate, markStudent, markQuestionList, sysUserMap));
                     markArchiveStudent.setObjectiveQuestions(buildObjectiveQuestions(objectiveQuestionMap, markStudent));
-                    markArchiveStudent.setCardContent(getCardContent(jdbcTemplate, markStudent, basicExam));
+                    markArchiveStudent.setArchiveCardId(getArchiveCardId(jdbcTemplate, markStudent, basicExam));
                     markArchiveStudent.setCreateTime(System.currentTimeMillis());
                     markArchiveStudents.add(markArchiveStudent);
                 }
@@ -134,6 +135,19 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
     /**
      * 电子卡格式信息
      */
+    private String getArchiveCardId(JdbcTemplate jdbcTemplate, MarkStudent markStudent, BasicExam basicExam) {
+        String cardContent = getCardContent(jdbcTemplate, markStudent, basicExam);
+        if (StringUtils.isBlank(cardContent)) {
+            return null;
+        }
+        String md5 = this.md5String(cardContent);
+        int count = this.getMarkArchiveStudentCard(jdbcTemplate, md5);
+        if (count == 0) {
+            this.insertMarkArchiveStudentCard(jdbcTemplate, md5, cardContent);
+        }
+        return md5;
+    }
+
     private String getCardContent(JdbcTemplate jdbcTemplate, MarkStudent markStudent, BasicExam basicExam) {
         if (markStudent.getCardNumber() != null) {
             ScanAnswerCard scanAnswerCard = this.getScanAnswerCard(jdbcTemplate, markStudent.getExamId(), markStudent.getCardNumber());
@@ -171,6 +185,13 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
         return null;
     }
 
+    private String md5String(String content) {
+        if (StringUtils.isBlank(content)) {
+            return null;
+        }
+        return DigestUtils.md5Hex(content);
+    }
+
     /**
      * 客观题信息
      */
@@ -355,6 +376,17 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
         return t;
     }
 
+    private <T> T getCount(JdbcTemplate jdbcTemplate, String sql, Class<T> tClass) {
+        //将查询的语句封装到List集合中,集合中存储每一个员工实体
+        T t = null;
+        try {
+            t = jdbcTemplate.queryForObject(sql, tClass);
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("查询失败:" + e.getMessage());
+        }
+        return t;
+    }
+
     private <T> List<T> listData(JdbcTemplate jdbcTemplate, String sql, Class<T> tClass) {
         //将查询的语句封装到List集合中,集合中存储每一个员工实体
         List<T> list = new ArrayList<>();
@@ -566,18 +598,28 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
         return this.getOne(jdbcTemplate, sql, ExamCardModelFour.class);
     }
 
+    private int getMarkArchiveStudentCard(JdbcTemplate jdbcTemplate, String id) {
+        String sql = "select count(1) from mark_archive_student_card where id = '" + id + "'";
+        return this.getCount(jdbcTemplate, sql, Integer.class);
+    }
+
     private int updateMarkPaperArchive(JdbcTemplate jdbcTemplate, Long id) {
         String sql = "update mark_paper set archive = 1 where id = " + id;
         return this.update(jdbcTemplate, sql);
     }
 
+    private int insertMarkArchiveStudentCard(JdbcTemplate jdbcTemplate, String id, String cardContent) {
+        String sql = "insert into mark_archive_student_card values ('" + id + "','" + cardContent + "')";
+        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 (?,?,?,?,?,?,?,?,?,?)";
+        String sql = "insert into mark_archive_student(student_id, exam_id, paper_number, student_code, basic_student_id, sheet_urls, subjective_questions, objective_questions, archive_card_id, create_time) values (?,?,?,?,?,?,?,?,?,?)";
         int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
             @Override
             public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
@@ -623,8 +665,8 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
                 } else {
                     preparedStatement.setNull(8, Types.VARCHAR);
                 }
-                if (StringUtils.isNotBlank(mas.getCardContent())) {
-                    preparedStatement.setString(9, mas.getCardContent());
+                if (StringUtils.isNotBlank(mas.getArchiveCardId())) {
+                    preparedStatement.setString(9, mas.getArchiveCardId());
                 } else {
                     preparedStatement.setNull(9, Types.VARCHAR);
                 }

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

@@ -86,7 +86,7 @@ public class DataUpgrade_3_4_5 implements DataUpgradeService {
                 markArchiveStudent.setSheetUrls(buildSheetUrls(jdbcTemplate, markStudent));
                 markArchiveStudent.setSubjectiveQuestions(buildSubjectiveQuestions(jdbcTemplate, markStudent, markQuestionList, sysUserMap));
                 markArchiveStudent.setObjectiveQuestions(buildObjectiveQuestions(objectiveQuestionMap, markStudent));
-                markArchiveStudent.setCardContent(getCardContent(jdbcTemplate, markStudent, basicExam));
+                markArchiveStudent.setArchiveCardId(getCardContent(jdbcTemplate, markStudent, basicExam));
                 markArchiveStudent.setCreateTime(System.currentTimeMillis());
                 markArchiveStudents.add(markArchiveStudent);
             }
@@ -526,7 +526,7 @@ public class DataUpgrade_3_4_5 implements DataUpgradeService {
                 preparedStatement.setString(6, mas.getSheetUrls());
                 preparedStatement.setString(7, mas.getSubjectiveQuestions());
                 preparedStatement.setString(8, mas.getObjectiveQuestions());
-                preparedStatement.setString(9, mas.getCardContent());
+                preparedStatement.setString(9, mas.getArchiveCardId());
                 preparedStatement.setLong(10, System.currentTimeMillis());
             }
 

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/TBTaskMapper.java

@@ -29,5 +29,6 @@ public interface TBTaskMapper extends BaseMapper<TBTask> {
                                        @Param("status") String status,
                                        @Param("type") String type,
                                        @Param("result") String result,
-                                       @Param("dpr") DataPermissionRule dpr);
+                                       @Param("dpr") DataPermissionRule dpr,
+                                       @Param("userId") Long userId);
 }

+ 2 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TBTaskServiceImpl.java

@@ -234,7 +234,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
     public IPage<TaskListResult> query(IPage<Map> iPage, Long semesterId, Long examId, Long courseId, String paperNumber, Long schoolId, Long printPlanId, TaskStatusEnum status, TaskTypeEnum type, TaskResultEnum result) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, sysUser.getId(), ServletUtil.getRequest().getServletPath());
-        return tbTaskMapper.query(iPage, schoolId, semesterId, examId, courseId, paperNumber, printPlanId, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null, dpr);
+        return tbTaskMapper.query(iPage, schoolId, semesterId, examId, courseId, paperNumber, printPlanId, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null, dpr, sysUser.getId());
     }
 
 
@@ -270,6 +270,6 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, sysUser.getId(), ServletUtil.getRequest().getServletPath());
-        return tbTaskMapper.query(iPage, schoolId, semesterId, examId, courseId, paperNumber, null, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null, dpr);
+        return tbTaskMapper.query(iPage, schoolId, semesterId, examId, courseId, paperNumber, null, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null, dpr, sysUser.getId());
     }
 }

+ 3 - 0
teachcloud-common/src/main/resources/mapper/TBTaskMapper.xml

@@ -62,6 +62,9 @@
             <if test="result != null and result != ''">
                 and tbt.result = #{result}
             </if>
+            <if test="userId != null">
+                and tbt.create_id = #{userId}
+            </if>
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
                     AND su.id = #{dpr.requestUserId}

+ 8 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArchiveStudent.java

@@ -44,7 +44,7 @@ public class MarkArchiveStudent implements Serializable {
 
     private String objectiveQuestions;
 
-    private String cardContent;
+    private String archiveCardId;
 
     private Long createTime;
 
@@ -104,13 +104,15 @@ public class MarkArchiveStudent implements Serializable {
     public void setObjectiveQuestions(String objectiveQuestions) {
         this.objectiveQuestions = objectiveQuestions;
     }
-    public String getCardContent() {
-        return cardContent;
+
+    public String getArchiveCardId() {
+        return archiveCardId;
     }
 
-    public void setCardContent(String cardContent) {
-        this.cardContent = cardContent;
+    public void setArchiveCardId(String archiveCardId) {
+        this.archiveCardId = archiveCardId;
     }
+
     public Long getCreateTime() {
         return createTime;
     }
@@ -130,7 +132,7 @@ public class MarkArchiveStudent implements Serializable {
             ", sheetUrls=" + sheetUrls +
             ", subjectiveQuestions=" + subjectiveQuestions +
             ", objectiveQuestions=" + objectiveQuestions +
-            ", cardContent=" + cardContent +
+            ", archiveCardId=" + archiveCardId +
             ", createTime=" + createTime +
         "}";
     }

+ 51 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkArchiveStudentCard.java

@@ -0,0 +1,51 @@
+package com.qmth.teachcloud.mark.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author xf
+ * @since 2025-04-09
+ */
+@TableName("mark_archive_student_card")
+@ApiModel(value="MarkArchiveStudentCard对象", description="")
+public class MarkArchiveStudentCard implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private String id;
+
+    private String cardContent;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+    public String getCardContent() {
+        return cardContent;
+    }
+
+    public void setCardContent(String cardContent) {
+        this.cardContent = cardContent;
+    }
+
+    @Override
+    public String toString() {
+        return "MarkArchiveStudentCard{" +
+            "id=" + id +
+            ", cardContent=" + cardContent +
+        "}";
+    }
+}

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkArchiveStudentCardMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.mapper;
+
+import com.qmth.teachcloud.mark.entity.MarkArchiveStudentCard;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2025-04-09
+ */
+public interface MarkArchiveStudentCardMapper extends BaseMapper<MarkArchiveStudentCard> {
+
+}

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkArchiveStudentCardService.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.service;
+
+import com.qmth.teachcloud.mark.entity.MarkArchiveStudentCard;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2025-04-09
+ */
+public interface MarkArchiveStudentCardService extends IService<MarkArchiveStudentCard> {
+
+}

+ 20 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArchiveStudentCardServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.mark.service.impl;
+
+import com.qmth.teachcloud.mark.entity.MarkArchiveStudentCard;
+import com.qmth.teachcloud.mark.mapper.MarkArchiveStudentCardMapper;
+import com.qmth.teachcloud.mark.service.MarkArchiveStudentCardService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2025-04-09
+ */
+@Service
+public class MarkArchiveStudentCardServiceImpl extends ServiceImpl<MarkArchiveStudentCardMapper, MarkArchiveStudentCard> implements MarkArchiveStudentCardService {
+
+}

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

@@ -154,7 +154,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                     question.setId(SystemConstant.getDbUuid());
                     question.setExamId(examId);
                     question.setPaperNumber(paperNumber);
-                    question.setPaperType(markPaper.getPaperType());
+                    question.setCourseId(markPaper.getCourseId());
+//                    question.setPaperType(markPaper.getPaperType());
                     saveOrUpdateList.add(question);
                 } else {
                     Optional<MarkQuestion> questionOptional = markQuestionList.stream().filter(m -> m.getId().equals(question.getId())).findFirst();
@@ -206,7 +207,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                         question.setId(SystemConstant.getDbUuid());
                         question.setExamId(examId);
                         question.setPaperNumber(paperNumber);
-                        question.setPaperType(markPaper.getPaperType());
+                        question.setCourseId(markPaper.getCourseId());
+//                        question.setPaperType(markPaper.getPaperType());
                         question.setCreateId(sysUser.getId());
                         question.setCreateTime(System.currentTimeMillis());
                         // 用来判断是否保存过
@@ -220,6 +222,9 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
             if (CollectionUtils.isNotEmpty(markQuestionList)) {
                 List<Long> deleteIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
                 this.removeByIds(deleteIds);
+                for (MarkQuestion markQuestion : markQuestionList) {
+                    markUserQuestionService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, markQuestion.getId());
+                }
 
                 markQuestionList.stream().filter(m -> m.getObjective()).forEach(m -> {
                     markQuestionAnswerService.deleteByExamIdAndPaperNumberAndMainNumberAndSubNumber(examId, paperNumber, m.getMainNumber(), m.getSubNumber());

+ 7 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java

@@ -171,6 +171,8 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
                 this.saveOrUpdateBatch(markUserQuestionUpdate);
             }
         }
+
+        markPaperService.updateGroupStatus(markerAddParam.getExamId(), markerAddParam.getPaperNumber());
     }
 
     private List<Long> listMergeQuestionId(Long examId, String paperNumber, Long questionId) {
@@ -223,6 +225,8 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
                 .eq(MarkUserQuestion::getUserId, markUserQuestion.getUserId())
                 .in(MarkUserQuestion::getQuestionId, ids);
         this.update(updateWrapper);
+
+        markPaperService.updateGroupStatus(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber());
     }
 
     @Override
@@ -276,7 +280,9 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
         IPage<MarkQualityDto> markQualityDtoIPage = this.baseMapper.pageQuality(page, examId, paperNumber, questionId, loginName);
         for (MarkQualityDto qualityDto : markQualityDtoIPage.getRecords()) {
             MarkQuestion markQuestion = markQuestionService.getById(qualityDto.getQuestionId());
-            qualityDto.setQuestionNumber(markQuestion.getQuestionNumber());
+            if (markQuestion != null) {
+                qualityDto.setQuestionNumber(markQuestion.getQuestionNumber());
+            }
             if (qualityDto.getUserId() != null) {
                 SysUser sysUser = sysUserService.getByUserId(qualityDto.getUserId());
                 qualityDto.setLoginName(sysUser.getLoginName());

+ 4 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java

@@ -46,6 +46,8 @@ public class TaskServiceImpl implements TaskService {
     private SysUserService sysUserService;
     @Resource
     private MarkArchiveStudentService markArchiveStudentService;
+    @Resource
+    private MarkArchiveStudentCardService markArchiveStudentCardService;
 
     @Override
     public Task build(MarkArbitrateHistory markArbitrateHistory, MarkQuestion markQuestion) {
@@ -126,7 +128,8 @@ public class TaskServiceImpl implements TaskService {
                     // 客观题
                     task.setObjectiveQuestions(StringUtils.isNotBlank(markArchiveStudent.getObjectiveQuestions()) ? JSON.parseArray(markArchiveStudent.getObjectiveQuestions(), StudentObjectiveAnswerDto.class) : null);
                     // 题卡卡格式
-                    task.setCardContent(markStudentService.getCardContent(markStudent));
+                    MarkArchiveStudentCard archiveStudentCard = markArchiveStudentCardService.getById(markArchiveStudent.getArchiveCardId());
+                    task.setCardContent(archiveStudentCard == null ? null : archiveStudentCard.getCardContent());
                 }
             } else {
                 task.setExamId(markStudent.getExamId());

+ 11 - 0
teachcloud-mark/src/main/resources/mapper/MarkArchiveStudentCardMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.teachcloud.mark.mapper.MarkArchiveStudentCardMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkArchiveStudentCard">
+        <id column="id" property="id" />
+        <result column="card_content" property="cardContent" />
+    </resultMap>
+
+</mapper>

+ 21 - 24
teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml

@@ -30,12 +30,12 @@
             bs.name AS semesterName
         FROM
             mark_user_question muq
-                LEFT JOIN
+                INNER JOIN
             mark_question mq ON muq.exam_id = mq.exam_id
                 AND muq.paper_number = mq.paper_number
                 AND muq.question_id = mq.id
                 AND muq.enable = true
-                LEFT JOIN
+                INNER JOIN
             basic_course bc ON mq.course_id = bc.id
                 LEFT JOIN
             sys_org so ON bc.teaching_room_id = so.id
@@ -163,30 +163,27 @@
 
     <select id="countByMarkTask" resultType="java.lang.Integer">
         SELECT
-            COUNT(1)
+        count(distinct mq.exam_id, muq.paper_number)
         FROM
-            mark_paper mp
-             join basic_exam be on mp.exam_id = be.id and be.enable = true
-            join basic_semester bs on be.semester_id = bs.id and bs.enable = true
+        mark_user_question muq
+        INNER JOIN
+        mark_question mq ON muq.exam_id = mq.exam_id
+        AND muq.paper_number = mq.paper_number
+        AND muq.question_id = mq.id
+        AND muq.enable = true
+        INNER JOIN
+        basic_course bc ON mq.course_id = bc.id
+        LEFT JOIN
+        sys_org so ON bc.teaching_room_id = so.id
+        JOIN
+        basic_exam be ON muq.exam_id = be.id and be.enable = true
+        JOIN
+        basic_semester bs ON be.semester_id = bs.id and bs.enable = true
         <where>
-        <if test="status != null and status != ''">
-            AND mp.status = #{status}
-        </if>
-          AND EXISTS( SELECT
-                          1
-                      FROM
-                          mark_user_question muq
-                              LEFT JOIN
-                          mark_question mq ON muq.exam_id = mq.exam_id
-                              AND muq.paper_number = mq.paper_number
-                              AND muq.question_id = mq.id
-                              AND muq.enable = TRUE
-                      WHERE
-                          mp.exam_id = muq.exam_id
-                        AND mp.paper_number = muq.paper_number
-                        <if test="userId != null">
-                            AND muq.user_id = #{userId} AND mq.task_count > 0
-                        </if>)
+            and muq.user_id = #{userId} and mq.task_count > 0
+            <if test="status != null and status != ''">
+                and exists (select 1 from mark_paper mp where mp.exam_id = mq.exam_id and mp.paper_number = mq.paper_number and mp.status = #{status})
+            </if>
         </where>
     </select>
     <select id="listDefaultMarkerByExamIdAndPaperNumber"