FeedDiaryController.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : FeedDiaryController.py
  4. @Time : 2024-10-7 14:37:30
  5. @Author : peng
  6. @Email :
  7. @Software: PyCharm
  8. """
  9. from datetime import datetime, timedelta
  10. import time
  11. from django.views import View
  12. from Roomumy.models import FeedDiary, FeedType
  13. from Service.CommonService import CommonService
  14. class FeedDiaryView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. return self.validation(request.GET, request, operation)
  19. def post(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.POST, request, operation)
  23. def validation(self, request_dict, request, operation):
  24. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  25. if token_code != 0:
  26. return response.json(token_code)
  27. if operation == 'query': # 查询喂养记录
  28. return self.get_feed_diary_data(request_dict, response)
  29. elif operation == 'queryStatistics': # 查询喂养统计
  30. return self.get_statistics_data(request_dict, response)
  31. elif operation == 'addOrEdit': # 添加或编辑喂养日记
  32. return self.add_or_edit_feed_diary(request_dict, response)
  33. elif operation == 'delete': # 删除喂养日记
  34. return self.delete_feed_diary(request_dict, response)
  35. elif operation == 'getFeedList': # 查询喂养类型列表
  36. return self.get_feed_list(request_dict, response)
  37. elif operation == 'feedTypeConfig':
  38. return self.feed_type_config(request_dict, response)
  39. elif operation == 'getDailyRecordStatus': # 查询天数记录
  40. return self.get_daily_record_status(request_dict, response)
  41. else:
  42. return response.json(414)
  43. @classmethod
  44. def get_feed_diary_data(cls, request_dict, response):
  45. """
  46. 查询喂养记录
  47. @param request_dict: 请求参数
  48. @request_dict start_time: 开始时间戳
  49. @request_dict end_time: 结束时间戳
  50. @request_dict baby_id: 宝宝id
  51. @request_dict event_type: 喂养类型
  52. @param response: 响应对象
  53. @return: response
  54. """
  55. start_time = request_dict.get('start_time', None)
  56. end_time = request_dict.get('end_time', None)
  57. baby_id = request_dict.get('baby_id', None)
  58. feed_type = request_dict.get('feed_type', None)
  59. if not all([start_time, end_time, baby_id]):
  60. return response.json(444, {'error param': 'start_time, end_time or baby_id'})
  61. try:
  62. feed_diary = FeedDiary.objects.filter(date_time__gte=start_time, date_time__lte=end_time,
  63. baby_id=baby_id)
  64. if feed_type:
  65. feed_diary = feed_diary.filter(feed_type=feed_type)
  66. feed_diary = feed_diary.values('feed_type__name', 'feed_type__icon_url', 'feed_content', 'date_time',
  67. 'id', 'feed_type')
  68. feed_diary = list(feed_diary)
  69. # 统计各类型的喂养次数
  70. feed_statistics = {}
  71. for item in feed_diary:
  72. feed_type_id = item['feed_type']
  73. feed_type_name = item['feed_type__name']
  74. # 初始化统计项
  75. if feed_type_id not in feed_statistics:
  76. feed_statistics[feed_type_id] = {
  77. "feed_type_name": feed_type_name,
  78. "frequency": 0,
  79. "total": 0 # 仅对类型1/2/3有效
  80. }
  81. # 更新统计
  82. feed_statistics[feed_type_id]["frequency"] += 1
  83. # 仅对类型1/2/3计算total
  84. if item['feed_type'] in [1, 2, 3] and "total" in item.get("feed_content", {}):
  85. feed_statistics[feed_type_id]["total"] += item["feed_content"]["total"]
  86. # 转换统计结果为列表
  87. feed_statistics_list = [
  88. {
  89. "feed_type": feed_type_id,
  90. "feed_type_name": data["feed_type_name"],
  91. "frequency": str(data["frequency"]),
  92. "total": str(data["total"])
  93. }
  94. for feed_type_id, data in feed_statistics.items()
  95. ]
  96. return response.json(0, {
  97. 'feed_diary': feed_diary,
  98. 'feed_statistics': feed_statistics_list # 改为列表形式,更清晰
  99. })
  100. except Exception as e:
  101. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  102. @classmethod
  103. def get_statistics_data(cls, request_dict, response):
  104. """
  105. 查询喂养记录
  106. @param request_dict: 请求参数
  107. @request_dict start_time: 开始时间戳
  108. @request_dict end_time: 结束时间戳
  109. @request_dict baby_id: 宝宝id
  110. @request_dict event_type: 喂养类型
  111. @request_dict sub_event_type: 喂养子类型
  112. @param response: 响应对象
  113. @return: response
  114. """
  115. start_time = request_dict.get('start_time', None)
  116. end_time = request_dict.get('end_time', None)
  117. baby_id = request_dict.get('baby_id', None)
  118. feed_type = request_dict.get('feed_type', None)
  119. sub_feed_type = request_dict.get('sub_feed_type', None)
  120. if not all([start_time, end_time, baby_id, feed_type]):
  121. return response.json(444, {'error param': 'start_time, end_time, event_type or baby_id'})
  122. s_time = datetime.datetime.fromtimestamp(int(start_time))
  123. e_time = datetime.datetime.fromtimestamp(int(end_time))
  124. time_list = CommonService.cutting_time(s_time, e_time, 'day')
  125. try:
  126. result_list = []
  127. for time_range in time_list:
  128. content_list = []
  129. feed_diary = FeedDiary.objects.filter(created_time__gte=time_range[0], created_time__lt=time_range[1],
  130. baby_id=baby_id, feed_type_id=feed_type).values_list(
  131. 'feed_content', flat=True)
  132. count = 0
  133. if feed_type == '5' and sub_feed_type: # 换尿布
  134. sub_feed_type = int(sub_feed_type)
  135. for item in feed_diary:
  136. if item['sub_feed_type'] in [sub_feed_type, 3]: # 1:嘘嘘 2:臭臭 3:嘘嘘+臭臭 4:干爽
  137. count += 1
  138. content_list.append(item)
  139. else:
  140. count = feed_diary.count()
  141. content_list = list(feed_diary)
  142. result_list.append({
  143. 'date_time': time_range[0],
  144. 'count': count,
  145. 'feed_content': content_list
  146. })
  147. return response.json(0, result_list)
  148. except Exception as e:
  149. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  150. @classmethod
  151. def add_or_edit_feed_diary(cls, request_dict, response):
  152. """
  153. 添加编辑喂养记录
  154. @param request_dict: 请求参数
  155. @request_dict date_time: 喂养时间戳
  156. @request_dict baby_id: 宝宝id
  157. @request_dict feed_id: 记录id
  158. @request_dict event_type: 喂养类型
  159. @request_dict event_content: 喂养事件
  160. @param response: 响应对象
  161. @return: response
  162. """
  163. date_time = request_dict.get('date_time', None)
  164. baby_id = request_dict.get('baby_id', None)
  165. feed_id = request_dict.get('feed_id', None)
  166. feed_type = request_dict.get('feed_type', None)
  167. feed_content = request_dict.get('feed_content', None)
  168. if not all([date_time, baby_id, feed_type, feed_content]):
  169. return response.json(444, {'error param': 'date_time, feed_content, feed_type or baby_id'})
  170. feed_content = eval(feed_content)
  171. try:
  172. now_time = int(time.time())
  173. feed_type_qs = FeedType.objects.filter(id=feed_type)
  174. if not feed_type_qs:
  175. return response.json(444, {'error param': 'feed_type'})
  176. if feed_id:
  177. FeedDiary.objects.filter(id=feed_id, baby_id=baby_id).update(date_time=date_time,
  178. updated_time=now_time,
  179. feed_content=feed_content)
  180. else:
  181. FeedDiary.objects.create(baby_id=baby_id, feed_type_id=feed_type, feed_content=feed_content,
  182. date_time=date_time, created_time=now_time, updated_time=now_time)
  183. return response.json(0)
  184. except Exception as e:
  185. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  186. @classmethod
  187. def delete_feed_diary(cls, request_dict, response):
  188. """
  189. 删除喂养记录
  190. @param request_dict: 请求参数
  191. @request_dict baby_id: 宝宝id
  192. @request_dict feed_id: 记录id
  193. @param response: 响应对象
  194. @return: response
  195. """
  196. baby_id = request_dict.get('baby_id', None)
  197. feed_id = request_dict.get('feed_id', None)
  198. if not all([feed_id, baby_id]):
  199. return response.json(444, {'error param': 'feed_id or baby_id'})
  200. try:
  201. FeedDiary.objects.filter(id=feed_id, baby_id=baby_id).delete()
  202. return response.json(0)
  203. except Exception as e:
  204. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  205. @classmethod
  206. def get_feed_list(cls, request_dict, response):
  207. """
  208. 获取喂养列表
  209. @param request_dict: 请求参数
  210. @param response: 响应对象
  211. @return: response
  212. """
  213. try:
  214. feed_type = FeedType.objects.filter(is_show=True).values('id', 'name', 'icon_url', 'sort').order_by('sort')
  215. return response.json(0, list(feed_type))
  216. except Exception as e:
  217. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  218. @classmethod
  219. def feed_type_config(cls, request_dict, response):
  220. """
  221. 根据喂养类型返回文本列表
  222. @param request_dict: 请求参数
  223. @param response: 响应对象
  224. @return: response
  225. """
  226. try:
  227. feed_type = request_dict.get('feed_type_id', None)
  228. if feed_type == '4':#辅食
  229. feed_type_text = [
  230. "米粉", "面条", "红薯", "山药", "南瓜",
  231. "胡萝卜", "菠菜", "番茄", "土豆", "猪肉",
  232. "猪肝", "鱼肉", "鸡肉", "牛肉", "虾",
  233. "鸡蛋", "苹果", "香蕉", "猕猴桃", "火龙果"
  234. ]
  235. elif feed_type == '5':
  236. feed_type_text = ["嘘嘘", "臭臭", "嘘嘘+臭臭", "干爽"]
  237. elif feed_type == '10':
  238. feed_type_text = ["额温", "耳温", "腋温", "口温", "肛温"]
  239. else:
  240. feed_type_text = []
  241. return response.json(0, {"feed_type_text": feed_type_text})
  242. except Exception as e:
  243. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  244. @classmethod
  245. def get_daily_record_status(cls, request_dict, response):
  246. """
  247. 获取记录的日期
  248. @param request_dict: 请求参数
  249. @request_dict baby_id: 宝宝id
  250. @request_dict timestamp: 时间戳
  251. @param response: 响应对象
  252. @return: response
  253. """
  254. baby_id = request_dict.get('baby_id')
  255. start_time = request_dict.get('start_time')
  256. end_time = request_dict.get('end_time')
  257. if not all([baby_id, start_time, end_time]):
  258. return response.json(444, {'error': '缺少baby_id、start_time或end_time参数'})
  259. try:
  260. # 转换为整数
  261. start_time = int(start_time)
  262. end_time = int(end_time)
  263. records = FeedDiary.objects.filter(
  264. baby_id=baby_id,
  265. date_time__gte=start_time,
  266. date_time__lte=end_time
  267. ).values('date_time')
  268. record_dates = {
  269. datetime.fromtimestamp(r['date_time']).strftime('%Y-%m-%d')
  270. for r in records
  271. }
  272. # 生成时间段内所有日期
  273. all_dates = []
  274. current_date = datetime.fromtimestamp(start_time).date()
  275. end_date = datetime.fromtimestamp(end_time).date()
  276. while current_date <= end_date:
  277. all_dates.append(current_date.strftime('%Y-%m-%d'))
  278. current_date += timedelta(days=1)
  279. # 构建返回结果
  280. result = []
  281. for date in all_dates:
  282. result.append({
  283. 'date': date,
  284. 'has_record': date in record_dates
  285. })
  286. return response.json(0, {
  287. 'baby_id': baby_id,
  288. 'days': result
  289. })
  290. except ValueError as e:
  291. return response.json(444, {'error': '时间戳格式不正确'})
  292. except Exception as e:
  293. return response.json(500, {'error': f'服务器错误: {str(e)}'})