Pārlūkot izejas kodu

后台推送查询

linhaohong 1 gadu atpakaļ
vecāks
revīzija
02d1a1696a
1 mainītis faili ar 268 papildinājumiem un 0 dzēšanām
  1. 268 0
      AdminController/MessageMangementController.py

+ 268 - 0
AdminController/MessageMangementController.py

@@ -0,0 +1,268 @@
+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
+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:
+            query &= Q(device_user_id=user_id)
+
+        if uids is not None:
+            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 = ''
+                Q(event_tag__regex=tags)
+            elif tags:
+                query &= Q(event_tag__regex=tags)
+        print(query)
+
+        # 联表查询
+        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()
+            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": uid_type["Type"],
+                "aiEventTypeList": ai_event_type_list,
+            }
+            equipment_info_list.append(equipment_info_data)
+
+        data = {
+            "list": equipment_info_list,
+            "total": paginator.count
+        }
+
+        return response.json(0, data)