Files
sake/build/resources/main/static/mobile/js/bnft/stepcnt/Stepcnt.js

1012 lines
33 KiB
JavaScript

/**
* 만보기 기능 관련 JavaScript
*/
$(document).ready(function() {
// 헤더 뒤로가기 버튼 이벤트 설정 (이벤트 위임 방식)
$(document).on('click', '.header__toBack__btn', function(e) {
e.preventDefault(); // 기본 동작 방지
location.href = '/sopmal/bnft/bnftMain';
});
// 동의 상태 확인 (가장 먼저)
if (!checkUserConsent()) {
return; // 동의하지 않은 경우 여기서 중단
}
// 다른 UI 초기화 (앱 인터페이스와 무관한 작업)
initStepCountChart();
// 깜짝선물과 마일리지 버튼 초기화
initRewardButtons();
// 스탬프 초기화
initStamps();
// 달력 초기화
initCalendar();
// 앱 인터페이스 초기화 확인 및 걸음 수 데이터 요청
initAppInterface();
});
/**
* 사용자 동의 상태 확인
*/
function checkUserConsent() {
const useAt = $('#useAt').val();
// 값이 없거나 'N'인 경우 동의하지 않은 것으로 처리
if (!useAt || useAt === 'N') {
// 동의하지 않은 경우
showConsentModal();
disableAllFeatures();
return false;
}
return true;
}
/**
* 동의 안내 모달 표시
*/
function showConsentModal() {
MicroModal.show('modal-consent');
}
/**
* 모든 기능 비활성화
*/
function disableAllFeatures() {
// 차트 영역 흐리게 처리
$('.stepChart').css({
'filter': 'blur(3px)',
'pointer-events': 'none',
'opacity': '0.5'
});
// 스탬프 영역 흐리게 처리
$('.stepStamp').css({
'filter': 'blur(3px)',
'pointer-events': 'none',
'opacity': '0.5'
});
// 달력 영역 흐리게 처리
$('.stepCalendar').css({
'filter': 'blur(3px)',
'pointer-events': 'none',
'opacity': '0.5'
});
// 모든 버튼 비활성화
$('#giftButton, #mileageButton').prop('disabled', true);
// 앱 인터페이스 기능 비활성화 플래그 설정
window.consentRequired = true;
}
/**
* 앱 인터페이스 초기화 확인 및 걸음 수 데이터 요청
*/
function initAppInterface() {
// 동의가 필요한 경우 앱 인터페이스 초기화 건너뛰기
if (window.consentRequired) {
console.log("사용자 동의가 필요하여 앱 인터페이스 초기화를 건너뜁니다.");
return;
}
// 전역 콜백 함수 정의
window.callback_get_walk_count = callback_get_walk_count;
// 앱 인터페이스 초기화 확인
if (window.app) {
console.log("앱 인터페이스 감지됨, 걸음 수 데이터 요청");
getWalkCountFromApp();
} else {
console.log("앱 인터페이스를 기다리는 중...");
let checkCount = 0;
const maxChecks = 10; // 최대 5초(500ms * 10)까지 시도
const checkInterval = setInterval(function() {
checkCount++;
if (window.app) {
clearInterval(checkInterval);
console.log("앱 인터페이스 초기화 완료, 걸음 수 데이터 요청");
getWalkCountFromApp();
} else if (checkCount >= maxChecks) {
clearInterval(checkInterval);
console.warn("앱 인터페이스를 찾을 수 없습니다. 최대 시도 횟수 초과.");
}
}, 500);
}
}
/**
* 앱에서 걸음 수 데이터 가져오기
*/
function getWalkCountFromApp() {
// 날짜 형식 변환 함수
function formatDate(date) {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return year + month + day;
}
// 오늘 날짜 구하기
const today = new Date();
// 현재 월의 첫 날 구하기
const firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
// 날짜 형식 변환
const startDate = formatDate(firstDay);
const endDate = formatDate(today);
// 앱에서 걸음 수 데이터 가져오기
try {
window.app.get_walk_count(startDate, endDate);
console.log("걸음 수 데이터 요청 성공");
} catch(e) {
console.error("걸음 수 데이터 요청 중 오류:", e);
showCustomAlert("걸음 수 데이터를 요청하는 중 오류가 발생했습니다.");
}
}
/**
* 걸음 수 데이터 콜백 함수 - 앱에서 호출됨
*/
function callback_get_walk_count(json_str) {
try {
console.log("걸음 수 데이터 수신 성공");
const walkData = JSON.parse(json_str);
// 콘솔에 데이터 출력 (디버깅용)
for(var i = 0; i < walkData.length; i++) {
var date = walkData[i].date;
var count = walkData[i].count;
console.log(date + " | " + count);
}
// 데이터 저장 및 처리
saveWalkCountData(walkData);
} catch(e) {
console.error("걸음 수 데이터 처리 실패:", e);
showCustomAlert("걸음 수 데이터를 처리하는 중 오류가 발생했습니다.");
}
}
/**
* 걸음 수 데이터 저장 및 처리
*/
function saveWalkCountData(walkData) {
if (!walkData || walkData.length === 0) return;
// 오늘 날짜 구하기
const today = new Date();
const todayFormatted = formatDateYYYYMMDD(today);
// 오늘의 걸음 수 찾기
const todayData = walkData.find(item => item.date === todayFormatted);
if (todayData) {
const stepCount = parseInt(todayData.count);
// AJAX로 걸음 수 데이터 서버에 저장
$.ajax({
url: '/sopmal/bnft/saveStepCount',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
stepCnt: stepCount,
bnfInnb: $('#bnfInnb').val()
}),
success: function(response) {
console.log("걸음 수 저장 성공:", response);
// 걸음 수 정보 업데이트
updateStepCountInfo(stepCount);
// 만보 달성 시 스탬프 정보 업데이트
if (stepCount >= 10000) {
updateStampInfo();
}
// 데이터 업데이트 후 화면 새로고침
if (response && response.resBody && response.resBody.result) {
const resultObj = JSON.parse(response.resBody.result);
if (resultObj && resultObj.result === true) {
// location.reload();
}
}
},
error: function(xhr, status, error) {
console.error("걸음 수 저장 실패:", error);
}
});
}
// 모든 걸음 수 데이터 저장 (필요하면 활성화)
/*
walkData.forEach(function(item) {
const date = item.date;
const count = parseInt(item.count);
// AJAX로 각 날짜의 걸음 수 데이터 저장
$.ajax({
url: '/sopmal/bnft/saveStepCountByDate',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
stepCnt: count,
bnfInnb: $('#bnfInnb').val(),
bnfPrtDt: formatDateForServer(date)
}),
success: function(response) {
console.log(date + " 걸음 수 저장 성공:", response);
},
error: function(xhr, status, error) {
console.error(date + " 걸음 수 저장 실패:", error);
}
});
});
*/
}
/**
* YYYYMMDD 형식의 문자열을 서버용 날짜 형식으로 변환
*/
function formatDateForServer(dateStr) {
const year = dateStr.substring(0, 4);
const month = dateStr.substring(4, 6);
const day = dateStr.substring(6, 8);
return year + '-' + month + '-' + day;
}
/**
* 날짜를 YYYYMMDD 형식의 문자열로 변환
*/
function formatDateYYYYMMDD(date) {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return year + month + day;
}
/**
* 걸음 수 정보 업데이트
*/
function updateStepCountInfo(stepCount) {
// hidden input 값 업데이트 (추가)
$('#currentStepCount').val(stepCount);
// 걸음 수 표시 업데이트
$('.cnt_step b').text(stepCount.toLocaleString());
// 거리와 칼로리 계산
const distance = calculateDistance(stepCount);
const calories = calculateCalories(stepCount);
// 거리와 칼로리 표시 업데이트
$('.cnt_km b').text(distance.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('.cnt_kcal b').text(calories.toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}));
// 진행률 계산 및 그래프 업데이트
const progressRate = Math.min(100, (stepCount * 100) / 10000);
updateStepCountChart(progressRate);
// 메시지 업데이트
const message = stepCount >= 10000 ? "와우, 오늘 만보 달성!!" : "조금 더 걸어볼까요?";
$('.tit3').text(message);
// 깜짝선물과 마일리지 버튼 상태 업데이트
updateRewardButtons(stepCount);
}
/**
* 알림용 모달 표시 함수
* @param {string} message - 표시할 메시지
* @param {boolean} isHTML - HTML 형식 메시지 여부
*/
function showCustomAlert(message, isHTML) {
if (isHTML) {
$('#modal-alert .microModal__content').html(message);
} else {
$('#modal-alert .microModal__content p').text(message);
}
MicroModal.show('modal-alert');
}
/**
* 걸음 수를 거리(km)로 변환
*/
function calculateDistance(steps) {
// 1km당 평균 걸음 수 (일반 성인 기준)
const STEPS_PER_KM = 1300;
return Math.round((steps / STEPS_PER_KM) * 100) / 100;
}
/**
* 걸음 수를 소모 칼로리(kcal)로 변환
*/
function calculateCalories(steps) {
// 1 걸음당 평균 소모 칼로리 (일반 성인 기준)
const CALORIES_PER_STEP = 0.04;
return Math.round(steps * CALORIES_PER_STEP * 10) / 10;
}
/**
* 만보기 그래프 초기화
*/
function initStepCountChart() {
const progressRate = parseFloat($('#progressRate').val() || 0);
const ctx = document.getElementById('myChart').getContext('2d');
window.stepChart = new Chart(ctx, {
type: 'doughnut',
data: {
labels: ['완료', '미완료'],
datasets: [{
data: [progressRate, 100 - progressRate],
backgroundColor: ['#4CAF50', '#f0f0f0']
}]
},
options: {
cutoutPercentage: 70,
animation: {
animateRotate: true,
animateScale: true
},
legend: {
display: false
},
tooltips: {
enabled: false
}
}
});
// 그래프 중앙에 진행률 표시 (이미 HTML에 존재하므로 값만 업데이트)
$('#progressRateValue').text(Math.round(progressRate));
}
/**
* 만보기 그래프 업데이트
*/
function updateStepCountChart(progressRate) {
if (window.stepChart) {
window.stepChart.data.datasets[0].data = [progressRate, 100 - progressRate];
window.stepChart.update();
$('#progressRateValue').text(Math.round(progressRate));
}
}
/**
* 깜짝선물과 마일리지 버튼 초기화
*/
function initRewardButtons() {
const currentSteps = parseInt($('#currentStepCount').val() || 0);
const giftPosition = parseInt($('#todayGiftCondition').val() || 0);
const giftReceived = $('#giftReceived').val() === 'Y';
const mileageReceived = $('#mileageReceived').val() === 'Y';
console.log('초기화 상태:', {
currentSteps,
giftPosition,
giftReceived,
mileageReceived
});
// 다음 목표 계산
const nextTarget = calculateNextTarget(currentSteps);
// 깜짝선물 버튼 초기화
if (giftReceived) {
// 이미 받은 경우
$('#giftText').hide();
$('#giftButton')
.show()
.prop('disabled', true)
.text('수령완료')
.removeClass('btn Att-check')
.addClass('btn-disabled')
.off('click'); // 이벤트 제거
} else if (currentSteps >= giftPosition) {
// 조건 충족하고 아직 안받은 경우
$('#giftText').hide();
$('#giftButton')
.show()
.prop('disabled', false)
.addClass('btn Att-check')
.html('<i class="ico_check_white"></i>선물받기')
.css({
'padding': '10px',
'font-size': '14px',
'height': '36px',
'white-space': 'nowrap'
})
.off('click') // 기존 이벤트 제거
.on('click', receiveGift); // 새 이벤트 추가
} else {
// 조건 미충족
$('#giftText')
.show()
.text((giftPosition - currentSteps).toLocaleString() + ' 걸음');
$('#giftButton').hide();
}
// 마일리지 버튼 초기화
if (mileageReceived) {
// 이미 받은 경우
$('#mileageText').hide();
$('#mileageButton')
.show()
.prop('disabled', true)
.text('수령완료')
.removeClass('btn Att-check')
.addClass('btn-disabled')
.off('click'); // 이벤트 제거
} else if (currentSteps >= nextTarget.targetStep) {
// 조건 충족하고 아직 안받은 경우
$('#mileageText').hide();
$('#mileageButton')
.show()
.prop('disabled', false)
.addClass('btn Att-check')
.html('<i class="ico_check_white"></i>마일리지받기')
.css({
'padding': '10px',
'font-size': '14px',
'height': '36px',
'white-space': 'nowrap'
})
.off('click') // 기존 이벤트 제거
.on('click', function() {
receiveMileage(); // rewardCode는 함수 내부에서 계산
});
} else {
// 조건 미충족
$('#mileageText')
.show()
.text(nextTarget.remainingSteps.toLocaleString() + ' 걸음');
$('#mileageButton').hide();
}
}
/**
* 깜짝선물과 마일리지 버튼 상태 업데이트
*/
function updateRewardButtons(stepCount) {
const giftPosition = parseInt($('#todayGiftCondition').val() || 0);
const achievementCount = parseInt($('#achievementCount').val() || 0);
const monthlyRewardReceived = $('#monthlyRewardReceived').val() === 'Y';
const giftReceived = $('#giftReceived').val() === 'Y';
const mileageReceived = $('#mileageReceived').val() === 'Y';
// 다음 목표 계산
const nextTarget = calculateNextTarget(stepCount);
// 깜짝선물 버튼 업데이트 (return 제거)
if (giftReceived) {
// 이미 받은 경우 - 상태 유지 (return 대신 아무것도 안함)
} else if (stepCount >= giftPosition) {
$('#giftText').hide();
$('#giftButton')
.show()
.prop('disabled', false)
.addClass('btn Att-check')
.html('<i class="ico_check_white"></i>선물받기')
.css({
'padding': '10px',
'font-size': '14px',
'height': '36px',
'white-space': 'nowrap'
})
.off('click')
.on('click', receiveGift);
} else {
$('#giftText')
.show()
.text((giftPosition - stepCount).toLocaleString() + ' 걸음');
$('#giftButton').hide();
}
// 마일리지 버튼 업데이트 - 일일 만보 달성 시 (return 제거)
if (mileageReceived) {
// 이미 받은 경우 - 상태 유지 (return 대신 아무것도 안함)
} else if (stepCount >= nextTarget.targetStep && nextTarget.rewardCode === '02010') {
$('#mileageText').hide();
$('#mileageButton')
.show()
.prop('disabled', false)
.addClass('btn Att-check')
.html('<i class="ico_check_white"></i>마일리지받기')
.css({
'padding': '10px',
'font-size': '14px',
'height': '36px',
'white-space': 'nowrap'
})
.off('click')
.on('click', function() {
receiveMileage('02010'); // 일일 만보 달성 코드
});
} else if (nextTarget.rewardCode !== '02020') {
$('#mileageText')
.show()
.text(nextTarget.remainingSteps.toLocaleString() + ' 걸음');
$('#mileageButton').hide();
}
// 월 누적 10회 달성 마일리지 버튼 업데이트
if (achievementCount >= 10 && !monthlyRewardReceived) {
$('#monthlyMileageButton')
.show()
.off('click')
.on('click', function() {
receiveMileage('02020'); // 월누적 10회 달성 코드 전달
})
.addClass('btn Att-check')
.html('<i class="ico_check_white"></i>월 10회 달성 보상받기');
} else {
$('#monthlyMileageButton').hide();
}
}
/**
* 다음 목표 단계와 남은 걸음 수 계산
*/
function calculateNextTarget(currentSteps) {
const result = {};
const achievementCount = parseInt($('#achievementCount').val() || 0);
// 만보 10회 달성 체크
if (achievementCount >= 10) {
// 이미 수령했는지 확인
const monthlyRewardReceived = $('#monthlyRewardReceived').val() === 'Y';
if (!monthlyRewardReceived) {
result.targetStep = 10000;
result.remainingSteps = 0;
result.achieved = true;
result.rewardCode = '02020'; // 월누적 10회 달성 코드
return result;
}
}
// 일일 만보 목표 처리
if (currentSteps < 10000) {
result.targetStep = 10000;
result.remainingSteps = 10000 - currentSteps;
result.rewardCode = '02010'; // 일일 만보 달성 코드
} else {
result.targetStep = 10000;
result.remainingSteps = 0;
result.achieved = true;
result.rewardCode = '02010'; // 일일 만보 달성 코드
}
return result;
}
/**
* 스탬프 초기화
*/
function initStamps() {
const achievementCount = parseInt($('#achievementCount').val() || 0);
const stampList = $('#stampList');
// 이미 스탬프가 있다면 초기화 건너뛰기
if (stampList.children().length > 0) return;
stampList.empty();
for (let i = 1; i <= 10; i++) {
if (i <= achievementCount) {
stampList.append('<li class="success">성공</li>');
} else if (i === 10) {
stampList.append('<li>응모완료</li>');
} else {
stampList.append('<li>대기</li>');
}
}
$('#monthlySuccessCount').text(achievementCount);
}
/**
* 달력 초기화
*/
function initCalendar() {
const daysContainer = $(".stepDays");
const now = new Date();
const currentMonth = now.getMonth();
const currentYear = now.getFullYear();
const currentDay = now.getDate();
// 현재 월의 첫 날 구하기
const firstDay = new Date(currentYear, currentMonth, 1);
const firstDayOfWeek = firstDay.getDay();
// 현재 월의 마지막 날 구하기
const lastDay = new Date(currentYear, currentMonth + 1, 0);
const daysInMonth = lastDay.getDate();
// 달력 월 표시 업데이트
$('.month-tit').text((currentMonth + 1) + '월');
// 달력 초기화
daysContainer.empty();
// 첫 날 앞의 빈 칸 생성
for (let i = 0; i < firstDayOfWeek; i++) {
const emptyCell = $('<div></div>');
daysContainer.append(emptyCell);
}
// 서버에서 일별 데이터 가져오기
$.ajax({
url: '/sopmal/bnft/getMonthlyStepData',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
yearMonth: currentYear + '-' + (currentMonth + 1).toString().padStart(2, '0')
}),
success: function(response) {
// 응답 데이터 파싱
let dailySteps = [];
if (response && response.resBody && response.resBody.result) {
try {
const parsedResult = JSON.parse(response.resBody.result);
dailySteps = parsedResult.dailySteps || [];
} catch (e) {
console.error('데이터 파싱 오류:', e);
}
}
// 날짜 칸 생성
for (let day = 1; day <= daysInMonth; day++) {
createCalendarDay(day, currentDay, dailySteps);
}
},
error: function() {
// 에러 발생 시 빈 달력 생성
for (let day = 1; day <= daysInMonth; day++) {
createCalendarDay(day, currentDay, []);
}
}
});
}
/**
* 달력 날짜 칸 생성
*/
function createCalendarDay(day, currentDay, dailyStepData) {
const daysContainer = $(".stepDays");
const calendarDay = $('<div></div>').text(day);
// 오늘 날짜에 클래스 추가
if (day === currentDay) {
calendarDay.addClass('today');
}
// 해당 날짜의 걸음 수 정보 찾기
const dayData = dailyStepData.find(data => {
const dateStr = data.recordDate || '';
return dateStr.endsWith('-' + day.toString().padStart(2, '0'));
});
if (dayData) {
const stepsCount = $('<div></div>')
.text(parseInt(dayData.stepCount || 0).toLocaleString())
.addClass('steps');
calendarDay.append(stepsCount);
// 단계별 클래스 추가
const stepCount = parseInt(dayData.stepCount || 0);
if (stepCount >= 10000) {
calendarDay.addClass('success');
} else if (stepCount >= 7500) {
calendarDay.addClass('success3');
} else if (stepCount >= 5000) {
calendarDay.addClass('success2');
} else if (stepCount >= 2500) {
calendarDay.addClass('success1');
}
}
daysContainer.append(calendarDay);
}
/**
* 깜짝선물 받기
*/
function receiveGift() {
$.ajax({
url: '/sopmal/bnft/receiveGift',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
bnfInnb: $('#bnfInnb').val(),
bnfRwdCateDvCd: $('#todayGiftCategory').val()
}),
success: function(response) {
// 응답 구조에 맞게 파싱
if (response && response.resBody && response.resBody.result) {
try {
const resultObj = JSON.parse(response.resBody.result);
if (resultObj && resultObj.success) {
// 선물 정보 추출 및 표시
if (resultObj.rewardInfo) {
const rewardInfo = resultObj.rewardInfo;
let rewardMessage = '<p style="text-align:center; font-weight:bold; margin-bottom:10px;">축하합니다!</p>';
// 선물 타입에 따른 메시지 생성
if (rewardInfo.mileageAmount && rewardInfo.mileageAmount > 0) {
rewardMessage += `<p>마일리지 <b>${rewardInfo.mileageAmount.toLocaleString()}원</b>이 지급되었습니다.</p>`;
}
if (rewardInfo.couponNo) {
rewardMessage += `<p>쿠폰이 발급되었습니다.</p>`;
}
// 보상 카테고리에 따른 추가 정보 표시 가능
switch(rewardInfo.rewardCategoryCode) {
case '02032':
rewardMessage += `<p>깜짝선물 달성 보상입니다.</p>`;
break;
// 다른 카테고리에 대한 처리 추가 가능
}
// 커스텀 모달로 선물 정보 표시
showCustomAlert(rewardMessage, true);
} else {
showCustomAlert('깜짝선물을 받았습니다!');
}
// 깜짝선물 수령 상태 업데이트
$('#giftReceived').val('Y');
// 깜짝선물 받기 버튼을 수령완료로 변경
$('#giftText').hide();
$('#giftButton')
.show()
.prop('disabled', true)
.text('수령완료')
.removeClass('btn Att-check')
.addClass('btn-disabled')
.off('click');
// 깜짝선물 획득 횟수 화면 업데이트
if (resultObj.surpriseGiftCount !== undefined) {
updateSurpriseGiftCount(resultObj.surpriseGiftCount);
}
} else {
showCustomAlert(resultObj.message || '선물 받기에 실패했습니다.');
}
} catch (e) {
console.error('응답 파싱 오류:', e);
showCustomAlert('응답 처리 중 오류가 발생했습니다.');
}
} else {
showCustomAlert('유효하지 않은 응답 형식입니다.');
}
},
error: function() {
showCustomAlert('서버 오류가 발생했습니다.');
}
});
}
/**
* 깜짝선물 획득 횟수 화면 업데이트
*/
function updateSurpriseGiftCount(surpriseGiftCount) {
// ID를 사용하여 더 정확하게 요소 선택
$('#surpriseGiftCountDisplay').text(surpriseGiftCount.toLocaleString());
console.log('깜짝선물 획득 횟수가 ' + surpriseGiftCount + '회로 업데이트되었습니다.');
}
/**
* 마일리지 받기
*/
function receiveMileage(rewardCode) {
const currentSteps = parseInt($('#currentStepCount').val() || 0);
const nextTarget = calculateNextTarget(currentSteps);
// rewardCode가 없으면 nextTarget에서 가져옴
if (!rewardCode) {
rewardCode = nextTarget.rewardCode;
}
$.ajax({
url: '/sopmal/bnft/receiveMileage',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
bnfInnb: $('#bnfInnb').val(),
bnfRwdCateDvCd: rewardCode
}),
success: function(response) {
// 응답 구조에 맞게 파싱
if (response && response.resBody && response.resBody.result) {
try {
const resultObj = JSON.parse(response.resBody.result);
if (resultObj && resultObj.success) {
if (rewardCode === '02020') {
showCustomAlert('월 10회 달성 보상을 받았습니다!');
$('#monthlyMileageButton').prop('disabled', true).text('수령완료');
$('#monthlyRewardReceived').val('Y');
} else {
showCustomAlert('마일리지를 받았습니다!');
$('#mileageButton').prop('disabled', true).text('수령완료');
}
} else {
showCustomAlert(resultObj.message || '마일리지 받기에 실패했습니다.');
}
} catch (e) {
console.error('응답 파싱 오류:', e);
showCustomAlert('응답 처리 중 오류가 발생했습니다.');
}
} else {
showCustomAlert('유효하지 않은 응답 형식입니다.');
}
},
error: function() {
showCustomAlert('서버 오류가 발생했습니다.');
}
});
}
/**
* 로컬 테스트용 만보기 데이터 모킹 기능
*/
function setupTestEnvironment() {
// 앱 인터페이스 모킹
window.app = {
get_walk_count: function(startDate, endDate) {
console.log("모의 걸음수 데이터 요청: " + startDate + " ~ " + endDate);
// 현재 월의 테스트 데이터 생성
const testData = generateTestData(startDate, endDate);
// 비동기 실행으로 실제 앱 동작 흉내
setTimeout(function() {
callback_get_walk_count(JSON.stringify(testData));
}, 500);
}
};
console.log("테스트 환경이 설정되었습니다.");
}
/**
* 테스트용 걸음수 데이터 생성
*/
function generateTestData(startDate, endDate) {
const result = [];
const start = parseDate(startDate);
const end = parseDate(endDate);
// 각 날짜별 데이터 생성
for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
const date = formatDateYYYYMMDD(d);
// 오늘 날짜인 경우 더 많은 걸음수 설정 (테스트용)
const isToday = date === formatDateYYYYMMDD(new Date());
// 다양한 테스트 케이스 (1,000 ~ 12,000 걸음)
let count;
if (isToday) {
// 오늘은 목표 달성 가능한 단계별 테스트를 위해 조정
// 예: 2400, 4900, 9900 또는 10000 이상
const testCase = Math.floor(Math.random() * 4);
switch(testCase) {
case 0: count = 2400; break; // 2500 미만
case 1: count = 4900; break; // 5000 미만
case 2: count = 9900; break; // 10000 미만
case 3: count = 11000; break; // 10000 이상
}
} else {
// 이전 날짜들은 다양한 걸음수 (성공/실패 케이스 혼합)
count = Math.floor(Math.random() * 12000) + 1000;
}
result.push({
date: date,
count: count.toString()
});
}
return result;
}
/**
* YYYYMMDD 문자열을 Date 객체로 파싱
*/
function parseDate(dateStr) {
const year = parseInt(dateStr.substring(0, 4));
const month = parseInt(dateStr.substring(4, 6)) - 1;
const day = parseInt(dateStr.substring(6, 8));
return new Date(year, month, day);
}
// 콘솔에서 수동으로 특정 걸음수 설정하는 함수
function setTodaySteps(steps) {
const today = formatDateYYYYMMDD(new Date());
const testData = [{
date: today,
count: steps.toString()
}];
callback_get_walk_count(JSON.stringify(testData));
console.log(steps + "걸음으로 설정되었습니다.");
}
/**
* 스탬프 정보 업데이트
*/
function updateStampInfo() {
// 서버에서 최신 달성 횟수 조회
$.ajax({
url: '/sopmal/bnft/getMonthlySuccessCount',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
bnfInnb: $('#bnfInnb').val()
}),
success: function(response) {
if (response && response.resBody && response.resBody.result) {
const resultObj = JSON.parse(response.resBody.result);
if (resultObj && resultObj.achievementCount !== undefined) {
const achievementCount = resultObj.achievementCount;
// hidden input 값 업데이트
$('#achievementCount').val(achievementCount);
// 스탬프 UI 업데이트
const stampList = $('#stampList');
stampList.empty();
for (let i = 1; i <= 10; i++) {
if (i <= achievementCount) {
stampList.append('<li class="success">성공</li>');
} else if (i === 10) {
stampList.append('<li>응모완료</li>');
} else {
stampList.append('<li>대기</li>');
}
}
// 달성 횟수 텍스트 업데이트
$('#monthlySuccessCount').text(achievementCount);
// 만보 10회 달성 시 마일리지 버튼 상태 업데이트
if (achievementCount >= 10) {
const currentSteps = parseInt($('#currentStepCount').val() || 0);
updateRewardButtons(currentSteps);
// 보상 정보가 있는 경우 처리
if (resultObj.rewardInfo) {
// 필요한 경우 보상 정보 활용
console.log("보상 정보:", resultObj.rewardInfo);
}
}
}
}
},
error: function(xhr, status, error) {
console.error("스탬프 정보 업데이트 실패:", error);
}
});
}
/**
* 설정 페이지로 이동
*/
function goToSettings() {
location.href = '/sopmal/bnft/stepcntSettings';
}