# -*- encoding: utf-8 -*- """ @File : FeedDiaryController.py @Time : 2024-10-7 14:37:30 @Author : peng @Email : @Software: PyCharm """ import datetime import json import time from django.db.models import F, Q, Count from django.views import View from Object.ResponseObject import ResponseObject from Roomumy.models import FeedDiary, FeedType from Service.CommonService import CommonService class 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, ResponseObject('cn')) elif operation == 'queryStatistics': # 查询喂养统计 return self.get_statistics_data(request_dict, ResponseObject('cn')) elif operation == 'addOrEdit': # 查询喂养统计 return self.add_or_edit_feed_diary(request_dict, ResponseObject('cn')) elif operation == 'delete': # 查询喂养统计 return self.delete_feed_diary(request_dict, ResponseObject('cn')) elif operation == 'getFeedList': # 查询喂养列表 return self.get_feed_list(request_dict, ResponseObject('cn')) 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(created_time__gte=start_time, created_time__lt=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', 'created_time', 'id', 'feed_type') return response.json(0, list(feed_diary)) 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: 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: now_time = int(time.time()) FeedDiary.objects.filter(id=feed_id, baby_id=baby_id).update(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, created_time=date_time, updated_time=date_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') 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)))