health-assistant / app /services /meal_service.py
yuting111222's picture
move backend files to root for Hugging Face Spaces deployment
f8e601b
from datetime import datetime
from typing import List, Dict, Any, Optional
from sqlalchemy.orm import Session
from ..models.meal_log import MealLog
class MealService:
def __init__(self, db: Session):
self.db = db
def create_meal_log(
self,
food_name: str,
meal_type: str,
portion_size: str,
nutrition: Dict[str, float],
meal_date: datetime,
image_url: Optional[str] = None,
ai_analysis: Optional[Dict[str, Any]] = None
) -> MealLog:
"""創建新的用餐記錄"""
meal_log = MealLog(
food_name=food_name,
meal_type=meal_type,
portion_size=portion_size,
calories=nutrition.get('calories', 0),
protein=nutrition.get('protein', 0),
carbs=nutrition.get('carbs', 0),
fat=nutrition.get('fat', 0),
fiber=nutrition.get('fiber', 0),
meal_date=meal_date,
image_url=image_url,
ai_analysis=ai_analysis,
created_at=datetime.utcnow()
)
self.db.add(meal_log)
self.db.commit()
self.db.refresh(meal_log)
return meal_log
def get_meal_logs(
self,
start_date: Optional[datetime] = None,
end_date: Optional[datetime] = None,
meal_type: Optional[str] = None
) -> List[MealLog]:
"""獲取用餐記錄"""
query = self.db.query(MealLog)
if start_date:
query = query.filter(MealLog.meal_date >= start_date)
if end_date:
query = query.filter(MealLog.meal_date <= end_date)
if meal_type:
query = query.filter(MealLog.meal_type == meal_type)
return query.order_by(MealLog.meal_date.desc()).all()
def get_nutrition_summary(
self,
start_date: datetime,
end_date: datetime
) -> Dict[str, float]:
"""獲取指定時間範圍內的營養攝入總結"""
meals = self.get_meal_logs(start_date, end_date)
summary = {
'total_calories': 0,
'total_protein': 0,
'total_carbs': 0,
'total_fat': 0,
'total_fiber': 0
}
for meal in meals:
# 根據份量大小調整營養值
multiplier = {
'small': 0.7,
'medium': 1.0,
'large': 1.3
}.get(meal.portion_size, 1.0)
summary['total_calories'] += meal.calories * multiplier
summary['total_protein'] += meal.protein * multiplier
summary['total_carbs'] += meal.carbs * multiplier
summary['total_fat'] += meal.fat * multiplier
summary['total_fiber'] += meal.fiber * multiplier
return summary