TransferAppHelper.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. namespace App\Module\Transfer\AdminControllers\Helper;
  3. use App\Module\Transfer\Models\TransferApp;
  4. use App\Module\Transfer\Enums\TransferStatus;
  5. use Dcat\Admin\Grid;
  6. use Dcat\Admin\Show;
  7. use Dcat\Admin\Form;
  8. /**
  9. * 划转应用管理辅助类
  10. */
  11. class TransferAppHelper
  12. {
  13. /**
  14. * 配置Grid表格
  15. */
  16. public static function grid(Grid $grid): void
  17. {
  18. $grid->column('id', 'ID')->sortable();
  19. $grid->column('keyname', '应用标识')->copyable();
  20. $grid->column('title', '应用名称')->limit(20);
  21. $grid->column('description', '描述')->limit(30);
  22. $grid->column('out_id', '外部应用ID');
  23. $grid->column('out_id2', '开放接口ID');
  24. $grid->column('out_id3', '三方平台ID');
  25. $grid->column('currency_id', '货币类型')->using([
  26. 1 => '金币',
  27. 2 => '钻石',
  28. 3 => '人民币',
  29. 4 => '美元',
  30. ])->label([
  31. 1 => 'warning',
  32. 2 => 'success',
  33. 3 => 'danger',
  34. 4 => 'primary',
  35. ]);
  36. $grid->column('fund_id', '资金账户');
  37. $grid->column('exchange_rate', '汇率')->display(function ($value) {
  38. return number_format($value, 4);
  39. });
  40. $grid->column('is_enabled', '状态')->switch();
  41. // 运行模式
  42. $grid->column('mode', '运行模式')->display(function () {
  43. return $this->isInternalMode() ? '农场内部' : '外部API';
  44. })->label([
  45. '农场内部' => 'success',
  46. '外部API' => 'primary',
  47. ]);
  48. // 支持功能
  49. $grid->column('features', '支持功能')->display(function () {
  50. $features = [];
  51. if ($this->supportsTransferIn()) $features[] = '转入';
  52. if ($this->supportsTransferOut()) $features[] = '转出';
  53. if ($this->supportsCallback()) $features[] = '回调';
  54. return implode(', ', $features);
  55. });
  56. $grid->column('created_at', '创建时间')->sortable();
  57. $grid->column('updated_at', '更新时间')->sortable();
  58. // 筛选器
  59. $grid->filter(function (Grid\Filter $filter) {
  60. $filter->like('keyname', '应用标识');
  61. $filter->like('title', '应用名称');
  62. $filter->equal('currency_id', '货币类型')->select([
  63. 1 => '金币',
  64. 2 => '钻石',
  65. 3 => '人民币',
  66. 4 => '美元',
  67. ]);
  68. $filter->equal('is_enabled', '状态')->select([
  69. 1 => '启用',
  70. 0 => '禁用',
  71. ]);
  72. });
  73. // 操作按钮
  74. $grid->actions(function (Grid\Displayers\Actions $actions) {
  75. $actions->disableDelete(); // 禁用删除
  76. // 添加测试连接按钮
  77. if (!$this->isInternalMode()) {
  78. $actions->append('<a href="javascript:void(0)" class="btn btn-xs btn-outline-info test-connection" data-id="'.$this->id.'">测试连接</a>');
  79. }
  80. });
  81. // 批量操作
  82. $grid->batchActions(function (Grid\Tools\BatchActions $batch) {
  83. $batch->add('启用应用', new \App\Module\Transfer\AdminControllers\Tools\EnableAppTool());
  84. $batch->add('禁用应用', new \App\Module\Transfer\AdminControllers\Tools\DisableAppTool());
  85. });
  86. // 工具栏
  87. $grid->tools(function (Grid\Tools $tools) {
  88. $tools->append('<a href="javascript:void(0)" class="btn btn-sm btn-success" onclick="refreshStats()">刷新统计</a>');
  89. });
  90. }
  91. /**
  92. * 配置Show详情
  93. */
  94. public static function show(Show $show): void
  95. {
  96. $show->field('id', 'ID');
  97. $show->field('keyname', '应用标识');
  98. $show->field('title', '应用名称');
  99. $show->field('description', '描述');
  100. $show->divider('外部应用配置');
  101. $show->field('out_id', '外部应用ID');
  102. $show->field('out_id2', '开放接口ID');
  103. $show->field('out_id3', '三方平台ID');
  104. $show->divider('资金配置');
  105. $show->field('currency_id', '货币类型')->using([
  106. 1 => '金币',
  107. 2 => '钻石',
  108. 3 => '人民币',
  109. 4 => '美元',
  110. ]);
  111. $show->field('fund_id', '资金账户类型');
  112. $show->field('fund_to_uid', '转入目标账户');
  113. $show->field('fund_in_uid', '转入来源账户');
  114. $show->field('exchange_rate', '汇率')->as(function ($value) {
  115. return number_format($value, 4);
  116. });
  117. $show->divider('API配置');
  118. $show->field('order_callback_url', '回调通知URL');
  119. $show->field('order_in_info_url', '转入查询URL');
  120. $show->field('order_out_create_url', '转出创建URL');
  121. $show->field('order_out_info_url', '转出查询URL');
  122. $show->divider('状态信息');
  123. $show->field('is_enabled', '启用状态')->using([1 => '启用', 0 => '禁用']);
  124. $show->field('mode', '运行模式')->as(function () {
  125. return $this->isInternalMode() ? '农场内部模式' : '外部API模式';
  126. });
  127. $show->divider('时间信息');
  128. $show->field('created_at', '创建时间');
  129. $show->field('updated_at', '更新时间');
  130. // 关联订单统计
  131. $show->divider('订单统计');
  132. $show->field('orders_count', '总订单数')->as(function () {
  133. return $this->orders()->count();
  134. });
  135. $show->field('completed_orders', '成功订单')->as(function () {
  136. return $this->orders()->where('status', TransferStatus::COMPLETED)->count();
  137. });
  138. $show->field('total_amount', '总金额')->as(function () {
  139. return number_format($this->orders()->sum('amount'), 2);
  140. });
  141. }
  142. /**
  143. * 配置Form表单
  144. */
  145. public static function form(Form $form): void
  146. {
  147. $form->tab('基本信息', function (Form $form) {
  148. $form->text('keyname', '应用标识')
  149. ->required()
  150. ->rules('required|string|max:50|unique:transfer_apps,keyname,' . request()->route('id'))
  151. ->help('唯一标识符,只能包含字母、数字、下划线');
  152. $form->text('title', '应用名称')
  153. ->required()
  154. ->rules('required|string|max:100');
  155. $form->textarea('description', '应用描述')
  156. ->rows(3)
  157. ->help('应用的详细描述信息');
  158. });
  159. $form->tab('外部应用配置', function (Form $form) {
  160. $form->number('out_id', '外部应用ID')
  161. ->required()
  162. ->min(1)
  163. ->help('主要外部应用ID,必填');
  164. $form->number('out_id2', '开放接口ID')
  165. ->min(1)
  166. ->help('开放接口应用ID,可选');
  167. $form->number('out_id3', '三方平台ID')
  168. ->min(1)
  169. ->help('第三方平台应用ID,可选');
  170. });
  171. $form->tab('资金配置', function (Form $form) {
  172. $form->select('currency_id', '货币类型')
  173. ->options([
  174. 1 => '金币',
  175. 2 => '钻石',
  176. 3 => '人民币',
  177. 4 => '美元',
  178. ])
  179. ->required()
  180. ->help('选择使用的货币类型');
  181. $form->number('fund_id', '资金账户类型')
  182. ->required()
  183. ->min(1)
  184. ->help('关联的资金账户类型ID');
  185. $form->number('fund_to_uid', '转入目标账户')
  186. ->min(1)
  187. ->help('转入操作的目标账户UID');
  188. $form->number('fund_in_uid', '转入来源账户')
  189. ->min(1)
  190. ->help('转入操作的来源账户UID');
  191. $form->decimal('exchange_rate', '汇率')
  192. ->required()
  193. ->default(1.0000)
  194. ->help('汇率比例,钱包金额:业务金额');
  195. });
  196. $form->tab('API配置', function (Form $form) {
  197. $form->url('order_callback_url', '回调通知URL')
  198. ->help('结果通知API地址,为空则不发送通知');
  199. $form->url('order_in_info_url', '转入查询URL')
  200. ->help('转入订单查询API地址,为空则不查询');
  201. $form->url('order_out_create_url', '转出创建URL')
  202. ->help('转出订单创建API地址,为空则不创建');
  203. $form->url('order_out_info_url', '转出查询URL')
  204. ->help('转出订单查询API地址,为空则不查询');
  205. $form->display('api_note', '说明')
  206. ->with('如果所有API地址都为空,系统将运行在农场内部模式');
  207. });
  208. $form->tab('状态设置', function (Form $form) {
  209. $form->switch('is_enabled', '启用状态')
  210. ->default(1)
  211. ->help('是否启用该应用');
  212. });
  213. // 保存前验证
  214. $form->saving(function (Form $form) {
  215. // 验证应用标识符格式
  216. if (!preg_match('/^[a-zA-Z0-9_]+$/', $form->keyname)) {
  217. return $form->response()->error('应用标识符格式无效');
  218. }
  219. // 验证汇率
  220. if ($form->exchange_rate <= 0) {
  221. return $form->response()->error('汇率必须大于0');
  222. }
  223. });
  224. }
  225. }