DetectController.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import json
  2. import logging
  3. import oss2
  4. from django.http import JsonResponse
  5. from django.views.generic.base import View
  6. from AnsjerPush.config import CONFIG_INFO, CONFIG_CN
  7. from AnsjerPush.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
  8. from Model.models import SysMsgModel
  9. from Object.RedisObject import RedisObject
  10. from Object.utils import LocalDateTimeUtil
  11. from Service.DevicePushService import DevicePushService
  12. from Service.EquipmentInfoService import EquipmentInfoService
  13. # 旧移动侦测接口
  14. class NotificationView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. return self.validation(request.GET)
  18. def post(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. return self.validation(request.POST)
  21. def validation(self, request_dict):
  22. """
  23. 设备触发报警消息推送
  24. @param request_dict:uidToken 加密uid
  25. @param request_dict:etk 加密uid
  26. @param request_dict:channel 设备通道号
  27. @param request_dict:n_time 设备触发报警时间
  28. @param request_dict:event_type 设备事件类型
  29. @param request_dict:is_st 文件类型(0:无,1:图片,2:视频)
  30. """
  31. logger = logging.getLogger('info')
  32. logger.info("旧移动侦测接口参数:{}".format(request_dict))
  33. uidToken = request_dict.get('uidToken', None)
  34. etk = request_dict.get('etk', None)
  35. channel = request_dict.get('channel', '1')
  36. n_time = request_dict.get('n_time', None)
  37. event_type = request_dict.get('event_type', None)
  38. is_st = request_dict.get('is_st', None)
  39. uid = request_dict.get('uid', None)
  40. if not all([channel, n_time]):
  41. return JsonResponse(status=200, data={'code': 444, 'msg': 'error channel or n_time'})
  42. try:
  43. if not uid:
  44. uid = DevicePushService.decode_uid(etk, uidToken) # 解密uid
  45. if len(uid) != 20 and len(uid) != 14:
  46. return JsonResponse(status=200, data={'code': 404, 'msg': 'wrong uid'})
  47. logger.info("旧移动侦测接口的uid:{}".format(uid))
  48. event_type = int(event_type)
  49. pkey = '{uid}_{channel}_{event_type}_ptl'.format(uid=uid, event_type=event_type, channel=channel)
  50. ykey = '{uid}_redis_qs'.format(uid=uid)
  51. is_sys_msg = self.is_sys_msg(event_type)
  52. if is_sys_msg is True:
  53. dkey = '{uid}_{channel}_{event_type}_flag'.format(uid=uid, event_type=event_type, channel=channel)
  54. else:
  55. dkey = '{uid}_{channel}_flag'.format(uid=uid, channel=channel)
  56. redisObj = RedisObject(db=6)
  57. have_ykey = redisObj.get_data(key=ykey) # uid_set 数据库缓存
  58. have_pkey = redisObj.get_data(key=pkey) # 一分钟限制key
  59. have_dkey = redisObj.get_data(key=dkey) # 推送类型限制
  60. # 一分钟外,推送开启状态
  61. detect_med_type = 0 # 0推送旧机制 1存库不推送,2推送存库
  62. # 暂时注销
  63. if event_type != 606:
  64. detect_status = 1
  65. if have_pkey:
  66. res_data = {'code': 0, 'msg': 'Push it once a minute'}
  67. return JsonResponse(status=200, data=res_data)
  68. else:
  69. detect_status = 0
  70. # 数据库读取数据
  71. if have_ykey:
  72. uid_push_list = eval(redisObj.get_data(key=ykey))
  73. else:
  74. # 从数据库查询出来
  75. uid_push_qs = DevicePushService.query_uid_push(uid, detect_status)
  76. if not uid_push_qs.exists():
  77. logger.info('消息推送-uid_push 数据不存在')
  78. return JsonResponse(status=200, data={'code': 176, 'msg': 'no uid_push data'})
  79. # 修改redis数据,并设置过期时间为10分钟
  80. uid_push_list = DevicePushService.cache_uid_push(uid_push_qs)
  81. redisObj.set_data(key=ykey, val=str(uid_push_list), expire=600)
  82. if not uid_push_list:
  83. res_data = {'code': 404, 'msg': 'error !'}
  84. return JsonResponse(status=200, data=res_data)
  85. if not uid_push_list:
  86. res_data = {'code': 0, 'msg': 'uid_push_list not exist'}
  87. return JsonResponse(status=200, data=res_data)
  88. nickname = uid_push_list[0]['uid_set__nickname']
  89. detect_interval = uid_push_list[0]['uid_set__detect_interval']
  90. detect_group = uid_push_list[0]['uid_set__detect_group']
  91. if not nickname:
  92. nickname = uid
  93. if detect_group is not None:
  94. if have_dkey:
  95. detect_med_type = 1 # 1为存库不推送
  96. else:
  97. detect_med_type = 2 # 为2的话,既推送,又存库
  98. if CONFIG_INFO != CONFIG_CN:
  99. new_detect_interval = uid_push_list[0]['uid_set__new_detect_interval']
  100. detect_interval = new_detect_interval if new_detect_interval > 0 else detect_interval
  101. detect_interval = 60 if detect_interval < 60 else detect_interval
  102. redisObj.set_data(key=dkey, val=1, expire=detect_interval - 5)
  103. redisObj.set_data(key=pkey, val=1, expire=60)
  104. logger.info(
  105. 'APP消息推送V1接口,是否进行APP推送:{},1为不推送,间隔:{}'.format(detect_med_type, detect_interval))
  106. # 旧模式并且没有pkey,重新创建一个
  107. if not detect_group and not have_pkey:
  108. redisObj.set_data(key=pkey, val=1, expire=60)
  109. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  110. bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')
  111. kwag_args = {
  112. 'uid': uid,
  113. 'channel': channel,
  114. 'event_type': event_type,
  115. 'n_time': n_time,
  116. }
  117. params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, 'is_st': is_st,
  118. 'is_sys_msg': is_sys_msg, 'channel': channel, 'event_type': event_type, 'n_time': n_time,
  119. 'electricity': '', 'bucket': bucket, 'app_push': '', 'storage_location': 1}
  120. # 推送以及报警消息存库
  121. result = DevicePushService.save_msg_push(uid_set_push_list=uid_push_list, **params)
  122. if result['code_date'] is None:
  123. result['code_date'] = {'do_apns_code': '', 'do_fcm_code': '', 'do_jpush_code': ''}
  124. if detect_med_type == 1:
  125. result['code_date']['do_apns_code'] = '只存库不推送'
  126. result['code_date']['do_fcm_code'] = '只存库不推送'
  127. result['code_date']['do_jpush_code'] = '只存库不推送'
  128. if is_sys_msg:
  129. SysMsgModel.objects.bulk_create(result['sys_msg_list'])
  130. else:
  131. if result['new_device_info_list'] and len(result['new_device_info_list']) > 0:
  132. # 根据日期获得星期几
  133. week = LocalDateTimeUtil.date_to_week(result['local_date_time'])
  134. EquipmentInfoService.equipment_info_bulk_create(week, result['new_device_info_list'])
  135. logger.info('----《旧接口》设备信息分表批量保存end')
  136. if is_st == '0' or is_st == '2':
  137. print("is_st=0or2")
  138. for up in uid_push_list:
  139. if up['push_type'] == 0: # ios apns
  140. up['do_apns_code'] = result['code_date']['do_apns_code']
  141. elif up['push_type'] == 1: # android gcm
  142. up['do_fcm_code'] = result['code_date']['do_fcm_code']
  143. elif up['push_type'] == 2: # android jpush
  144. up['do_jpush_code'] = result['code_date']['do_jpush_code']
  145. del up['push_type']
  146. del up['userID_id']
  147. del up['userID__NickName']
  148. del up['lang']
  149. del up['tz']
  150. del up['uid_set__nickname']
  151. del up['uid_set__detect_interval']
  152. del up['uid_set__detect_group']
  153. return JsonResponse(status=200, data={'code': 0, 'msg': 'success 0 or 2'})
  154. elif is_st == '1':
  155. print("is_st=1")
  156. # Endpoint以杭州为例,其它Region请按实际情况填写。
  157. obj = '{uid}/{channel}/{filename}.jpeg'.format(uid=uid, channel=channel, filename=n_time)
  158. # 设置此签名URL在60秒内有效。
  159. url = bucket.sign_url('PUT', obj, 7200)
  160. for up in uid_push_list:
  161. up['do_apns_code'] = result['code_date']['do_apns_code']
  162. up['do_fcm_code'] = result['code_date']['do_fcm_code']
  163. up['do_jpush_code'] = result['code_date']['do_jpush_code']
  164. del up['push_type']
  165. del up['userID_id']
  166. del up['userID__NickName']
  167. del up['lang']
  168. del up['tz']
  169. del up['uid_set__nickname']
  170. del up['uid_set__detect_interval']
  171. del up['uid_set__detect_group']
  172. res_data = {'code': 0, 'img_push': url, 'msg': 'success'}
  173. return JsonResponse(status=200, data=res_data)
  174. elif is_st == '3':
  175. print("is_st=3")
  176. # 人形检测带动图
  177. # Endpoint以杭州为例,其它Region请按实际情况填写。
  178. img_url_list = []
  179. for i in range(int(is_st)):
  180. obj = '{uid}/{channel}/{filename}_{st}.jpeg'. \
  181. format(uid=uid, channel=channel, filename=n_time, st=i)
  182. # 设置此签名URL在60秒内有效。
  183. url = bucket.sign_url('PUT', obj, 7200)
  184. img_url_list.append(url)
  185. for up in uid_push_list:
  186. up['do_apns_code'] = result['code_date']['do_apns_code']
  187. up['do_fcm_code'] = result['code_date']['do_fcm_code']
  188. up['do_jpush_code'] = result['code_date']['do_jpush_code']
  189. del up['push_type']
  190. del up['userID_id']
  191. del up['userID__NickName']
  192. del up['lang']
  193. del up['tz']
  194. del up['uid_set__nickname']
  195. del up['uid_set__detect_interval']
  196. del up['uid_set__detect_group']
  197. res_data = {'code': 0, 'img_url_list': img_url_list, 'msg': 'success 3'}
  198. return JsonResponse(status=200, data=res_data)
  199. except Exception as e:
  200. logger.info('消息推送-异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  201. data = {
  202. 'errLine': e.__traceback__.tb_lineno,
  203. 'errMsg': repr(e),
  204. }
  205. return JsonResponse(status=200, data=json.dumps(data), safe=False)
  206. def is_sys_msg(self, event_type):
  207. event_type_list = [702, 703, 704]
  208. if event_type in event_type_list:
  209. return True
  210. return False