ソースを参照

更新推送分表代码

locky 1 年間 前
コミット
e5ca426129

+ 1 - 1
AdminController/DeviceManagementController.py

@@ -420,7 +420,7 @@ class DeviceManagement(View):
                 if '设备配置数据' in delDataOptions:
                     UidSetModel.objects.filter(uid__in=uidList).delete()
                 if '设备推送数据' in delDataOptions:
-                    Equipment_Info.objects.filter(devUid__in=uidList).delete()
+                    EquipmentInfoService.delete_all_equipment_info(device_uid__in=uidList)
                 if '设备AP信息数据' in delDataOptions:
                     UidUserModel.objects.filter(UID__in=uidList).delete()
                 if '设备AI数据' in delDataOptions:

+ 30 - 0
Controller/Cron/CronTaskController.py

@@ -49,6 +49,8 @@ class CronDelDataView(View):
             return self.delAccessLog(response)
         elif operation == 'delPushInfo':  # 定时删除推送数据
             return self.delPushInfo(response)
+        elif operation == 'delPushInfoV2':  # 定时删除推送数据V2
+            return self.delPushInfoV2(response)
         elif operation == 'delVodHls':  # 定时删除云存播放列表
             return self.delVodHls(response)
         elif operation == 'delCloudLog':  # 定时删除云存接口数据
@@ -256,6 +258,34 @@ class CronDelDataView(View):
         # 关闭游标
         cursor.close()
 
+    @classmethod
+    def delPushInfoV2(cls, response):
+        try:
+            del_push_info_thread = threading.Thread(
+                target=cls.del_push_info_data_v2)
+            del_push_info_thread.start()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def del_push_info_data_v2():
+        cursor = connections['mysql02'].cursor()
+
+        # 获取7天前时间戳
+        now_time = int(time.time())
+        expiration_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
+
+        # 每次删除条数
+        size = 5000
+
+        for i in range(1, 21):
+            sql = "DELETE FROM equipment_info_{} WHERE add_time< %s LIMIT %s ".format(i)
+            cursor.execute(sql, [expiration_time, size])
+
+        # 关闭游标
+        cursor.close()
+
     @staticmethod
     def delVodHls(response):
         nowTime = int(time.time())

+ 110 - 117
Controller/DetectControllerV2.py

@@ -310,31 +310,27 @@ class DetectControllerViewV2(View):
     def do_query(self, request_dict, response, userID):
         page = int(request_dict.get('page', None))
         line = int(request_dict.get('line', None))
-        if not page or not line:
-            return response.json(444, 'page,line')
-        startTime = request_dict.get('startTime', None)
-        endTime = request_dict.get('endTime', None)
-        eventType = request_dict.get('eventType', None)
-        region = request_dict.get('region', None)
-        if not region:
-            return response.json(444, 'region')
-        region = int(region)
-        try:
-            # 根据时间筛选消息推送
-            if startTime and endTime:
-                qs, count = EquipmentInfoService.find_by_start_time_equipment_info(page, line, userID, startTime,
-                                                                                   endTime, eventType,
-                                                                                   request_dict.get('uids', None))
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        event_type = request_dict.get('eventType', None)
+        region = int(request_dict.get('region', None))
+        uids = request_dict.get('uids', None)
 
-            else:
-                # 默认查询近七天消息推送
-                def_time = LocalDateTimeUtil.get_before_days_timestamp(int(time.time()), 8)
-                qs, count = EquipmentInfoService.get_equipment_info_week_all(page, line, userID, def_time, endTime,
-                                                                             eventType,
-                                                                             request_dict.get('uids', None))
-            uids = request_dict.get('uids', None)
+        try:
+            uid_list = []
             if uids:
                 uid_list = uids.split(',')
+
+            if not start_time and not end_time:
+                # 默认查询近七天内数据
+                end_time = int(time.time())
+                start_time = LocalDateTimeUtil.get_before_days_timestamp(end_time, 7)
+
+            equipment_info_qs, count = EquipmentInfoService.\
+                union_equipment_info(userID, uid_list, event_type, start_time, end_time, page, line)
+
+            # 查询设备类型,昵称
+            if uid_list:
                 dvqs = Device_Info.objects.filter(UID__in=uid_list, userID_id=userID).values('UID', 'Type', 'NickName')
                 uid_type_dict = {}
                 for dv in dvqs:
@@ -344,59 +340,63 @@ class DetectControllerViewV2(View):
                 uid_type_dict = {}
                 for dv in dvqs:
                     uid_type_dict[dv['UID']] = {'type': dv['Type'], 'NickName': dv['NickName']}
