HTML; } /** * 处理导出请求 * * @param Request $request * @return \Illuminate\Http\Response */ public function export(Request $request) { try { // 获取导出参数 $format = $request->get('format', 'excel'); $startDate = $request->get('start_date'); $endDate = $request->get('end_date'); $status = $request->get('status'); $type = $request->get('type'); $fields = $request->get('fields', []); // 构建查询 $query = TransferOrder::with('transferApp'); // 应用筛选条件 if ($startDate) { $query->where('created_at', '>=', $startDate . ' 00:00:00'); } if ($endDate) { $query->where('created_at', '<=', $endDate . ' 23:59:59'); } if ($status !== null && $status !== '') { $query->where('status', $status); } if ($type !== null && $type !== '') { $query->where('type', $type); } // 获取数据 $orders = $query->orderBy('created_at', 'desc')->get(); // 处理导出字段 $exportData = $this->prepareExportData($orders, $fields); // 生成文件 $filename = 'transfer_orders_' . date('Y-m-d_H-i-s'); if ($format === 'csv') { return $this->exportCsv($exportData, $filename); } else { return $this->exportExcel($exportData, $filename); } } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '导出失败: ' . $e->getMessage() ], 500); } } /** * 准备导出数据 * * @param \Illuminate\Support\Collection $orders * @param array $fields * @return array */ protected function prepareExportData($orders, array $fields): array { // 默认字段 if (empty($fields)) { $fields = ['id', 'out_order_id', 'user_id', 'type', 'status', 'amount', 'out_amount', 'created_at']; } // 字段标题映射 $fieldLabels = [ 'id' => '订单ID', 'out_order_id' => '外部订单ID', 'user_id' => '用户ID', 'out_user_id' => '外部用户ID', 'type' => '订单类型', 'status' => '订单状态', 'amount' => '内部金额', 'out_amount' => '外部金额', 'exchange_rate' => '汇率', 'transfer_app_title' => '划转应用', 'remark' => '备注', 'error_message' => '错误信息', 'created_at' => '创建时间', 'processed_at' => '处理时间', 'completed_at' => '完成时间' ]; $data = []; // 添加标题行 $headers = []; foreach ($fields as $field) { $headers[] = $fieldLabels[$field] ?? $field; } $data[] = $headers; // 添加数据行 foreach ($orders as $order) { $row = []; foreach ($fields as $field) { $value = $this->getFieldValue($order, $field); $row[] = $value; } $data[] = $row; } return $data; } /** * 获取字段值 * * @param TransferOrder $order * @param string $field * @return mixed */ protected function getFieldValue(TransferOrder $order, string $field) { switch ($field) { case 'type': return TransferType::from($order->type)->getDescription(); case 'status': return TransferStatus::from($order->status)->getDescription(); case 'transfer_app_title': return $order->transferApp->title ?? ''; case 'created_at': case 'processed_at': case 'completed_at': return $order->{$field} ? $order->{$field}->format('Y-m-d H:i:s') : ''; default: return $order->{$field} ?? ''; } } /** * 导出CSV * * @param array $data * @param string $filename * @return \Illuminate\Http\Response */ protected function exportCsv(array $data, string $filename) { $output = fopen('php://temp', 'w'); foreach ($data as $row) { fputcsv($output, $row); } rewind($output); $csv = stream_get_contents($output); fclose($output); return Response::make($csv, 200, [ 'Content-Type' => 'text/csv', 'Content-Disposition' => 'attachment; filename="' . $filename . '.csv"', ]); } /** * 导出Excel(简化版,实际项目中建议使用PhpSpreadsheet) * * @param array $data * @param string $filename * @return \Illuminate\Http\Response */ protected function exportExcel(array $data, string $filename) { // 简化的Excel导出(实际是CSV格式但扩展名为xlsx) return $this->exportCsv($data, $filename); } /** * 获取导出URL * * @return string */ protected function getExportUrl(): string { return admin_url('transfer/orders/export'); } }