paginate(50); // 禁用创建和编辑按钮 $grid->disableCreateButton(); $grid->disableEditButton(); // 设置表格标题 // $grid->header(function () { // return view('transfer::admin.order.header', [ // 'todayStats' => TransferOrderHelper::getTodayStats(), // 'statusStats' => TransferOrderHelper::getStatusStats(), // 'typeStats' => TransferOrderHelper::getTypeStats(), // ]); // }); }); return $grid; } /** * 配置数据详情 */ protected function detail($id): Show { $show = Show::make($id, new TransferOrder(), function (Show $show) use ($id) { // 使用辅助类配置详情 TransferOrderHelper::show($show); // 添加自定义面板 $show->panel() ->title('划转订单详情') ->tools(function ($tools) use ($id) { $order = TransferOrder::find($id); if ($order && $order->canRetry()) { $tools->append('重试订单'); } if ($order && $order->isTransferOut() && !$order->isFinalStatus()) { $tools->append('手动完成'); } }); }); return $show; } /** * 重试订单 */ #[Post('transfer/orders/{id}/retry', name: 'admin.transfer.orders.retry')] public function retry($id) { try { $order = TransferOrder::findOrFail($id); if (!$order->canRetry()) { return response()->json([ 'status' => false, 'message' => '订单状态不允许重试' ]); } $result = TransferLogic::retryOrder($id); if ($result) { return response()->json([ 'status' => true, 'message' => '订单重试成功' ]); } else { return response()->json([ 'status' => false, 'message' => '订单重试失败' ]); } } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '重试失败: ' . $e->getMessage() ]); } } /** * 手动完成订单 */ #[Post('transfer/orders/{id}/manual-complete', name: 'admin.transfer.orders.manual-complete')] public function manualComplete($id) { try { $remark = request('remark', '管理员手动完成'); $order = TransferOrder::findOrFail($id); if ($order->isFinalStatus()) { return response()->json([ 'status' => false, 'message' => '订单已处于最终状态' ]); } if (!$order->isTransferOut()) { return response()->json([ 'status' => false, 'message' => '只有转出订单支持手动完成' ]); } $result = TransferLogic::manualComplete($id, $remark); if ($result) { return response()->json([ 'status' => true, 'message' => '订单手动完成成功' ]); } else { return response()->json([ 'status' => false, 'message' => '订单手动完成失败' ]); } } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '手动完成失败: ' . $e->getMessage() ]); } } /** * 获取订单统计信息 */ #[Get('transfer/orders/statistics', name: 'admin.transfer.orders.statistics')] public function statistics() { try { $stats = [ 'today' => TransferOrderHelper::getTodayStats(), 'status' => TransferOrderHelper::getStatusStats(), 'type' => TransferOrderHelper::getTypeStats(), ]; return response()->json([ 'status' => true, 'data' => $stats ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '获取统计信息失败: ' . $e->getMessage() ]); } } /** * 导出订单数据 */ #[Get('transfer/orders/export', name: 'admin.transfer.orders.export')] public function export() { try { $filters = request()->all(); // 构建查询 $query = TransferOrder::with('transferApp'); // 应用筛选条件 if (isset($filters['transfer_app_id'])) { $query->where('transfer_app_id', $filters['transfer_app_id']); } if (isset($filters['type'])) { $query->where('type', $filters['type']); } if (isset($filters['status'])) { $query->where('status', $filters['status']); } if (isset($filters['start_date'])) { $query->where('created_at', '>=', $filters['start_date']); } if (isset($filters['end_date'])) { $query->where('created_at', '<=', $filters['end_date']); } $orders = $query->orderBy('created_at', 'desc')->limit(10000)->get(); // 生成CSV数据 $csvData = []; $csvData[] = [ 'ID', '应用名称', '外部订单ID', '用户ID', '外部用户ID', '类型', '状态', '外部金额', '内部金额', '汇率', '创建时间', '完成时间', '备注' ]; foreach ($orders as $order) { $csvData[] = [ $order->id, $order->transferApp->title, $order->out_order_id, $order->user_id, $order->out_user_id, $order->type->getDescription(), $order->status->getDescription(), $order->out_amount, $order->amount, $order->exchange_rate, $order->created_at->format('Y-m-d H:i:s'), $order->completed_at?->format('Y-m-d H:i:s'), $order->remark, ]; } // 生成CSV文件 $filename = 'transfer_orders_' . date('Y-m-d_H-i-s') . '.csv'; $handle = fopen('php://output', 'w'); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="' . $filename . '"'); // 添加BOM以支持中文 fwrite($handle, "\xEF\xBB\xBF"); foreach ($csvData as $row) { fputcsv($handle, $row); } fclose($handle); exit; } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '导出失败: ' . $e->getMessage() ]); } } }