-            if not qs or count == 0 or not qs.exists():
+
+            # 没有推送数据返回空列表
+            if count == 0:
                 return response.json(0, {'datas': [], 'count': 0})
-            qr = qs
+
             res = []
             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_guonei = 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'
-            )
-            aws_s3_guowai = boto3.client(
+            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'
             )
-            # vod_time_list = []
+            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()
-            for p in qr:
-                devUid = p['devUid']
-                eventTime = p['eventTime']
-                channel = p['Channel']
-                storage_location = p['storage_location']
-                if p['is_st'] == 1:
-                    thumbspng = '{uid}/{channel}/{time}.jpeg'.format(uid=devUid, channel=p['Channel'], time=eventTime)
-                    if storage_location == 1:  # oss
-                        response_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
-                        p['img'] = response_url
-                        p['img_list'] = [response_url]
-                    elif region == 2 and storage_location == 2:  # 2:国内,aws
-                        response_url = aws_s3_guonei.generate_presigned_url('get_object',
-                                                                            Params={'Bucket': 'push',
-                                                                                    'Key': thumbspng},
-                                                                            ExpiresIn=300)
-                        p['img'] = response_url
-                        p['img_list'] = [response_url]
-                    elif region == 1 and storage_location == 2:  # 1:国外,aws
-                        response_url = aws_s3_guowai.generate_presigned_url('get_object',
-                                                                            Params={'Bucket': 'foreignpush',
-                                                                                    'Key': thumbspng},
-                                                                            ExpiresIn=300)
-                        p['img'] = response_url
-                        p['img_list'] = [response_url]
-                elif p['is_st'] == 2:
+            for equipment_info in equipment_info_qs:
+                uid = equipment_info['devUid']
+                event_time = equipment_info['eventTime']
+                channel = equipment_info['Channel']
+                storage_location = equipment_info['storage_location']
+                border_coords = equipment_info['borderCoords']
+                event_type = equipment_info['eventType']
+                event_tag = equipment_info['eventTag']
+
+                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)
+
+                    equipment_info['img'] = img_url
+                    equipment_info['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=devUid, channel=channel,
-                                                               start_time=int(eventTime)).values("bucket_id")
+                    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')
@@ -405,68 +405,61 @@ class DetectControllerViewV2(View):
                     bucket_name = vod_bucket_qs[0]['bucket']
                     endpoint = vod_bucket_qs[0]['endpoint']
                     bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                    ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'],
-                                                                    etime=eventTime)
-                    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'})
-                        # thumb3 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_3000,w_700'})
-                        p['img_list'] = [thumb0, thumb1, thumb2]
-                    elif region == 2 and storage_location == 2:  # 2:国内,aws
-                        thumb = aws_s3_guonei.generate_presigned_url('get_object',
-                                                                     Params={'Bucket': 'push', 'Key': ts},
-                                                                     ExpiresIn=3600)
-                        p['img_list'] = [thumb]
-                    elif region == 1 and storage_location == 2:  # 1:国外,aws
-                        thumb = aws_s3_guowai.generate_presigned_url('get_object',
-                                                                     Params={'Bucket': 'foreignpush', 'Key': ts},
-                                                                     ExpiresIn=3600)
-                        p['img_list'] = [thumb]
-                elif p['is_st'] == 3 or p['is_st'] == 4:
+                    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'})
+                        equipment_info['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)
+                        equipment_info['img_list'] = [img_url]
+
+                elif equipment_info['is_st'] == 3 or equipment_info['is_st'] == 4:
                     # 列表装载回放时间戳标记
-                    p['img_list'] = []
-                    for i in range(p['is_st']):
-                        thumbspng = '{uid}/{channel}/{time}_{st}.jpeg'.format(uid=devUid, channel=p['Channel'],
-                                                                              time=eventTime, st=i)
-                        if storage_location == 1:  # oss
-                            img = oss_img_bucket.sign_url('GET', thumbspng, 300)
-                            p['img_list'].append(img)
-                        elif region == 2 and storage_location == 2:  # 2:国内,aws
-                            response_url = aws_s3_guonei.generate_presigned_url('get_object',
-                                                                                Params={'Bucket': 'push',
-                                                                                        'Key': thumbspng},
-                                                                                ExpiresIn=300)
-                            img = response_url
-                            p['img_list'].append(img)
-                        elif region == 1 and storage_location == 2:  # 1:国外,aws
-                            response_url = aws_s3_guowai.generate_presigned_url('get_object',
-                                                                                Params={'Bucket': 'foreignpush',
-                                                                                        'Key': thumbspng},
-                                                                                ExpiresIn=300)
-                            img = response_url
-                            p['img_list'].append(img)
-
-                if devUid in uid_type_dict.keys():
-                    p['uid_type'] = uid_type_dict[devUid]['type']
-                    p['devNickName'] = uid_type_dict[devUid]['NickName']
+                    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)
+                        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']
+                    equipment_info['devNickName'] = uid_type_dict[uid]['NickName']
                 else:
