2025-06-11 14:44:16 +09:00

155 lines
5.2 KiB
JavaScript

//* src/services/recommend.js
import { recommendApi, handleApiError, formatSuccessResponse } from './api.js'
/**
* AI 추천 관련 API 서비스
* 유저스토리: REC-005
*/
class RecommendService {
/**
* AI 마케팅 팁 생성 (REC-005: AI 마케팅 방법 추천)
* @param {Object} requestData - 마케팅 팁 요청 정보
* @returns {Promise<Object>} 생성된 마케팅 팁
*/
async generateMarketingTips(requestData = {}) {
try {
const response = await recommendApi.post('/marketing-tips', {
storeId: requestData.storeId,
includeWeather: requestData.includeWeather !== false, // 기본값 true
includeTrends: requestData.includeTrends !== false, // 기본값 true
maxTips: requestData.maxTips || 3,
tipType: requestData.tipType || 'general', // general, menu, marketing, operation
})
return formatSuccessResponse(response.data.data, 'AI 마케팅 팁이 생성되었습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 날씨 기반 메뉴 추천
* @param {number} storeId - 매장 ID
* @returns {Promise<Object>} 날씨 기반 메뉴 추천
*/
async getWeatherBasedMenuRecommendation(storeId) {
try {
const response = await recommendApi.get(`/weather-menu/${storeId}`)
return formatSuccessResponse(response.data.data, '날씨 기반 메뉴 추천을 조회했습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 매출 예측 추천
* @param {number} storeId - 매장 ID
* @param {string} period - 예측 기간 (day, week, month)
* @returns {Promise<Object>} 매출 예측 정보
*/
async getSalesPrediction(storeId, period = 'day') {
try {
const response = await recommendApi.get(`/sales-prediction/${storeId}?period=${period}`)
return formatSuccessResponse(response.data.data, '매출 예측 정보를 조회했습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 인기 메뉴 추천
* @param {number} storeId - 매장 ID
* @param {string} period - 분석 기간
* @returns {Promise<Object>} 인기 메뉴 추천
*/
async getPopularMenuRecommendation(storeId, period = 'month') {
try {
const response = await recommendApi.get(`/popular-menu/${storeId}?period=${period}`)
return formatSuccessResponse(response.data.data, '인기 메뉴 추천을 조회했습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 마케팅 전략 추천
* @param {number} storeId - 매장 ID
* @param {string} strategyType - 전략 유형 (sales_boost, customer_retention, cost_reduction)
* @returns {Promise<Object>} 마케팅 전략 추천
*/
async getMarketingStrategy(storeId, strategyType = 'sales_boost') {
try {
const response = await recommendApi.get(`/marketing-strategy/${storeId}?type=${strategyType}`)
return formatSuccessResponse(response.data.data, '마케팅 전략 추천을 조회했습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 통합 AI 추천 (매출 예측 + 메뉴 추천 + 마케팅 전략)
* @param {number} storeId - 매장 ID
* @returns {Promise<Object>} 통합 AI 추천 정보
*/
async getComprehensiveRecommendation(storeId) {
try {
const response = await recommendApi.get(`/comprehensive-recommendation/${storeId}`)
return formatSuccessResponse(response.data.data, '통합 AI 추천을 조회했습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 추천 기록 조회
* @param {Object} filters - 필터링 옵션
* @returns {Promise<Object>} 추천 기록 목록
*/
async getRecommendationHistory(filters = {}) {
try {
const queryParams = new URLSearchParams()
if (filters.type) queryParams.append('type', filters.type)
if (filters.startDate) queryParams.append('startDate', filters.startDate)
if (filters.endDate) queryParams.append('endDate', filters.endDate)
if (filters.page) queryParams.append('page', filters.page)
if (filters.size) queryParams.append('size', filters.size || 20)
const response = await recommendApi.get(`/history?${queryParams.toString()}`)
return formatSuccessResponse(response.data.data, '추천 기록을 조회했습니다.')
} catch (error) {
return handleApiError(error)
}
}
/**
* 추천 피드백 제공
* @param {number} recommendationId - 추천 ID
* @param {Object} feedback - 피드백 정보
* @returns {Promise<Object>} 피드백 제공 결과
*/
async provideFeedback(recommendationId, feedback) {
try {
const response = await recommendApi.post(`/feedback/${recommendationId}`, {
rating: feedback.rating, // 1-5 점수
useful: feedback.useful, // true/false
comment: feedback.comment || '',
appliedSuggestions: feedback.appliedSuggestions || [],
})
return formatSuccessResponse(response.data.data, '피드백이 제공되었습니다.')
} catch (error) {
return handleApiError(error)
}
}
}
export const recommendService = new RecommendService()
export default recommendService