|
|
@@ -81,6 +81,49 @@ class MistakeBookController extends Controller
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 新增错题
|
|
|
+ */
|
|
|
+ public function addMistake(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $payload = $request->only([
|
|
|
+ 'student_id',
|
|
|
+ 'question_id',
|
|
|
+ 'my_answer',
|
|
|
+ 'correct_answer',
|
|
|
+ 'source',
|
|
|
+ 'happened_at',
|
|
|
+ 'idempotency_key',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ if (empty($payload['student_id']) || empty($payload['question_id'])) {
|
|
|
+ return response()->json([
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => '缺少必要参数:student_id, question_id',
|
|
|
+ ], 400);
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ $result = $this->mistakeBookService->createMistake($payload);
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => true,
|
|
|
+ 'data' => $result,
|
|
|
+ 'duplicate' => $result['duplicate'] ?? false,
|
|
|
+ ]);
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('新增错题失败', [
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'payload' => $payload,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => '新增错题失败: ' . $e->getMessage(),
|
|
|
+ ], 500);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取单条错题详情
|
|
|
*
|
|
|
@@ -643,4 +686,221 @@ class MistakeBookController extends Controller
|
|
|
], 500);
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量操作错题
|
|
|
+ */
|
|
|
+ public function batchOperation(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ 'operation' => 'required|string|in:favorite,reviewed,mastered,retry_list,remove_retry_list,set_error_type,set_importance',
|
|
|
+ 'params' => 'array',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $mistakeIds = $validated['mistake_ids'];
|
|
|
+ $operation = $validated['operation'];
|
|
|
+ $params = $validated['params'] ?? [];
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation($mistakeIds, $operation, $params);
|
|
|
+
|
|
|
+ if ($result['success'] ?? false) {
|
|
|
+ return response()->json([
|
|
|
+ 'success' => true,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => "批量操作成功,成功处理 {$result['success_count']} 条记录",
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $result['error'] ?? '批量操作失败',
|
|
|
+ ], 400);
|
|
|
+ } catch (\Throwable $e) {
|
|
|
+ Log::error('Batch operation error', [
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'request' => $request->all(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => '批量操作失败',
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ ], 500);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量标记为已复习
|
|
|
+ */
|
|
|
+ public function batchMarkReviewed(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'reviewed'
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已标记 {$result['success_count']} 道题为已复习"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量标记为已掌握
|
|
|
+ */
|
|
|
+ public function batchMarkMastered(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'mastered'
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已标记 {$result['success_count']} 道题为已掌握"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量加入重练清单
|
|
|
+ */
|
|
|
+ public function batchAddToRetryList(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'retry_list'
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已加入 {$result['success_count']} 道题到重练清单"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量从重练清单移除
|
|
|
+ */
|
|
|
+ public function batchRemoveFromRetryList(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'remove_retry_list'
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已从重练清单移除 {$result['success_count']} 道题"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量设置错误类型
|
|
|
+ */
|
|
|
+ public function batchSetErrorType(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ 'error_type' => 'required|string|in:concept,calculation,careless,logic,other',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'set_error_type',
|
|
|
+ ['error_type' => $validated['error_type']]
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已为 {$result['success_count']} 道题设置错误类型"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量设置重要程度
|
|
|
+ */
|
|
|
+ public function batchSetImportance(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ 'importance' => 'required|integer|min:1|max:10',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'set_importance',
|
|
|
+ ['importance' => $validated['importance']]
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已为 {$result['success_count']} 道题设置重要程度"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量切换收藏状态
|
|
|
+ */
|
|
|
+ public function batchToggleFavorite(Request $request): JsonResponse
|
|
|
+ {
|
|
|
+ $validated = $request->validate([
|
|
|
+ 'mistake_ids' => 'required|array|min:1',
|
|
|
+ 'mistake_ids.*' => 'string',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result = $this->mistakeBookService->batchOperation(
|
|
|
+ $validated['mistake_ids'],
|
|
|
+ 'favorite'
|
|
|
+ );
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'success' => $result['success'] ?? false,
|
|
|
+ 'data' => $result,
|
|
|
+ 'message' => $result['success'] ?? false
|
|
|
+ ? "已为 {$result['success_count']} 道题切换收藏状态"
|
|
|
+ : ($result['error'] ?? '操作失败'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+}
|