-                    p['uid_type'] = ''
+                    equipment_info['uid_type'] = ''
 
-                p['borderCoords'] = '' if p['borderCoords'] == '' else json.loads(p['borderCoords'])  # ai消息坐标信息
-                p['ai_event_type_list'] = []
+                equipment_info['borderCoords'] = '' if border_coords == '' else json.loads(border_coords)  # ai消息坐标信息
+                equipment_info['ai_event_type_list'] = []
                 # 如果是ai消息类型,则分解eventType, 如:123 -> [1,2,3]
-                if p['borderCoords'] and p['eventType'] in ai_all_event_type:
-                    p['ai_event_type_list'] = list(map(int, str(p['eventType'])))
-                if EquipmentInfoService.is_combo_tag(p['eventType'], p['eventTag']):
-                    p['ai_event_type_list'] += EquipmentInfoService.get_combo_types(p['eventType'], p['eventTag'])
-                res.append(p)
+                if border_coords and event_type in ai_all_event_type:
+                    equipment_info['ai_event_type_list'] = list(map(int, str(event_type)))
+                if EquipmentInfoService.is_combo_tag(event_type, event_tag):
+                    equipment_info['ai_event_type_list'] += EquipmentInfoService.get_combo_types(event_type, event_tag)
+
+                res.append(equipment_info)
             return response.json(0, {'datas': res, 'count': count})
         except Exception as e:
-            print(repr(e))
+            print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(474)
 
     def do_update_interval(self, userID, request_dict, response):

+ 49 - 73
Controller/EquipmentInfo.py

@@ -13,16 +13,6 @@ from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.ModelService import ModelService
 
-'''
-http://192.168.136.45:8077/equipment/info?token=test&operation=add&devUid=2N1K3LE78TYJ38CE111A&Channel=0&eventType=1&eventTime=1234567890&operation=add&alarm=21342134&receiveTime=1234567891234567
-http://test.dvema.com/equipment/info?token=test&operation=query&page=1&line=10
-http://192.168.136.45:8077/equipment/info?token=test&operation=delete&devUid=UKPAH63V23U4ZHEB111A&id=5&id=6&id=7
-http://192.168.136.40:8077/equipment/info?token=test&operation=update&devUid=UKPAH63V23U4ZHEB111A&id=3&id=4
-http://192.168.136.45:8077/equipment/info?token=test&operation=queryByAdmin&page=1&line=10&userID_id=151547867345163613800138001
-http://192.168.136.45:8077/equipment/info?token=test&operation=deleteByAdmin&id=5&id=6&id=7
-
-'''
-
 
 class EquipmentInfo(View):
     @method_decorator(csrf_exempt)
@@ -47,16 +37,16 @@ class EquipmentInfo(View):
         operation = request_dict.get('operation', None)
         if not userID:
             return response.json(309)
-        if operation == 'query':
+        if operation == 'query':    # 查询推送消息
             return self.query_info(request_dict, userID, response)
         elif operation == 'add':
             return self.add_info(request_dict, userID, response)
-        elif operation == 'update':
+        elif operation == 'update':     # 已读推送消息
             return self.update_info(request_dict, userID, response)
-        elif operation == 'update-answer-status':
+        elif operation == 'update-answer-status':   # 已接听一键通话消息
             return self.update_answer_status(request_dict, userID, response)
-        elif operation == 'delete':
-            return self.delete_info(request_dict, userID, response)
+        elif operation == 'delete':     # 删除推送消息
+            return self.delete_info(request_dict, response)
         elif operation == 'findByTime':
             return self.findByTime_info(request_dict, userID, response)
         if operation == 'queryByAdmin':
@@ -168,46 +158,35 @@ class EquipmentInfo(View):
             res.append(p)
         return response.json(0, {'datas': res, 'count': count})
 
-    def update_info(self, request_dict, userID, response):
-        is_update_all = request_dict.get('is_update_all', 0)
-        eventType = request_dict.get('eventType', None)
-        if int(is_update_all) == 1:
+    @staticmethod
+    def update_info(request_dict, userID, response):
+        is_update_all = int(request_dict.get('is_update_all', 0))
+        event_type = request_dict.get('eventType', None)
+        if is_update_all == 1:
+            kwargs = {
+                'device_user_id': userID,
+                'status': 0
+            }
+            if event_type:
+                kwargs['event_type'] = int(event_type)
             try:
