DetectControllerV2.py 7.0 KB

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