ソースを参照

fix: 修复掌握度快照并发创建导致的偶发报错

- snapshot_id 加随机后缀避免同秒并发下唯一键冲突
- catch 块补 return null 修复 TypeError
- PDF导出获取上一次快照改用 skip(1) 替代脆弱的 snapshot_id 拼接比较
- gitignore 过滤 .serena 目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
gwd 1 日 前
コミット
16ee21acf2

+ 1 - 0
.gitignore

@@ -44,3 +44,4 @@ ansible/
 
 # 向量加粗修复脚本(独立工具)
 scripts/vector_bold_fix/
+.serena/

+ 3 - 2
app/Services/ExamAnswerAnalysisService.php

@@ -1733,7 +1733,7 @@ class ExamAnswerAnalysisService
             }
 
             // 生成快照ID
-            $snapshotId = 'snap_'.$paperId.'_'.now()->format('YmdHis');
+            $snapshotId = 'snap_'.$paperId.'_'.now()->format('YmdHis').'_'.substr(uniqid(), -4);
 
             // 保存到快照表
             DB::connection('mysql')->table('knowledge_point_mastery_snapshots')->insert([
@@ -1818,7 +1818,8 @@ class ExamAnswerAnalysisService
                 'paper_id' => $paperId,
                 'error' => $e->getMessage(),
             ]);
-        }
+
+            return null;
     }
 
     /**

+ 1 - 1
app/Services/ExamPdfExportService.php

@@ -735,8 +735,8 @@ class ExamPdfExportService
                     ->table('knowledge_point_mastery_snapshots')
                     ->where('student_id', $studentId)
                     ->where('paper_id', $paper->paper_id)
-                    ->where('snapshot_id', '!=', "snap_{$paper->paper_id}_".date('YmdHis'))
                     ->latest('snapshot_time')
+                    ->skip(1)
                     ->first();
 
                 $previousMasteryData = [];