[ 'code' => 'Master', 'class' => 'master', 'label' => 'Master', 'icon' => '/edu/img/ico/ico_level_master.svg', ], 'ELITE' => [ 'code' => 'Elite', 'class' => 'elite', 'label' => 'Elite', 'icon' => '/edu/img/ico/ico_level_elite.svg', ], 'LEARNER' => [ 'code' => 'Learner', 'class' => 'learner', 'label' => 'Learner', 'icon' => '/edu/img/ico/ico_level_learner.svg', ], 'ROOKIE' => [ 'code' => 'Rookie', 'class' => 'rookie', 'label' => 'Rookie', 'icon' => '/edu/img/ico/ico_level_rookie.svg', ], ]; $key = strtoupper($level); return $map[$key] ?? [ 'code' => 'Rookie', 'class' => 'rookie', 'label' => 'Rookie', 'icon' => '/edu/img/ico/ico_level_rookie.svg', ]; } } if (!function_exists('mypage_badge_map')) { function mypage_badge_map(string $badgeCode): array { $badgeCode = strtoupper(trim($badgeCode)); $BADGE_ICON_MAP = [ // 실제 운영 시 코드값 확정되면 여기만 교체 'BG001' => [ 'slot' => 'hat', 'img' => '/edu/img/mypage/ico_school.png', 'name' => '학습 배지', ], 'BG002' => [ 'slot' => 'pencil', 'img' => '/edu/img/mypage/ico_pencil.png', 'name' => '작성 배지', ], 'BG003' => [ 'slot' => 'pick', 'img' => '/edu/img/mypage/ico_pick_2.png', 'name' => 'Pick 배지', ], ]; return $BADGE_ICON_MAP[$badgeCode] ?? [ 'slot' => 'pick', 'img' => '/edu/img/mypage/ico_pick_2.png', 'name' => '기본 배지', ]; } } // TODO: 실제 로그인 세션 연동 후 교체 $memberId = 'U001'; $sysCompCode = 'COMP01'; $profileData = [ 'member_id' => $memberId, 'sys_comp_code' => $sysCompCode, 'name' => '사용자', 'rank_name' => '', 'working_comp' => '', 'join_date' => '', 'latest_stats_year' => '', 'learning_level' => 'Rookie', 'level_class' => 'rookie', 'level_icon' => '/edu/img/ico/ico_level_rookie.svg', 'total_minutes' => 0, 'profile_image' => '/edu/img/insight/profile.png', // 현재는 기본 이미지 고정 ]; $profileBadges = [ 'hat' => null, 'pencil' => null, 'pick' => null, ]; try { $pdo = db_conn(); $pdo->exec("SET NAMES 'utf8mb4'"); // 최신년도 학습통계 우선 $sql = " SELECT u.member_id, u.sys_comp_code, u.name, u.rank_name, u.working_comp, u.join_date, ys.stats_year, ys.learning_level, ys.total_minutes FROM edu_users u LEFT JOIN edu_yearly_learning_stats ys ON ys.member_id = u.member_id AND ys.sys_comp_code = u.sys_comp_code AND ys.stats_year = ( SELECT MAX(stats_year) FROM edu_yearly_learning_stats WHERE member_id = u.member_id AND sys_comp_code = u.sys_comp_code ) WHERE u.member_id = :member_id AND u.sys_comp_code = :sys_comp_code LIMIT 1 "; $stmt = $pdo->prepare($sql); $stmt->execute([ ':member_id' => $memberId, ':sys_comp_code' => $sysCompCode, ]); $row = $stmt->fetch(PDO::FETCH_ASSOC); if ($row) { $levelMeta = mypage_level_meta($row['learning_level'] ?? ''); $profileData = [ 'member_id' => $row['member_id'], 'sys_comp_code' => $row['sys_comp_code'], 'name' => $row['name'] ?? '사용자', 'rank_name' => $row['rank_name'] ?? '', 'working_comp' => $row['working_comp'] ?? '', 'join_date' => $row['join_date'] ?? '', 'latest_stats_year' => $row['stats_year'] ?? '', 'learning_level' => $levelMeta['label'], 'level_class' => $levelMeta['class'], 'level_icon' => $levelMeta['icon'], 'total_minutes' => (int)($row['total_minutes'] ?? 0), 'profile_image' => '/edu/img/insight/profile.png', ]; } // 최신통계가 없으면 누적 이력 합계 fallback if ((int)$profileData['total_minutes'] === 0) { $stmtFallback = $pdo->prepare(" SELECT COALESCE(SUM(watch_tm), 0) AS total_minutes FROM edu_learning_histories WHERE member_id = :member_id AND sys_comp_code = :sys_comp_code "); $stmtFallback->execute([ ':member_id' => $memberId, ':sys_comp_code' => $sysCompCode, ]); $fallbackMin = (int)$stmtFallback->fetchColumn(); if ($fallbackMin > 0) { $profileData['total_minutes'] = $fallbackMin; } } // 배지 조회 $stmtBadge = $pdo->prepare(" SELECT badge_code, issued_at FROM edu_user_badges WHERE member_id = :member_id AND sys_comp_code = :sys_comp_code ORDER BY issued_at DESC, seq DESC "); $stmtBadge->execute([ ':member_id' => $memberId, ':sys_comp_code' => $sysCompCode, ]); foreach ($stmtBadge->fetchAll(PDO::FETCH_ASSOC) as $badgeRow) { $badgeInfo = mypage_badge_map($badgeRow['badge_code'] ?? ''); $slot = $badgeInfo['slot']; if (!isset($profileBadges[$slot]) || $profileBadges[$slot] !== null) { continue; } $profileBadges[$slot] = [ 'badge_code' => $badgeRow['badge_code'], 'slot' => $slot, 'img' => $badgeInfo['img'], 'name' => $badgeInfo['name'], 'issued_at' => $badgeRow['issued_at'], ]; } } catch (Throwable $e) { // 운영 시 로깅 권장 }