| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- <?php
- namespace App\Module\UrsPromotion\AdminControllers\Actions;
- use App\Module\UrsPromotion\Models\UrsUserReferral;
- use App\Module\UrsPromotion\Models\UrsUserMapping;
- use Dcat\Admin\Widgets\Modal;
- use UCore\DcatAdmin\RowAction;
- /**
- * 查看推荐上级链操作
- *
- * 显示用户的上级推荐链路径
- */
- class ViewReferralChainAction extends RowAction
- {
- /**
- * 操作按钮标题
- *
- * @var string
- */
- protected $title = '上级链';
- /**
- * 检查是否允许显示此操作
- *
- * @return bool
- */
- public function allowed()
- {
- // 所有记录都允许查看上级链
- return true;
- }
- /**
- * 渲染操作按钮
- *
- * @return string
- */
- public function render2()
- {
- $row = $this->getRow();
- $ursUserId = $row->urs_user_id;
- // 获取推荐上级链数据
- $chainData = $this->getReferralChainData($ursUserId);
- // 构建链路HTML
- $chainHtml = $this->buildChainHtml($chainData);
- return Modal::make()
- ->xl()
- ->title("URS用户 {$ursUserId} 的推荐上级链")
- ->body($chainHtml)
- ->button("<i class=\"fa fa-link\"></i> {$this->title}");
- }
- /**
- * 获取推荐上级链数据
- *
- * @param int $ursUserId
- * @return array
- */
- private function getReferralChainData(int $ursUserId): array
- {
- $chain = [];
- $currentUserId = $ursUserId;
- $level = 0;
- $maxLevels = 30; // 防止无限循环,最多查询10级
- // 从当前用户开始,向上查找推荐人
- while ($currentUserId && $level < $maxLevels) {
- // 查找当前用户的推荐关系
- $referral = UrsUserReferral::where('urs_user_id', $currentUserId)
- ->where('status', UrsUserReferral::STATUS_VALID)
- ->first();
- // 获取用户的农场信息
- $userMapping = UrsUserMapping::where('urs_user_id', $currentUserId)
- ->where('status', UrsUserMapping::STATUS_VALID)
- ->with(['user.info'])
- ->first();
- $userInfo = [
- 'urs_user_id' => $currentUserId,
- 'farm_user_id' => $userMapping->user_id ?? null,
- 'username' => $userMapping->user->username ?? '未进入农场',
- 'nickname' => $userMapping->user->info->nickname ?? '无昵称',
- 'level' => $level,
- 'is_root' => false,
- ];
- if ($referral) {
- $userInfo['referrer_id'] = $referral->urs_referrer_id;
- $userInfo['referral_time'] = $referral->referral_time;
- $currentUserId = $referral->urs_referrer_id;
- } else {
- // 没有推荐人,说明是根用户
- $userInfo['is_root'] = true;
- $currentUserId = null;
- }
- $chain[] = $userInfo;
- $level++;
- }
- return array_reverse($chain); // 反转数组,从根用户开始显示
- }
- /**
- * 构建上级链HTML
- *
- * @param array $chainData
- * @return string
- */
- private function buildChainHtml(array $chainData): string
- {
- $html = '<div class="referral-chain-container">';
- // 添加样式
- $html .= '<style>
- .referral-chain-container {
- padding: 20px;
- font-family: "Helvetica Neue", Arial, sans-serif;
- }
- .chain-node {
- margin: 10px 0;
- padding: 15px;
- border: 2px solid #ddd;
- border-radius: 8px;
- background-color: #f9f9f9;
- position: relative;
- }
- .chain-node.root {
- border-color: #dc3545;
- background-color: #f8d7da;
- }
- .chain-node.current {
- border-color: #007bff;
- background-color: #d1ecf1;
- font-weight: bold;
- }
- .level-badge {
- display: inline-block;
- padding: 4px 8px;
- border-radius: 4px;
- color: white;
- font-size: 12px;
- margin-right: 10px;
- }
- .level-root { background-color: #dc3545; }
- .level-1 { background-color: #fd7e14; }
- .level-2 { background-color: #ffc107; color: #333; }
- .level-3 { background-color: #28a745; }
- .level-4 { background-color: #17a2b8; }
- .level-5 { background-color: #6f42c1; }
- .user-info {
- font-size: 14px;
- margin: 5px 0;
- }
- .user-meta {
- font-size: 12px;
- color: #666;
- margin-top: 8px;
- }
- .chain-arrow {
- text-align: center;
- color: #007bff;
- font-size: 18px;
- margin: 5px 0;
- }
- </style>';
- if (empty($chainData)) {
- $html .= '<p class="text-muted">无法获取推荐链信息</p>';
- } else {
- $totalLevels = count($chainData);
- $targetUserId = $chainData[count($chainData) - 1]['urs_user_id'];
- $html .= "<h5><i class=\"fa fa-link\"></i> 推荐链路径 (共{$totalLevels}级)</h5>";
- foreach ($chainData as $index => $user) {
- $isRoot = $user['is_root'];
- $isCurrent = ($user['urs_user_id'] == $targetUserId);
- $level = $totalLevels - $user['level'] - 1; // 重新计算显示级别
- $nodeClass = 'chain-node';
- if ($isRoot) {
- $nodeClass .= ' root';
- $levelName = '根用户';
- $badgeClass = 'level-root';
- } elseif ($isCurrent) {
- $nodeClass .= ' current';
- $levelName = '当前用户';
- $badgeClass = 'level-' . min($level, 5);
- } else {
- $levelName = "第{$level}级推荐人";
- $badgeClass = 'level-' . min($level, 5);
- }
- $html .= "<div class='{$nodeClass}'>";
- $html .= "<span class='level-badge {$badgeClass}'>{$levelName}</span>";
- $html .= "<span class='user-info'>URS-{$user['urs_user_id']}</span>";
- if ($user['farm_user_id']) {
- $html .= " → 农场用户ID: {$user['farm_user_id']} | {$user['username']} ({$user['nickname']})";
- } else {
- $html .= " → <span class='text-warning'>未进入农场</span>";
- }
- $html .= "<div class='user-meta'>";
- if (isset($user['referral_time'])) {
- $html .= "推荐时间: {$user['referral_time']}";
- }
- if ($isRoot) {
- $html .= "推荐链的起始用户";
- } elseif ($isCurrent) {
- $html .= "目标用户";
- }
- $html .= "</div>";
- $html .= "</div>";
- // 添加箭头(除了最后一个)
- if ($index < count($chainData) - 1) {
- $html .= '<div class="chain-arrow">↓ 推荐</div>';
- }
- }
- }
- $html .= '</div>';
- return $html;
- }
- }
|