|
@@ -0,0 +1,267 @@
|
|
|
+import time
|
|
|
+import boto3
|
|
|
+import botocore
|
|
|
+import oss2
|
|
|
+from botocore import client
|
|
|
+from django.core.paginator import Paginator
|
|
|
+from django.db.models import Q
|
|
|
+from django.views.generic.base import View
|
|
|
+
|
|
|
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
|
|
|
+ SERVER_TYPE
|
|
|
+from Model.models import Device_Info, VodBucketModel, DeviceTypeModel
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
+from Model import models
|
|
|
+from Object.utils import LocalDateTimeUtil
|
|
|
+from Service.EquipmentInfoService import EquipmentInfoService
|
|
|
+from Service.VodHlsService import SplitVodHlsObject
|
|
|
+
|
|
|
+
|
|
|
+class MassageView(View):
|
|
|
+
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ operation = kwargs.get('operation')
|
|
|
+ return self.validation(request, request.GET, operation)
|
|
|
+
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ operation = kwargs.get('operation')
|
|
|
+ return self.validation(request, request.POST, operation)
|
|
|
+
|
|
|
+ def validation(self, request, request_dict, operation):
|
|
|
+ language = request_dict.get('language', 'en')
|
|
|
+ response = ResponseObject(language, 'pc')
|
|
|
+ if operation == 'XXX':
|
|
|
+ return 0
|
|
|
+ else:
|
|
|
+ # tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
|
|
|
+ # if tko.code != 0:
|
|
|
+ # return response.json(tko.code)
|
|
|
+ if operation == 'queryInfoList':
|
|
|
+ return self.query_info_list(request_dict, response)
|
|
|
+ else:
|
|
|
+ return response.json(414)
|
|
|
+
|
|
|
+ def query_info_list(self, request_dict, response):
|
|
|
+ """
|
|
|
+ 查询推送数据
|
|
|
+ @param request_dict: 请求参数
|
|
|
+ @request_dict uids: 设备id
|
|
|
+ @request_dict eventType: 事件类型
|
|
|
+ @request_dict eventType: userID
|
|
|
+ @request_dict startTime: 开始时间戳
|
|
|
+ @request_dict endTime: 结束时间戳
|
|
|
+ @request_dict pageNo: 开始时间戳
|
|
|
+ @request_dict pageSize: 结束时间戳
|
|
|
+ @param response:
|
|
|
+ @return:
|
|
|
+ """
|
|
|
+ uids = request_dict.get('uids', None)
|
|
|
+ event_type = request_dict.get('eventType', None)
|
|
|
+ user_id = request_dict.get('userID', None)
|
|
|
+ # 时间
|
|
|
+ start_time = request_dict.get('startTime', None)
|
|
|
+ end_time = request_dict.get('endTime', None)
|
|
|
+ # 分页
|
|
|
+ page = int(request_dict.get('pageNo', None))
|
|
|
+ size = int(request_dict.get('pageSize', None))
|
|
|
+ # 区域
|
|
|
+ if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
|
|
|
+ region = 2
|
|
|
+ else:
|
|
|
+ region = 1
|
|
|
+
|
|
|
+ query = Q()
|
|
|
+ if not start_time and not end_time:
|
|
|
+ # 默认查询近七天内数据
|
|
|
+ end_time = int(time.time())
|
|
|
+ start_time = LocalDateTimeUtil.get_before_days_timestamp(end_time, 7)
|
|
|
+ query &= Q(event_time__range=(start_time, end_time))
|
|
|
+
|
|
|
+ elif start_time and end_time:
|
|
|
+ query &= Q(event_time__range=(start_time, end_time))
|
|
|
+
|
|
|
+ else:
|
|
|
+ response.json(10, "需要给出一个时间段")
|
|
|
+
|
|
|
+ if user_id is None and uids is None:
|
|
|
+ return response.json(0, {"list": [], "total": 0})
|
|
|
+
|
|
|
+ # 过滤条件
|
|
|
+ if user_id is not None and user_id != "":
|
|
|
+ query &= Q(device_user_id=user_id)
|
|
|
+
|
|
|
+ if uids is not None and uids != "":
|
|
|
+ uid_list = uids.split(',')
|
|
|
+ query &= Q(device_uid__in=uid_list)
|
|
|
+
|
|
|
+ if event_type is not None:
|
|
|
+ event_type_list = EquipmentInfoService.get_comb_event_type(event_type)
|
|
|
+ event_type_list = list(set(event_type_list))
|
|
|
+ tags = EquipmentInfoService.get_event_tag(event_type)
|
|
|
+ if event_type_list:
|
|
|
+ query &= Q(event_type__in=event_type_list)
|
|
|
+ tags = ''
|
|
|
+ query &= Q(event_tag__regex=tags)
|
|
|
+ elif tags:
|
|
|
+ query &= Q(event_tag__regex=tags)
|
|
|
+
|
|
|
+ # 联表查询
|
|
|
+ querysets = []
|
|
|
+ for i in range(1, 21):
|
|
|
+ table_name = f'EquipmentInfo{i}'
|
|
|
+ model_class = getattr(models, table_name)
|
|
|
+ annotated_queryset = model_class.objects.filter(query)
|
|
|
+ querysets.append(annotated_queryset)
|
|
|
+
|
|
|
+ equipment_info_combined_qs = querysets[0].union(*querysets[1:], all=True)
|
|
|
+
|
|
|
+ # 创建分页对象
|
|
|
+ equipment_info_combined_qs = equipment_info_combined_qs.order_by("-event_time")
|
|
|
+ paginator = Paginator(equipment_info_combined_qs, size)
|
|
|
+ # 获取请求页的数据
|
|
|
+ packages_page = paginator.page(page)
|
|
|
+
|
|
|
+ # 连接存储桶
|
|
|
+ auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
|
|
|
+ oss_img_bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')
|
|
|
+ aws_s3 = boto3.client(
|
|
|
+ 's3',
|
|
|
+ aws_access_key_id=AWS_ACCESS_KEY_ID[1],
|
|
|
+ aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
|
|
|
+ config=botocore.client.Config(signature_version='s3v4'),
|
|
|
+ region_name='us-east-1'
|
|
|
+ )
|
|
|
+ aws_s3_cn = boto3.client(
|
|
|
+ 's3',
|
|
|
+ aws_access_key_id=AWS_ACCESS_KEY_ID[0],
|
|
|
+ aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
|
|
|
+ config=botocore.client.Config(signature_version='s3v4'),
|
|
|
+ region_name='cn-northwest-1'
|
|
|
+ )
|
|
|
+
|
|
|
+ # ai消息标识所有组合标签
|
|
|
+ ai_all_event_type = EquipmentInfoService.get_all_comb_event_type()
|
|
|
+
|
|
|
+ # 遍历调整返回数据
|
|
|
+ equipment_info_list = []
|
|
|
+ for equipment_info in packages_page:
|
|
|
+ uid = equipment_info.device_uid
|
|
|
+ channel = equipment_info.channel
|
|
|
+ event_time = equipment_info.event_time
|
|
|
+ storage_location = equipment_info.storage_location
|
|
|
+ border_coords = equipment_info.border_coords
|
|
|
+ event_tag = equipment_info.event_tag
|
|
|
+
|
|
|
+ img_url = ""
|
|
|
+ if equipment_info.is_st == 1:
|
|
|
+ thumbspng = '{}/{}/{}.jpeg'.format(uid, channel, event_time)
|
|
|
+ if storage_location == 1: # 阿里云oss
|
|
|
+ img_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
|
|
|
+ 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)
|
|
|
+
|
|
|
+ img_url = img_url
|
|
|
+ img_list = [img_url]
|
|
|
+
|
|
|
+ elif equipment_info.is_st == 2:
|
|
|
+ # 列表装载回放时间戳标记
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vodqs = split_vod_hls_obj.get_vod_hls_data(
|
|
|
+ uid=uid, channel=channel, start_time=int(event_time)).values('bucket_id')
|
|
|
+ if not vodqs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
|
|
|
+ if not vod_bucket_qs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ bucket_name = vod_bucket_qs[0]['bucket']
|
|
|
+ endpoint = vod_bucket_qs[0]['endpoint']
|
|
|
+ bucket = oss2.Bucket(auth, endpoint, bucket_name)
|
|
|
+ ts = '{}/vod{}/{}/ts0.ts'.format(uid, channel, event_time)
|
|
|
+ if storage_location == 1: # 阿里云oss
|
|
|
+ thumb0 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_0000,w_700'})
|
|
|
+ thumb1 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_1000,w_700'})
|
|
|
+ thumb2 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_2000,w_700'})
|
|
|
+ img_url = ""
|
|
|
+ img_list = [thumb0, thumb1, thumb2]
|
|
|
+ else:
|
|
|
+ params = {'Key': ts}
|
|
|
+ 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)
|
|
|
+ img_list = [img_url]
|
|
|
+
|
|
|
+ elif equipment_info.is_st == 3 or equipment_info.is_st == 4:
|
|
|
+ # 列表装载回放时间戳标记
|
|
|
+ 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)
|
|
|
+ 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)
|
|
|
+ img_list.append(img_url)
|
|
|
+
|
|
|
+ else:
|
|
|
+ img_list = []
|
|
|
+
|
|
|
+ uid_type = Device_Info.objects.filter(UID=uid).values('Type').first()
|
|
|
+ device_type = DeviceTypeModel.objects.filter(type=uid_type['Type']).values('name').first()
|
|
|
+ border_coords = '' if border_coords == '' else eval(border_coords)
|
|
|
+ ai_event_type_list = []
|
|
|
+
|
|
|
+ # 如果是ai消息类型,则分解eventType, 如:123 -> [1,2,3]
|
|
|
+ if border_coords and event_type in ai_all_event_type:
|
|
|
+ ai_event_type_list = list(map(int, str(event_type)))
|
|
|
+ if EquipmentInfoService.is_combo_tag(event_type, event_tag):
|
|
|
+ ai_event_type_list += EquipmentInfoService.get_combo_types(event_type, event_tag)
|
|
|
+ equipment_info_data = {
|
|
|
+ "uid": uid,
|
|
|
+ "status": equipment_info.status,
|
|
|
+ "answerStatus": equipment_info.answer_status,
|
|
|
+ "alarm": equipment_info.alarm,
|
|
|
+ "isSt": equipment_info.is_st,
|
|
|
+ "storageLocation": storage_location,
|
|
|
+ "devNickName": equipment_info.device_nick_name,
|
|
|
+ "channel": channel,
|
|
|
+ "eventType": equipment_info.event_type,
|
|
|
+ "eventTime": int(event_time),
|
|
|
+ "addTime": equipment_info.add_time,
|
|
|
+ "borderCoords": border_coords,
|
|
|
+ "eventTag": event_tag,
|
|
|
+ "img": img_url,
|
|
|
+ "imgList": img_list,
|
|
|
+ "uidType": device_type["name"],
|
|
|
+ "aiEventTypeList": str(ai_event_type_list),
|
|
|
+ }
|
|
|
+ equipment_info_list.append(equipment_info_data)
|
|
|
+
|
|
|
+ data = {
|
|
|
+ "list": equipment_info_list,
|
|
|
+ "total": paginator.count
|
|
|
+ }
|
|
|
+
|
|
|
+ return response.json(0, data)
|