| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace App\Module\Game\AdminControllers\LazyRenderable;
- use App\Module\Game\Services\RewardService;
- use App\Module\Game\Models\GameRewardGroup;
- use UCore\DcatAdmin\Support\LazyRenderable;
- /**
- * 随机奖励结果弹窗表格
- */
- class RandomRewardResultLazyRenderable extends LazyRenderable
- {
- /**
- * 渲染页面
- *
- * @return string
- */
- public function render()
- {
- // 获取传递的参数
- $groupId = $this->group_id;
- $count = $this->count ?? 10;
- // 获取奖励组信息
- $group = GameRewardGroup::find($groupId);
- if (!$group) {
- return '<div class="alert alert-danger">奖励组不存在</div>';
- }
- // 批量模拟奖励
- $results = RewardService::batchSimulateReward($groupId, $count);
- // 转换为表格数据
- $tableData = [];
- foreach ($results as $index => $result) {
- try {
- $formattedItems = '无奖励';
- if ($result->success && !empty($result->items)) {
- $formattedItems = $this->formatRewardItems($result->items);
- }
- $row = [
- 'index' => (int)($index + 1),
- 'success' => (bool)$result->success,
- 'error' => $result->success ? '' : (string)($result->errorMessage ?? ''),
- 'formatted_items' => (string)$formattedItems
- ];
- $tableData[] = (object)$row;
- } catch (\Exception $e) {
- // 如果处理单个结果失败,创建一个错误行
- $row = [
- 'index' => (int)($index + 1),
- 'success' => false,
- 'error' => '处理结果失败: ' . $e->getMessage(),
- 'formatted_items' => '处理失败'
- ];
- $tableData[] = (object)$row;
- }
- }
- // 计算统计信息
- $successCount = collect($tableData)->where('success', true)->count();
- $successRate = $count > 0 ? round(($successCount / $count) * 100, 2) : 0;
- // 生成HTML表格
- $html = "
- <div class=\"alert alert-info\">
- <h5><i class=\"fa fa-info-circle\"></i> 模拟统计</h5>
- <p><strong>奖励组:</strong>{$group->name} ({$group->code})</p>
- <p><strong>模拟次数:</strong>{$count} 次</p>
- <p><strong>成功次数:</strong>{$successCount} 次</p>
- <p><strong>成功率:</strong>{$successRate}%</p>
- </div>
- <div class=\"table-responsive\">
- <table class=\"table table-striped table-bordered\">
- <thead>
- <tr>
- <th>次数</th>
- <th>状态</th>
- <th style=\"width: 400px;\">奖励内容</th>
- <th>错误信息</th>
- </tr>
- </thead>
- <tbody>";
- foreach ($tableData as $row) {
- $statusBadge = $row->success
- ? '<span class="badge badge-success">成功</span>'
- : '<span class="badge badge-danger">失败</span>';
- $rewardContent = $row->formatted_items ?: '<span class="text-muted">无奖励</span>';
- $errorContent = $row->error ? "<span class=\"text-danger\">{$row->error}</span>" : '';
- $html .= "
- <tr>
- <td>{$row->index}</td>
- <td>{$statusBadge}</td>
- <td>{$rewardContent}</td>
- <td>{$errorContent}</td>
- </tr>";
- }
- $html .= "
- </tbody>
- </table>
- </div>";
- return $html;
- }
- /**
- * 格式化奖励项显示
- *
- * @param array $items
- * @return string
- */
- private function formatRewardItems(array $items): string
- {
- if (empty($items)) {
- return '无奖励';
- }
- $formatted = [];
- foreach ($items as $item) {
- try {
- // 确保$item是对象且有必要的属性
- if (!is_object($item)) {
- $formatted[] = "<span class=\"text-danger\">数据格式错误</span>";
- continue;
- }
- $formatted[] = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromDto($item, true);
- } catch (\Exception $e) {
- $formatted[] = "<span class=\"text-danger\">格式化错误: " . $e->getMessage() . "</span>";
- }
- }
- return implode('<br>', $formatted);
- }
- }
|