EquipmentInfoService.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  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 itertools
  11. import logging
  12. import time
  13. from django.db.models import Value, CharField, Q, F
  14. from Model.models import EquipmentInfoMonday, EquipmentInfoTuesday, EquipmentInfoWednesday, EquipmentInfoThursday, \
  15. EquipmentInfoFriday, EquipmentInfoSaturday, EquipmentInfoSunday, EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, \
  16. EquipmentInfo4, EquipmentInfo5, EquipmentInfo6, EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10, \
  17. EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15, EquipmentInfo16, \
  18. EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20
  19. from Object.utils import LocalDateTimeUtil
  20. EQUIPMENT_INFO_MODEL_LIST = [EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, EquipmentInfo4, EquipmentInfo5,
  21. EquipmentInfo6, EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10,
  22. EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15,
  23. EquipmentInfo16, EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20]
  24. """
  25. 设备分表查询Service
  26. 因数据量不断增加,单表保留近七天数据进行分表优化设计
  27. 进行拆分为七张表星期一至星期天进行分表存储。分担单表存储读写压力。
  28. """
  29. class EquipmentInfoService:
  30. @staticmethod
  31. def get_equipment_info_model(dt, val=0):
  32. """
  33. 根据日期判断是星期几,返回相应的Model对象
  34. @param val: 1-7代表week
  35. @param dt: 日期 例:2022-03-03
  36. @return: 星期一至星期天equipment_info对象实例
  37. """
  38. week = 1
  39. if dt:
  40. week = LocalDateTimeUtil.date_to_week(dt)
  41. if 0 < val < 8:
  42. week = val
  43. equipment_info = None
  44. if week == 1:
  45. equipment_info = EquipmentInfoMonday.objects.all().annotate(tab_val=Value('1', output_field=CharField()))
  46. elif week == 2:
  47. equipment_info = EquipmentInfoTuesday.objects.all().annotate(tab_val=Value('2', output_field=CharField()))
  48. elif week == 3:
  49. equipment_info = EquipmentInfoWednesday.objects.all().annotate(tab_val=Value('3', output_field=CharField()))
  50. elif week == 4:
  51. equipment_info = EquipmentInfoThursday.objects.all().annotate(tab_val=Value('4', output_field=CharField()))
  52. elif week == 5:
  53. equipment_info = EquipmentInfoFriday.objects.all().annotate(tab_val=Value('5', output_field=CharField()))
  54. elif week == 6:
  55. equipment_info = EquipmentInfoSaturday.objects.all().annotate(tab_val=Value('6', output_field=CharField()))
  56. elif week == 7:
  57. equipment_info = EquipmentInfoSunday.objects.all().annotate(tab_val=Value('7', output_field=CharField()))
  58. return equipment_info
  59. @classmethod
  60. def find_by_start_time_equipment_info(cls, page, size, user_id, start_time, end_time, event_type,
  61. uid_list):
  62. """
  63. 通过start_time查找指定日期当天设备消息推送
  64. @param page: 页数
  65. @param size: 每页条数
  66. @param user_id: 设备用户id
  67. @param start_time: 开始时间
  68. @param end_time: 结束时间
  69. @param event_type: 事件类型
  70. @param uid_list: 设备uid列表
  71. @return: result 查询结果
  72. """
  73. if start_time and end_time:
  74. start_date = datetime.datetime.fromtimestamp(int(start_time))
  75. # 根据开始日期,获取设备信息查询对象
  76. qs = EquipmentInfoService.get_equipment_info_model(str(start_date.date()), 0)
  77. # 调用查询方法
  78. qs = cls.query_equipment_info(qs, user_id, start_time, end_time, event_type,
  79. uid_list)
  80. # 时区问题
  81. week = LocalDateTimeUtil.date_to_week(str(start_date.date()))
  82. if week > 0:
  83. # 根据筛选日期 查找昨天数据
  84. yesterday = 7 if week == 1 else week - 1
  85. yesterday_info = EquipmentInfoService.get_equipment_info_model('', yesterday)
  86. yesterday_info = cls.query_equipment_info(yesterday_info, user_id, start_time, end_time, event_type,
  87. uid_list)
  88. # 根据筛选日期 查找明天数据
  89. tomorrow = 1 if week == 7 else week + 1
  90. tomorrow_info = EquipmentInfoService.get_equipment_info_model('', tomorrow)
  91. tomorrow_info = cls.query_equipment_info(tomorrow_info, user_id, start_time, end_time, event_type,
  92. uid_list)
  93. qs = qs.union(yesterday_info, tomorrow_info, all=True)
  94. if qs.exists():
  95. count = qs.count()
  96. qs_page = cls.get_equipment_info_page(qs, page, size)
  97. return qs_page, count
  98. return None, 0
  99. @classmethod
  100. def get_equipment_info_week_all(cls, page, size, user_id, start_time, end_time, event_type,
  101. uid_list):
  102. """
  103. 分表查询近七天设备消息推送
  104. @param page: 页数
  105. @param size: 分页大小
  106. @param user_id: 设备用户id
  107. @param start_time: 事件开始时间
  108. @param end_time: 事件结束时间
  109. @param event_type: 事件类型
  110. @param uid_list: uid列表
  111. @return: qs_page, count 结果集
  112. """
  113. # 星期一设备信息查询
  114. monday_qs = EquipmentInfoService.get_equipment_info_model('', 1)
  115. monday_qs = cls.query_equipment_info(monday_qs, user_id, start_time, end_time, event_type,
  116. uid_list)
  117. # 星期二设备信息查询
  118. tuesday_qs = EquipmentInfoService.get_equipment_info_model('', 2)
  119. tuesday_qs = cls.query_equipment_info(tuesday_qs, user_id, start_time, end_time, event_type,
  120. uid_list)
  121. # 星期三设备信息查询
  122. wednesday_qs = EquipmentInfoService.get_equipment_info_model('', 3)
  123. wednesday_qs = cls.query_equipment_info(wednesday_qs, user_id, start_time, end_time, event_type,
  124. uid_list)
  125. # 星期四设备信息查询
  126. thursday_qs = EquipmentInfoService.get_equipment_info_model('', 4)
  127. thursday_qs = cls.query_equipment_info(thursday_qs, user_id, start_time, end_time, event_type,
  128. uid_list)
  129. # 星期五设备信息查询
  130. friday_qs = EquipmentInfoService.get_equipment_info_model('', 5)
  131. friday_qs = cls.query_equipment_info(friday_qs, user_id, start_time, end_time, event_type,
  132. uid_list)
  133. # 星期六设备信息查询
  134. saturday_qs = EquipmentInfoService.get_equipment_info_model('', 6)
  135. saturday_qs = cls.query_equipment_info(saturday_qs, user_id, start_time, end_time, event_type,
  136. uid_list)
  137. # 星期天设备信息查询
  138. sunday_qs = EquipmentInfoService.get_equipment_info_model('', 7)
  139. sunday_qs = cls.query_equipment_info(sunday_qs, user_id, start_time, end_time, event_type,
  140. uid_list)
  141. result = monday_qs.union(tuesday_qs, wednesday_qs, thursday_qs, friday_qs, saturday_qs, sunday_qs, all=True)
  142. count = result.count()
  143. qs_page = cls.get_equipment_info_page(result, page, size)
  144. return qs_page, count
  145. @classmethod
  146. def query_equipment_info(cls, qs, user_id, start_time, end_time, event_type,
  147. uid_list):
  148. """
  149. 设备信息条件查询,根据分表设计,默认条件event_time大于七天前时间
  150. @param qs: 设备信息查询对象
  151. @param user_id: 设备用户id
  152. @param start_time: 开始时间
  153. @param end_time: 结束时间
  154. @param event_type: 事件类型
  155. @param uid_list: 设备uid列表
  156. @return: result 设备信息结果集
  157. """
  158. now_time = int(time.time())
  159. # 获取七天前时间戳
  160. seven_days_before_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
  161. # 默认查询当前表event_time大于七天前时间
  162. qs = qs.filter(event_time__gt=seven_days_before_time)
  163. if user_id:
  164. qs = qs.filter(device_user_id=user_id)
  165. if event_type:
  166. # 多类型查询
  167. eventTypeList = cls.get_comb_event_type(event_type)
  168. # eventTypeList += cls.get_combo_type_bins(event_type)
  169. eventTypeList = list(set(eventTypeList))
  170. tags = cls.get_event_tag(event_type)
  171. if eventTypeList:
  172. qs = qs.filter(Q(event_type__in=eventTypeList, event_tag='') | Q(event_tag__regex=tags))
  173. elif tags:
  174. qs = qs.filter(event_tag__regex=tags)
  175. if start_time and end_time:
  176. qs = qs.filter(event_time__range=(start_time, end_time))
  177. else:
  178. qs = qs.filter(event_time__range=(start_time, now_time))
  179. if uid_list:
  180. uid_list = uid_list.split(',')
  181. qs = qs.filter(device_uid__in=uid_list)
  182. return qs
  183. @classmethod
  184. def get_equipment_info_page(cls, equipment_info_qs, page, size):
  185. """
  186. 获取查询结果集进行排序、分页,遍历重命名字典key(主要针对原函数返回结果集)
  187. @param equipment_info_qs: 设备信息结果集
  188. @param page: 页数
  189. @param size: 分页大小
  190. @return: qs_page 遍历后的设备信息结果集
  191. """
  192. equipment_info_qs = equipment_info_qs.values('id', 'device_uid', 'device_nick_name', 'channel', 'event_type',
  193. 'status', 'answer_status', 'alarm',
  194. 'event_time', 'receive_time', 'is_st', 'add_time',
  195. 'storage_location', 'border_coords', 'tab_val', 'event_tag')
  196. equipment_info_qs = equipment_info_qs.order_by('-event_time')
  197. qs_page = equipment_info_qs[(page - 1) * size:page * size]
  198. if not qs_page or not qs_page.exists() or qs_page.count == 0:
  199. return qs_page
  200. for item in qs_page:
  201. # 星期表值
  202. tab_val = item['tab_val']
  203. # id = 星期表值+id
  204. item['id'] = int(tab_val + str(item['id']))
  205. item['devUid'] = item['device_uid']
  206. item['devNickName'] = item['device_nick_name']
  207. item['Channel'] = item['channel']
  208. item['eventType'] = item['event_type']
  209. item['eventTime'] = item['event_time']
  210. item['receiveTime'] = item['receive_time']
  211. item['addTime'] = item['add_time']
  212. item['borderCoords'] = item['border_coords']
  213. item['eventTag'] = item['event_tag']
  214. item.pop('device_uid')
  215. item.pop('device_nick_name')
  216. item.pop('channel')
  217. item.pop('event_type')
  218. item.pop('event_time')
  219. item.pop('receive_time')
  220. item.pop('add_time')
  221. item.pop('border_coords')
  222. item.pop('tab_val')
  223. item.pop('event_tag')
  224. return qs_page
  225. @classmethod
  226. def get_comb_event_type(cls, event_type):
  227. """
  228. 重新组合ai消息类型查询,使其支持ai多标签查询
  229. @param event_type: 消息类型
  230. @return: event_type_list 消息类型数组
  231. """
  232. if ',' in event_type:
  233. event_type_list = event_type.split(',')
  234. event_type_list = [int(i.strip()) for i in event_type_list]
  235. else:
  236. event_type_list = [int(event_type)]
  237. ai_event_type_list = []
  238. normal_event_type_list = []
  239. a_type = [60, 61, 62, 63, 64, 65, 66]
  240. for val in event_type_list:
  241. if val <= 4: # 分离出ai类型,以便后续组合ai标签,目前只存在4个ai类型1,2,3,4
  242. ai_event_type_list.append(val)
  243. else:
  244. if val not in a_type:
  245. normal_event_type_list.append(val)
  246. if len(ai_event_type_list) < 1:
  247. return normal_event_type_list
  248. ai_event_type_list.sort()
  249. ai_type = [1, 2, 3, 4] # AI目前所有的标签,1人,2车,3宠物,4包裹,后续有新类型需要这里加, 后续会优化,存在表里,包裹存对应的aws标签
  250. comb_ai_event_type = []
  251. seen = set()
  252. for i in range(1, len(ai_type) + 1): # 计算所有组合,如[1, 2, 3, 4], 4取1,4取2,4取3,4取4
  253. for s in itertools.combinations(ai_type, i):
  254. if s not in seen: # 去除重复项, 如a=[1,2,3,4,4],会有两个[1,2,3,4,4],[1,2,3,4,4]的组合
  255. seen.add(s)
  256. s_list = list(s)
  257. for ai_event_type in ai_event_type_list:
  258. if ai_event_type in s_list: # 排除没有选择的标签组合
  259. if s_list not in comb_ai_event_type:
  260. s_list = [str(v) for v in s_list]
  261. comb_ai_event_type.append(s_list)
  262. regroup_list = []
  263. for val in comb_ai_event_type: # 组合ai类型组合,如[[2,3],[1,3]] -> [23, 13]
  264. val = ''.join(val)
  265. regroup_list.append(int(val))
  266. group_list = regroup_list + normal_event_type_list # 加上普通移动消息类型
  267. return group_list
  268. @classmethod
  269. def get_all_comb_event_type(cls):
  270. """
  271. 计算ai消息类型全组合
  272. @return: event_type_list ai所有消息类型数组
  273. """
  274. ai_type = [1, 2, 3, 4] # AI目前所有的标签,1人,2车,3宠物,4包裹,后续有新类型需要这里加, 后续会优化,存在表里,包裹存对应的aws标签
  275. comb_ai_event_type = []
  276. for i in range(1, len(ai_type) + 1): # 计算所有组合,如[1, 2, 3, 4], 4取1,4取2,4取3,4取4
  277. for s in itertools.combinations(ai_type, i):
  278. s_list = list(s)
  279. s_list = [str(v) for v in s_list]
  280. comb_ai_event_type.append(s_list)
  281. regroup_list = []
  282. for val in comb_ai_event_type: # 组合ai类型组合,如[[2,3],[1,3]] -> [23, 13]
  283. val = ''.join(val)
  284. regroup_list.append(int(val))
  285. return regroup_list
  286. @staticmethod
  287. def get_equipment_info_obj(dt, **kwargs):
  288. """
  289. 根据日期判断是星期几,返回相应的对象实例
  290. @param dt: 日期 例:2022-03-03
  291. @param kwargs: 设备信息属性值
  292. @return: 星期一至星期天equipment_info对象实例
  293. """
  294. logger = logging.getLogger('info')
  295. week = LocalDateTimeUtil.date_to_week(dt)
  296. logger.info('本周{}'.format(str(week)))
  297. equipment_info = None
  298. if week == 1:
  299. equipment_info = EquipmentInfoMonday(**kwargs)
  300. elif week == 2:
  301. equipment_info = EquipmentInfoTuesday(**kwargs)
  302. elif week == 3:
  303. equipment_info = EquipmentInfoWednesday(**kwargs)
  304. elif week == 4:
  305. equipment_info = EquipmentInfoThursday(**kwargs)
  306. elif week == 5:
  307. equipment_info = EquipmentInfoFriday(**kwargs)
  308. elif week == 6:
  309. equipment_info = EquipmentInfoSaturday(**kwargs)
  310. elif week == 7:
  311. equipment_info = EquipmentInfoSunday(**kwargs)
  312. logger.info(type(equipment_info))
  313. logger.info(equipment_info)
  314. return equipment_info
  315. @classmethod
  316. def get_combo_types(cls, event_type, event_tag):
  317. """
  318. 获取设备算法组合类型
  319. 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警(提示:有人出现),58:车型,59:宠物,60:人脸,61:异响,
  320. 62:区域闯入,63:区域闯出,64:长时间无人检测,65:长时间无人检测
  321. 0:代表空字符,702:摄像头休眠,703:摄像头唤醒,704:电量过低
  322. AWS AI识别 1:人形,2:车型,3:宠物,4:包裹。云端AI类型
  323. @param event_tag:
  324. @param event_type:
  325. @return:
  326. """
  327. try:
  328. types = []
  329. if event_tag:
  330. res = event_tag.split(',')
  331. types = [int(var) for var in res if var]
  332. return types
  333. res_type = cls.is_type_exist(event_type)
  334. if res_type == 0:
  335. return types
  336. combo_types = [51, 57, 58, 60, 59, 61, 62, 63, 64, 65]
  337. event_type = str(event_type)
  338. len_type = len(event_type)
  339. for i in range(0, len_type):
  340. e_type = int(event_type[len_type - 1 - i])
  341. if e_type == 1:
  342. types.append(combo_types[i])
  343. return types
  344. except Exception as e:
  345. print('推送错误异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  346. return event_type
  347. @staticmethod
  348. def is_combo_tag(event_type, event_tag):
  349. """
  350. 是否为多标签
  351. """
  352. if not event_tag:
  353. return False
  354. res = event_tag.split(',')
  355. types = [int(var) for var in res if var]
  356. if event_type in types and len(types) == 1:
  357. return False
  358. return True
  359. @classmethod
  360. def is_type_exist(cls, event_type):
  361. """
  362. 判断类型是否存在列表
  363. @param event_type:
  364. @return: 0 or event_type
  365. """
  366. combo_types = cls.combo_type_all()
  367. if not combo_types:
  368. return 0
  369. if event_type in combo_types:
  370. return event_type
  371. return 0
  372. @staticmethod
  373. def combo_type_all():
  374. """
  375. 获取所有组合类型
  376. @return:
  377. """
  378. arr_list = []
  379. event_arr = []
  380. resource_list = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
  381. for i in range(2, len(resource_list) + 1):
  382. arr_list += list(itertools.combinations(resource_list, i)) # 表示从 [1,2,3,4] 中选出 3个元素的组合情况
  383. for i in arr_list:
  384. val = 0
  385. for item in i:
  386. val += item
  387. event_arr.append(int(EquipmentInfoService.dec_to_bin(val)))
  388. return event_arr
  389. @staticmethod
  390. def dec_to_bin(num):
  391. """
  392. 十进制转二进制
  393. @param num:
  394. @return:
  395. """
  396. result = ""
  397. while num != 0:
  398. ret = num % 2
  399. num //= 2
  400. result = str(ret) + result
  401. return result
  402. @staticmethod
  403. def get_combo_type_bins(event_type):
  404. """
  405. 获取组合类型二进制列表
  406. @param event_type: 标签类型
  407. @return:
  408. """
  409. res_list = []
  410. try:
  411. if ',' in event_type:
  412. res_list = event_type.split(',')
  413. res_list = [int(i.strip()) for i in res_list]
  414. else:
  415. res_list = [int(event_type)]
  416. combo_types = [51, 57, 58, 60, 59, 61]
  417. for e_item in res_list:
  418. bins = EquipmentInfoService.combo_type_all()
  419. if e_item in combo_types:
  420. event_label = combo_types.index(e_item) + 1
  421. for item in bins:
  422. val = str(item)
  423. val_len = len(val)
  424. if val_len >= event_label and int(val[val_len - event_label]) == 1:
  425. res_list.append(int(item))
  426. return res_list
  427. except Exception as e:
  428. print('推送错误异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  429. return res_list
  430. @staticmethod
  431. def get_event_tag(event_type):
  432. """
  433. 获取标签用于筛选推送消息
  434. """
  435. if ',' in event_type:
  436. tags = ''
  437. res_list = event_type.split(',')
  438. tag_size = len(res_list)
  439. for i, item in enumerate(res_list):
  440. tags += ',' + str(item) + ','
  441. if i < (tag_size - 1):
  442. tags += '|'
  443. return tags
  444. else:
  445. return ',' + str(event_type) + ','
  446. @staticmethod
  447. def update_equipment_answer_status(user_id, uid, event_time):
  448. """
  449. 更新一键通话消息状态
  450. @param user_id: 用户id
  451. @param uid: uid
  452. @param event_time: 事件时间
  453. @return updated_flag: bool
  454. """
  455. updated_flag = False
  456. updated = EquipmentInfoMonday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  457. event_type__in=[606, 607]).update(answer_status=1)
  458. if updated:
  459. updated_flag = True
  460. updated = EquipmentInfoTuesday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  461. event_type__in=[606, 607]).update(answer_status=1)
  462. if updated:
  463. updated_flag = True
  464. updated = EquipmentInfoWednesday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  465. event_type__in=[606, 607]).update(answer_status=1)
  466. if updated:
  467. updated_flag = True
  468. updated = EquipmentInfoThursday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  469. event_type__in=[606, 607]).update(answer_status=1)
  470. if updated:
  471. updated_flag = True
  472. updated = EquipmentInfoFriday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  473. event_type__in=[606, 607]).update(answer_status=1)
  474. if updated:
  475. updated_flag = True
  476. updated = EquipmentInfoSaturday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  477. event_type__in=[606, 607]).update(answer_status=1)
  478. if updated:
  479. updated_flag = True
  480. updated = EquipmentInfoSunday.objects.filter(device_user_id=user_id, device_uid=uid, event_time=event_time,
  481. event_type__in=[606, 607]).update(answer_status=1)
  482. if updated:
  483. updated_flag = True
  484. return updated_flag
  485. @classmethod
  486. def union_equipment_info(cls, user_id, uid_list, event_type, start_time, end_time, page, line):
  487. """
  488. 联表查询推送数据
  489. @param user_id:
  490. @param uid_list:
  491. @param event_type:
  492. @param start_time:
  493. @param end_time:
  494. @param page:
  495. @param line:
  496. @return:
  497. """
  498. try:
  499. kwargs = {
  500. 'device_user_id': user_id,
  501. 'event_time__range': (start_time, end_time),
  502. }
  503. event_type_kwargs = {
  504. 'device_user_id': user_id,
  505. 'event_time__range': (start_time, end_time),
  506. }
  507. if uid_list:
  508. kwargs['device_uid__in'] = uid_list
  509. event_type_kwargs['device_uid__in'] = uid_list
  510. event_type_list = []
  511. if event_type:
  512. # 多类型查询
  513. event_type_list = cls.get_comb_event_type(event_type)
  514. event_type_list = list(set(event_type_list))
  515. tags = cls.get_event_tag(event_type)
  516. if event_type_list:
  517. event_type_kwargs['event_type__in'] = event_type_list
  518. event_type_kwargs['event_tag'] = ''
  519. kwargs['event_tag__regex'] = tags
  520. elif tags:
  521. kwargs['event_tag__regex'] = tags
  522. if not event_type_list:
  523. # 新增tab_val字段记录表的标识:表编号+10
  524. equipment_info_1 = EquipmentInfo1.objects.filter(**kwargs).annotate(tab_val=Value('11', output_field=CharField()))
  525. equipment_info_2 = EquipmentInfo2.objects.filter(**kwargs).annotate(tab_val=Value('12', output_field=CharField()))
  526. equipment_info_3 = EquipmentInfo3.objects.filter(**kwargs).annotate(tab_val=Value('13', output_field=CharField()))
  527. equipment_info_4 = EquipmentInfo4.objects.filter(**kwargs).annotate(tab_val=Value('14', output_field=CharField()))
  528. equipment_info_5 = EquipmentInfo5.objects.filter(**kwargs).annotate(tab_val=Value('15', output_field=CharField()))
  529. equipment_info_6 = EquipmentInfo6.objects.filter(**kwargs).annotate(tab_val=Value('16', output_field=CharField()))
  530. equipment_info_7 = EquipmentInfo7.objects.filter(**kwargs).annotate(tab_val=Value('17', output_field=CharField()))
  531. equipment_info_8 = EquipmentInfo8.objects.filter(**kwargs).annotate(tab_val=Value('18', output_field=CharField()))
  532. equipment_info_9 = EquipmentInfo9.objects.filter(**kwargs).annotate(tab_val=Value('19', output_field=CharField()))
  533. equipment_info_10 = EquipmentInfo10.objects.filter(**kwargs).annotate(tab_val=Value('20', output_field=CharField()))
  534. equipment_info_11 = EquipmentInfo11.objects.filter(**kwargs).annotate(tab_val=Value('21', output_field=CharField()))
  535. equipment_info_12 = EquipmentInfo12.objects.filter(**kwargs).annotate(tab_val=Value('22', output_field=CharField()))
  536. equipment_info_13 = EquipmentInfo13.objects.filter(**kwargs).annotate(tab_val=Value('23', output_field=CharField()))
  537. equipment_info_14 = EquipmentInfo14.objects.filter(**kwargs).annotate(tab_val=Value('24', output_field=CharField()))
  538. equipment_info_15 = EquipmentInfo15.objects.filter(**kwargs).annotate(tab_val=Value('25', output_field=CharField()))
  539. equipment_info_16 = EquipmentInfo16.objects.filter(**kwargs).annotate(tab_val=Value('26', output_field=CharField()))
  540. equipment_info_17 = EquipmentInfo17.objects.filter(**kwargs).annotate(tab_val=Value('27', output_field=CharField()))
  541. equipment_info_18 = EquipmentInfo18.objects.filter(**kwargs).annotate(tab_val=Value('28', output_field=CharField()))
  542. equipment_info_19 = EquipmentInfo19.objects.filter(**kwargs).annotate(tab_val=Value('29', output_field=CharField()))
  543. equipment_info_20 = EquipmentInfo20.objects.filter(**kwargs).annotate(tab_val=Value('30', output_field=CharField()))
  544. else:
  545. equipment_info_1 = EquipmentInfo1.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('11', output_field=CharField()))
  546. equipment_info_2 = EquipmentInfo2.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('12', output_field=CharField()))
  547. equipment_info_3 = EquipmentInfo3.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('13', output_field=CharField()))
  548. equipment_info_4 = EquipmentInfo4.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('14', output_field=CharField()))
  549. equipment_info_5 = EquipmentInfo5.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('15', output_field=CharField()))
  550. equipment_info_6 = EquipmentInfo6.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('16', output_field=CharField()))
  551. equipment_info_7 = EquipmentInfo7.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('17', output_field=CharField()))
  552. equipment_info_8 = EquipmentInfo8.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('18', output_field=CharField()))
  553. equipment_info_9 = EquipmentInfo9.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('19', output_field=CharField()))
  554. equipment_info_10 = EquipmentInfo10.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('20', output_field=CharField()))
  555. equipment_info_11 = EquipmentInfo11.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('21', output_field=CharField()))
  556. equipment_info_12 = EquipmentInfo12.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('22', output_field=CharField()))
  557. equipment_info_13 = EquipmentInfo13.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('23', output_field=CharField()))
  558. equipment_info_14 = EquipmentInfo14.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('24', output_field=CharField()))
  559. equipment_info_15 = EquipmentInfo15.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('25', output_field=CharField()))
  560. equipment_info_16 = EquipmentInfo16.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('26', output_field=CharField()))
  561. equipment_info_17 = EquipmentInfo17.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('27', output_field=CharField()))
  562. equipment_info_18 = EquipmentInfo18.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('28', output_field=CharField()))
  563. equipment_info_19 = EquipmentInfo19.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('29', output_field=CharField()))
  564. equipment_info_20 = EquipmentInfo20.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('30', output_field=CharField()))
  565. equipment_info_union = equipment_info_1.union(
  566. equipment_info_2, equipment_info_3, equipment_info_4, equipment_info_5, equipment_info_6, equipment_info_7,
  567. equipment_info_8, equipment_info_9, equipment_info_10,
  568. equipment_info_11, equipment_info_12, equipment_info_13, equipment_info_14, equipment_info_15,
  569. equipment_info_16, equipment_info_17, equipment_info_18, equipment_info_19, equipment_info_20)
  570. count = equipment_info_union.count()
  571. if count == 0:
  572. return None, 0
  573. equipment_info_union = cls.get_equipment_info_union_page(equipment_info_union, page, line)
  574. return equipment_info_union, count
  575. except Exception as e:
  576. print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  577. @staticmethod
  578. def get_equipment_info_union_page(equipment_info_union, page, line):
  579. """
  580. 获取查询结果集进行排序、分页,遍历重命名字典key(主要针对原函数返回结果集)
  581. @param equipment_info_union: 设备信息结果集
  582. @param page: 页数
  583. @param line: 分页大小
  584. @return: qs_page 遍历后的设备信息结果集
  585. """
  586. equipment_info_qs = equipment_info_union.values('id', 'device_uid', 'device_nick_name', 'channel', 'event_type',
  587. 'status', 'answer_status', 'alarm', 'event_time', 'is_st',
  588. 'add_time', 'storage_location', 'border_coords', 'tab_val',
  589. 'event_tag')
  590. equipment_info_qs = equipment_info_qs.order_by('-event_time')
  591. equipment_info_qs = equipment_info_qs[(page - 1) * line:page * line]
  592. for equipment_info in equipment_info_qs:
  593. # id: 表标识+id
  594. equipment_info['id'] = equipment_info['tab_val'] + str(equipment_info['id'])
  595. equipment_info['devUid'] = equipment_info['device_uid']
  596. equipment_info['devNickName'] = equipment_info['device_nick_name']
  597. equipment_info['Channel'] = equipment_info['channel']
  598. equipment_info['eventType'] = equipment_info['event_type']
  599. equipment_info['eventTime'] = equipment_info['event_time']
  600. equipment_info['receiveTime'] = equipment_info['event_time']
  601. equipment_info['addTime'] = equipment_info['add_time']
  602. equipment_info['borderCoords'] = equipment_info['border_coords']
  603. equipment_info['eventTag'] = equipment_info['event_tag']
  604. equipment_info.pop('device_uid')
  605. equipment_info.pop('device_nick_name')
  606. equipment_info.pop('channel')
  607. equipment_info.pop('event_type')
  608. equipment_info.pop('event_time')
  609. equipment_info.pop('add_time')
  610. equipment_info.pop('border_coords')
  611. equipment_info.pop('tab_val')
  612. equipment_info.pop('event_tag')
  613. return equipment_info_qs
  614. @staticmethod
  615. def all_read_equipment_info(**kwargs):
  616. """
  617. 全部已读推送消息
  618. @param kwargs:
  619. @return:
  620. """
  621. for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
  622. equipment_info_model.objects.filter(**kwargs).update(status=1)
  623. @staticmethod
  624. def update_equipment_info_answer_status(**kwargs):
  625. """
  626. 已接听一键通话消息
  627. @param kwargs:
  628. @return:
  629. """
  630. for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
  631. equipment_info_model.objects.filter(**kwargs).update(answer_status=1)
  632. @staticmethod
  633. def delete_all_equipment_info(**kwargs):
  634. """
  635. 删除全部推送消息
  636. @param kwargs:
  637. @return:
  638. """
  639. for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
  640. equipment_info_model.objects.filter(**kwargs).delete()
  641. @staticmethod
  642. def get_equipment_info_model_with_full_id(full_id):
  643. """
  644. 根据拼接id获取推送表
  645. @param full_id: 拼接id,表标识+id
  646. @return:
  647. """
  648. tab_val = int(full_id[:2]) - 10
  649. if tab_val > 20:
  650. return None
  651. tab_index = tab_val - 1
  652. return EQUIPMENT_INFO_MODEL_LIST[tab_index]
  653. @staticmethod
  654. def count_equipment_info(**kwargs):
  655. """
  656. 查询推送数据数量
  657. @param kwargs:
  658. @return: count
  659. """
  660. count = 0
  661. for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
  662. count += equipment_info_model.objects.filter(**kwargs).count()
  663. return count