-                is_update = 0
-                for i in range(1, 8):
-                    eq_qs = EquipmentInfoService.get_equipment_info_model('', i)
-                    eq_qs = eq_qs.filter(device_user_id=userID)
-                    if eventType:
-                        eq_qs = eq_qs.filter(event_type=int(eventType))
-                    is_update += eq_qs.update(status=1)
-                return response.json(0, {'update_count': is_update})
+                EquipmentInfoService.all_read_equipment_info(**kwargs)
             except Exception as e:
                 print(repr(e))
-            return response.json(0, {'update_success': 'all'})
         else:
             id_list = request_dict.getlist('id[]', None)
             if id_list is None or len(id_list) < 1:
                 id_list = request_dict.getlist('id', None)
-            param_flag = CommonService.get_param_flag(data=[id_list])
-            if param_flag is True:
-                count = 0
-                for ei_id in id_list:
-                    try:
-                        tab_val = int(ei_id[0:1])
-                        ei_id = int(ei_id[1:])
-                        eq = EquipmentInfoService.get_equipment_info_model('', tab_val)
-                        eq = eq.filter(id=ei_id)
-                        if eq.exists():
-                            own_dev = ModelService.check_own_device(userID, eq[0].device_uid)
-                            if own_dev is True:
-                                count += 1
-                                eq.update(status=1)
-
-                    except Exception as e:
-                        print(repr(e))
-                return response.json(0, {'update_success': count})
-            else:
+            if not id_list:
                 return response.json(444)
+            for full_id in id_list:
+                try:
+                    ei_id = int(full_id[2:])
+                    equipment_info_model = EquipmentInfoService.get_equipment_info_model_with_full_id(full_id)
+                    equipment_info_model.objects.filter(id=ei_id).update(status=1)
+                except Exception as e:
+                    print(repr(e))
+        return response.json(0)
 
     @staticmethod
     def update_answer_status(request_dict, user_id, response):
@@ -222,37 +201,34 @@ class EquipmentInfo(View):
         event_time = request_dict.get('event_time', None)
         if not all([uid, event_time]):
             return response.json(444)
-        updated = EquipmentInfoService.update_equipment_answer_status(user_id, uid, event_time)
-        if updated:
-            return response.json(0)
-        else:
-            return response.json(5)
 
-    def delete_info(self, request_dict, userID, response):
+        kwargs = {
+            'device_user_id': user_id,
+            'device_uid': uid,
+            'event_time': event_time,
+            'event_type__in': [606, 607]
+        }
+        try:
+            EquipmentInfoService.update_equipment_info_answer_status(**kwargs)
+        except Exception as e:
+            print(repr(e))
+        return response.json(0)
+
+    @staticmethod
+    def delete_info(request_dict, response):
         id_list = request_dict.getlist('id[]', None)
         if id_list is None or len(id_list) < 1:
             id_list = request_dict.getlist('id', None)
-        param_flag = CommonService.get_param_flag(data=[id_list])
-        if param_flag is True:
-            try:
-                for ei_id in id_list:
-                    tab_val = int(ei_id[0:1])
-                    ei_id = int(ei_id[1:])
-                    eq = EquipmentInfoService.get_equipment_info_model('', tab_val)
-                    eq = eq.filter(id=ei_id)
-                    if eq.exists():
-                        own_dev = ModelService.check_own_device(userID, eq[0].device_uid)
-                        if own_dev is True:
-                            eq.delete()
-
-            except Exception as e:
-                errorInfo = traceback.format_exc()
-                print(errorInfo)
-                return response.json(424, repr(e))
-            else:
-                return response.json(0)
-        else:
+        if not id_list:
             return response.json(444)
+        try:
+            for full_id in id_list:
+                ei_id = int(full_id[2:])
+                equipment_info_model = EquipmentInfoService.get_equipment_info_model_with_full_id(full_id)
+                equipment_info_model.objects.filter(id=ei_id).delete()
+        except Exception as e:
+            print(repr(e))
+        return response.json(0)
 
     def findByTime_info(self, request_dict, userID, response):
         startTime = request_dict.get('startTime')

+ 10 - 2
Controller/PcInfo.py

@@ -657,13 +657,21 @@ class PcInfo(View):
         version = request_dict.get('version', None)
         if version is None:
             return response.json(444)
-        avss_version_qs = AVSSVersion.objects.filter().values('online_version')
+        avss_version_qs = AVSSVersion.objects.filter().values('online_version', 'force_update_version')
         if not avss_version_qs.exists():
             return response.json(173)
         # 比较当前版本和线上版本
         online_version = avss_version_qs[0]['online_version']
         if version < online_version:
