messageSyncService = $messageSyncService; $this->eventConsumerSyncService = $eventConsumerSyncService; } /** * 批量查询消息数据 */ public function queryMessages(Request $request): JsonResponse { try { $request->validate([ 'message_ids' => 'required|array|min:1', 'message_ids.*' => 'required|string|max:255', ]); $messageIds = array_filter(array_map('trim', $request->input('message_ids'))); if (empty($messageIds)) { return response()->json([ 'success' => false, 'message' => '请提供有效的消息ID列表' ], 400); } // 验证消息ID格式 $validationErrors = $this->messageSyncService->validateMessageIds($messageIds); if (!empty($validationErrors)) { return response()->json([ 'success' => false, 'message' => '消息ID格式验证失败', 'errors' => $validationErrors ], 400); } // 查询消息数据 $messages = $this->messageSyncService->getMessagesByIds($messageIds); $stats = $this->messageSyncService->getMessageStats($messageIds); return response()->json([ 'success' => true, 'data' => [ 'messages' => $messages, 'stats' => $stats ] ]); } catch (ValidationException $e) { return response()->json([ 'success' => false, 'message' => '请求参数验证失败', 'errors' => $e->errors() ], 422); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => '查询消息失败: ' . $e->getMessage() ], 500); } } /** * 执行消息同步 */ public function syncMessages(Request $request): JsonResponse { try { $request->validate([ 'message_ids' => 'required|array|min:1', 'message_ids.*' => 'required|string|max:255', ]); $messageIds = array_filter(array_map('trim', $request->input('message_ids'))); if (empty($messageIds)) { return response()->json([ 'success' => false, 'message' => '请提供有效的消息ID列表' ], 400); } // 验证消息ID格式 $validationErrors = $this->messageSyncService->validateMessageIds($messageIds); if (!empty($validationErrors)) { return response()->json([ 'success' => false, 'message' => '消息ID格式验证失败', 'errors' => $validationErrors ], 400); } // 执行同步 $results = $this->messageSyncService->syncMessages($messageIds); // 统计同步结果 $successCount = count(array_filter($results, fn($r) => $r['success'])); $failureCount = count($results) - $successCount; return response()->json([ 'success' => true, 'data' => [ 'results' => $results, 'summary' => [ 'total' => count($results), 'success' => $successCount, 'failure' => $failureCount ] ] ]); } catch (ValidationException $e) { return response()->json([ 'success' => false, 'message' => '请求参数验证失败', 'errors' => $e->errors() ], 422); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => '消息同步失败: ' . $e->getMessage() ], 500); } } /** * 获取agent配置信息 */ public function getAgentConfig(): JsonResponse { try { $config = [ 'agent_url' => config('services.agent.url'), 'timeout' => config('services.agent.timeout', 30), ]; return response()->json([ 'success' => true, 'data' => $config ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => '获取配置失败: ' . $e->getMessage() ], 500); } } /** * 测试数据库连接 */ public function testConnection(): JsonResponse { try { // 测试crmslave数据库连接 $connection = \DB::connection('crmslave'); $connection->getPdo(); // 测试表是否存在 $tableExists = $connection->getSchemaBuilder()->hasTable('system_publish_event'); return response()->json([ 'success' => true, 'data' => [ 'connection' => 'ok', 'table_exists' => $tableExists ] ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => '数据库连接测试失败: ' . $e->getMessage() ], 500); } } /** * 对比CRM和Agent的事件消费者消息同步状态 */ public function compareEventConsumerSync(Request $request): JsonResponse { try { $request->validate([ 'start_time' => 'nullable|date_format:Y-m-d H:i:s', 'end_time' => 'nullable|date_format:Y-m-d H:i:s', 'message_name' => 'nullable|string|max:255', 'exclude_messages' => 'nullable|array', 'exclude_messages.*' => 'string|max:255', ]); $startTime = $request->input('start_time') ? Carbon::createFromFormat('Y-m-d H:i:s', $request->input('start_time')) : null; $endTime = $request->input('end_time') ? Carbon::createFromFormat('Y-m-d H:i:s', $request->input('end_time')) : null; $messageName = $request->input('message_name'); $excludeMessages = $request->input('exclude_messages', []); $result = $this->eventConsumerSyncService->compareSyncStatus( $startTime, $endTime, $excludeMessages, $messageName ); return response()->json([ 'success' => true, 'data' => $result ]); } catch (ValidationException $e) { return response()->json([ 'success' => false, 'message' => '请求参数验证失败', 'errors' => $e->errors() ], 422); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => '对比消息同步状态失败: ' . $e->getMessage() ], 500); } } /** * 导出缺失的消息为Excel */ public function exportMissingMessages(Request $request): JsonResponse { try { $request->validate([ 'start_time' => 'nullable|date_format:Y-m-d H:i:s', 'end_time' => 'nullable|date_format:Y-m-d H:i:s', 'exclude_messages' => 'nullable|array', 'exclude_messages.*' => 'string|max:255', ]); $startTime = $request->input('start_time') ? Carbon::createFromFormat('Y-m-d H:i:s', $request->input('start_time')) : null; $endTime = $request->input('end_time') ? Carbon::createFromFormat('Y-m-d H:i:s', $request->input('end_time')) : null; $excludeMessages = $request->input('exclude_messages', []); $result = $this->eventConsumerSyncService->compareSyncStatus( $startTime, $endTime, $excludeMessages ); $missingMessages = $result['missing_messages']; if (empty($missingMessages)) { return response()->json([ 'success' => true, 'message' => '没有缺失的消息', 'data' => [] ]); } // 生成CSV数据 $csv = "msg_id,event_name,msg_body,created,updated\n"; foreach ($missingMessages as $msg) { $csv .= sprintf( '"%s","%s","%s","%s","%s"' . "\n", $msg['msg_id'], $msg['event_name'], str_replace('"', '""', $msg['msg_body']), $msg['created'], $msg['updated'] ); } return response()->json([ 'success' => true, 'data' => [ 'csv' => $csv, 'filename' => 'missing_messages_' . date('YmdHis') . '.csv', 'count' => count($missingMessages) ] ]); } catch (ValidationException $e) { return response()->json([ 'success' => false, 'message' => '请求参数验证失败', 'errors' => $e->errors() ], 422); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => '导出消息失败: ' . $e->getMessage() ], 500); } } }