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()
]);
}
}
}