Initial commit: 교육 프로젝트 배포
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
<?php
|
||||
//[마이페이지][학습레벨] 데이터 동적변환
|
||||
require_once __DIR__ . '/../bbs/db_conn.php';
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
// TODO: 실제 로그인 세션 연동 후 교체
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
$memberId = $_SESSION['member_id'] ?? '';
|
||||
$sysCompCode = $_SESSION['sys_comp_code'] ?? '';
|
||||
//$memberId = 'U001';
|
||||
//$sysCompCode = 'COMP01';
|
||||
|
||||
/**
|
||||
* JSON 응답 출력 함수
|
||||
*/
|
||||
function response_json(array $data): void
|
||||
{
|
||||
echo json_encode($data, JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* 학습레벨 메타 반환 함수
|
||||
*/
|
||||
function mypage_level_meta(?string $level): array
|
||||
{
|
||||
$level = trim((string)$level);
|
||||
|
||||
$map = [
|
||||
'MASTER' => [
|
||||
'label' => 'Master',
|
||||
'class' => 'master',
|
||||
'icon' => '/img/ico/ico_level_master.svg',
|
||||
],
|
||||
'ELITE' => [
|
||||
'label' => 'Elite',
|
||||
'class' => 'elite',
|
||||
'icon' => '/img/ico/ico_level_elite.svg',
|
||||
],
|
||||
'LEARNER' => [
|
||||
'label' => 'Learner',
|
||||
'class' => 'learner',
|
||||
'icon' => '/img/ico/ico_level_learner.svg',
|
||||
],
|
||||
'ROOKIE' => [
|
||||
'label' => 'Rookie',
|
||||
'class' => 'rookie',
|
||||
'icon' => '/img/ico/ico_level_rookie.svg',
|
||||
],
|
||||
];
|
||||
|
||||
$key = strtoupper($level);
|
||||
|
||||
return $map[$key] ?? [
|
||||
'label' => 'Rookie',
|
||||
'class' => 'rookie',
|
||||
'icon' => '/img/ico/ico_level_rookie.svg',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 총 학습시간 기준으로 학습레벨 계산
|
||||
* - 40시간 이상: Master
|
||||
* - 20 ~ 40시간: Elite
|
||||
* - 8 ~ 20시간: Learner
|
||||
* - 0 ~ 8시간: Rookie
|
||||
*/
|
||||
function calc_level_by_minutes(int $totalMinutes): string
|
||||
{
|
||||
if ($totalMinutes >= 2400) {
|
||||
return 'MASTER';
|
||||
}
|
||||
|
||||
if ($totalMinutes >= 1200) {
|
||||
return 'ELITE';
|
||||
}
|
||||
|
||||
if ($totalMinutes >= 480) {
|
||||
return 'LEARNER';
|
||||
}
|
||||
|
||||
return 'ROOKIE';
|
||||
}
|
||||
|
||||
try {
|
||||
$pdo = db_conn();
|
||||
$pdo->exec("SET NAMES 'utf8mb4'");
|
||||
|
||||
// ★ 선택년도 수집
|
||||
$selectedYear = trim((string)($_GET['selected_year'] ?? date('Y')));
|
||||
|
||||
if ($selectedYear === '' || !preg_match('/^\d{4}$/', $selectedYear)) {
|
||||
$selectedYear = date('Y');
|
||||
}
|
||||
|
||||
$levelCode = 'ROOKIE';
|
||||
$totalMinutes = 0;
|
||||
$statsYear = $selectedYear;
|
||||
|
||||
// ★ 선택년도 통계 우선 조회
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
stats_year,
|
||||
learning_level,
|
||||
total_minutes
|
||||
FROM edu_yearly_learning_stats
|
||||
WHERE member_id = :member_id
|
||||
AND sys_comp_code = :sys_comp_code
|
||||
AND stats_year = :selected_year
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([
|
||||
':member_id' => $memberId,
|
||||
':sys_comp_code' => $sysCompCode,
|
||||
':selected_year' => (int)$selectedYear,
|
||||
]);
|
||||
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($row) {
|
||||
$levelCode = (string)($row['learning_level'] ?? 'ROOKIE');
|
||||
$totalMinutes = (int)($row['total_minutes'] ?? 0);
|
||||
$statsYear = (string)($row['stats_year'] ?? $selectedYear);
|
||||
} else {
|
||||
// ★ 선택년도 통계가 없으면 학습이력 합계로 fallback
|
||||
$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
|
||||
AND YEAR(last_viewed_at) = :selected_year
|
||||
");
|
||||
$stmtFallback->execute([
|
||||
':member_id' => $memberId,
|
||||
':sys_comp_code' => $sysCompCode,
|
||||
':selected_year' => (int)$selectedYear,
|
||||
]);
|
||||
|
||||
$totalMinutes = (int)$stmtFallback->fetchColumn();
|
||||
$totalMinutes = floor($totalMinutes / 60);//초를 분으로
|
||||
$levelCode = calc_level_by_minutes($totalMinutes);
|
||||
}
|
||||
|
||||
$levelMeta = mypage_level_meta($levelCode);
|
||||
|
||||
response_json([
|
||||
'success' => true,
|
||||
'selected_year' => $selectedYear,
|
||||
'stats_year' => $statsYear,
|
||||
'total_minutes' => $totalMinutes,
|
||||
'learning_level' => $levelMeta['label'],
|
||||
'level_class' => $levelMeta['class'],
|
||||
'level_icon' => $levelMeta['icon'],
|
||||
]);
|
||||
|
||||
} catch (Throwable $e) {
|
||||
response_json([
|
||||
'success' => false,
|
||||
'message' => '학습레벨 정보를 불러오지 못했습니다.',
|
||||
'error' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
Reference in New Issue
Block a user