| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- <?php
- namespace App\Module\Transfer\AdminControllers;
- use App\Module\Transfer\AdminControllers\Helper\TransferOrderHelper;
- use App\Module\Transfer\Models\TransferOrder;
- use App\Module\Transfer\Repositories\TransferOrderRepository;
- use App\Module\Transfer\Logics\TransferLogic;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Spatie\RouteAttributes\Attributes\Resource;
- use Spatie\RouteAttributes\Attributes\Post;
- use Spatie\RouteAttributes\Attributes\Get;
- use UCore\DcatAdmin\AdminController;
- /**
- * 划转订单管理控制器
- *
- * 路由注解:
- * - Resource: transfer/orders (订单管理,只读)
- * - 额外路由: 重试订单、手动完成、统计信息、导出
- */
- #[Resource('transfer/orders', names: 'admin.transfer.orders', except: ['create', 'store', 'edit', 'update', 'destroy'])]
- class TransferOrderController extends AdminController
- {
- /**
- * 页面标题
- */
- protected $title = '划转订单管理';
- /**
- * 模型类
- */
- protected $model = TransferOrder::class;
- /**
- * 仓库类
- */
- protected $repository = TransferOrderRepository::class;
- /**
- * 配置数据表格
- */
- protected function grid(): Grid
- {
- $grid = Grid::make(new TransferOrder(), function (Grid $grid) {
- // 使用辅助类配置表格
- TransferOrderHelper::grid($grid);
-
- // 设置每页显示数量
- $grid->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('<a class="btn btn-sm btn-outline-warning" href="javascript:void(0)" onclick="retryOrder('.$id.')">重试订单</a>');
- }
- if ($order && $order->isTransferOut() && !$order->isFinalStatus()) {
- $tools->append('<a class="btn btn-sm btn-outline-success" href="javascript:void(0)" onclick="manualComplete('.$id.')">手动完成</a>');
- }
- });
- });
- 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()
- ]);
- }
- }
- }
|