paginate(20); // 禁用创建按钮(如果需要) // $grid->disableCreateButton(); // 设置表格标题 // $grid->header(function () { // return view('transfer::admin.app.header'); // }); }); return $grid; } /** * 配置数据详情 */ protected function detail($id): Show { $show = Show::make($id, new TransferApp(), function (Show $show) { // 使用辅助类配置详情 TransferAppHelper::show($show); // 添加自定义面板 $show->panel() ->title('划转应用详情') ->tools(function ($tools) { // 添加测试连接按钮 $appId = request()->route('app'); // 从路由参数获取应用ID $tools->append('测试连接'); }); }); return $show; } /** * 配置创建和编辑表单 */ protected function form(): Form { $form = Form::make(new TransferApp(), function (Form $form) { // 使用辅助类配置表单 TransferAppHelper::form($form); // 设置表单标题 $form->title('划转应用配置'); // 表单工具栏 $form->tools(function (Form\Tools $tools) { // 添加测试按钮 $tools->append('测试配置'); }); }); return $form; } /** * 测试应用连接 */ #[Post('transfer/apps/{id}/test-connection', name: 'admin.transfer.apps.test-connection')] public function testConnection($id) { try { $app = TransferApp::findOrFail($id); if ($app->isInternalMode()) { return response()->json([ 'status' => true, 'message' => '农场内部模式,无需测试连接' ]); } // 测试各个API端点 $results = []; $urls = [ 'callback' => $app->order_callback_url, 'in_info' => $app->order_in_info_url, 'out_create' => $app->order_out_create_url, 'out_info' => $app->order_out_info_url, ]; foreach ($urls as $type => $url) { if (empty($url)) { $results[$type] = ['status' => 'skip', 'message' => '未配置']; continue; } try { $response = Http::timeout(10)->get($url); $results[$type] = [ 'status' => $response->successful() ? 'success' : 'error', 'message' => $response->successful() ? '连接成功' : "HTTP {$response->status()}", 'response_time' => $response->transferStats->getTransferTime() ?? 0 ]; } catch (\Exception $e) { $results[$type] = [ 'status' => 'error', 'message' => $e->getMessage() ]; } } return response()->json([ 'status' => true, 'message' => '连接测试完成', 'data' => $results ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '测试失败: ' . $e->getMessage() ]); } } /** * 切换应用状态 */ #[Post('transfer/apps/{id}/toggle-status', name: 'admin.transfer.apps.toggle-status')] public function toggleStatus($id) { try { $app = TransferApp::findOrFail($id); $app->is_enabled = !$app->is_enabled; $app->save(); $status = $app->is_enabled ? '启用' : '禁用'; return response()->json([ 'status' => true, 'message' => "应用已{$status}" ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '操作失败: ' . $e->getMessage() ]); } } /** * 获取应用统计信息 */ #[Get('transfer/apps/{id}/statistics', name: 'admin.transfer.apps.statistics')] public function statistics($id = null) { try { $query = \App\Module\Transfer\Models\TransferOrder::query(); if ($id) { $query->where('transfer_app_id', $id); } $stats = [ 'total_orders' => $query->count(), 'completed_orders' => (clone $query)->where('status', \App\Module\Transfer\Enums\TransferStatus::COMPLETED)->count(), 'failed_orders' => (clone $query)->where('status', \App\Module\Transfer\Enums\TransferStatus::FAILED)->count(), 'total_amount' => $query->sum('amount'), 'total_fee' => $query->sum('fee_amount'), 'today_orders' => (clone $query)->whereDate('created_at', today())->count(), 'today_amount' => (clone $query)->whereDate('created_at', today())->sum('amount'), 'today_fee' => (clone $query)->whereDate('created_at', today())->sum('fee_amount'), ]; $stats['success_rate'] = $stats['total_orders'] > 0 ? round($stats['completed_orders'] / $stats['total_orders'] * 100, 2) : 0; return response()->json([ 'status' => true, 'data' => $stats ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '获取统计信息失败: ' . $e->getMessage() ]); } } /** * 获取手续费统计信息 */ #[Get('transfer/apps/{id}/fee-statistics', name: 'admin.transfer.apps.fee-statistics')] public function feeStatistics($id = null) { try { $query = \App\Module\Transfer\Models\TransferOrder::query() ->where('status', \App\Module\Transfer\Enums\TransferStatus::COMPLETED) ->where('fee_amount', '>', 0); if ($id) { $query->where('transfer_app_id', $id); } $stats = $query->selectRaw(' COUNT(*) as total_orders, SUM(fee_amount) as total_fee, AVG(fee_rate) as avg_fee_rate, SUM(CASE WHEN type = 1 THEN fee_amount ELSE 0 END) as in_fee, SUM(CASE WHEN type = 2 THEN fee_amount ELSE 0 END) as out_fee, COUNT(CASE WHEN type = 1 THEN 1 END) as in_orders, COUNT(CASE WHEN type = 2 THEN 1 END) as out_orders ') ->first(); // 今日手续费统计 $todayStats = (clone $query)->whereDate('created_at', today()) ->selectRaw('COUNT(*) as today_orders, SUM(fee_amount) as today_fee') ->first(); $result = [ 'total_orders' => $stats->total_orders ?? 0, 'total_fee' => number_format($stats->total_fee ?? 0, 4), 'avg_fee_rate' => number_format(($stats->avg_fee_rate ?? 0) * 100, 2) . '%', 'in_fee' => number_format($stats->in_fee ?? 0, 4), 'out_fee' => number_format($stats->out_fee ?? 0, 4), 'in_orders' => $stats->in_orders ?? 0, 'out_orders' => $stats->out_orders ?? 0, 'today_orders' => $todayStats->today_orders ?? 0, 'today_fee' => number_format($todayStats->today_fee ?? 0, 4), ]; return response()->json([ 'status' => true, 'data' => $result ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '获取手续费统计失败: ' . $e->getMessage() ]); } } }