|  | @@ -11,7 +11,7 @@ from django.views.generic.base import View
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_DOMAIN_JIUAN, DETECT_PUSH_DOMAINS_JIUAN, \
 | 
	
		
			
				|  |  |      OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, LOGGER, ALGORITHM_COMBO_TYPES
 | 
	
		
			
				|  |  | -from Ansjer.config import PUSH_BUCKET, CONFIG_INFO, CONFIG_CN
 | 
	
		
			
				|  |  | +from Ansjer.config import PUSH_BUCKET, CONFIG_INFO, CONFIG_CN, CONFIG_EUR, CONFIG_US
 | 
	
		
			
				|  |  |  from Model.models import Device_Info, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel, \
 | 
	
		
			
				|  |  |      AiService, VodBucketModel
 | 
	
		
			
				|  |  |  from Object.ETkObject import ETkObject
 | 
	
	
		
			
				|  | @@ -334,8 +334,6 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                  # 默认查询近七天内数据
 | 
	
		
			
				|  |  |                  end_time = int(time.time())
 | 
	
		
			
				|  |  |                  start_time = LocalDateTimeUtil.get_before_days_timestamp(end_time, 7)
 | 
	
		
			
				|  |  | -            # oci获取图片链接太慢了 app默认20条 暂时先减少分页条数
 | 
	
		
			
				|  |  | -            line = 10 if CONFIG_INFO != CONFIG_CN else line
 | 
	
		
			
				|  |  |              equipment_info_qs, count = EquipmentInfoService. \
 | 
	
		
			
				|  |  |                  union_equipment_info(userID, uid_list, event_type, start_time, end_time, page, line)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -373,9 +371,9 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                  region_name='cn-northwest-1'
 | 
	
		
			
				|  |  |              )
 | 
	
		
			
				|  |  |              # 国内生产环境默认不实例OCI对象
 | 
	
		
			
				|  |  | -            oci_eur = None if CONFIG_INFO == CONFIG_CN else OCIObjectStorage('eur')
 | 
	
		
			
				|  |  | -            oci_us = None if CONFIG_INFO == CONFIG_CN else OCIObjectStorage('us')
 | 
	
		
			
				|  |  | +            oci = self.get_oci_client()
 | 
	
		
			
				|  |  |              redis_obj = RedisObject(3)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              # ai消息标识所有组合标签
 | 
	
		
			
				|  |  |              ai_all_event_type = EquipmentInfoService.get_all_comb_event_type()
 | 
	
		
			
				|  |  |              for equipment_info in equipment_info_qs:
 | 
	
	
		
			
				|  | @@ -392,8 +390,10 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                      if storage_location == 1:  # 阿里云oss
 | 
	
		
			
				|  |  |                          img_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
 | 
	
		
			
				|  |  |                      elif storage_location in [3, 4]:
 | 
	
		
			
				|  |  | -                        oci = oci_eur if storage_location == 4 else oci_us
 | 
	
		
			
				|  |  | -                        img_url = DetectControllerViewV2.oci_object_url(oci, thumbspng)
 | 
	
		
			
				|  |  | +                        prefix_name = f'{uid}/'
 | 
	
		
			
				|  |  | +                        img_url = DetectControllerViewV2.oci_object_url(oci, redis_obj, uid, prefix_name)
 | 
	
		
			
				|  |  | +                        if img_url:
 | 
	
		
			
				|  |  | +                            img_url = img_url + thumbspng
 | 
	
		
			
				|  |  |                      else:
 | 
	
		
			
				|  |  |                          params = {'Key': thumbspng}
 | 
	
		
			
				|  |  |                          if region == 1:  # AWS国外
 | 
	
	
		
			
				|  | @@ -446,33 +446,26 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                      # 列表装载回放时间戳标记
 | 
	
		
			
				|  |  |                      equipment_info['img_list'] = []
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    msg_key = f'{uid}:{channel}:{event_time}'
 | 
	
		
			
				|  |  | -                    # OCI三张图 获取缓存临时URL
 | 
	
		
			
				|  |  | -                    img_data = DetectControllerViewV2.get_msg_redis_url(redis_obj, msg_key,
 | 
	
		
			
				|  |  | -                                                                        equipment_info['is_st'], storage_location)
 | 
	
		
			
				|  |  | -                    if img_data:
 | 
	
		
			
				|  |  | -                        equipment_info['img_list'] = img_data
 | 
	
		
			
				|  |  | -                    else:
 | 
	
		
			
				|  |  | -                        for i in range(equipment_info['is_st']):
 | 
	
		
			
				|  |  | -                            thumbspng = '{}/{}/{}_{}.jpeg'.format(uid, channel, event_time, i)
 | 
	
		
			
				|  |  | -                            if storage_location == 1:  # 阿里云oss
 | 
	
		
			
				|  |  | -                                img_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
 | 
	
		
			
				|  |  | -                            elif storage_location in [3, 4]:  # 国外OCI云
 | 
	
		
			
				|  |  | -                                oci = oci_eur if storage_location == 4 else oci_us
 | 
	
		
			
				|  |  | -                                img_url = DetectControllerViewV2.oci_object_url(oci, thumbspng)
 | 
	
		
			
				|  |  | -                            else:
 | 
	
		
			
				|  |  | -                                params = {'Key': thumbspng}
 | 
	
		
			
				|  |  | -                                if region == 1:  # 国外AWS
 | 
	
		
			
				|  |  | -                                    params['Bucket'] = 'foreignpush'
 | 
	
		
			
				|  |  | -                                    img_url = aws_s3.generate_presigned_url(
 | 
	
		
			
				|  |  | -                                        'get_object', Params=params, ExpiresIn=300)
 | 
	
		
			
				|  |  | -                                else:  # 国内AWS
 | 
	
		
			
				|  |  | -                                    params['Bucket'] = 'push'
 | 
	
		
			
				|  |  | -                                    img_url = aws_s3_cn.generate_presigned_url(
 | 
	
		
			
				|  |  | -                                        'get_object', Params=params, ExpiresIn=300)
 | 
	
		
			
				|  |  | -                            equipment_info['img_list'].append(img_url)
 | 
	
		
			
				|  |  | -                        if not img_data and equipment_info['is_st'] == 3 and storage_location in [3, 4]:
 | 
	
		
			
				|  |  | -                            DetectControllerViewV2.set_msg_redis_url(redis_obj, msg_key, equipment_info['img_list'])
 | 
	
		
			
				|  |  | +                    for i in range(equipment_info['is_st']):
 | 
	
		
			
				|  |  | +                        thumbspng = '{}/{}/{}_{}.jpeg'.format(uid, channel, event_time, i)
 | 
	
		
			
				|  |  | +                        if storage_location == 1:  # 阿里云oss
 | 
	
		
			
				|  |  | +                            img_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
 | 
	
		
			
				|  |  | +                        elif storage_location in [3, 4]:  # 国外OCI云
 | 
	
		
			
				|  |  | +                            prefix_name = f'{uid}/'
 | 
	
		
			
				|  |  | +                            img_url = DetectControllerViewV2.oci_object_url(oci, redis_obj, uid, prefix_name)
 | 
	
		
			
				|  |  | +                            if img_url:
 | 
	
		
			
				|  |  | +                                img_url = img_url + thumbspng
 | 
	
		
			
				|  |  | +                        else:
 | 
	
		
			
				|  |  | +                            params = {'Key': thumbspng}
 | 
	
		
			
				|  |  | +                            if region == 1:  # 国外AWS
 | 
	
		
			
				|  |  | +                                params['Bucket'] = 'foreignpush'
 | 
	
		
			
				|  |  | +                                img_url = aws_s3.generate_presigned_url(
 | 
	
		
			
				|  |  | +                                    'get_object', Params=params, ExpiresIn=300)
 | 
	
		
			
				|  |  | +                            else:  # 国内AWS
 | 
	
		
			
				|  |  | +                                params['Bucket'] = 'push'
 | 
	
		
			
				|  |  | +                                img_url = aws_s3_cn.generate_presigned_url(
 | 
	
		
			
				|  |  | +                                    'get_object', Params=params, ExpiresIn=300)
 | 
	
		
			
				|  |  | +                        equipment_info['img_list'].append(img_url)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if uid in uid_type_dict.keys():
 | 
	
		
			
				|  |  |                      equipment_info['uid_type'] = uid_type_dict[uid]['type']
 | 
	
	
		
			
				|  | @@ -494,30 +487,42 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |              return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @staticmethod
 | 
	
		
			
				|  |  | -    def get_msg_redis_url(redis_client, msg_key, is_st, storage_location):
 | 
	
		
			
				|  |  | -        if is_st == 3 and storage_location in [3, 4]:
 | 
	
		
			
				|  |  | -            img_data = redis_client.get_data(msg_key)
 | 
	
		
			
				|  |  | -            if img_data:
 | 
	
		
			
				|  |  | -                return json.loads(img_data)
 | 
	
		
			
				|  |  | -        return None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @staticmethod
 | 
	
		
			
				|  |  | -    def set_msg_redis_url(redis_client, msg_key, img_list):
 | 
	
		
			
				|  |  | -        redis_client.set_data(msg_key, json.dumps(img_list), 580)
 | 
	
		
			
				|  |  | +    def get_oci_client():
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        获取所在区域客户端
 | 
	
		
			
				|  |  | +        @return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        if CONFIG_INFO == CONFIG_CN:
 | 
	
		
			
				|  |  | +            return None
 | 
	
		
			
				|  |  | +        oci = OCIObjectStorage(CONFIG_EUR) if CONFIG_INFO == CONFIG_EUR else OCIObjectStorage(CONFIG_US)
 | 
	
		
			
				|  |  | +        return oci
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @staticmethod
 | 
	
		
			
				|  |  | -    def oci_object_url(oci, obj_name):
 | 
	
		
			
				|  |  | +    def oci_object_url(oci, redis_obj, uid, obj_name):
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  |          获取OCI对象存储URL 有效期5分钟
 | 
	
		
			
				|  |  | -        @param oci:
 | 
	
		
			
				|  |  | -        @param obj_name: 对象名称
 | 
	
		
			
				|  |  | +        @param uid: 设备UID
 | 
	
		
			
				|  |  | +        @param redis_obj: 缓存客户端
 | 
	
		
			
				|  |  | +        @param oci: oci客户端
 | 
	
		
			
				|  |  | +        @param obj_name: 对象名称或前缀
 | 
	
		
			
				|  |  |          @return: url
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  | -        if not oci:
 | 
	
		
			
				|  |  | -            return ''
 | 
	
		
			
				|  |  | -        time_expires = datetime.datetime.utcnow() + datetime.timedelta(minutes=10)
 | 
	
		
			
				|  |  | -        result = oci.get_preauthenticated_request_url(PUSH_BUCKET, 'ociPush', obj_name, time_expires)
 | 
	
		
			
				|  |  | -        return result.full_path if result else ''
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            if not oci:
 | 
	
		
			
				|  |  | +                return ''
 | 
	
		
			
				|  |  | +            uid_key = f'PUSH:MSG:OCI:URL:{uid}'
 | 
	
		
			
				|  |  | +            oci_url = redis_obj.get_data(uid_key)
 | 
	
		
			
				|  |  | +            if oci_url:
 | 
	
		
			
				|  |  | +                return oci_url
 | 
	
		
			
				|  |  | +            time_expires = datetime.datetime.utcnow() + datetime.timedelta(minutes=60)
 | 
	
		
			
				|  |  | +            result = oci.get_preauthenticated_request_url(PUSH_BUCKET, 'ociPush', obj_name, time_expires,
 | 
	
		
			
				|  |  | +                                                          'AnyObjectRead')  # 授权到指定uid文件夹
 | 
	
		
			
				|  |  | +            full_url = result.full_path if result else ''
 | 
	
		
			
				|  |  | +            redis_obj.set_data(uid_key, full_url, 3580)
 | 
	
		
			
				|  |  | +            return full_url
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            LOGGER.error('oci查询消息列表异常error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 | 
	
		
			
				|  |  | +            return
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def do_transfer(self, request_dict, response, userID):
 | 
	
		
			
				|  |  |          event_time = request_dict.get('eventTime', None)
 | 
	
	
		
			
				|  | @@ -560,8 +565,10 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                  region_name='cn-northwest-1'
 | 
	
		
			
				|  |  |              )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            oci_eur = OCIObjectStorage('eur')
 | 
	
		
			
				|  |  | -            oci_us = OCIObjectStorage('us')
 | 
	
		
			
				|  |  | +            # 国内生产环境默认不实例OCI对象
 | 
	
		
			
				|  |  | +            oci = self.get_oci_client()
 | 
	
		
			
				|  |  | +            redis_obj = RedisObject(3)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              # ai消息标识所有组合标签
 | 
	
		
			
				|  |  |              ai_all_event_type = EquipmentInfoService.get_all_comb_event_type()
 | 
	
		
			
				|  |  |              for equipment_info in equipment_info_qs:
 | 
	
	
		
			
				|  | @@ -578,8 +585,10 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                      if storage_location == 1:  # 阿里云oss
 | 
	
		
			
				|  |  |                          img_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
 | 
	
		
			
				|  |  |                      elif storage_location in [3, 4]:
 | 
	
		
			
				|  |  | -                        oci = oci_eur if storage_location == 4 else oci_us
 | 
	
		
			
				|  |  | -                        img_url = DetectControllerViewV2.oci_object_url(oci, thumbspng)
 | 
	
		
			
				|  |  | +                        prefix_name = f'{uid}/'
 | 
	
		
			
				|  |  | +                        img_url = DetectControllerViewV2.oci_object_url(oci, redis_obj, uid, prefix_name)
 | 
	
		
			
				|  |  | +                        if img_url:
 | 
	
		
			
				|  |  | +                            img_url = img_url + thumbspng
 | 
	
		
			
				|  |  |                      else:
 | 
	
		
			
				|  |  |                          params = {'Key': thumbspng}
 | 
	
		
			
				|  |  |                          if region == 1:  # AWS国外
 | 
	
	
		
			
				|  | @@ -636,8 +645,10 @@ class DetectControllerViewV2(View):
 | 
	
		
			
				|  |  |                          if storage_location == 1:  # 阿里云oss
 | 
	
		
			
				|  |  |                              img_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
 | 
	
		
			
				|  |  |                          elif storage_location in [3, 4]:
 | 
	
		
			
				|  |  | -                            oci = oci_eur if storage_location == 4 else oci_us
 | 
	
		
			
				|  |  | -                            img_url = DetectControllerViewV2.oci_object_url(oci, thumbspng)
 | 
	
		
			
				|  |  | +                            prefix_name = f'{uid}/'
 | 
	
		
			
				|  |  | +                            img_url = DetectControllerViewV2.oci_object_url(oci, redis_obj, uid, prefix_name)
 | 
	
		
			
				|  |  | +                            if img_url:
 | 
	
		
			
				|  |  | +                                img_url = img_url + thumbspng
 | 
	
		
			
				|  |  |                          else:
 | 
	
		
			
				|  |  |                              params = {'Key': thumbspng}
 | 
	
		
			
				|  |  |                              if region == 1:  # 国外AWS
 |