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');
}
});
}
}