-            return response.json(0, {'online_version': online_version})
+            res = {'online_version': online_version}
+            # 判断是否强制更新
+            force_update_version = avss_version_qs[0]['force_update_version']
+            if version < force_update_version:
+                res['force_update'] = 1
+                return response.json(0, res)
+            else:
+                res['force_update'] = 0
+                return response.json(0, res)
         else:
             return response.json(0)
 

+ 1 - 2
Controller/SerialNumberController.py

@@ -515,8 +515,7 @@ class SerialNumberView(View):
                 UidPushModel.objects.filter(uid_set__uid=uid).delete()
                 iotdeviceInfoModel.objects.filter(serial_number=serial).delete()
                 # 删除推送消息
-                for val in range(1, 8):
-                    EquipmentInfoService.get_equipment_info_model('', val).filter(device_uid=uid).delete()
+                EquipmentInfoService.delete_all_equipment_info(device_uid=uid)
 
                 # 重置设备云存
                 UID_Bucket.objects.filter(uid=uid).delete()

+ 25 - 30
Controller/SysManage.py

@@ -105,34 +105,29 @@ def initMsgFunc(request):
     token = request_dict.get('token', None)
     tko = TokenObject(token)
     response.lang = tko.lang
-    if tko.code == 0:
-        userID = tko.userID
-        seven_days_ago = int(time.time()) - 3600 * 24 * 7  # 过滤七天前数据
-        sm_count = SysMsgModel.objects.filter(userID_id=userID, status=0).count()
-        # eq_count = Equipment_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago, status=False).count()
-        # rq_count = Equipment_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago, eventType=57,
-        # status=False).count()
-        sm_count = SysMsgModel.objects.filter(userID_id=userID, status=0).count()
-        # eq_count = Equipment_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago, status=False).count()
-        # rq_count = Equipment_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago, eventType=57,
-        # status=False).count()
-        eq_count = 0
-        rq_count = 0
-        for i in range(1, 8):
-            eq_qs = EquipmentInfoService.get_equipment_info_model('', i)
-            eq_qs = eq_qs.filter(device_user_id=userID, event_time__gt=seven_days_ago, status=False)
-            if eq_qs.exists():
-                eq_count += eq_qs.count()
-                rq_count += eq_qs.filter(event_type=57).count()
-        ai_count = Ai_Push_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago, status=False).count()
-        uid_reset_count = Device_Info.objects.filter(userID_id=userID, isExist=2).count()
-        res = {
-            'sm_count': sm_count,  # 系统消息未读数量
-            'eq_count': eq_count,  # 未读消息总数
-            'rq_count': rq_count,  # 人形检测总数
-            'ai_count': ai_count,  # AI消息总数
-            'uid_reset_count': uid_reset_count,  # 复位的设备数量
-        }
-        return response.json(0, res)
-    else:
+    if tko.code != 0:
         return response.json(tko.code)
+    userID = tko.userID
+    seven_days_ago = int(time.time()) - 3600 * 24 * 7  # 过滤七天前数据
+    sm_count = SysMsgModel.objects.filter(userID_id=userID, status=0).count()
+    sm_count = SysMsgModel.objects.filter(userID_id=userID, status=0).count()
+
+    kwargs = {
+        'device_user_id': userID,
+        'event_time__gt': seven_days_ago,
+        'status': 0
+    }
+    eq_count = EquipmentInfoService.count_equipment_info(**kwargs)
+    kwargs['event_type'] = 57
+    rq_count = EquipmentInfoService.count_equipment_info(**kwargs)
+
+    ai_count = Ai_Push_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago, status=False).count()
+    uid_reset_count = Device_Info.objects.filter(userID_id=userID, isExist=2).count()
+    res = {
+        'sm_count': sm_count,  # 系统消息未读数量
+        'eq_count': eq_count,  # 未读消息总数
+        'rq_count': rq_count,  # 人形检测总数
+        'ai_count': ai_count,  # AI消息总数
+        'uid_reset_count': uid_reset_count,  # 复位的设备数量
+    }
+    return response.json(0, res)

+ 581 - 0
Model/models.py

@@ -573,6 +573,586 @@ class EquipmentInfoSunday(models.Model):
         app_label = "PushModel"
 
 
