EquipmentInfoService.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : EquipmentInfoService.py
  4. @Time : 2022/4/14 17:28
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import datetime
  10. import time
  11. from Model.models import EquipmentInfoMonday, EquipmentInfoTuesday, EquipmentInfoWednesday, EquipmentInfoThursday, \
  12. EquipmentInfoFriday, EquipmentInfoSaturday, EquipmentInfoSunday
  13. from Object.utils import LocalDateTimeUtil
  14. """
  15. 设备分表查询Service
  16. 因数据量不断增加,单表保留近七天数据进行分表优化设计
  17. 进行拆分为七张表星期一至星期天进行分表存储。分担单表存储读写压力。
  18. """
  19. class EquipmentInfoService:
  20. @staticmethod
  21. def get_equipment_info_model(dt, val=0):
  22. """
  23. 根据日期判断是星期几,返回相应的Model对象
  24. @param val: 1-7代表week
  25. @param dt: 日期 例:2022-03-03
  26. @return: 星期一至星期天equipment_info对象实例
  27. """
  28. week = 1
  29. if dt:
  30. week = LocalDateTimeUtil.date_to_week(dt)
  31. if 0 < val < 8:
  32. week = val
  33. equipment_info = None
  34. if week == 1:
  35. equipment_info = EquipmentInfoMonday.objects.all()
  36. elif week == 2:
  37. equipment_info = EquipmentInfoTuesday.objects.all()
  38. elif week == 3:
  39. equipment_info = EquipmentInfoWednesday.objects.all()
  40. elif week == 4:
  41. equipment_info = EquipmentInfoThursday.objects.all()
  42. elif week == 5:
  43. equipment_info = EquipmentInfoFriday.objects.all()
  44. elif week == 6:
  45. equipment_info = EquipmentInfoSaturday.objects.all()
  46. elif week == 7:
  47. equipment_info = EquipmentInfoSunday.objects.all()
  48. return equipment_info
  49. @classmethod
  50. def find_by_start_time_equipment_info(cls, page, size, user_id, start_time, end_time, event_type,
  51. uid_list):
  52. """
  53. 通过start_time查找指定日期当天设备消息推送
  54. @param page: 页数
  55. @param size: 每页条数
  56. @param user_id: 设备用户id
  57. @param start_time: 开始时间
  58. @param end_time: 结束时间
  59. @param event_type: 事件类型
  60. @param uid_list: 设备uid列表
  61. @return: result 查询结果
  62. """
  63. if start_time and end_time:
  64. start_date = datetime.datetime.fromtimestamp(int(start_time))
  65. # 根据开始日期,获取设备信息查询对象
  66. qs = EquipmentInfoService.get_equipment_info_model(str(start_date.date()), 0)
  67. # 调用查询方法
  68. qs = cls.query_equipment_info(qs, user_id, start_time, end_time, event_type,
  69. uid_list)
  70. if qs.exists:
  71. count = qs.count()
  72. qs_page = cls.get_equipment_info_page(qs, page, size)
  73. return qs_page, count
  74. return None, 0
  75. @classmethod
  76. def get_equipment_info_week_all(cls, page, size, user_id, start_time, end_time, event_type,
  77. uid_list):
  78. """
  79. 分表查询近七天设备消息推送
  80. @param page: 页数
  81. @param size: 分页大小
  82. @param user_id: 设备用户id
  83. @param start_time: 事件开始时间
  84. @param end_time: 事件结束时间
  85. @param event_type: 事件类型
  86. @param uid_list: uid列表
  87. @return: qs_page, count 结果集
  88. """
  89. # 星期一设备信息查询
  90. monday_qs = EquipmentInfoService.get_equipment_info_model('', 1)
  91. monday_qs = cls.query_equipment_info(monday_qs, user_id, start_time, end_time, event_type,
  92. uid_list)
  93. # 星期二设备信息查询
  94. tuesday_qs = EquipmentInfoService.get_equipment_info_model('', 2)
  95. tuesday_qs = cls.query_equipment_info(tuesday_qs, user_id, start_time, end_time, event_type,
  96. uid_list)
  97. # 星期三设备信息查询
  98. wednesday_qs = EquipmentInfoService.get_equipment_info_model('', 3)
  99. wednesday_qs = cls.query_equipment_info(wednesday_qs, user_id, start_time, end_time, event_type,
  100. uid_list)
  101. # 星期四设备信息查询
  102. thursday_qs = EquipmentInfoService.get_equipment_info_model('', 4)
  103. thursday_qs = cls.query_equipment_info(thursday_qs, user_id, start_time, end_time, event_type,
  104. uid_list)
  105. # 星期五设备信息查询
  106. friday_qs = EquipmentInfoService.get_equipment_info_model('', 5)
  107. friday_qs = cls.query_equipment_info(friday_qs, user_id, start_time, end_time, event_type,
  108. uid_list)
  109. # 星期六设备信息查询
  110. saturday_qs = EquipmentInfoService.get_equipment_info_model('', 6)
  111. saturday_qs = cls.query_equipment_info(saturday_qs, user_id, start_time, end_time, event_type,
  112. uid_list)
  113. # 星期天设备信息查询
  114. sunday_qs = EquipmentInfoService.get_equipment_info_model('', 7)
  115. sunday_qs = cls.query_equipment_info(sunday_qs, user_id, start_time, end_time, event_type,
  116. uid_list)
  117. result = monday_qs.union(tuesday_qs).union(wednesday_qs).union(thursday_qs).union(friday_qs).union(
  118. saturday_qs).union(
  119. sunday_qs)
  120. count = result.count()
  121. qs_page = cls.get_equipment_info_page(result, page, size)
  122. return qs_page, count
  123. @classmethod
  124. def query_equipment_info(cls, qs, user_id, start_time, end_time, event_type,
  125. uid_list):
  126. """
  127. 设备信息条件查询,根据分表设计,默认条件event_time大于七天前时间
  128. @param qs: 设备信息查询对象
  129. @param user_id: 设备用户id
  130. @param start_time: 开始时间
  131. @param end_time: 结束时间
  132. @param event_type: 事件类型
  133. @param uid_list: 设备uid列表
  134. @return: result 设备信息结果集
  135. """
  136. now_time = int(time.time())
  137. # 获取七天前时间戳
  138. seven_days_before_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
  139. # 默认查询当前表event_time大于七天前时间
  140. qs = qs.filter(event_time__gt=seven_days_before_time)
  141. if user_id:
  142. qs = qs.filter(device_user_id=user_id)
  143. if event_type:
  144. # 兼容AI查询
  145. if ',' in event_type:
  146. eventTypeList = event_type.split(',')
  147. eventTypeList = [int(i.strip()) for i in eventTypeList]
  148. qs = qs.filter(event_type__in=eventTypeList)
  149. else:
  150. qs = qs.filter(event_type=event_type)
  151. if start_time and end_time:
  152. qs = qs.filter(event_time__range=(start_time, end_time))
  153. if uid_list:
  154. uid_list = uid_list.split(',')
  155. qs = qs.filter(device_uid__in=uid_list)
  156. return qs
  157. @classmethod
  158. def get_equipment_info_page(cls, equipment_info_qs, page, size):
  159. """
  160. 获取查询结果集进行排序、分页,遍历重命名字典key(主要针对原函数返回结果集)
  161. @param equipment_info_qs: 设备信息结果集
  162. @param page: 页数
  163. @param size: 分页大小
  164. @return: qs_page 遍历后的设备信息结果集
  165. """
  166. equipment_info_qs = equipment_info_qs.values('id', 'device_uid', 'device_nick_name', 'channel', 'event_type',
  167. 'status', 'alarm',
  168. 'event_time', 'receive_time', 'is_st', 'add_time',
  169. 'storage_location', 'border_coords')
  170. equipment_info_qs = equipment_info_qs.order_by('-event_time')
  171. qs_page = equipment_info_qs[(page - 1) * size:page * size]
  172. if qs_page and len(qs_page) > 0:
  173. for item in qs_page:
  174. event_time = item['event_time']
  175. date_time = datetime.datetime.fromtimestamp(int(event_time)).strftime("%Y%m%d")
  176. dt = date_time[2:8]
  177. item['id'] = int(str(dt) + str(item['id']))
  178. item['devUid'] = item['device_uid']
  179. item['devNickName'] = item['device_nick_name']
  180. item['Channel'] = item['channel']
  181. item['eventType'] = item['event_type']
  182. item['eventTime'] = item['event_time']
  183. item['receiveTime'] = item['receive_time']
  184. item['addTime'] = item['add_time']
  185. item['borderCoords'] = item['border_coords']
  186. item.pop('device_uid')
  187. item.pop('device_nick_name')
  188. item.pop('channel')
  189. item.pop('event_type')
  190. item.pop('event_time')
  191. item.pop('receive_time')
  192. item.pop('add_time')
  193. item.pop('border_coords')
  194. return qs_page