222 lines
7.0 KiB
PHP
222 lines
7.0 KiB
PHP
<?php
|
|
//=========================
|
|
//개인정보 + 최신연도 학습레벨 + 배지
|
|
//=========================
|
|
require_once __DIR__ . '/db_conn.php';
|
|
|
|
if (!function_exists('mypage_h')) {
|
|
function mypage_h(?string $str): string
|
|
{
|
|
return htmlspecialchars((string)$str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
|
}
|
|
}
|
|
|
|
if (!function_exists('mypage_level_meta')) {
|
|
function mypage_level_meta(?string $level): array
|
|
{
|
|
$level = trim((string)$level);
|
|
|
|
$map = [
|
|
'MASTER' => [
|
|
'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) {
|
|
// 운영 시 로깅 권장
|
|
} |