+class EquipmentInfo1(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_1'
+        verbose_name = '推送数据表1'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo2(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_2'
+        verbose_name = '推送数据表2'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo3(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_3'
+        verbose_name = '推送数据表3'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo4(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_4'
+        verbose_name = '推送数据表4'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo5(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_5'
+        verbose_name = '推送数据表5'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo6(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_6'
+        verbose_name = '推送数据表6'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo7(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_7'
+        verbose_name = '推送数据表7'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo8(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_8'
+        verbose_name = '推送数据表8'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo9(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_9'
+        verbose_name = '推送数据表9'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo10(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_10'
+        verbose_name = '推送数据表10'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo11(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_11'
+        verbose_name = '推送数据表11'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo12(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_12'
+        verbose_name = '推送数据表12'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo13(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_13'
+        verbose_name = '推送数据表13'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo14(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_14'
+        verbose_name = '推送数据表14'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo15(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_15'
+        verbose_name = '推送数据表15'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo16(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_16'
+        verbose_name = '推送数据表16'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo17(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_17'
+        verbose_name = '推送数据表17'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo18(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_18'
+        verbose_name = '推送数据表18'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo19(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_19'
+        verbose_name = '推送数据表19'
+        app_label = 'PushModel'
+
+
+class EquipmentInfo20(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name='主键')
+    device_user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    device_uid = models.CharField(default='', max_length=32, db_index=True, verbose_name='设备uid')
+    device_nick_name = models.CharField(default='', max_length=32, verbose_name='设备昵称')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='设备通道')
+    # 0:空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),
+    # 51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警,
+    # 702:摄像头休眠,703:摄像头唤醒,704:电量过低
+    event_type = models.PositiveSmallIntegerField(default=0, verbose_name='事件类型')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(default='', max_length=128, db_index=True, verbose_name='事件标签')
+    alarm = models.CharField(default='', max_length=256, verbose_name='报警信息')
+    # 0:无图, 1:单图, 3:多图
+    is_st = models.PositiveSmallIntegerField(default=0, verbose_name='图片信息')
+    # 1: 阿里云, 2: AWS
+    storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
+    border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
+    event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
+    add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_20'
+        verbose_name = '推送数据表20'
+        app_label = 'PushModel'
+
+
 class PushInaccurateFeedback(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键id')
     equipment_info_id = models.CharField(default='', max_length=32, verbose_name='推送表id')
@@ -862,6 +1442,7 @@ class Equipment_Version(models.Model):
 class AVSSVersion(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     online_version = models.CharField(default='', max_length=32, verbose_name='线上版本')
+    force_update_version = models.CharField(default='', max_length=32, verbose_name='强制更新版本')
 
     class Meta:
         verbose_name = 'AVSS版本'

+ 196 - 2
Service/EquipmentInfoService.py

@@ -11,12 +11,20 @@ import itertools
 import logging
 import time
 
-from django.db.models import Value, CharField, Q
+from django.db.models import Value, CharField, Q, F
 
 from Model.models import EquipmentInfoMonday, EquipmentInfoTuesday, EquipmentInfoWednesday, EquipmentInfoThursday, \
-    EquipmentInfoFriday, EquipmentInfoSaturday, EquipmentInfoSunday
+    EquipmentInfoFriday, EquipmentInfoSaturday, EquipmentInfoSunday, EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, \
+    EquipmentInfo4, EquipmentInfo5, EquipmentInfo6, EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10, \
+    EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15, EquipmentInfo16, \
+    EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20
 from Object.utils import LocalDateTimeUtil
 
+EQUIPMENT_INFO_MODEL_LIST = [EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, EquipmentInfo4, EquipmentInfo5,
+                             EquipmentInfo6, EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10,
+                             EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15,
+                             EquipmentInfo16, EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20]
+
 """
 设备分表查询Service    
 因数据量不断增加,单表保留近七天数据进行分表优化设计
@@ -501,3 +509,189 @@ class EquipmentInfoService:
         if updated:
             updated_flag = True
         return updated_flag
+
+    @classmethod
+    def union_equipment_info(cls, user_id, uid_list, event_type, start_time, end_time, page, line):
+        """
+        联表查询推送数据
+        @param user_id:
+        @param uid_list:
+        @param event_type:
+        @param start_time:
+        @param end_time:
+        @param page:
+        @param line:
+        @return:
+        """
+        try:
+            kwargs = {
+                'device_user_id': user_id,
+                'event_time__range': (start_time, end_time),
+            }
+            event_type_kwargs = {}
+            if uid_list:
+                kwargs['device_uid__in'] = uid_list
+            if event_type:
+                # 多类型查询
+                event_type_list = cls.get_comb_event_type(event_type)
+                event_type_list = list(set(event_type_list))
+                tags = cls.get_event_tag(event_type)
+                if event_type_list:
+                    event_type_kwargs['event_type__in'] = event_type_list
+                    event_type_kwargs['event_tag'] = ''
+                    kwargs['event_tag__regex'] = tags
+                elif tags:
+                    kwargs['event_tag__regex'] = tags
+
+            if not event_type_kwargs:
+                # 新增tab_val字段记录表的标识:表编号+10
+                equipment_info_1 = EquipmentInfo1.objects.filter(**kwargs).annotate(tab_val=Value('11', output_field=CharField()))
+                equipment_info_2 = EquipmentInfo2.objects.filter(**kwargs).annotate(tab_val=Value('12', output_field=CharField()))
+                equipment_info_3 = EquipmentInfo3.objects.filter(**kwargs).annotate(tab_val=Value('13', output_field=CharField()))
+                equipment_info_4 = EquipmentInfo4.objects.filter(**kwargs).annotate(tab_val=Value('14', output_field=CharField()))
+                equipment_info_5 = EquipmentInfo5.objects.filter(**kwargs).annotate(tab_val=Value('15', output_field=CharField()))
+                equipment_info_6 = EquipmentInfo6.objects.filter(**kwargs).annotate(tab_val=Value('16', output_field=CharField()))
+                equipment_info_7 = EquipmentInfo7.objects.filter(**kwargs).annotate(tab_val=Value('17', output_field=CharField()))
+                equipment_info_8 = EquipmentInfo8.objects.filter(**kwargs).annotate(tab_val=Value('18', output_field=CharField()))
+                equipment_info_9 = EquipmentInfo9.objects.filter(**kwargs).annotate(tab_val=Value('19', output_field=CharField()))
+                equipment_info_10 = EquipmentInfo10.objects.filter(**kwargs).annotate(tab_val=Value('20', output_field=CharField()))
+                equipment_info_11 = EquipmentInfo11.objects.filter(**kwargs).annotate(tab_val=Value('21', output_field=CharField()))
+                equipment_info_12 = EquipmentInfo12.objects.filter(**kwargs).annotate(tab_val=Value('22', output_field=CharField()))
+                equipment_info_13 = EquipmentInfo13.objects.filter(**kwargs).annotate(tab_val=Value('23', output_field=CharField()))
+                equipment_info_14 = EquipmentInfo14.objects.filter(**kwargs).annotate(tab_val=Value('24', output_field=CharField()))
+                equipment_info_15 = EquipmentInfo15.objects.filter(**kwargs).annotate(tab_val=Value('25', output_field=CharField()))
+                equipment_info_16 = EquipmentInfo16.objects.filter(**kwargs).annotate(tab_val=Value('26', output_field=CharField()))
+                equipment_info_17 = EquipmentInfo17.objects.filter(**kwargs).annotate(tab_val=Value('27', output_field=CharField()))
+                equipment_info_18 = EquipmentInfo18.objects.filter(**kwargs).annotate(tab_val=Value('28', output_field=CharField()))
+                equipment_info_19 = EquipmentInfo19.objects.filter(**kwargs).annotate(tab_val=Value('29', output_field=CharField()))
+                equipment_info_20 = EquipmentInfo20.objects.filter(**kwargs).annotate(tab_val=Value('30', output_field=CharField()))
+            else:
+                equipment_info_1 = EquipmentInfo1.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('11', output_field=CharField()))
+                equipment_info_2 = EquipmentInfo2.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('12', output_field=CharField()))
+                equipment_info_3 = EquipmentInfo3.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('13', output_field=CharField()))
+                equipment_info_4 = EquipmentInfo4.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('14', output_field=CharField()))
+                equipment_info_5 = EquipmentInfo5.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('15', output_field=CharField()))
+                equipment_info_6 = EquipmentInfo6.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('16', output_field=CharField()))
+                equipment_info_7 = EquipmentInfo7.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('17', output_field=CharField()))
+                equipment_info_8 = EquipmentInfo8.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('18', output_field=CharField()))
+                equipment_info_9 = EquipmentInfo9.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('19', output_field=CharField()))
+                equipment_info_10 = EquipmentInfo10.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('20', output_field=CharField()))
+                equipment_info_11 = EquipmentInfo11.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('21', output_field=CharField()))
+                equipment_info_12 = EquipmentInfo12.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('22', output_field=CharField()))
+                equipment_info_13 = EquipmentInfo13.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('23', output_field=CharField()))
+                equipment_info_14 = EquipmentInfo14.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('24', output_field=CharField()))
+                equipment_info_15 = EquipmentInfo15.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('25', output_field=CharField()))
+                equipment_info_16 = EquipmentInfo16.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('26', output_field=CharField()))
+                equipment_info_17 = EquipmentInfo17.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('27', output_field=CharField()))
+                equipment_info_18 = EquipmentInfo18.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('28', output_field=CharField()))
+                equipment_info_19 = EquipmentInfo19.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('29', output_field=CharField()))
+                equipment_info_20 = EquipmentInfo20.objects.filter(Q(**kwargs) | Q(**event_type_kwargs)).annotate(tab_val=Value('30', output_field=CharField()))
+
+            equipment_info_union = equipment_info_1.union(
+                equipment_info_2, equipment_info_3, equipment_info_4, equipment_info_5, equipment_info_6, equipment_info_7,
+                equipment_info_8, equipment_info_9, equipment_info_10,
+                equipment_info_11, equipment_info_12, equipment_info_13, equipment_info_14, equipment_info_15,
+                equipment_info_16, equipment_info_17, equipment_info_18, equipment_info_19, equipment_info_20)
+
+            count = equipment_info_union.count()
+            if count == 0:
+                return None, 0
+
+            equipment_info_union = cls.get_equipment_info_union_page(equipment_info_union, page, line)
+            return equipment_info_union, count
+        except Exception as e:
+            print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_equipment_info_union_page(equipment_info_union, page, line):
+        """
+        获取查询结果集进行排序、分页,遍历重命名字典key(主要针对原函数返回结果集)
+        @param equipment_info_union: 设备信息结果集
+        @param page: 页数
+        @param line: 分页大小
+        @return: qs_page 遍历后的设备信息结果集
+        """
+        equipment_info_qs = equipment_info_union.values('id', 'device_uid', 'device_nick_name', 'channel', 'event_type',
+                                                        'status', 'answer_status', 'alarm', 'event_time', 'is_st',
+                                                        'add_time', 'storage_location', 'border_coords', 'tab_val',
+                                                        'event_tag')
+
+        equipment_info_qs = equipment_info_qs.order_by('-event_time')
+        equipment_info_qs = equipment_info_qs[(page - 1) * line:page * line]
+        for equipment_info in equipment_info_qs:
+            # id: 表标识+id
+            equipment_info['id'] = equipment_info['tab_val'] + str(equipment_info['id'])
+            equipment_info['devUid'] = equipment_info['device_uid']
+            equipment_info['devNickName'] = equipment_info['device_nick_name']
+            equipment_info['Channel'] = equipment_info['channel']
+            equipment_info['eventType'] = equipment_info['event_type']
+            equipment_info['eventTime'] = equipment_info['event_time']
+            equipment_info['receiveTime'] = equipment_info['event_time']
+            equipment_info['addTime'] = equipment_info['add_time']
+            equipment_info['borderCoords'] = equipment_info['border_coords']
+            equipment_info['eventTag'] = equipment_info['event_tag']
+            equipment_info.pop('device_uid')
+            equipment_info.pop('device_nick_name')
+            equipment_info.pop('channel')
+            equipment_info.pop('event_type')
+            equipment_info.pop('event_time')
+            equipment_info.pop('add_time')
+            equipment_info.pop('border_coords')
+            equipment_info.pop('tab_val')
+            equipment_info.pop('event_tag')
+        return equipment_info_qs
+
+    @staticmethod
+    def all_read_equipment_info(**kwargs):
+        """
+        全部已读推送消息
+        @param kwargs:
+        @return:
+        """
+        for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
+            equipment_info_model.objects.filter(**kwargs).update(status=1)
+
+    @staticmethod
+    def update_equipment_info_answer_status(**kwargs):
+        """
+        已接听一键通话消息
+        @param kwargs:
+        @return:
+        """
+        for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
+            equipment_info_model.objects.filter(**kwargs).update(answer_status=1)
+
+    @staticmethod
+    def delete_all_equipment_info(**kwargs):
+        """
+        删除全部推送消息
+        @param kwargs:
+        @return:
+        """
+        for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
+            equipment_info_model.objects.filter(**kwargs).delete()
+
+    @staticmethod
+    def get_equipment_info_model_with_full_id(full_id):
+        """
+        根据拼接id获取推送表
+        @param full_id: 拼接id,表标识+id
+        @return:
+        """
+        tab_val = int(full_id[:2]) - 10
+        if tab_val > 20:
+            return None
+        tab_index = tab_val - 1
+        return EQUIPMENT_INFO_MODEL_LIST[tab_index]
+
+    @staticmethod
+    def count_equipment_info(**kwargs):
+        """
+        查询推送数据数量
+        @param kwargs:
+        @return: count
+        """
+        count = 0
+        for equipment_info_model in EQUIPMENT_INFO_MODEL_LIST:
+            count += equipment_info_model.objects.filter(**kwargs).count()
+        return count