323 lines
10 KiB
PHP
323 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Services\MessageSyncService;
|
|
use App\Services\EventConsumerSyncService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Carbon\Carbon;
|
|
|
|
class MessageSyncController extends Controller
|
|
{
|
|
private MessageSyncService $messageSyncService;
|
|
private EventConsumerSyncService $eventConsumerSyncService;
|
|
|
|
public function __construct(
|
|
MessageSyncService $messageSyncService,
|
|
EventConsumerSyncService $eventConsumerSyncService
|
|
) {
|
|
$this->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);
|
|
}
|
|
}
|
|
}
|