GameRewardGroup.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace App\Module\Game\Models;
  3. use Illuminate\Database\Eloquent\Relations\HasMany;
  4. use UCore\ModelCore;
  5. /**
  6. * 奖励组
  7. *
  8. * field start
  9. * @property int $id 主键
  10. * @property string $name 奖励组名称
  11. * @property string $code 奖励组编码(唯一)
  12. * @property string $description 奖励组描述
  13. * @property bool $is_random 是否随机发放(0:全部发放, 1:随机发放)
  14. * @property int $random_count 随机发放时的奖励数量
  15. * @property \Carbon\Carbon $created_at 创建时间
  16. * @property \Carbon\Carbon $updated_at 更新时间
  17. * field end
  18. */
  19. class GameRewardGroup extends ModelCore
  20. {
  21. /**
  22. * 与模型关联的表名
  23. *
  24. * @var string
  25. */
  26. protected $table = 'game_reward_groups';
  27. // attrlist start
  28. protected $fillable = [
  29. 'id',
  30. 'name',
  31. 'code',
  32. 'description',
  33. 'is_random',
  34. 'random_count',
  35. ];
  36. // attrlist end
  37. /**
  38. * 应该被转换为原生类型的属性
  39. *
  40. * @var array
  41. */
  42. protected $casts = [
  43. 'is_random' => 'boolean',
  44. 'random_count' => 'integer',
  45. ];
  46. /**
  47. * 获取奖励组中的所有奖励项
  48. *
  49. * @return HasMany
  50. */
  51. public function rewardItems(): HasMany
  52. {
  53. return $this->hasMany(GameRewardItem::class, 'group_id', 'id');
  54. }
  55. /**
  56. * 格式化奖励详情用于显示
  57. *
  58. * @return string
  59. */
  60. public function formatRewardDetails(): string
  61. {
  62. if ($this->rewardItems->isEmpty()) {
  63. return '<span class="text-muted">暂无奖励项</span>';
  64. }
  65. $details = [];
  66. foreach ($this->rewardItems as $item) {
  67. $detail = $this->formatSingleRewardItem($item);
  68. $details[] = $detail;
  69. }
  70. return '<div class="reward-details">' . implode('<br>', $details) . '</div>';
  71. }
  72. /**
  73. * 格式化单个奖励项
  74. *
  75. * @param GameRewardItem $item
  76. * @return string
  77. */
  78. private function formatSingleRewardItem(GameRewardItem $item): string
  79. {
  80. $rewardTypeName = \App\Module\Game\Enums\REWARD_TYPE::getName($item->reward_type);
  81. $targetName = $this->getTargetName($item);
  82. $quantity = $item->quantity;
  83. $weight = $item->weight;
  84. $guaranteed = $item->is_guaranteed ? '必中' : '非必中';
  85. return sprintf(
  86. '<span class="badge badge-info">%s</span> %s × %d (权重: %.2f, %s)',
  87. $rewardTypeName,
  88. $targetName,
  89. $quantity,
  90. $weight,
  91. $guaranteed
  92. );
  93. }
  94. /**
  95. * 获取目标名称
  96. *
  97. * @param GameRewardItem $item
  98. * @return string
  99. */
  100. private function getTargetName(GameRewardItem $item): string
  101. {
  102. switch ($item->reward_type) {
  103. case \App\Module\Game\Enums\REWARD_TYPE::ITEM->value:
  104. try {
  105. $itemModel = \App\Module\GameItems\Models\Item::find($item->target_id);
  106. return $itemModel ? $itemModel->name : "物品 (ID: {$item->target_id})";
  107. } catch (\Exception $e) {
  108. return "物品 (ID: {$item->target_id})";
  109. }
  110. case \App\Module\Game\Enums\REWARD_TYPE::CURRENCY->value:
  111. try {
  112. $currency = \App\Module\Fund\Models\FundCurrencyModel::find($item->target_id);
  113. return $currency ? $currency->name : "货币 (ID: {$item->target_id})";
  114. } catch (\Exception $e) {
  115. return "货币 (ID: {$item->target_id})";
  116. }
  117. case \App\Module\Game\Enums\REWARD_TYPE::FUND_CONFIG->value:
  118. try {
  119. $fund = \App\Module\Fund\Models\FundConfigModel::find($item->target_id);
  120. return $fund ? $fund->name : "账户种类 (ID: {$item->target_id})";
  121. } catch (\Exception $e) {
  122. return "账户种类 (ID: {$item->target_id})";
  123. }
  124. case \App\Module\Game\Enums\REWARD_TYPE::PET_EXP->value:
  125. return "宠物经验 (宠物ID: {$item->target_id})";
  126. case \App\Module\Game\Enums\REWARD_TYPE::PET_ENERGY->value:
  127. return "宠物体力 (宠物ID: {$item->target_id})";
  128. case \App\Module\Game\Enums\REWARD_TYPE::FARM_SHRINE->value:
  129. try {
  130. $shrineName = \App\Module\Farm\Enums\BUFF_TYPE::getName($item->target_id);
  131. $durationHours = $item->param2 > 0 ? $item->param2 : 24;
  132. return "{$shrineName} ({$durationHours}小时)";
  133. } catch (\Exception $e) {
  134. return "神像 (类型: {$item->target_id})";
  135. }
  136. case \App\Module\Game\Enums\REWARD_TYPE::OTHER->value:
  137. return "其他奖励 (ID: {$item->target_id})";
  138. default:
  139. return "未知奖励类型 (ID: {$item->target_id})";
  140. }
  141. }
  142. }