column('id', 'ID')->sortable(); $grid->column('keyname', '应用标识')->copyable(); $grid->column('title', '应用名称')->limit(20); $grid->column('description', '描述')->limit(30); $grid->column('out_id2', '开放接口ID'); $grid->column('out_id3', '三方平台ID'); $grid->column('currency_id', '货币类型')->using([ 1 => '金币', 2 => '钻石', 3 => '人民币', 4 => '美元', ])->label([ 1 => 'warning', 2 => 'success', 3 => 'danger', 4 => 'primary', ]); $grid->column('fund_id', '资金账户'); $grid->column('exchange_rate', '汇率')->display(function ($value) { return number_format($value, 4); }); // 手续费配置 $grid->column('fee_config', '手续费配置')->display(function () { $feeInfo = []; if ($this->fee_in_rate > 0 || $this->fee_in_min > 0) { $feeInfo[] = "转入: " . number_format($this->fee_in_rate * 100, 2) . "%"; } if ($this->fee_out_rate > 0 || $this->fee_out_min > 0) { $feeInfo[] = "转出: " . number_format($this->fee_out_rate * 100, 2) . "%"; } return empty($feeInfo) ? '无手续费' : implode('
', $feeInfo); }); $grid->column('is_enabled', '启用状态')->switch(); $grid->column('allow_transfer_in', '允许转入')->switch(); $grid->column('allow_transfer_out', '允许转出')->switch(); // 运行模式 $grid->column('mode', '运行模式')->display(function () { $isEmpty = empty($this->order_callback_url) && empty($this->order_in_info_url) && empty($this->order_out_create_url) && empty($this->order_out_info_url); return $isEmpty ? '农场内部' : '外部API'; })->label([ '农场内部' => 'success', '外部API' => 'primary', ]); // 支持功能 $grid->column('features', '支持功能')->display(function () { $features = []; if ($this->allow_transfer_in && $this->fund_in_uid > 0) $features[] = '转入'; if ($this->allow_transfer_out && $this->fund_to_uid > 0) $features[] = '转出'; if (!empty($this->order_callback_url)) $features[] = '回调'; return implode(', ', $features); }); $grid->column('created_at', '创建时间')->sortable(); $grid->column('updated_at', '更新时间')->sortable(); // 筛选器 $grid->filter(function (Grid\Filter $filter) { $filter->like('keyname', '应用标识'); $filter->like('title', '应用名称'); $filter->equal('currency_id', '货币类型')->select([ 1 => '金币', 2 => '钻石', 3 => '人民币', 4 => '美元', ]); $filter->equal('is_enabled', '启用状态')->select([ 1 => '启用', 0 => '禁用', ]); $filter->equal('allow_transfer_in', '允许转入')->select([ 1 => '允许', 0 => '禁止', ]); $filter->equal('allow_transfer_out', '允许转出')->select([ 1 => '允许', 0 => '禁止', ]); }); // 操作按钮 $grid->actions(function (Grid\Displayers\Actions $actions) { $actions->disableDelete(); // 禁用删除 // 添加测试连接按钮 $isEmpty = empty($this->order_callback_url) && empty($this->order_in_info_url) && empty($this->order_out_create_url) && empty($this->order_out_info_url); if (!$isEmpty) { $actions->append('测试连接'); } }); // 批量操作 $grid->batchActions(function (Grid\Tools\BatchActions $batch) { $batch->add(new \App\Module\Transfer\AdminControllers\Tools\EnableAppTool()); $batch->add(new \App\Module\Transfer\AdminControllers\Tools\DisableAppTool()); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append('刷新统计'); }); } /** * 配置Show详情 */ public static function show(Show $show): void { $show->field('id', 'ID'); $show->field('keyname', '应用标识'); $show->field('title', '应用名称'); $show->field('description', '描述'); $show->divider(); $show->field('out_id2', '开放接口ID'); $show->field('out_id3', '三方平台ID'); $show->divider(); $show->field('currency_id', '货币类型')->using([ 1 => '金币', 2 => '钻石', 3 => '人民币', 4 => '美元', ]); $show->field('fund_id', '资金账户类型'); $show->field('fund_to_uid', '转入目标账户'); $show->field('fund_in_uid', '转入来源账户'); $show->field('exchange_rate', '汇率')->as(function ($value) { return number_format($value, 4); }); $show->divider(); $show->field('fee_in_rate', '转入手续费率')->as(function ($value) { return number_format($value * 100, 2) . '%'; }); $show->field('fee_in_min', '转入最低手续费')->as(function ($value) { return number_format($value, 4); }); $show->field('fee_in_max', '转入最高手续费')->as(function ($value) { return $value > 0 ? number_format($value, 4) : '不限制'; }); $show->field('fee_out_rate', '转出手续费率')->as(function ($value) { return number_format($value * 100, 2) . '%'; }); $show->field('fee_out_min', '转出最低手续费')->as(function ($value) { return number_format($value, 4); }); $show->field('fee_out_max', '转出最高手续费')->as(function ($value) { return $value > 0 ? number_format($value, 4) : '不限制'; }); $show->field('fee_account_uid', '手续费收取账户')->as(function ($value) { return $value > 0 ? "UID: {$value}" : '默认账户(UID: 1)'; }); $show->divider(); $show->field('order_callback_url', '回调通知URL'); $show->field('order_in_info_url', '转入查询URL'); $show->field('order_out_create_url', '转出创建URL'); $show->field('order_out_info_url', '转出查询URL'); $show->divider(); $show->field('is_enabled', '启用状态')->using([1 => '启用', 0 => '禁用']); $show->field('allow_transfer_in', '允许转入')->using([1 => '允许', 0 => '禁止']); $show->field('allow_transfer_out', '允许转出')->using([1 => '允许', 0 => '禁止']); $show->field('mode', '运行模式')->as(function () { $isEmpty = empty($this->order_callback_url) && empty($this->order_in_info_url) && empty($this->order_out_create_url) && empty($this->order_out_info_url); return $isEmpty ? '农场内部模式' : '外部API模式'; }); $show->divider(); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 关联订单统计 $show->divider(); $show->field('orders_count', '总订单数')->as(function () { return \App\Module\Transfer\Models\TransferOrder::where('transfer_app_id', $this->id)->count(); }); $show->field('completed_orders', '成功订单')->as(function () { return \App\Module\Transfer\Models\TransferOrder::where('transfer_app_id', $this->id) ->where('status', TransferStatus::COMPLETED)->count(); }); $show->field('total_amount', '总金额')->as(function () { $amount = \App\Module\Transfer\Models\TransferOrder::where('transfer_app_id', $this->id)->sum('amount'); return number_format($amount, 2); }); $show->field('total_fee', '总手续费')->as(function () { $fee = \App\Module\Transfer\Models\TransferOrder::where('transfer_app_id', $this->id)->sum('fee_amount'); return number_format($fee, 4); }); } /** * 配置Form表单 */ public static function form(Form $form): void { $form->tab('基本信息', function (Form $form) { $form->text('keyname', '应用标识') ->required() ->creationRules('required|string|max:50|unique:' . (new TransferApp)->getTable() . ',keyname') ->updateRules('required|string|max:50|unique:' . (new TransferApp)->getTable() . ',keyname,{{id}}') ->help('唯一标识符,只能包含字母、数字、下划线'); $form->text('title', '应用名称') ->required() ->rules('required|string|max:100'); $form->textarea('description', '应用描述') ->rows(3) ->help('应用的详细描述信息'); }); $form->tab('外部应用配置', function (Form $form) { $form->number('out_id2', '开放接口ID') ->min(1) ->help('开放接口应用ID,用于API对接'); $form->number('out_id3', '三方平台ID') ->min(1) ->help('第三方平台应用ID,用于平台集成'); }); $form->tab('资金配置', function (Form $form) { $form->select('currency_id', '货币类型') ->options([ 1 => '金币', 2 => '钻石', 3 => '人民币', 4 => '美元', ]) ->required() ->help('选择使用的货币类型'); $form->number('fund_id', '资金账户类型') ->required() ->min(1) ->help('关联的资金账户类型ID'); $form->number('fund_to_uid', '转入目标账户') ->min(1) ->help('转入操作的目标账户UID'); $form->number('fund_in_uid', '转入来源账户') ->min(1) ->help('转入操作的来源账户UID'); $form->decimal('exchange_rate', '汇率') ->required() ->default(1.0000) ->help('汇率比例,外部应用金额:业务金额'); }); $form->tab('手续费配置', function (Form $form) { $form->divider('转入手续费设置'); $form->decimal('fee_in_rate', '转入手续费率') ->default(0.0000) ->help('转入手续费率,范围0-1,例如0.0050表示0.5%'); $form->decimal('fee_in_min', '转入最低手续费') ->default(0.0000) ->help('转入最低手续费金额,0表示无最低限制'); $form->decimal('fee_in_max', '转入最高手续费') ->default(0.0000) ->help('转入最高手续费金额,0表示无最高限制'); $form->divider('转出手续费设置'); $form->decimal('fee_out_rate', '转出手续费率') ->default(0.0000) ->help('转出手续费率,范围0-1,例如0.0100表示1.0%'); $form->decimal('fee_out_min', '转出最低手续费') ->default(0.0000) ->help('转出最低手续费金额,0表示无最低限制'); $form->decimal('fee_out_max', '转出最高手续费') ->default(0.0000) ->help('转出最高手续费金额,0表示无最高限制'); $form->divider('手续费账户设置'); $form->number('fee_account_uid', '手续费收取账户') ->default(1) ->help('手续费收取的账户UID,默认为1'); $form->display('fee_note', '说明') ->with(function () { return '手续费将从转账金额中扣除,转入时用户收到扣除手续费后的金额,转出时从用户账户额外扣除手续费'; }); }); $form->tab('API配置', function (Form $form) { $form->url('order_callback_url', '回调通知URL') ->help('结果通知API地址,为空则不发送通知'); $form->url('order_in_info_url', '转入查询URL') ->help('转入订单查询API地址,为空则不查询'); $form->url('order_out_create_url', '转出创建URL') ->help('转出订单创建API地址,为空则不创建'); $form->url('order_out_info_url', '转出查询URL') ->help('转出订单查询API地址,为空则不查询'); $form->display('api_note', '说明') ->with(function () { return '如果所有API地址都为空,系统将运行在农场内部模式'; }); }); $form->tab('状态设置', function (Form $form) { $form->switch('is_enabled', '启用状态') ->default(1) ->help('是否启用该应用'); $form->switch('allow_transfer_in', '允许转入') ->default(1) ->help('是否允许转入操作'); $form->switch('allow_transfer_out', '允许转出') ->default(1) ->help('是否允许转出操作'); }); // 保存前验证 $form->saving(function (Form $form) { // 验证应用标识符格式 if (!preg_match('/^[a-zA-Z0-9_]+$/', $form->keyname)) { return $form->response()->error('应用标识符格式无效'); } // 验证汇率 if ($form->exchange_rate <= 0) { return $form->response()->error('汇率必须大于0'); } // 验证手续费率 if ($form->fee_in_rate < 0 || $form->fee_in_rate > 1) { return $form->response()->error('转入手续费率必须在0-1之间'); } if ($form->fee_out_rate < 0 || $form->fee_out_rate > 1) { return $form->response()->error('转出手续费率必须在0-1之间'); } // 验证最低和最高手续费的关系 if ($form->fee_in_max > 0 && $form->fee_in_min > $form->fee_in_max) { return $form->response()->error('转入最低手续费不能大于最高手续费'); } if ($form->fee_out_max > 0 && $form->fee_out_min > $form->fee_out_max) { return $form->response()->error('转出最低手续费不能大于最高手续费'); } // 验证手续费账户 if ($form->fee_account_uid < 1) { return $form->response()->error('手续费收取账户UID必须大于0'); } }); } }