RandomRewardResultLazyRenderable.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace App\Module\Game\AdminControllers\LazyRenderable;
  3. use App\Module\Game\Services\RewardService;
  4. use App\Module\Game\Models\GameRewardGroup;
  5. use UCore\DcatAdmin\Support\LazyRenderable;
  6. /**
  7. * 随机奖励结果弹窗表格
  8. */
  9. class RandomRewardResultLazyRenderable extends LazyRenderable
  10. {
  11. /**
  12. * 渲染页面
  13. *
  14. * @return string
  15. */
  16. public function render()
  17. {
  18. // 获取传递的参数
  19. $groupId = $this->group_id;
  20. $count = $this->count ?? 10;
  21. // 获取奖励组信息
  22. $group = GameRewardGroup::find($groupId);
  23. if (!$group) {
  24. return '<div class="alert alert-danger">奖励组不存在</div>';
  25. }
  26. // 批量模拟奖励
  27. $results = RewardService::batchSimulateReward($groupId, $count);
  28. // 转换为表格数据
  29. $tableData = [];
  30. foreach ($results as $index => $result) {
  31. try {
  32. $formattedItems = '无奖励';
  33. if ($result->success && !empty($result->items)) {
  34. $formattedItems = $this->formatRewardItems($result->items);
  35. }
  36. $row = [
  37. 'index' => (int)($index + 1),
  38. 'success' => (bool)$result->success,
  39. 'error' => $result->success ? '' : (string)($result->errorMessage ?? ''),
  40. 'formatted_items' => (string)$formattedItems
  41. ];
  42. $tableData[] = (object)$row;
  43. } catch (\Exception $e) {
  44. // 如果处理单个结果失败,创建一个错误行
  45. $row = [
  46. 'index' => (int)($index + 1),
  47. 'success' => false,
  48. 'error' => '处理结果失败: ' . $e->getMessage(),
  49. 'formatted_items' => '处理失败'
  50. ];
  51. $tableData[] = (object)$row;
  52. }
  53. }
  54. // 计算统计信息
  55. $successCount = collect($tableData)->where('success', true)->count();
  56. $successRate = $count > 0 ? round(($successCount / $count) * 100, 2) : 0;
  57. // 生成HTML表格
  58. $html = "
  59. <div class=\"alert alert-info\">
  60. <h5><i class=\"fa fa-info-circle\"></i> 模拟统计</h5>
  61. <p><strong>奖励组:</strong>{$group->name} ({$group->code})</p>
  62. <p><strong>模拟次数:</strong>{$count} 次</p>
  63. <p><strong>成功次数:</strong>{$successCount} 次</p>
  64. <p><strong>成功率:</strong>{$successRate}%</p>
  65. </div>
  66. <div class=\"table-responsive\">
  67. <table class=\"table table-striped table-bordered\">
  68. <thead>
  69. <tr>
  70. <th>次数</th>
  71. <th>状态</th>
  72. <th style=\"width: 400px;\">奖励内容</th>
  73. <th>错误信息</th>
  74. </tr>
  75. </thead>
  76. <tbody>";
  77. foreach ($tableData as $row) {
  78. $statusBadge = $row->success
  79. ? '<span class="badge badge-success">成功</span>'
  80. : '<span class="badge badge-danger">失败</span>';
  81. $rewardContent = $row->formatted_items ?: '<span class="text-muted">无奖励</span>';
  82. $errorContent = $row->error ? "<span class=\"text-danger\">{$row->error}</span>" : '';
  83. $html .= "
  84. <tr>
  85. <td>{$row->index}</td>
  86. <td>{$statusBadge}</td>
  87. <td>{$rewardContent}</td>
  88. <td>{$errorContent}</td>
  89. </tr>";
  90. }
  91. $html .= "
  92. </tbody>
  93. </table>
  94. </div>";
  95. return $html;
  96. }
  97. /**
  98. * 格式化奖励项显示
  99. *
  100. * @param array $items
  101. * @return string
  102. */
  103. private function formatRewardItems(array $items): string
  104. {
  105. if (empty($items)) {
  106. return '无奖励';
  107. }
  108. $formatted = [];
  109. foreach ($items as $item) {
  110. try {
  111. // 确保$item是对象且有必要的属性
  112. if (!is_object($item)) {
  113. $formatted[] = "<span class=\"text-danger\">数据格式错误</span>";
  114. continue;
  115. }
  116. $formatted[] = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromDto($item, true);
  117. } catch (\Exception $e) {
  118. $formatted[] = "<span class=\"text-danger\">格式化错误: " . $e->getMessage() . "</span>";
  119. }
  120. }
  121. return implode('<br>', $formatted);
  122. }
  123. }