123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- # -*- encoding: utf-8 -*-
- """
- @File : FeedDiaryController.py
- @Time : 2024-10-7 14:37:30
- @Author : peng
- @Email :
- @Software: PyCharm
- """
- from datetime import datetime, timedelta
- import time
- from django.views import View
- 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, 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)}'})
|