#add jira & message sync
This commit is contained in:
16
app/Http/Controllers/AdminController.php
Normal file
16
app/Http/Controllers/AdminController.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\View\View;
|
||||
|
||||
class AdminController extends Controller
|
||||
{
|
||||
/**
|
||||
* 显示管理系统主页概览
|
||||
*/
|
||||
public function index(): View
|
||||
{
|
||||
return view('admin.index');
|
||||
}
|
||||
}
|
||||
@@ -15,13 +15,7 @@ class EnvController extends Controller
|
||||
$this->envManager = $envManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示环境管理页面
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('env.index');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取所有项目列表
|
||||
|
||||
135
app/Http/Controllers/JiraController.php
Normal file
135
app/Http/Controllers/JiraController.php
Normal file
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Services\JiraService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
class JiraController extends Controller
|
||||
{
|
||||
private JiraService $jiraService;
|
||||
|
||||
public function __construct(JiraService $jiraService)
|
||||
{
|
||||
$this->jiraService = $jiraService;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 生成上周周报
|
||||
*/
|
||||
public function generateWeeklyReport(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
$username = $request->input('username') ?: config('jira.default_user');
|
||||
|
||||
if (!$username) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '请提供用户名'
|
||||
], 400);
|
||||
}
|
||||
|
||||
$report = $this->jiraService->generateWeeklyReport($username);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'report' => $report,
|
||||
'username' => $username,
|
||||
'generated_at' => Carbon::now()->format('Y-m-d H:i:s')
|
||||
]
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '生成周报失败: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工时记录
|
||||
*/
|
||||
public function getWorkLogs(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'username' => 'required|string',
|
||||
'start_date' => 'required|date',
|
||||
'end_date' => 'required|date|after_or_equal:start_date',
|
||||
]);
|
||||
|
||||
try {
|
||||
$username = $request->input('username');
|
||||
$startDate = Carbon::parse($request->input('start_date'))->startOfDay();
|
||||
$endDate = Carbon::parse($request->input('end_date'))->endOfDay();
|
||||
|
||||
$workLogs = $this->jiraService->getWorkLogs($username, $startDate, $endDate);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'work_logs' => $workLogs->values()->toArray(),
|
||||
'total_hours' => $workLogs->sum('hours'),
|
||||
'total_records' => $workLogs->count(),
|
||||
'date_range' => [
|
||||
'start' => $startDate->format('Y-m-d'),
|
||||
'end' => $endDate->format('Y-m-d')
|
||||
]
|
||||
]
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '获取工时记录失败: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取JIRA配置信息
|
||||
*/
|
||||
public function getConfig(): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'default_user' => config('jira.default_user', ''),
|
||||
'host' => config('jira.host', '')
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下载周报文件
|
||||
*/
|
||||
public function downloadWeeklyReport(Request $request)
|
||||
{
|
||||
try {
|
||||
$username = $request->input('username') ?: config('jira.default_user');
|
||||
|
||||
if (!$username) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '请提供用户名'
|
||||
], 400);
|
||||
}
|
||||
|
||||
$report = $this->jiraService->generateWeeklyReport($username);
|
||||
$filename = sprintf('weekly_report_%s_%s.md', $username, Carbon::now()->subWeek()->format('Y-m-d'));
|
||||
|
||||
return response($report)
|
||||
->header('Content-Type', 'text/markdown')
|
||||
->header('Content-Disposition', 'attachment; filename="' . $filename . '"');
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '下载周报失败: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
207
app/Http/Controllers/MessageDispatchController.php
Normal file
207
app/Http/Controllers/MessageDispatchController.php
Normal file
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Services\MessageDispatchService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
class MessageDispatchController extends Controller
|
||||
{
|
||||
private MessageDispatchService $messageDispatchService;
|
||||
|
||||
public function __construct(MessageDispatchService $messageDispatchService)
|
||||
{
|
||||
$this->messageDispatchService = $messageDispatchService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取可用的服务列表
|
||||
*/
|
||||
public function getAvailableServices(): JsonResponse
|
||||
{
|
||||
try {
|
||||
$services = $this->messageDispatchService->getAvailableServices();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $services,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '获取服务列表失败',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取可用的国家代码列表
|
||||
*/
|
||||
public function getAvailableCountryCodes(): JsonResponse
|
||||
{
|
||||
try {
|
||||
$codes = $this->messageDispatchService->getAvailableCountryCodes();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $codes,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '获取国家代码列表失败',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取可用的域名列表
|
||||
*/
|
||||
public function getAvailableDomains(): JsonResponse
|
||||
{
|
||||
try {
|
||||
$domains = $this->messageDispatchService->getAvailableDomains();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $domains,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '获取域名列表失败',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询异常的消息分发数据
|
||||
*/
|
||||
public function getAbnormalDispatches(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'msg_ids' => 'nullable|array',
|
||||
'msg_ids.*' => 'string',
|
||||
'request_status' => 'nullable|integer',
|
||||
'business_status' => 'nullable|integer',
|
||||
'target_services' => 'nullable|array',
|
||||
'target_services.*' => 'integer',
|
||||
'country_codes' => 'nullable|array',
|
||||
'domains' => 'nullable|array',
|
||||
]);
|
||||
|
||||
$msgIds = $request->input('msg_ids');
|
||||
$requestStatus = $request->input('request_status');
|
||||
$businessStatus = $request->input('business_status');
|
||||
$targetServices = $request->input('target_services');
|
||||
$countryCodes = $request->input('country_codes');
|
||||
$domains = $request->input('domains');
|
||||
|
||||
$results = $this->messageDispatchService->getAbnormalDispatches(
|
||||
$msgIds,
|
||||
$requestStatus,
|
||||
$businessStatus,
|
||||
$targetServices,
|
||||
$countryCodes,
|
||||
$domains
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $results,
|
||||
'total' => count($results),
|
||||
]);
|
||||
} 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 getServiceRoutes(): JsonResponse
|
||||
{
|
||||
try {
|
||||
$routes = $this->messageDispatchService->getServiceRoutes();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $routes
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新消息分发状态
|
||||
*/
|
||||
public function batchUpdateDispatch(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'updates' => 'required|array|min:1',
|
||||
'updates.*.id' => 'required',
|
||||
'updates.*.request_status' => 'nullable|in:0,1,2,3,4,5',
|
||||
'updates.*.business_status' => 'nullable|in:0,1,2',
|
||||
'updates.*.retry_count' => 'nullable|numeric|min:0',
|
||||
'updates.*.request_error_message' => 'nullable|string|max:1000',
|
||||
'updates.*.request_error_code' => 'nullable|string|max:50',
|
||||
'updates.*.business_error_message' => 'nullable|string|max:1000',
|
||||
'updates.*.business_error_code' => 'nullable|string|max:50',
|
||||
'updates.*.processing_time_ms' => 'nullable|numeric|min:0',
|
||||
'updates.*.country_code' => 'nullable|string|max:10',
|
||||
'updates.*.target_service' => 'nullable',
|
||||
]);
|
||||
|
||||
$updates = $request->input('updates');
|
||||
|
||||
$results = $this->messageDispatchService->batchUpdateDispatch($updates);
|
||||
|
||||
$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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
322
app/Http/Controllers/MessageSyncController.php
Normal file
322
app/Http/Controllers/MessageSyncController.php
Normal file
@@ -0,0 +1,322 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user