GameRewardItemController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. namespace App\Module\Game\AdminControllers;
  3. use App\Module\Fund\Models\FundCurrencyModel;
  4. use App\Module\Game\Enums\REWARD_TYPE;
  5. use App\Module\Game\Models\GameRewardGroup;
  6. use App\Module\Game\Models\GameRewardItem;
  7. use App\Module\Game\Repositorys\GameRewardItemRepository;
  8. use App\Module\GameItems\Models\Item;
  9. use Dcat\Admin\Form;
  10. use Dcat\Admin\Grid;
  11. use Dcat\Admin\Show;
  12. use Dcat\Admin\Http\Controllers\AdminController;
  13. use Dcat\Admin\Layout\Content;
  14. use Dcat\Admin\Widgets\Card;
  15. use Spatie\RouteAttributes\Attributes\Resource;
  16. /**
  17. * 奖励项管理控制器
  18. */
  19. #[Resource('game-reward-items', names: 'dcat.admin.game-reward-items')]
  20. class GameRewardItemController extends AdminController
  21. {
  22. /**
  23. * 标题
  24. *
  25. * @return string
  26. */
  27. protected function title()
  28. {
  29. return '奖励项管理';
  30. }
  31. /**
  32. * 首页
  33. *
  34. * @param Content $content
  35. * @return Content
  36. */
  37. public function index(Content $content)
  38. {
  39. // 获取奖励组ID
  40. $groupId = request()->get('group_id');
  41. // 如果有奖励组ID,则显示该奖励组的信息
  42. if ($groupId) {
  43. $group = GameRewardGroup::find($groupId);
  44. if ($group) {
  45. $content->body(new Card(
  46. '奖励组信息',
  47. "<p><strong>ID:</strong> {$group->id}</p>" .
  48. "<p><strong>名称:</strong> {$group->name}</p>" .
  49. "<p><strong>编码:</strong> {$group->code}</p>" .
  50. "<p><strong>描述:</strong> {$group->description}</p>" .
  51. "<p><strong>随机发放:</strong> " . ($group->is_random ? '是' : '否') . "</p>" .
  52. ($group->is_random ? "<p><strong>随机数量:</strong> {$group->random_count}</p>" : '')
  53. ));
  54. }
  55. }
  56. return $content
  57. ->title($this->title())
  58. ->description('管理奖励项')
  59. ->body($this->grid());
  60. }
  61. /**
  62. * 创建表格
  63. *
  64. * @return Grid
  65. */
  66. protected function grid()
  67. {
  68. return Grid::make(new GameRewardItemRepository(), function (Grid $grid) {
  69. // 获取请求中的奖励组ID
  70. $groupId = request()->get('group_id');
  71. // 如果有奖励组ID,则只显示该奖励组的奖励项
  72. if ($groupId) {
  73. $grid->model()->where('group_id', $groupId);
  74. // 添加返回按钮
  75. $grid->tools(function (Grid\Tools $tools) use ($groupId) {
  76. $tools->append('<a href="'.admin_url('game-reward-groups/'.$groupId.'/edit').'" class="btn btn-sm btn-default">
  77. <i class="fa fa-arrow-left"></i> 返回奖励组
  78. </a>');
  79. });
  80. // 添加创建按钮
  81. $grid->tools(function (Grid\Tools $tools) use ($groupId) {
  82. $tools->append('<a href="'.admin_url('game-reward-items/create?group_id='.$groupId).'" class="btn btn-sm btn-success">
  83. <i class="fa fa-plus"></i> 添加奖励项
  84. </a>');
  85. });
  86. } else {
  87. // 如果没有奖励组ID,则添加奖励组筛选
  88. $grid->filter(function (Grid\Filter $filter) {
  89. $filter->equal('id', 'ID');
  90. $filter->equal('group_id', '奖励组')->select(
  91. GameRewardGroup::pluck('name', 'id')
  92. );
  93. $filter->equal('reward_type', '奖励类型')->select(REWARD_TYPE::getAll());
  94. $filter->equal('target_id', '目标ID');
  95. $filter->equal('is_guaranteed', '必中')->select([0 => '否', 1 => '是']);
  96. });
  97. }
  98. $grid->column('id', 'ID')->sortable();
  99. $grid->column('group_id', '奖励组')->display(function ($groupId) {
  100. $group = GameRewardGroup::find($groupId);
  101. return $group ? "{$group->name} (ID: {$groupId})" : "未知 ({$groupId})";
  102. });
  103. $grid->column('reward_type', '奖励类型')->display(function ($type) {
  104. return REWARD_TYPE::getName($type);
  105. });
  106. $grid->column('target_id', '目标')->display(function ($targetId) {
  107. // 获取当前行的奖励类型
  108. $rewardType = $this->getAttribute('reward_type');
  109. // 根据奖励类型显示不同的目标信息
  110. switch ($rewardType) {
  111. case REWARD_TYPE::ITEM->value:
  112. $item = Item::find($targetId);
  113. return $item ? "{$item->name} (ID: {$targetId})" : "物品 (ID: {$targetId})";
  114. case REWARD_TYPE::CURRENCY->value:
  115. $currency = FundCurrencyModel::find($targetId);
  116. return $currency ? "{$currency->name} (ID: {$targetId})" : "货币 (ID: {$targetId})";
  117. case REWARD_TYPE::PET_EXP->value:
  118. return "宠物经验 (宠物ID: {$targetId})";
  119. case REWARD_TYPE::PET_ENERGY->value:
  120. return "宠物体力 (宠物ID: {$targetId})";
  121. case REWARD_TYPE::OTHER->value:
  122. return "其他奖励 (ID: {$targetId})";
  123. default:
  124. return "未知奖励类型 (ID: {$targetId})";
  125. }
  126. });
  127. $grid->column('param1', '参数1');
  128. $grid->column('param2', '参数2');
  129. $grid->column('quantity', '数量');
  130. $grid->column('weight', '权重');
  131. $grid->column('is_guaranteed', '必中')->switch();
  132. $grid->column('created_at', '创建时间');
  133. $grid->column('updated_at', '更新时间');
  134. });
  135. }
  136. /**
  137. * 创建详情页
  138. *
  139. * @param mixed $id
  140. * @return Show
  141. */
  142. protected function detail($id)
  143. {
  144. return Show::make($id, new GameRewardItemRepository(), function (Show $show) {
  145. $show->field('id', 'ID');
  146. $show->field('group_id', '奖励组')->as(function ($groupId) {
  147. $group = GameRewardGroup::find($groupId);
  148. return $group ? "{$group->name} (ID: {$groupId})" : "未知 ({$groupId})";
  149. });
  150. $show->field('reward_type', '奖励类型')->as(function ($type) {
  151. return REWARD_TYPE::getName($type);
  152. });
  153. // 根据奖励类型显示不同的目标信息
  154. $show->field('target_id', '目标')->unescape()->as(function ($targetId) {
  155. // 获取当前记录的奖励类型
  156. $rewardType = $this->getAttribute('reward_type');
  157. switch ($rewardType) {
  158. case REWARD_TYPE::ITEM->value:
  159. $item = Item::find($targetId);
  160. return $item ? "<strong>{$item->name}</strong> (ID: {$targetId})" : "物品 (ID: {$targetId})";
  161. case REWARD_TYPE::CURRENCY->value:
  162. $currency = FundCurrencyModel::find($targetId);
  163. return $currency ? "<strong>{$currency->name}</strong> (ID: {$targetId})" : "货币 (ID: {$targetId})";
  164. case REWARD_TYPE::PET_EXP->value:
  165. return "宠物经验 (宠物ID: {$targetId})";
  166. case REWARD_TYPE::PET_ENERGY->value:
  167. return "宠物体力 (宠物ID: {$targetId})";
  168. case REWARD_TYPE::OTHER->value:
  169. return "其他奖励 (ID: {$targetId})";
  170. default:
  171. return "未知奖励类型 (ID: {$targetId})";
  172. }
  173. });
  174. $show->field('param1', '参数1');
  175. $show->field('param2', '参数2');
  176. $show->field('quantity', '数量');
  177. $show->field('weight', '权重');
  178. $show->field('is_guaranteed', '必中')->as(function ($value) {
  179. return $value ? '是' : '否';
  180. });
  181. $show->field('extra_data', '额外数据')->json();
  182. $show->field('created_at', '创建时间');
  183. $show->field('updated_at', '更新时间');
  184. // 添加返回按钮
  185. $show->tools(function (Show\Tools $tools) {
  186. // 简单地添加返回列表按钮,不需要获取当前记录ID
  187. $tools->append('<a href="'.admin_url('game-reward-items').'" class="btn btn-sm btn-default">
  188. <i class="fa fa-arrow-left"></i> 返回列表
  189. </a>');
  190. });
  191. });
  192. }
  193. /**
  194. * 创建表单
  195. *
  196. * @return Form
  197. */
  198. protected function form()
  199. {
  200. return Form::make(new GameRewardItemRepository(), function (Form $form) {
  201. $form->display('id', 'ID');
  202. // 获取请求中的奖励组ID
  203. $groupId = request()->get('group_id');
  204. // 如果有奖励组ID,则设置默认值
  205. if ($groupId && $form->isCreating()) {
  206. $form->hidden('group_id')->default($groupId);
  207. // 显示奖励组信息
  208. $group = GameRewardGroup::find($groupId);
  209. if ($group) {
  210. $form->display('group_info', '奖励组')->value("{$group->name} (ID: {$groupId})");
  211. }
  212. } else {
  213. $form->select('group_id', '奖励组')
  214. ->options(GameRewardGroup::pluck('name', 'id'))
  215. ->required();
  216. }
  217. $form->select('reward_type', '奖励类型')
  218. ->options(REWARD_TYPE::getAll())
  219. ->required();
  220. $form->select('target_id', '目标ID')
  221. ->options(function () use ($form) {
  222. // 获取当前奖励类型
  223. $rewardType = $form->model()->reward_type ?? request()->get('reward_type');
  224. // 根据奖励类型返回不同的选项
  225. if ($rewardType == REWARD_TYPE::ITEM->value) {
  226. // 物品类型,返回物品列表
  227. return Item::pluck('name', 'id')->toArray();
  228. } elseif ($rewardType == REWARD_TYPE::CURRENCY->value) {
  229. // 货币类型,返回货币列表
  230. return FundCurrencyModel::pluck('name', 'id')->toArray();
  231. }
  232. // 默认返回空选项
  233. return [];
  234. })
  235. ->required()
  236. ->help('根据奖励类型不同,表示物品ID、货币ID等');
  237. $form->number('param1', '参数1')
  238. ->default(0)
  239. ->help('根据奖励类型不同含义,如物品的品质、货币的来源等');
  240. $form->number('param2', '参数2')
  241. ->default(0)
  242. ->help('根据奖励类型不同含义,如物品的绑定状态、货币的类型等');
  243. $form->number('quantity', '数量')
  244. ->default(1)
  245. ->min(1)
  246. ->required();
  247. $form->number('weight', '权重')
  248. ->default(1.00)
  249. ->step(0.01)
  250. ->required()
  251. ->help('随机发放时使用,权重越高,被选中的概率越大');
  252. $form->switch('is_guaranteed', '必中')
  253. ->default(0)
  254. ->help('开启后,在随机发放时会优先选择');
  255. $form->textarea('extra_data', '额外数据')
  256. ->help('JSON格式,可存储特定奖励类型的额外参数');
  257. $form->display('created_at', '创建时间');
  258. $form->display('updated_at', '更新时间');
  259. // 添加动态更新目标ID选择器的JavaScript
  260. $form->script(<<<JS
  261. $(function() {
  262. // 监听奖励类型选择变化
  263. $(document).on('change', 'select[name="reward_type"]', function() {
  264. var rewardType = $(this).val();
  265. var targetIdSelect = $('select[name="target_id"]');
  266. // 清空当前选项
  267. targetIdSelect.empty();
  268. // 根据奖励类型加载不同的选项
  269. if (rewardType) {
  270. $.ajax({
  271. url: '/admin/api/reward-targets',
  272. type: 'GET',
  273. data: {
  274. reward_type: rewardType
  275. },
  276. success: function(data) {
  277. // 添加选项
  278. $.each(data, function(id, name) {
  279. targetIdSelect.append(new Option(name, id));
  280. });
  281. // 如果有默认值,则设置
  282. var defaultValue = targetIdSelect.data('default');
  283. if (defaultValue) {
  284. targetIdSelect.val(defaultValue);
  285. }
  286. }
  287. });
  288. }
  289. });
  290. // 初始化时触发一次
  291. $('select[name="reward_type"]').trigger('change');
  292. });
  293. JS);
  294. // 保存后跳转回列表页
  295. $form->saved(function (Form $form) {
  296. return redirect(admin_url('game-reward-items?group_id=' . $form->model()->group_id));
  297. });
  298. });
  299. }
  300. }