| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 | # -*- encoding: utf-8 -*-"""@File    : FeedDiaryController.py@Time    : 2024-10-7 14:37:30@Author  : peng@Email   :@Software: PyCharm"""from datetime import datetime, timedeltaimport jsonimport timefrom django.db.models import F, Q, Countfrom django.views import Viewfrom Object.ResponseObject import ResponseObjectfrom Roomumy.models import FeedDiary, FeedTypefrom Service.CommonService import CommonServiceclass FeedDiaryView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, request, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, request, operation)    def validation(self, request_dict, request, operation):        token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)        if token_code != 0:            return response.json(token_code)        if operation == 'query':  # 查询喂养记录            return self.get_feed_diary_data(request_dict, response)        elif operation == 'queryStatistics':  # 查询喂养统计            return self.get_statistics_data(request_dict, response)        elif operation == 'addOrEdit':  # 添加或编辑喂养日记            return self.add_or_edit_feed_diary(request_dict, response)        elif operation == 'delete':  # 删除喂养日记            return self.delete_feed_diary(request_dict, response)        elif operation == 'getFeedList':  # 查询喂养类型列表            return self.get_feed_list(request_dict, response)        elif operation == 'feedTypeConfig':            return self.feed_type_config(request_dict, response)        elif operation == 'getDailyRecordStatus':  # 查询天数记录            return self.get_daily_record_status(request_dict, response)        else:            return response.json(414)    @classmethod    def get_feed_diary_data(cls, request_dict, response):        """        查询喂养记录        @param request_dict: 请求参数        @request_dict start_time: 开始时间戳        @request_dict end_time: 结束时间戳        @request_dict baby_id: 宝宝id        @request_dict event_type: 喂养类型        @param response: 响应对象        @return: response        """        start_time = request_dict.get('start_time', None)        end_time = request_dict.get('end_time', None)        baby_id = request_dict.get('baby_id', None)        feed_type = request_dict.get('feed_type', None)        if not all([start_time, end_time, baby_id]):            return response.json(444, {'error param': 'start_time, end_time or baby_id'})        try:            feed_diary = FeedDiary.objects.filter(date_time__gte=start_time, date_time__lte=end_time,                                                  baby_id=baby_id)            if feed_type:                feed_diary = feed_diary.filter(feed_type=feed_type)            feed_diary = feed_diary.values('feed_type__name', 'feed_type__icon_url', 'feed_content', 'date_time',                                           'id', 'feed_type')            feed_diary = list(feed_diary)            # 统计各类型的喂养次数            feed_statistics = {}            for item in feed_diary:                feed_type_id = item['feed_type']                feed_type_name = item['feed_type__name']                # 初始化统计项                if feed_type_id not in feed_statistics:                    feed_statistics[feed_type_id] = {                        "feed_type_name": feed_type_name,                        "frequency": 0,                        "total": 0  # 仅对类型1/2/3有效                    }                # 更新统计                feed_statistics[feed_type_id]["frequency"] += 1                # 仅对类型1/2/3计算total                if item['feed_type'] in [1, 2, 3] and "total" in item.get("feed_content", {}):                    feed_statistics[feed_type_id]["total"] += item["feed_content"]["total"]            # 转换统计结果为列表            feed_statistics_list = [                {                    "feed_type": feed_type_id,                    "feed_type_name": data["feed_type_name"],                    "frequency": str(data["frequency"]),                    "total": str(data["total"])                }                for feed_type_id, data in feed_statistics.items()            ]            return response.json(0, {                'feed_diary': feed_diary,                'feed_statistics': feed_statistics_list  # 改为列表形式,更清晰            })        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def get_statistics_data(cls, request_dict, response):        """        查询喂养记录        @param request_dict: 请求参数        @request_dict start_time: 开始时间戳        @request_dict end_time: 结束时间戳        @request_dict baby_id: 宝宝id        @request_dict event_type: 喂养类型        @request_dict sub_event_type: 喂养子类型        @param response: 响应对象        @return: response        """        start_time = request_dict.get('start_time', None)        end_time = request_dict.get('end_time', None)        baby_id = request_dict.get('baby_id', None)        feed_type = request_dict.get('feed_type', None)        sub_feed_type = request_dict.get('sub_feed_type', None)        if not all([start_time, end_time, baby_id, feed_type]):            return response.json(444, {'error param': 'start_time, end_time, event_type or baby_id'})        s_time = datetime.datetime.fromtimestamp(int(start_time))        e_time = datetime.datetime.fromtimestamp(int(end_time))        time_list = CommonService.cutting_time(s_time, e_time, 'day')        try:            result_list = []            for time_range in time_list:                content_list = []                feed_diary = FeedDiary.objects.filter(created_time__gte=time_range[0], created_time__lt=time_range[1],                                                      baby_id=baby_id, feed_type_id=feed_type).values_list(                    'feed_content', flat=True)                count = 0                if feed_type == '5' and sub_feed_type:  # 换尿布                    sub_feed_type = int(sub_feed_type)                    for item in feed_diary:                        if item['sub_feed_type'] in [sub_feed_type, 3]:  # 1:嘘嘘 2:臭臭 3:嘘嘘+臭臭 4:干爽                            count += 1                            content_list.append(item)                else:                    count = feed_diary.count()                    content_list = list(feed_diary)                result_list.append({                    'date_time': time_range[0],                    'count': count,                    'feed_content': content_list                })            return response.json(0, result_list)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def add_or_edit_feed_diary(cls, request_dict, response):        """        添加编辑喂养记录        @param request_dict: 请求参数        @request_dict date_time: 喂养时间戳        @request_dict baby_id: 宝宝id        @request_dict feed_id: 记录id        @request_dict event_type: 喂养类型        @request_dict event_content: 喂养事件        @param response: 响应对象        @return: response        """        date_time = request_dict.get('date_time', None)        baby_id = request_dict.get('baby_id', None)        feed_id = request_dict.get('feed_id', None)        feed_type = request_dict.get('feed_type', None)        feed_content = request_dict.get('feed_content', None)        if not all([date_time, baby_id, feed_type, feed_content]):            return response.json(444, {'error param': 'date_time, feed_content, feed_type or baby_id'})        feed_content = eval(feed_content)        try:            now_time = int(time.time())            feed_type_qs = FeedType.objects.filter(id=feed_type)            if not feed_type_qs:                return response.json(444, {'error param': 'feed_type'})            if feed_id:                FeedDiary.objects.filter(id=feed_id, baby_id=baby_id).update(date_time=date_time,                                                                             updated_time=now_time,                                                                             feed_content=feed_content)            else:                FeedDiary.objects.create(baby_id=baby_id, feed_type_id=feed_type, feed_content=feed_content,                                         date_time=date_time, created_time=now_time, updated_time=now_time)            return response.json(0)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def delete_feed_diary(cls, request_dict, response):        """        删除喂养记录        @param request_dict: 请求参数        @request_dict baby_id: 宝宝id        @request_dict feed_id: 记录id        @param response: 响应对象        @return: response        """        baby_id = request_dict.get('baby_id', None)        feed_id = request_dict.get('feed_id', None)        if not all([feed_id, baby_id]):            return response.json(444, {'error param': 'feed_id or baby_id'})        try:            FeedDiary.objects.filter(id=feed_id, baby_id=baby_id).delete()            return response.json(0)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def get_feed_list(cls, request_dict, response):        """        获取喂养列表        @param request_dict: 请求参数        @param response: 响应对象        @return: response        """        try:            feed_type = FeedType.objects.filter(is_show=True).values('id', 'name', 'icon_url', 'sort').order_by('sort')            return response.json(0, list(feed_type))        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def feed_type_config(cls, request_dict, response):        """        根据喂养类型返回文本列表        @param request_dict: 请求参数        @param response: 响应对象        @return: response        """        try:            feed_type = request_dict.get('feed_type_id', None)            if feed_type == '4':#辅食                feed_type_text = [                    "米粉", "面条", "红薯", "山药", "南瓜",                    "胡萝卜", "菠菜", "番茄", "土豆", "猪肉",                    "猪肝", "鱼肉", "鸡肉", "牛肉", "虾",                    "鸡蛋", "苹果", "香蕉", "猕猴桃", "火龙果"                ]            elif feed_type == '5':                feed_type_text = ["嘘嘘", "臭臭", "嘘嘘+臭臭", "干爽"]            elif feed_type == '10':                feed_type_text = ["额温", "耳温", "腋温", "口温", "肛温"]            else:                feed_type_text = []            return response.json(0, {"feed_type_text": feed_type_text})        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def get_daily_record_status(cls, request_dict, response):        """        获取记录的日期        @param request_dict: 请求参数        @request_dict baby_id: 宝宝id        @request_dict timestamp: 时间戳        @param response: 响应对象        @return: response        """        baby_id = request_dict.get('baby_id')        start_time = request_dict.get('start_time')        end_time = request_dict.get('end_time')        if not all([baby_id, start_time, end_time]):            return response.json(444, {'error': '缺少baby_id、start_time或end_time参数'})        try:            # 转换为整数            start_time = int(start_time)            end_time = int(end_time)            records = FeedDiary.objects.filter(                baby_id=baby_id,                date_time__gte=start_time,                date_time__lte=end_time            ).values('date_time')            record_dates = {                datetime.fromtimestamp(r['date_time']).strftime('%Y-%m-%d')                for r in records            }            # 生成时间段内所有日期            all_dates = []            current_date = datetime.fromtimestamp(start_time).date()            end_date = datetime.fromtimestamp(end_time).date()            while current_date <= end_date:                all_dates.append(current_date.strftime('%Y-%m-%d'))                current_date += timedelta(days=1)            # 构建返回结果            result = []            for date in all_dates:                result.append({                    'date': date,                    'has_record': date in record_dates                })            return response.json(0, {                'baby_id': baby_id,                'days': result            })        except ValueError as e:            return response.json(444, {'error': '时间戳格式不正确'})        except Exception as e:            return response.json(500, {'error': f'服务器错误: {str(e)}'})
 |