UrsPartnerDividendController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. namespace App\Module\UrsPromotion\AdminControllers;
  3. use App\Module\UrsPromotion\Models\UrsPartnerDividendRecord;
  4. use App\Module\UrsPromotion\Models\UrsPartnerDividendDetail;
  5. use App\Module\UrsPromotion\Repositories\UrsPartnerDividendRepository;
  6. use App\Module\UrsPromotion\Services\UrsPartnerDividendService;
  7. use UCore\DcatAdmin\AdminController;
  8. use UCore\DcatAdmin\Helper\GridHelper;
  9. use UCore\DcatAdmin\Helper\ShowHelper;
  10. use UCore\DcatAdmin\Helper\FilterHelper;
  11. use Dcat\Admin\Grid;
  12. use Dcat\Admin\Show;
  13. use Dcat\Admin\Http\Controllers\AdminController as BaseAdminController;
  14. use Illuminate\Http\Request;
  15. /**
  16. * URS合伙人分红管理控制器
  17. *
  18. * @AdminController(
  19. * title="合伙人分红管理",
  20. * permission="urs-promotion.partner-dividend"
  21. * )
  22. *
  23. * @AdminRoute(
  24. * uri="urs-promotion/partner-dividend",
  25. * name="urs-promotion.partner-dividend"
  26. * )
  27. */
  28. class UrsPartnerDividendController extends AdminController
  29. {
  30. /**
  31. * 仓库实例
  32. */
  33. protected UrsPartnerDividendRepository $repository;
  34. /**
  35. * 构造函数
  36. */
  37. public function __construct()
  38. {
  39. $this->repository = new UrsPartnerDividendRepository();
  40. }
  41. /**
  42. * 列表页面
  43. */
  44. protected function grid(): Grid
  45. {
  46. return Grid::make($this->repository, function (Grid $grid) {
  47. // 基础配置
  48. $grid->column('id', 'ID')->sortable();
  49. $grid->column('dividend_date', '分红日期')->sortable();
  50. $grid->column('total_fee_amount', '总手续费')->display(function ($value) {
  51. return number_format($value, 4) . ' 钻石';
  52. })->sortable();
  53. $grid->column('dividend_amount', '分红金额')->display(function ($value) {
  54. return number_format($value, 4) . ' 钻石';
  55. })->sortable();
  56. $grid->column('partner_count', '合伙人数')->sortable();
  57. $grid->column('per_partner_amount', '人均分红')->display(function ($value) {
  58. return number_format($value, 4) . ' 钻石';
  59. });
  60. // 状态显示
  61. $grid->column('status', '状态')->display(function ($status) {
  62. $colors = [
  63. 'pending' => 'warning',
  64. 'processing' => 'info',
  65. 'completed' => 'success',
  66. 'failed' => 'danger'
  67. ];
  68. $names = UrsPartnerDividendRecord::getStatuses();
  69. $color = $colors[$status] ?? 'secondary';
  70. $name = $names[$status] ?? '未知';
  71. return "<span class='badge badge-{$color}'>{$name}</span>";
  72. });
  73. // 转账应用
  74. $grid->column('transferApp.title', '转账应用');
  75. // 时间显示
  76. GridHelper::dateTimeColumns($grid, ['created_at']);
  77. // 筛选器
  78. $grid->filter(function (Grid\Filter $filter) {
  79. FilterHelper::dateRangeFilter($filter, 'dividend_date', '分红日期');
  80. $filter->equal('status', '状态')->select(UrsPartnerDividendRecord::getStatuses());
  81. $filter->equal('transfer_app_id', '转账应用')->select(
  82. \App\Module\Transfer\Models\TransferApp::pluck('title', 'id')->toArray()
  83. );
  84. });
  85. // 操作配置
  86. $grid->actions(function (Grid\Displayers\Actions $actions) {
  87. $actions->disableEdit();
  88. $actions->disableDelete();
  89. });
  90. $grid->disableCreateButton();
  91. $grid->disableBatchActions();
  92. // 工具栏
  93. $grid->tools(function (Grid\Tools $tools) {
  94. $tools->append('<a href="' . admin_route('urs-promotion.partner-dividend.execute') . '" class="btn btn-primary btn-sm">
  95. <i class="fa fa-play"></i> 执行分红
  96. </a>');
  97. $tools->append('<a href="' . admin_route('urs-promotion.partner-dividend.statistics') . '" class="btn btn-info btn-sm">
  98. <i class="fa fa-chart-bar"></i> 分红统计
  99. </a>');
  100. });
  101. // 排序
  102. $grid->model()->orderBy('dividend_date', 'desc');
  103. });
  104. }
  105. /**
  106. * 详情页面
  107. */
  108. protected function detail($id): Show
  109. {
  110. return Show::make($id, $this->repository, function (Show $show) {
  111. // 基础信息
  112. $show->field('id', 'ID');
  113. $show->field('dividend_date', '分红日期');
  114. $show->field('total_fee_amount', '总手续费')->as(function ($value) {
  115. return number_format($value, 4) . ' 钻石';
  116. });
  117. $show->field('dividend_amount', '分红金额')->as(function ($value) {
  118. return number_format($value, 4) . ' 钻石';
  119. });
  120. $show->field('partner_count', '合伙人数');
  121. $show->field('per_partner_amount', '人均分红')->as(function ($value) {
  122. return number_format($value, 4) . ' 钻石';
  123. });
  124. $show->field('status', '状态')->as(function ($status) {
  125. return UrsPartnerDividendRecord::getStatuses()[$status] ?? '未知';
  126. });
  127. $show->field('transferApp.title', '转账应用');
  128. $show->field('error_message', '错误信息');
  129. ShowHelper::dateTimeFields($show, ['created_at', 'updated_at']);
  130. // 分红详情
  131. $show->relation('details', '分红详情', function ($model) {
  132. $grid = new Grid(new UrsPartnerDividendDetail());
  133. $grid->setResource('urs-promotion/partner-dividend-details');
  134. $grid->column('user_id', '用户ID');
  135. $grid->column('user.username', '用户名');
  136. $grid->column('urs_user_id', 'URS用户ID');
  137. $grid->column('talent_level_name', '达人等级');
  138. $grid->column('dividend_amount', '分红金额')->display(function ($value) {
  139. return number_format($value, 4) . ' 钻石';
  140. });
  141. $grid->column('status', '状态')->display(function ($status) {
  142. $colors = [
  143. 'pending' => 'warning',
  144. 'completed' => 'success',
  145. 'failed' => 'danger'
  146. ];
  147. $names = UrsPartnerDividendDetail::getStatuses();
  148. $color = $colors[$status] ?? 'secondary';
  149. $name = $names[$status] ?? '未知';
  150. return "<span class='badge badge-{$color}'>{$name}</span>";
  151. });
  152. $grid->column('transfer_order_id', '转账订单ID');
  153. $grid->column('error_message', '错误信息');
  154. GridHelper::dateTimeColumns($grid, ['created_at']);
  155. $grid->model()->where('dividend_record_id', $model->id);
  156. $grid->disableActions();
  157. $grid->disableCreateButton();
  158. $grid->disableBatchActions();
  159. $grid->disableFilter();
  160. return $grid;
  161. });
  162. });
  163. }
  164. /**
  165. * 执行分红页面
  166. */
  167. public function execute(Request $request)
  168. {
  169. if ($request->isMethod('post')) {
  170. $date = $request->input('date');
  171. $force = $request->input('force', false);
  172. // 验证日期
  173. if (!$date || !strtotime($date)) {
  174. return response()->json([
  175. 'status' => false,
  176. 'message' => '请选择有效的分红日期'
  177. ]);
  178. }
  179. // 检查是否已经分红
  180. if (!$force && UrsPartnerDividendRecord::isDividendProcessed($date)) {
  181. return response()->json([
  182. 'status' => false,
  183. 'message' => "日期 {$date} 的分红已经处理过了"
  184. ]);
  185. }
  186. // 执行分红
  187. $result = UrsPartnerDividendService::executeDailyDividend($date);
  188. return response()->json([
  189. 'status' => $result['success'],
  190. 'message' => $result['message'],
  191. 'data' => $result['data'] ?? null
  192. ]);
  193. }
  194. // 显示执行页面
  195. $content = admin_view('urs-promotion::partner-dividend.execute');
  196. return $content;
  197. }
  198. /**
  199. * 分红统计页面
  200. */
  201. public function statistics()
  202. {
  203. $stats = UrsPartnerDividendService::getDividendStatistics();
  204. $partnerList = UrsPartnerDividendService::getPartnerList();
  205. $recentHistory = UrsPartnerDividendService::getDividendHistory(null, null, 10);
  206. $content = admin_view('urs-promotion::partner-dividend.statistics', [
  207. 'stats' => $stats['data'] ?? [],
  208. 'partners' => $partnerList['data'] ?? [],
  209. 'history' => $recentHistory['data'] ?? []
  210. ]);
  211. return $content;
  212. }
  213. }