Эх сурвалжийг харах

feat: 优化达标的判断逻辑,取 direct_mastery_level 和 mastery_level 的最大值

gwd 1 долоо хоног өмнө
parent
commit
839daa8e75

+ 15 - 12
app/Models/StudentKnowledgeMastery.php

@@ -130,11 +130,12 @@ class StudentKnowledgeMastery extends Model
 
         foreach ($kpCodes as $kpCode) {
             $record = $records->get($kpCode);
-            // 优先使用 direct_mastery_level(直接学习掌握度)
+            // 取 direct_mastery_level 和 mastery_level 的最大值
+            // 避免"学了之后反而从达标变成未达标"的问题
             if ($record) {
-                $level = $record->direct_mastery_level !== null
-                    ? (float) $record->direct_mastery_level
-                    : (float) $record->mastery_level;
+                $direct = $record->direct_mastery_level;
+                $mastery = (float) $record->mastery_level;
+                $level = $direct !== null ? max((float) $direct, $mastery) : $mastery;
             } else {
                 $level = 0.0;
             }
@@ -186,12 +187,13 @@ class StudentKnowledgeMastery extends Model
 
             $hasAnyKpWithQuestions = true;
 
-            // 优先使用 direct_mastery_level(直接学习掌握度)
+            // 取 direct_mastery_level 和 mastery_level 的最大值
+            // 避免"学了之后反而从达标变成未达标"的问题
             $record = $records->get($kpCode);
             if ($record) {
-                $level = $record->direct_mastery_level !== null
-                    ? (float) $record->direct_mastery_level
-                    : (float) $record->mastery_level;
+                $direct = $record->direct_mastery_level;
+                $mastery = (float) $record->mastery_level;
+                $level = $direct !== null ? max((float) $direct, $mastery) : $mastery;
             } else {
                 $level = 0.0;
             }
@@ -239,12 +241,13 @@ class StudentKnowledgeMastery extends Model
                 continue;
             }
 
-            // 优先使用 direct_mastery_level(直接学习掌握度)
+            // 取 direct_mastery_level 和 mastery_level 的最大值
+            // 避免"学了之后反而从达标变成未达标"的问题
             $record = $records->get($kpCode);
             if ($record) {
-                $level = $record->direct_mastery_level !== null
-                    ? (float) $record->direct_mastery_level
-                    : (float) $record->mastery_level;
+                $direct = $record->direct_mastery_level;
+                $mastery = (float) $record->mastery_level;
+                $level = $direct !== null ? max((float) $direct, $mastery) : $mastery;
             } else {
                 $level = 0.0;
             }

+ 9 - 5
app/Services/DiagnosticChapterService.php

@@ -522,14 +522,18 @@ class DiagnosticChapterService
             ->get(['kp_code', 'mastery_level', 'direct_mastery_level'])
             ->keyBy('kp_code');
 
-        // 构建有效掌握度映射:优先使用 direct_mastery_level,其次使用 mastery_level
+        // 构建有效掌握度映射:取 direct_mastery_level 和 mastery_level 的最大值
+        // 避免"学了之后反而从达标变成未达标"的问题
         $levels = [];
         foreach ($masteryRecords as $kpCode => $record) {
-            // 优先使用 direct_mastery_level(直接学习掌握度)
-            if ($record->direct_mastery_level !== null) {
-                $levels[$kpCode] = (float) $record->direct_mastery_level;
+            $direct = $record->direct_mastery_level;
+            $mastery = (float) $record->mastery_level;
+
+            if ($direct !== null) {
+                // 取两者最大值:直接学习达标或聚合值达标,都算达标
+                $levels[$kpCode] = max((float) $direct, $mastery);
             } else {
-                $levels[$kpCode] = (float) $record->mastery_level;
+                $levels[$kpCode] = $mastery;
             }
         }