| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | import timeimport boto3import botocoreimport oss2from botocore import clientfrom django.core.paginator import Paginatorfrom django.db.models import Qfrom django.views.generic.base import Viewfrom Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \    SERVER_TYPEfrom Model.models import Device_Info, VodBucketModel, DeviceTypeModelfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Model import modelsfrom Object.utils import LocalDateTimeUtilfrom Service.EquipmentInfoService import EquipmentInfoServicefrom Service.VodHlsService import SplitVodHlsObjectclass 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)
 |