DetectControllerV2.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import json
  2. import logging
  3. import threading
  4. from django.http import JsonResponse
  5. from django.views.generic.base import View
  6. from Object.RedisObject import RedisObject
  7. from Service.DevicePushService import DevicePushService
  8. TIME_LOGGER = logging.getLogger('time')
  9. # 移动侦测V2接口
  10. class NotificationV2View(View):
  11. def get(self, request, *args, **kwargs):
  12. request.encoding = 'utf-8'
  13. return self.validation(request.GET)
  14. def post(self, request, *args, **kwargs):
  15. request.encoding = 'utf-8'
  16. return self.validation(request.POST)
  17. @staticmethod
  18. def validation(request_dict):
  19. """
  20. 设备触发报警消息推送
  21. @param request_dict:uidToken 加密uid
  22. @param request_dict:etk 加密uid
  23. @param request_dict:channel 设备通道号
  24. @param request_dict:n_time 设备触发报警时间
  25. @param request_dict:event_type 设备事件类型
  26. @param request_dict:is_st 文件类型(0:无,1:图片,2:视频)
  27. @param request_dict:region 文件存储区域(1:国外, 2:国内)
  28. @param request_dict:electricity 电量值
  29. @param request_dict:time_token 时间戳token
  30. @param request_dict:uid uid
  31. @param request_dict:dealings_type 往来检测 1:来,2:离开
  32. @param request_dict:detection 检测类型 0:普通,1:算法
  33. """
  34. logger = logging.getLogger('info')
  35. logger.info('消息推送V2接口参数:{}'.format(request_dict))
  36. uidToken = request_dict.get('uidToken', None)
  37. etk = request_dict.get('etk', None)
  38. channel = request_dict.get('channel', '1')
  39. n_time = request_dict.get('n_time', None)
  40. event_type = request_dict.get('event_type', None)
  41. is_st = request_dict.get('is_st', None)
  42. region = request_dict.get('region', None)
  43. electricity = request_dict.get('electricity', '')
  44. dealings_type = int(request_dict.get('dealingsType', 0))
  45. detection = int(request_dict.get('detection', 0))
  46. # 参数校验
  47. if not all([channel, n_time]):
  48. return JsonResponse(status=200, data={'code': 444, 'msg': 'param is wrong'})
  49. if not region or not is_st:
  50. return JsonResponse(status=200, data={'code': 404, 'msg': 'no region or is_st'})
  51. is_st = int(is_st)
  52. region = int(region)
  53. event_type = int(event_type)
  54. redis_obj = RedisObject()
  55. try:
  56. uid = DevicePushService.decode_uid(etk, uidToken)
  57. if len(uid) != 20 and len(uid) != 14:
  58. return JsonResponse(status=200, data={'code': 404, 'msg': 'wrong uid'})
  59. TIME_LOGGER.info('开始推送,uid:{},n_time:{},事件类型:{}'.format(uid, n_time, event_type))
  60. # 判断是否为系统消息
  61. is_sys_msg = DevicePushService.judge_sys_msg(int(event_type))
  62. if is_sys_msg:
  63. push_interval = '{uid}_{channel}_{event_type}_flag'.format(uid=uid, channel=channel,
  64. event_type=event_type)
  65. else:
  66. push_interval = '{uid}_{channel}_flag'.format(uid=uid, channel=channel)
  67. req_limiting = '{uid}_{channel}_{event_type}_ptl'.format(uid=uid, channel=channel, event_type=event_type)
  68. cache_req_limiting = redis_obj.get_data(key=req_limiting) # 获取请求限流缓存数据
  69. cache_app_push = redis_obj.get_data(key=push_interval) # 获取APP推送消息时间间隔缓存数据
  70. if event_type not in [606, 607]:
  71. if cache_req_limiting: # 限流存在则直接返回
  72. return JsonResponse(status=200, data={'code': 0, 'msg': 'Push again in one minute'})
  73. redis_obj.set_data(key=req_limiting, val=1, expire=60) # 当缓存不存在限流数据 重新设置一分钟请求一次
  74. # 查询uid_push和uid_set数据
  75. uid_push_qs = DevicePushService.query_uid_push(uid, event_type)
  76. if not uid_push_qs.exists():
  77. logger.info('消息推送-{}uid_push数据不存在'.format(uid))
  78. return JsonResponse(status=200, data={'code': 176, 'msg': 'no uid_push data'})
  79. ai_type = uid_push_qs.first()['uid_set__ai_type']
  80. device_type = uid_push_qs.first()['uid_set__device_type']
  81. # uid_push_qs转存列表
  82. uid_set_push_list = DevicePushService.qs_to_list(uid_push_qs)
  83. nickname = uid_set_push_list[0]['uid_set__nickname']
  84. nickname = uid if not nickname else nickname
  85. # APP消息提醒推送间隔
  86. detect_interval = uid_set_push_list[0]['uid_set__detect_interval']
  87. if event_type not in [606, 607]:
  88. if not cache_app_push:
  89. # 缓存APP提醒推送间隔 默认1分钟提醒一次
  90. DevicePushService.cache_push_detect_interval(redis_obj, push_interval, detect_interval,
  91. uid_set_push_list[0]['uid_set__new_detect_interval'])
  92. else:
  93. cache_app_push = ''
  94. bucket = ''
  95. aws_s3_client = ''
  96. if is_st == 1 or is_st == 3: # 使用aws s3
  97. aws_s3_client = DevicePushService.get_s3_client(region=region)
  98. bucket = 'foreignpush' if region == 1 else 'push'
  99. kwag_args = {
  100. 'uid': uid,
  101. 'channel': channel,
  102. 'event_type': event_type,
  103. 'n_time': n_time,
  104. }
  105. params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, 'is_st': is_st, 'region': region,
  106. 'is_sys_msg': is_sys_msg, 'channel': channel, 'event_type': event_type, 'n_time': n_time,
  107. 'electricity': electricity, 'bucket': bucket, 'aws_s3_client': aws_s3_client,
  108. 'app_push': cache_app_push, 'storage_location': 2, 'ai_type': ai_type, 'device_type': device_type,
  109. 'dealings_type': dealings_type, 'detection': detection,
  110. 'app_push_config': uid_set_push_list[0]['uid_set__msg_notify']}
  111. # 推送消息,生成推送数据列表
  112. result = DevicePushService.save_msg_push(uid_set_push_list, **params)
  113. # 保存推送数据
  114. DevicePushService.save_sys_msg(
  115. is_sys_msg,
  116. result['local_date_time'],
  117. result['sys_msg_list'],
  118. result['new_device_info_list'])
  119. # 异步推送消息和保存数据
  120. # push_thread = threading.Thread(
  121. # target=push_and_save_data,
  122. # args=(uid_set_push_list, is_sys_msg),
  123. # kwargs=params)
  124. # push_thread.start()
  125. params['aws_s3_client'] = aws_s3_client
  126. params['uid_set_push_list'] = uid_set_push_list
  127. result_dict = DevicePushService.get_push_url(**params) # 获取S3对象上传链接
  128. TIME_LOGGER.info('推送响应,uid:{},n_time:{},事件类型:{},响应:{}'.format(
  129. uid, n_time, event_type, json.dumps(result_dict)))
  130. return JsonResponse(status=200, data=result_dict)
  131. except Exception as e:
  132. logger.info('V2推送接口异常, errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  133. data = {
  134. 'errLine': e.__traceback__.tb_lineno,
  135. 'errMsg': repr(e),
  136. }
  137. return JsonResponse(status=200, data=json.dumps(data), safe=False)
  138. def push_and_save_data(uid_set_push_list, is_sys_msg, **params):
  139. # 推送消息,生成推送数据列表
  140. result = DevicePushService.save_msg_push(uid_set_push_list, **params)
  141. # 保存推送数据
  142. DevicePushService.save_sys_msg(
  143. is_sys_msg,
  144. result['local_date_time'],
  145. result['sys_msg_list'],
  146. result['new_device_info_list'])