File size: 2,858 Bytes
89b8989
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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