ActivityController.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. namespace App\Module\Activity\AdminControllers;
  3. use App\Module\Activity\AdminControllers\Actions\CloseActivityAction;
  4. use App\Module\Activity\AdminControllers\Actions\DuplicateActivityAction;
  5. use App\Module\Activity\AdminControllers\Actions\EndActivityAction;
  6. use App\Module\Activity\AdminControllers\Actions\StartActivityAction;
  7. use App\Module\Activity\Enums\ACTIVITY_STATUS;
  8. use App\Module\Activity\Enums\ACTIVITY_TYPE;
  9. use App\Module\Activity\Repositorys\ActivityConfigRepository;
  10. use Dcat\Admin\Form;
  11. use Dcat\Admin\Grid;
  12. use Dcat\Admin\Show;
  13. use Dcat\Admin\Http\Controllers\AdminController;
  14. use Dcat\Admin\Widgets\Card;
  15. use Dcat\Admin\Widgets\Table;
  16. /**
  17. * 活动管理控制器
  18. */
  19. class ActivityController extends AdminController
  20. {
  21. /**
  22. * 标题
  23. *
  24. * @return string
  25. */
  26. protected function title()
  27. {
  28. return '活动管理';
  29. }
  30. /**
  31. * 创建表格
  32. *
  33. * @return Grid
  34. */
  35. protected function grid()
  36. {
  37. return Grid::make(new ActivityConfigRepository(), function (Grid $grid) {
  38. $grid->column('id', 'ID')->sortable();
  39. $grid->column('name', '活动名称');
  40. $grid->column('type', '活动类型')->display(function ($type) {
  41. return ACTIVITY_TYPE::getName($type);
  42. });
  43. $grid->column('start_time', '开始时间')->sortable();
  44. $grid->column('end_time', '结束时间')->sortable();
  45. $grid->column('status', '状态')->display(function ($status) {
  46. return ACTIVITY_STATUS::getName($status);
  47. })->label([
  48. ACTIVITY_STATUS::NOT_STARTED => 'default',
  49. ACTIVITY_STATUS::IN_PROGRESS => 'success',
  50. ACTIVITY_STATUS::ENDED => 'warning',
  51. ACTIVITY_STATUS::CLOSED => 'danger',
  52. ]);
  53. $grid->column('display_order', '显示顺序')->sortable();
  54. $grid->column('reward_group_id', '奖励组ID');
  55. $grid->column('reward_group_code', '奖励组编码');
  56. $grid->column('created_at', '创建时间');
  57. $grid->column('updated_at', '更新时间');
  58. $grid->filter(function (Grid\Filter $filter) {
  59. $filter->equal('id', 'ID');
  60. $filter->like('name', '活动名称');
  61. $filter->equal('type', '活动类型')->select(ACTIVITY_TYPE::getAll());
  62. $filter->equal('status', '状态')->select(ACTIVITY_STATUS::getAll());
  63. $filter->between('start_time', '开始时间')->datetime();
  64. $filter->between('end_time', '结束时间')->datetime();
  65. });
  66. // 使用 RowAction 类添加行操作按钮
  67. $grid->actions(function (Grid\Displayers\Actions $actions) {
  68. // 添加复制按钮
  69. $actions->append(new DuplicateActivityAction());
  70. // 添加状态变更按钮(这些按钮会根据当前状态自动显示或隐藏)
  71. $actions->append(new StartActivityAction());
  72. $actions->append(new EndActivityAction());
  73. $actions->append(new CloseActivityAction());
  74. });
  75. });
  76. }
  77. /**
  78. * 创建详情页
  79. *
  80. * @param mixed $id
  81. * @return Show
  82. */
  83. protected function detail($id)
  84. {
  85. return Show::make($id, new ActivityConfigRepository(), function (Show $show) {
  86. $show->field('id', 'ID');
  87. $show->field('name', '活动名称');
  88. $show->field('type', '活动类型')->as(function ($type) {
  89. return ACTIVITY_TYPE::getName($type);
  90. });
  91. $show->field('description', '活动描述');
  92. $show->field('start_time', '开始时间');
  93. $show->field('end_time', '结束时间');
  94. $show->field('status', '状态')->as(function ($status) {
  95. return ACTIVITY_STATUS::getName($status);
  96. });
  97. $show->field('display_order', '显示顺序');
  98. $show->field('icon', '活动图标')->image();
  99. $show->field('banner', '活动横幅')->image();
  100. $show->field('reward_group_id', '奖励组ID');
  101. $show->field('reward_group_code', '奖励组编码');
  102. $show->field('config_params', '配置参数')->json();
  103. $show->field('created_at', '创建时间');
  104. $show->field('updated_at', '更新时间');
  105. // 显示活动条件
  106. $show->divider();
  107. $show->field('条件')->as(function () {
  108. $conditions = $this->conditions()->get();
  109. if ($conditions->isEmpty()) {
  110. return '无条件';
  111. }
  112. $headers = ['ID', '条件类型', '参与条件', '完成条件', '显示顺序'];
  113. $rows = [];
  114. foreach ($conditions as $condition) {
  115. $rows[] = [
  116. $condition->id,
  117. $condition->getConditionTypeName(),
  118. $condition->is_participation_condition ? '是' : '否',
  119. $condition->is_completion_condition ? '是' : '否',
  120. $condition->display_order
  121. ];
  122. }
  123. return Card::make(
  124. Table::make($headers, $rows)
  125. );
  126. });
  127. // 显示奖励信息
  128. $show->divider();
  129. $show->field('奖励信息')->as(function () {
  130. if (empty($this->reward_group_id) && empty($this->reward_group_code)) {
  131. return '未配置奖励';
  132. }
  133. $rewardInfo = '奖励组ID: ' . ($this->reward_group_id ?? '无') . '<br>';
  134. $rewardInfo .= '奖励组编码: ' . ($this->reward_group_code ?? '无') . '<br>';
  135. // 这里可以调用奖励组服务获取更详细的奖励信息
  136. // 由于没有实际的奖励组服务,这里只返回基本信息
  137. return $rewardInfo;
  138. })->unescape();
  139. });
  140. }
  141. /**
  142. * 创建表单
  143. *
  144. * @return Form
  145. */
  146. protected function form()
  147. {
  148. return Form::make(new ActivityConfigRepository(), function (Form $form) {
  149. $form->display('id', 'ID');
  150. $form->text('name', '活动名称')->required();
  151. $form->select('type', '活动类型')->options(ACTIVITY_TYPE::getAll())->required();
  152. $form->textarea('description', '活动描述');
  153. $form->datetime('start_time', '开始时间')->required();
  154. $form->datetime('end_time', '结束时间')->required();
  155. $form->select('status', '状态')->options(ACTIVITY_STATUS::getAll())->default(ACTIVITY_STATUS::NOT_STARTED);
  156. $form->number('display_order', '显示顺序')->default(0);
  157. $form->image('icon', '活动图标')->autoUpload();
  158. $form->image('banner', '活动横幅')->autoUpload();
  159. // 奖励组选择
  160. $form->divider('奖励配置');
  161. $form->number('reward_group_id', '奖励组ID')->help('填写奖励组ID或奖励组编码,两者选其一即可');
  162. $form->text('reward_group_code', '奖励组编码')->help('填写奖励组ID或奖励组编码,两者选其一即可');
  163. // 活动条件
  164. $form->divider('活动条件');
  165. $form->hasMany('conditions', '条件', function (Form\NestedForm $form) {
  166. $form->select('condition_type', '条件类型')->options(\App\Module\Activity\Enums\CONDITION_TYPE::getAll())->required();
  167. $form->textarea('condition_params', '条件参数')->help('JSON格式,根据条件类型填写不同的参数');
  168. $form->switch('is_participation_condition', '参与条件')->default(false);
  169. $form->switch('is_completion_condition', '完成条件')->default(false);
  170. $form->number('display_order', '显示顺序')->default(0);
  171. });
  172. // 高级配置
  173. $form->divider('高级配置');
  174. $form->textarea('config_params', '配置参数')->help('JSON格式,用于存储活动特定的配置参数');
  175. $form->display('created_at', '创建时间');
  176. $form->display('updated_at', '更新时间');
  177. });
  178. }
  179. }