RandomRewardAction.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Module\Game\AdminControllers\Actions;
  3. use App\Module\Game\Services\RewardService;
  4. use App\Module\Game\Models\GameRewardGroup;
  5. use Dcat\Admin\Grid\RowAction;
  6. use Illuminate\Http\Request;
  7. /**
  8. * 单次随机奖励操作
  9. */
  10. class RandomRewardAction extends RowAction
  11. {
  12. /**
  13. * 操作按钮标题
  14. *
  15. * @var string
  16. */
  17. protected $title = '<i class="fa fa-gift"></i> 单次随机奖励';
  18. /**
  19. * 处理请求
  20. *
  21. * @param Request $request
  22. * @return mixed
  23. */
  24. public function handle(Request $request)
  25. {
  26. try {
  27. $id = $this->getKey();
  28. // 获取奖励组信息
  29. $group = GameRewardGroup::find($id);
  30. if (!$group) {
  31. return $this->response()
  32. ->error('奖励组不存在');
  33. }
  34. // 模拟单次随机奖励
  35. $result = RewardService::simulateReward($id);
  36. if (!$result->success) {
  37. return $this->response()
  38. ->error('模拟奖励失败: ' . $result->errorMessage);
  39. }
  40. // 格式化奖励结果
  41. $rewardText = $this->formatRewardItems($result->items);
  42. return $this->response()
  43. ->success("单次随机奖励结果:\n{$rewardText}")
  44. ->detail('奖励组', $group->name)
  45. ->detail('编码', $group->code);
  46. } catch (\Exception $e) {
  47. return $this->response()
  48. ->error('操作失败: ' . $e->getMessage());
  49. }
  50. }
  51. /**
  52. * 格式化奖励项显示
  53. *
  54. * @param array $items
  55. * @return string
  56. */
  57. private function formatRewardItems(array $items): string
  58. {
  59. if (empty($items)) {
  60. return '无奖励';
  61. }
  62. $formatted = [];
  63. foreach ($items as $item) {
  64. $rewardTypeName = \App\Module\Game\Enums\REWARD_TYPE::getName($item->rewardType);
  65. $targetName = $this->getTargetName($item);
  66. $formatted[] = "• {$rewardTypeName}: {$targetName} × {$item->quantity}";
  67. }
  68. return implode("\n", $formatted);
  69. }
  70. /**
  71. * 获取目标名称
  72. *
  73. * @param \App\Module\Game\Dtos\RewardItemDto $item
  74. * @return string
  75. */
  76. private function getTargetName($item): string
  77. {
  78. switch ($item->rewardType) {
  79. case \App\Module\Game\Enums\REWARD_TYPE::ITEM->value:
  80. $itemModel = \App\Module\GameItems\Models\Item::find($item->targetId);
  81. return $itemModel ? $itemModel->name : "物品ID: {$item->targetId}";
  82. case \App\Module\Game\Enums\REWARD_TYPE::CURRENCY->value:
  83. // 暂时返回固定名称,后续可以根据实际模型调整
  84. return "货币ID: {$item->targetId}";
  85. case \App\Module\Game\Enums\REWARD_TYPE::PET->value:
  86. $pet = \App\Module\Pet\Models\PetConfig::find($item->targetId);
  87. return $pet ? $pet->name : "宠物ID: {$item->targetId}";
  88. case \App\Module\Game\Enums\REWARD_TYPE::PET_POWER->value:
  89. return "宠物体力";
  90. default:
  91. return "未知奖励类型 (ID: {$item->targetId})";
  92. }
  93. }
  94. /**
  95. * 确认信息
  96. *
  97. * @return array|string|void
  98. */
  99. public function confirm()
  100. {
  101. return ['确定要进行单次随机奖励模拟吗?', '此操作仅模拟奖励结果,不会实际发放奖励'];
  102. }
  103. }