소스 검색

feat:执药考试模块增加做题记录

yangting 5 일 전
부모
커밋
151cdf92b6

+ 41 - 0
deploy/fix-prod-schema.sql

@@ -0,0 +1,41 @@
+-- ============================================================
+-- 线上库 schema 补齐脚本(2026-08-31)
+-- 背景:线上已部署新代码(含 question_count / practiceProgress 功能),
+--       但线上库 schema 落后,缺列缺表导致多个接口 500。
+-- 用法:先把本文件上传到服务器 /root/,然后执行:
+--       docker exec -i mysql8 mysql -uuser -p'qPa5*gt8o.' zhijiayun_pharmacy < /root/fix-prod-schema.sql
+-- 说明:
+--   - 第 1 条 ALTER 若报 "Duplicate column name 'question_count'",说明列已加过,
+--     属正常现象,忽略即可(用 -f 或继续执行后续语句)。
+--   - CREATE TABLE IF NOT EXISTS 可安全重复执行。
+-- ============================================================
+
+-- 1) 考试记录表:满分列(realExam/list、records、summary、recordDetail 等接口依赖)
+ALTER TABLE t_quiz_user_exam_record
+  ADD COLUMN question_count INT DEFAULT NULL COMMENT '试卷题目总数(满分)' AFTER wrong_count;
+
+-- 2) 练习进度表(practiceProgress/listBySectionIds、save、get 接口依赖)
+CREATE TABLE IF NOT EXISTS t_quiz_practice_progress (
+  id bigint NOT NULL COMMENT '主键ID(雪花算法)',
+  user_id bigint NOT NULL COMMENT '用户ID',
+  subject_id bigint DEFAULT NULL COMMENT '科目ID',
+  section_id bigint NOT NULL COMMENT '节ID',
+  section_name varchar(200) DEFAULT NULL COMMENT '节名称',
+  current_index int NOT NULL DEFAULT 0 COMMENT '当前题号(0基)',
+  answered_count int NOT NULL DEFAULT 0 COMMENT '已答题数',
+  answers text COMMENT '已选答案JSON {index:答案}',
+  create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+  PRIMARY KEY (id),
+  UNIQUE KEY uk_user_section (user_id, section_id),
+  KEY idx_user_id (user_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='练习进度表';
+
+-- 3) 回填存量考试记录的满分值
+UPDATE t_quiz_user_exam_record r
+SET r.question_count = (
+  SELECT COUNT(*) FROM t_quiz_question q
+  WHERE q.is_real = 1 AND q.year = r.year
+    AND (r.subject_id IS NULL OR q.subject_id = r.subject_id)
+)
+WHERE r.question_count IS NULL;

+ 1 - 0
zhijiayun-quiz/src/main/java/com/xuekairui/quiz/entity/QuizUserExamRecord.java

@@ -25,6 +25,7 @@ public class QuizUserExamRecord {
     private BigDecimal totalScore;
     private Integer correctCount;
     private Integer wrongCount;
+    private Integer questionCount;
     private Integer isPassed;
     @TableField(typeHandler = JacksonTypeHandler.class)
     private List<Map<String, Object>> answers;

+ 9 - 3
zhijiayun-quiz/src/main/java/com/xuekairui/quiz/service/impl/RealExamServiceImpl.java

@@ -190,6 +190,7 @@ public class RealExamServiceImpl implements RealExamService {
                 .userId(userId)
                 .year(year)
                 .subjectId(subjectId)
+                .questionCount(questions.size())
                 .startTime(LocalDateTime.now())
                 .status(0)
                 .build();
@@ -314,10 +315,11 @@ public class RealExamServiceImpl implements RealExamService {
             answerRecords.add(answerRecord);
         }
 
-        int total = correctCount + wrongCount;
-        // 每题1分,总分按正确数计算;及格线为60%
+        // 满分 = 试卷题目总数(以 startExam 时快照为准,无快照则回退为本次作答题数)
+        int questionTotal = record.getQuestionCount() != null ? record.getQuestionCount() : correctCount + wrongCount;
+        // 每题1分,总分按正确数计算;及格线为满分的60%
         BigDecimal totalScore = BigDecimal.valueOf(correctCount);
-        BigDecimal passScore = BigDecimal.valueOf(total * 0.6).setScale(0, RoundingMode.HALF_UP);
+        BigDecimal passScore = BigDecimal.valueOf(questionTotal * 0.6).setScale(0, RoundingMode.HALF_UP);
         int isPassed = totalScore.compareTo(passScore) >= 0 ? 1 : 0;
 
         record.setSubmitTime(LocalDateTime.now());
@@ -325,6 +327,7 @@ public class RealExamServiceImpl implements RealExamService {
         record.setTotalScore(totalScore);
         record.setCorrectCount(correctCount);
         record.setWrongCount(wrongCount);
+        record.setQuestionCount(questionTotal);
         record.setIsPassed(isPassed);
         record.setAnswers(answerRecords);
         record.setStatus(1);
@@ -333,6 +336,7 @@ public class RealExamServiceImpl implements RealExamService {
         return SubmitExamVO.builder()
                 .recordId(record.getId())
                 .totalScore(totalScore)
+                .questionCount(questionTotal)
                 .correctCount(correctCount)
                 .wrongCount(wrongCount)
                 .isPassed(isPassed)
@@ -378,6 +382,7 @@ public class RealExamServiceImpl implements RealExamService {
                     .yearLabel(yearLabel)
                     .subjectName(subjectName)
                     .totalScore(r.getTotalScore())
+                    .questionCount(r.getQuestionCount())
                     .correctCount(r.getCorrectCount())
                     .wrongCount(r.getWrongCount())
                     .isPassed(r.getIsPassed())
@@ -456,6 +461,7 @@ public class RealExamServiceImpl implements RealExamService {
                 .recordId(record.getId())
                 .year(record.getYear())
                 .totalScore(record.getTotalScore())
+                .questionCount(record.getQuestionCount())
                 .correctCount(record.getCorrectCount())
                 .wrongCount(record.getWrongCount())
                 .isPassed(record.getIsPassed())

+ 1 - 0
zhijiayun-quiz/src/main/java/com/xuekairui/quiz/vo/ExamDetailVO.java

@@ -23,6 +23,7 @@ public class ExamDetailVO {
     private Long recordId;
     private String year;
     private BigDecimal totalScore;
+    private Integer questionCount;  // 试卷题目总数(满分)
     private Integer correctCount;
     private Integer wrongCount;
     private Integer isPassed;

+ 1 - 0
zhijiayun-quiz/src/main/java/com/xuekairui/quiz/vo/ExamRecordVO.java

@@ -23,6 +23,7 @@ public class ExamRecordVO {
     private String yearLabel;    // 年份标签(如 "2025年真题")
     private String subjectName;  // 科目名
     private BigDecimal totalScore;
+    private Integer questionCount;  // 试卷题目总数(满分)
     private Integer correctCount;
     private Integer wrongCount;
     private Integer isPassed;

+ 1 - 0
zhijiayun-quiz/src/main/java/com/xuekairui/quiz/vo/SubmitExamVO.java

@@ -19,6 +19,7 @@ import java.math.BigDecimal;
 public class SubmitExamVO {
     private Long recordId;
     private BigDecimal totalScore;
+    private Integer questionCount;  // 试卷题目总数(满分)
     private Integer correctCount;
     private Integer wrongCount;
     private Integer isPassed;