Explorar o código

重写消息推送查询、选择删除推送消息、定时删除推送消息

zhangdongming %!s(int64=3) %!d(string=hai) anos
pai
achega
9c57fc7406

+ 36 - 14
Controller/Cron/CronTaskController.py

@@ -7,6 +7,7 @@
 # @Email   : zhangdongming@asj6.wecom.work
 # @File    : CronTaskController.py
 # @Software: PyCharm
+import datetime
 import time
 
 from django.db import connection, connections, transaction
@@ -32,7 +33,7 @@ class CronDelDataView(View):
 
     def validation(self, request_dict, request, operation):
         response = ResponseObject()
-        if operation == 'delAccessLog':   # 定时删除访问接口数据
+        if operation == 'delAccessLog':  # 定时删除访问接口数据
             return self.delAccessLog(response)
         elif operation == 'delPushInfo':  # 定时删除推送数据
             return self.delPushInfo(response)
@@ -62,14 +63,35 @@ class CronDelDataView(View):
 
     @staticmethod
     def delPushInfo(response):
-        nowTime = int(time.time())
+        now_time = int(time.time())
         cursor = connections['mysql02'].cursor()
         try:
+            # 当前时间转日期
+            local_date_now = str(datetime.datetime.fromtimestamp(int(now_time)).date())
+            # 根据日期获取周几
+            week_val = LocalDateTimeUtil.date_to_week(local_date_now)
+            # 根据当前时间获取7天前时间戳
+            expiration_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
+            # 每次删除条数
+            size = 10000
+            # 删除7天前的数据
+            sql = "DELETE FROM equipment_info WHERE eventTime<= %s LIMIT %s "
+            if week_val == 1:
+                sql = "DELETE FROM equipment_info_sunday WHERE event_time<= %s LIMIT %s "
+            if week_val == 2:
+                sql = "DELETE FROM equipment_info_monday WHERE event_time<= %s LIMIT %s "
+            if week_val == 3:
+                sql = "DELETE FROM equipment_info_tuesday WHERE event_time<= %s LIMIT %s "
+            if week_val == 4:
+                sql = "DELETE FROM equipment_info_wednesday WHERE event_time<= %s LIMIT %s "
+            if week_val == 5:
+                sql = "DELETE FROM equipment_info_thursday WHERE event_time<= %s LIMIT %s "
+            if week_val == 6:
+                sql = "DELETE FROM equipment_info_friday WHERE event_time<= %s LIMIT %s "
+            if week_val == 7:
+                sql = "DELETE FROM equipment_info_saturday WHERE event_time<= %s LIMIT %s "
             for i in range(5):
-                # 删除7天前的数据
-                sql = "DELETE FROM `equipment_info` WHERE addTime<={} LIMIT 10000".format(
-                    nowTime - 3600 * 24 * 7)
-                cursor.execute(sql)
+                cursor.execute(sql, [expiration_time, size])
             # 关闭游标
             cursor.close()
             return response.json(0)
@@ -160,11 +182,11 @@ class CronUpdateDataView(View):
 
     def validation(self, request_dict, request, operation):
         response = ResponseObject()
-        if operation == 'expiredUidBucket':   # 定时更新过期云存套餐状态
+        if operation == 'expiredUidBucket':  # 定时更新过期云存套餐状态
             return self.expiredUidBucket(response)
-        elif operation == 'updateUnusedUidBucket':   # 定时更新过期云存关联的未使用套餐状态
+        elif operation == 'updateUnusedUidBucket':  # 定时更新过期云存关联的未使用套餐状态
             return self.updateUnusedUidBucket(response)
-        elif operation == 'updateUnusedAiService':   # 定时更新过期ai关联的未使用套餐状态
+        elif operation == 'updateUnusedAiService':  # 定时更新过期ai关联的未使用套餐状态
             return self.updateUnusedAiService(response)
         else:
             return response.json(404)
@@ -185,7 +207,7 @@ class CronUpdateDataView(View):
             has_unused=1).values(
             "id",
             "uid")[
-            0:1000]
+                              0:1000]
         for expired_uid_bucket in expired_uid_buckets:
             unuseds = Unused_Uid_Meal.objects.filter(
                 uid=expired_uid_bucket['uid']).values(
@@ -196,7 +218,7 @@ class CronUpdateDataView(View):
                 "expire",
                 "num",
                 "bucket_id").order_by('addTime')[
-                0:1]
+                      0:1]
             if not unuseds.exists():
                 continue
             unused = unuseds[0]
@@ -230,18 +252,18 @@ class CronUpdateDataView(View):
             use_status=1).values(
             'id',
             'uid')[
-            0:200]
+                        0:200]
         for ai_service in ai_service_qs:
             try:
                 with transaction.atomic():
                     AiService.objects.filter(
                         id=ai_service['id']).update(
-                        use_status=2)      # 更新过期ai订单状态
+                        use_status=2)  # 更新过期ai订单状态
                     # 如果存在未使用套餐,更新为使用
                     unused_ai_service = AiService.objects.filter(
                         uid=ai_service['uid'],
                         use_status=0).order_by('addTime')[
-                        :1].values(
+                                        :1].values(
                         'id',
                         'endTime')
                     if unused_ai_service.exists():

+ 75 - 59
Controller/DetectControllerV2.py

@@ -11,34 +11,33 @@
 @file: DetectController.py
 @Contact: chanjunkai@163.com
 """
+import json
 import os
 import time
-import json
+
 import apns2
+import boto3
+import botocore
 import jpush as jpush
 import oss2
+from botocore import client
 from django.http import JsonResponse
 from django.views.generic.base import View
 from pyfcm import FCMNotification
-from Object.RedisObject import RedisObject
-from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_DOMAIN_JIUAN, DETECT_PUSH_DOMAINS_JIUAN,\
-                            SERVER_DOMAIN, SERVER_DOMAIN_SSL, \
-                            OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
-                            JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE,  SERVER_TYPE
+
+from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_DOMAIN_JIUAN, DETECT_PUSH_DOMAINS_JIUAN, \
+    OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
+    JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE, SERVER_TYPE
+from Ansjer.config import PUSH_REDIS_ADDRESS
 from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel, \
     AiService
 from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
-from django.db.models import Q
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
-from Service.ModelService import ModelService
-import boto3
-import botocore
-from botocore import client
-from Ansjer.config import PUSH_REDIS_ADDRESS
+from Service.EquipmentInfoService import EquipmentInfoService
 
 
 class DetectControllerViewV2(View):
@@ -288,24 +287,34 @@ class DetectControllerViewV2(View):
         if not region:
             return response.json(444, 'region')
         region = int(region)
-        now_time = int(time.time())
-
-        qs = Equipment_Info.objects.filter(userID_id=userID).order_by('-eventTime')
-        qs = qs.filter(eventTime__gt=now_time - 3600 * 168)
+        # now_time = int(time.time())
 
+        # qs = Equipment_Info.objects.filter(userID_id=userID).order_by('-eventTime')
+        # qs = qs.filter(eventTime__gt=now_time - 3600 * 168)
+        # 根据时间筛选消息推送
         if startTime and endTime:
-            qs = qs.filter(eventTime__range=(startTime, endTime))
-        if eventType:
-            if ',' in eventType:   #兼容AI查询
-                eventTypeList = eventType.split(',')
-                eventTypeList = [int(i.strip()) for i in eventTypeList]
-                qs = qs.filter(eventType__in=eventTypeList)
-            else:
-                qs = qs.filter(eventType=eventType)
+            qs, count = EquipmentInfoService.find_by_start_time_equipment_info(page, line, userID, startTime,
+                                                                               endTime, eventType,
+                                                                               request_dict.get('uids', None))
+
+        else:
+            # 默认查询近七天消息推送
+            qs, count = EquipmentInfoService.get_equipment_info_week_all(page, line, userID, startTime, endTime,
+                                                                         eventType,
+                                                                         request_dict.get('uids', None))
+        # if startTime and endTime:
+        #     qs = qs.filter(eventTime__range=(startTime, endTime))
+        # if eventType:
+        #     if ',' in eventType:  # 兼容AI查询
+        #         eventTypeList = eventType.split(',')
+        #         eventTypeList = [int(i.strip()) for i in eventTypeList]
+        #         qs = qs.filter(eventType__in=eventTypeList)
+        #     else:
+        #         qs = qs.filter(eventType=eventType)
         uids = request_dict.get('uids', None)
         if uids:
             uid_list = uids.split(',')
-            qs = qs.filter(devUid__in=uid_list)
+            # qs = qs.filter(devUid__in=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:
@@ -316,13 +325,14 @@ class DetectControllerViewV2(View):
             for dv in dvqs:
                 uid_type_dict[dv['UID']] = {'type': dv['Type'], 'NickName': dv['NickName']}
         # print(uid_type_dict)
-        if not qs.exists():
+        if count == 0 and not qs.exists():
             return response.json(0, {'datas': [], 'count': 0})
-        qs = qs.values('id', 'devUid', 'devNickName', 'Channel', 'eventType', 'status', 'alarm', 'eventTime',
-                       'receiveTime', 'is_st', 'addTime', 'storage_location', 'borderCoords')
+        # qs = qs.values('id', 'devUid', 'devNickName', 'Channel', 'eventType', 'status', 'alarm', 'eventTime',
+        #                'receiveTime', 'is_st', 'addTime', 'storage_location', 'borderCoords')
 
-        count = qs.count()
-        qr = qs[(page - 1) * line:page * line]
+        # count = qs.count()
+        # qr = qs[(page - 1) * line:page * line]
+        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')
@@ -346,10 +356,10 @@ class DetectControllerViewV2(View):
             eventTime = p['eventTime']
             channel = p['Channel']
             storage_location = p['storage_location']
-            p['borderCoords'] = '' if p['borderCoords'] =='' else json.loads(p['borderCoords'])
+            p['borderCoords'] = '' if p['borderCoords'] == '' else json.loads(p['borderCoords'])
             if p['is_st'] == 1:
                 thumbspng = '{uid}/{channel}/{time}.jpeg'.format(uid=devUid, channel=p['Channel'], time=eventTime)
-                if storage_location == 1:   # oss
+                if storage_location == 1:  # oss
                     response_url = oss_img_bucket.sign_url('GET', thumbspng, 300)
                     p['img'] = response_url
                     p['img_list'] = [response_url]
@@ -359,9 +369,10 @@ class DetectControllerViewV2(View):
                                                                         ExpiresIn=300)
                     p['img'] = response_url
                     p['img_list'] = [response_url]
-                elif region == 1 and storage_location == 2:   # 1:国外,aws
+                elif region == 1 and storage_location == 2:  # 1:国外,aws
                     response_url = aws_s3_guowai.generate_presigned_url('get_object',
-                                                                        Params={'Bucket': 'foreignpush', 'Key': thumbspng},
+                                                                        Params={'Bucket': 'foreignpush',
+                                                                                'Key': thumbspng},
                                                                         ExpiresIn=300)
                     p['img'] = response_url
                     p['img_list'] = [response_url]
@@ -376,18 +387,21 @@ class DetectControllerViewV2(View):
                     endpoint = vodqs[0]['bucket__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'})
+                    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
+                    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
+                    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)
@@ -396,8 +410,9 @@ class DetectControllerViewV2(View):
                 # 列表装载回放时间戳标记
                 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
+                    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
@@ -406,9 +421,10 @@ class DetectControllerViewV2(View):
                                                                             ExpiresIn=300)
                         img = response_url
                         p['img_list'].append(img)
-                    elif region == 1 and storage_location == 2:   # 1:国外,aws
+                    elif region == 1 and storage_location == 2:  # 1:国外,aws
                         response_url = aws_s3_guowai.generate_presigned_url('get_object',
-                                                                            Params={'Bucket': 'foreignpush', 'Key': thumbspng},
+                                                                            Params={'Bucket': 'foreignpush',
+                                                                                    'Key': thumbspng},
                                                                             ExpiresIn=300)
                         img = response_url
                         p['img_list'].append(img)
@@ -513,7 +529,8 @@ class NotificationView(View):
                 uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid, uid_set__detect_status=1). \
                     values('token_val', 'app_type', 'appBundleId', 'm_code',
                            'push_type', 'userID_id', 'userID__NickName',
-                           'lang', 'm_code', 'tz', 'uid_set__nickname', 'uid_set__detect_interval', 'uid_set__detect_group',
+                           'lang', 'm_code', 'tz', 'uid_set__nickname', 'uid_set__detect_interval',
+                           'uid_set__detect_group',
                            'uid_set__channel')
                 print(uid_push_qs)
                 # 新建一个list接收数据
@@ -528,8 +545,8 @@ class NotificationView(View):
                     return JsonResponse(status=200, data=res_data)
         else:
             # 从数据库查询出来
-            uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid,uid_set__detect_status=1). \
-                values('token_val', 'app_type', 'appBundleId','m_code',
+            uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid, uid_set__detect_status=1). \
+                values('token_val', 'app_type', 'appBundleId', 'm_code',
                        'push_type', 'userID_id', 'userID__NickName',
                        'lang', 'm_code', 'tz', 'uid_set__nickname', 'uid_set__detect_interval', 'uid_set__detect_group',
                        'uid_set__channel')
@@ -569,7 +586,7 @@ class NotificationView(View):
             else:
                 detect_med_type = 2  # 为2的话,既推送,又存库
                 # detect_group=0允许全部推送的时候
-                if detect_group == '0'or detect_group == '':
+                if detect_group == '0' or detect_group == '':
                     redisObj.set_data(key=dkey, val=1, expire=detect_interval)
                 else:
                     detect_group_list = detect_group.split(',')
@@ -579,7 +596,7 @@ class NotificationView(View):
                         redisObj.set_data(key=dkey, val=1, expire=detect_interval)
                 # 改为1秒
                 # 如果不是正式
-                if SERVER_TYPE!="Ansjer.formal_settings":
+                if SERVER_TYPE != "Ansjer.formal_settings":
                     redisObj.set_data(key=pkey, val=1, expire=10)
                 else:
                     redisObj.set_data(key=pkey, val=1, expire=60)
@@ -645,7 +662,7 @@ class NotificationView(View):
             kwag_args['msg_title'] = msg_title
             kwag_args['msg_text'] = msg_text
             push_server_status = 0
-            #推送
+            # 推送
             if detect_med_type == 2 or detect_med_type == 0:
                 if push_type == 0:  # ios apns
                     print('do_apns')
@@ -717,7 +734,7 @@ class NotificationView(View):
                 del up['uid_set__nickname']
                 del up['uid_set__detect_interval']
                 del up['uid_set__detect_group']
-            return JsonResponse(status=200, data={'code': 0, 'msg': 'success 0 or 2' ,'re_list':redis_list})
+            return JsonResponse(status=200, data={'code': 0, 'msg': 'success 0 or 2', 're_list': redis_list})
 
         elif is_st == '1':
             print("is_st=1")
@@ -735,7 +752,7 @@ class NotificationView(View):
                     },
                     ExpiresIn=3600
                 )
-            else:   # 1:国外
+            else:  # 1:国外
                 response_url = aws_s3_guowai.generate_presigned_url(
                     ClientMethod='put_object',
                     Params={
@@ -790,7 +807,7 @@ class NotificationView(View):
                         },
                         ExpiresIn=3600
                     )
-                else:   # 1:国外
+                else:  # 1:国外
                     response_url = aws_s3_guowai.generate_presigned_url(
                         ClientMethod='put_object',
                         Params={
@@ -826,7 +843,6 @@ class NotificationView(View):
                 res_data = {'code': 0, 'img_url_list': img_url_list, 'msg': 'success 3'}
             return JsonResponse(status=200, data=res_data)
 
-
     def get_msg_title(self, appBundleId, nickname):
         package_title_config = {
             'com.ansjer.customizedd_a': 'DVS',
@@ -853,7 +869,7 @@ class NotificationView(View):
         return False
 
     def get_msg_text(self, channel, n_time, lang, tz, event_type, is_sys=0):
-        n_date = CommonService.get_now_time_str(n_time=n_time, tz=tz,lang=lang)
+        n_date = CommonService.get_now_time_str(n_time=n_time, tz=tz, lang=lang)
         etype = int(event_type)
         if lang == 'cn':
             if etype == 704:
@@ -1036,7 +1052,7 @@ class PushNotificationView(View):
                 # 从数据库查询出来
                 uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid, uid_set__detect_status=1). \
                     values('token_val', 'app_type', 'appBundleId',
-                           'push_type', 'userID_id', 'lang','m_code',
+                           'push_type', 'userID_id', 'lang', 'm_code',
                            'tz', 'uid_set__nickname')
                 # 新建一个list接收数据
                 redis_list = []
@@ -1080,7 +1096,7 @@ class PushNotificationView(View):
                             },
                             ExpiresIn=3600
                         )
-                    else:   # 1:国外
+                    else:  # 1:国外
                         response_url = aws_s3_guowai.generate_presigned_url(
                             ClientMethod='put_object',
                             Params={
@@ -1113,7 +1129,7 @@ class PushNotificationView(View):
                                 },
                                 ExpiresIn=3600
                             )
-                        else:   # 1:国外
+                        else:  # 1:国外
                             response_url = aws_s3_guowai.generate_presigned_url(
                                 ClientMethod='put_object',
                                 Params={
@@ -1217,4 +1233,4 @@ class PushNotificationView(View):
             else:
                 send_text = '{msg_type} channel:{channel} date:{date}'. \
                     format(msg_type=msg_type, channel=channel, date=n_date)
-        return send_text
+        return send_text

+ 11 - 13
Controller/EquipmentInfo.py

@@ -1,21 +1,17 @@
 import time
 import traceback
 
-import oss2
-from django.db import connection, connections
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
-from django.views.generic import TemplateView
 from django.views.generic.base import View
 
-from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
-from Ansjer.config import SERVER_DOMAIN
-from Model.models import Device_Info, VodHlsModel, Equipment_Info
+from Model.models import Device_Info, Equipment_Info
 from Model.models import Device_User
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
-from Object.UidTokenObject import UidTokenObject
+from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
+from Service.EquipmentInfoService import EquipmentInfoService
 from Service.ModelService import ModelService
 
 '''
@@ -149,7 +145,6 @@ 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)
@@ -191,10 +186,14 @@ class EquipmentInfo(View):
         param_flag = CommonService.get_param_flag(data=[id_list])
         if param_flag is True:
             try:
-                for id in id_list:
-                    eq = Equipment_Info.objects.filter(id=id)
+                for ei_id in id_list:
+                    event_date = '20{}'.format(ei_id[0:6])
+                    ei_id = ei_id[6:]
+                    val = LocalDateTimeUtil.format_date_to_week(event_date, '%Y%m%d')
+                    eq = EquipmentInfoService.get_equipment_info_model('', val)
+                    eq = eq.filter(id=ei_id)
                     if eq.exists():
-                        own_dev = ModelService.check_own_device(userID, eq[0].devUid)
+                        own_dev = ModelService.check_own_device(userID, eq[0].device_uid)
                         if own_dev is True:
                             eq.delete()
             except Exception as e:
@@ -291,6 +290,7 @@ use information_schema;
 select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='Ansjer81';
 '''
 
+
 # 按季度删除访问日志
 def deleteExpireEquipmentInfoById(request):
     response = ResponseObject()
@@ -301,5 +301,3 @@ def deleteExpireEquipmentInfoById(request):
 
     Equipment_Info.objects.filter(id__lte=id).delete()
     return response.json(0)
-
-

+ 218 - 0
Model/models.py

@@ -340,6 +340,224 @@ class Equipment_Info(models.Model):
         ordering = ('-id',)
         app_label = "PushModel"
 
+
+class EquipmentInfoMonday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_monday'
+        verbose_name = u'星期一设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
+class EquipmentInfoTuesday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_tuesday'
+        verbose_name = u'星期二设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
+class EquipmentInfoWednesday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_wednesday'
+        verbose_name = u'星期三设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
+class EquipmentInfoThursday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_thursday'
+        verbose_name = u'星期四设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
+class EquipmentInfoFriday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_friday'
+        verbose_name = u'星期五设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
+class EquipmentInfoSaturday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_saturday'
+        verbose_name = u'星期六设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
+class EquipmentInfoSunday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_sunday'
+        verbose_name = u'星期天设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "PushModel"
+
+
 class Ai_Push_Info(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     devUid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备ID')

+ 53 - 0
Object/utils/LocalDateTimeUtil.py

@@ -56,6 +56,59 @@ def get_last_month():
     return last_month_date
 
 
+def get_before_days_timestamp(timestamp, days=1):
+    """
+    获取之前日期时间戳-秒级
+    @param timestamp: 时间戳
+    @param days: 天数
+    @return: (timestamp - second * hour * days) 时间戳
+    """
+    if days:
+        second = 3600
+        hour = 24
+        if days > 0:
+            return timestamp - second * hour * days
+    return 0
+
+
+def date_to_week(str_date):
+    """
+    日期获取星期几
+    @param str_date 日期 例:2022-03-03
+    @return: int 1-7
+    """
+    if str_date:
+        return datetime.datetime.strptime(str_date, "%Y-%m-%d").weekday() + 1
+    return datetime.datetime.now().weekday() + 1
+
+
+def format_date_to_week(str_date, str_format):
+    """
+    日期获取星期几
+    @param str_format:  %Y%m%d
+    @param str_date 日期 例:2022-03-03
+    @return: int 1-7
+    """
+    if str_date:
+        return datetime.datetime.strptime(str_date, str_format).weekday() + 1
+    return 0
+
+
 if __name__ == "__main__":
+    val = format_date_to_week('20220417', '%Y%m%d')
+    pfe = str(22162688)
+    print(pfe[6:])
+    now_time = int(time.time())
+    date_time = datetime.datetime.fromtimestamp(now_time)
+    print(date_to_week(str(date_time.date())))
+    result = get_before_days_timestamp(now_time, 7)
+    print(result)
+    print(now_time - 3600 * 168)
+    dd = datetime.date.today()
+    print(type(dd))
+    dd = str(dd)
+    print(type(dd))
+    week = date_to_week('2022-03-03')
+    print(week)
     start_time, end_time = get_today_date(True)
     print('--- start_time = {} end_time = {}'.format(start_time, end_time))

+ 205 - 0
Service/EquipmentInfoService.py

@@ -0,0 +1,205 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : EquipmentInfoService.py
+@Time    : 2022/4/14 17:28
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import datetime
+import time
+
+from Model.models import EquipmentInfoMonday, EquipmentInfoTuesday, EquipmentInfoWednesday, EquipmentInfoThursday, \
+    EquipmentInfoFriday, EquipmentInfoSaturday, EquipmentInfoSunday
+from Object.utils import LocalDateTimeUtil
+
+"""
+设备分表查询Service    
+因数据量不断增加,单表保留近七天数据进行分表优化设计
+进行拆分为七张表星期一至星期天进行分表存储。分担单表存储读写压力。
+"""
+
+
+class EquipmentInfoService:
+
+    @staticmethod
+    def get_equipment_info_model(dt, val=0):
+
+        """
+        根据日期判断是星期几,返回相应的Model对象
+        @param val: 1-7代表week
+        @param dt: 日期 例:2022-03-03
+        @return: 星期一至星期天equipment_info对象实例
+        """
+        week = 1
+        if dt:
+            week = LocalDateTimeUtil.date_to_week(dt)
+        if 0 < val < 8:
+            week = val
+        equipment_info = None
+        if week == 1:
+            equipment_info = EquipmentInfoMonday.objects.all()
+        elif week == 2:
+            equipment_info = EquipmentInfoTuesday.objects.all()
+        elif week == 3:
+            equipment_info = EquipmentInfoWednesday.objects.all()
+        elif week == 4:
+            equipment_info = EquipmentInfoThursday.objects.all()
+        elif week == 5:
+            equipment_info = EquipmentInfoFriday.objects.all()
+        elif week == 6:
+            equipment_info = EquipmentInfoSaturday.objects.all()
+        elif week == 7:
+            equipment_info = EquipmentInfoSunday.objects.all()
+        return equipment_info
+
+    @classmethod
+    def find_by_start_time_equipment_info(cls, page, size, user_id, start_time, end_time, event_type,
+                                          uid_list):
+        """
+        通过start_time查找指定日期当天设备消息推送
+        @param page: 页数
+        @param size: 每页条数
+        @param user_id: 设备用户id
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @param event_type: 事件类型
+        @param uid_list: 设备uid列表
+        @return: result 查询结果
+        """
+        if start_time and end_time:
+            start_date = datetime.datetime.fromtimestamp(int(start_time))
+            # 根据开始日期,获取设备信息查询对象
+            qs = EquipmentInfoService.get_equipment_info_model(str(start_date.date()), 0)
+            # 调用查询方法
+            qs = cls.query_equipment_info(qs, user_id, start_time, end_time, event_type,
+                                          uid_list)
+            if qs.exists:
+                count = qs.count()
+                qs_page = cls.get_equipment_info_page(qs, page, size)
+                return qs_page, count
+        return None, 0
+
+    @classmethod
+    def get_equipment_info_week_all(cls, page, size, user_id, start_time, end_time, event_type,
+                                    uid_list):
+        """
+        分表查询近七天设备消息推送
+        @param page: 页数
+        @param size: 分页大小
+        @param user_id: 设备用户id
+        @param start_time: 事件开始时间
+        @param end_time: 事件结束时间
+        @param event_type: 事件类型
+        @param uid_list: uid列表
+        @return: qs_page, count 结果集
+        """
+        # 星期一设备信息查询
+        monday_qs = EquipmentInfoService.get_equipment_info_model('', 1)
+        monday_qs = cls.query_equipment_info(monday_qs, user_id, start_time, end_time, event_type,
+                                             uid_list)
+        # 星期二设备信息查询
+        tuesday_qs = EquipmentInfoService.get_equipment_info_model('', 2)
+        tuesday_qs = cls.query_equipment_info(tuesday_qs, user_id, start_time, end_time, event_type,
+                                              uid_list)
+        # 星期三设备信息查询
+        wednesday_qs = EquipmentInfoService.get_equipment_info_model('', 3)
+        wednesday_qs = cls.query_equipment_info(wednesday_qs, user_id, start_time, end_time, event_type,
+                                                uid_list)
+        # 星期四设备信息查询
+        thursday_qs = EquipmentInfoService.get_equipment_info_model('', 4)
+        thursday_qs = cls.query_equipment_info(thursday_qs, user_id, start_time, end_time, event_type,
+                                               uid_list)
+        # 星期五设备信息查询
+        friday_qs = EquipmentInfoService.get_equipment_info_model('', 5)
+        friday_qs = cls.query_equipment_info(friday_qs, user_id, start_time, end_time, event_type,
+                                             uid_list)
+        # 星期六设备信息查询
+        saturday_qs = EquipmentInfoService.get_equipment_info_model('', 6)
+        saturday_qs = cls.query_equipment_info(saturday_qs, user_id, start_time, end_time, event_type,
+                                               uid_list)
+        # 星期天设备信息查询
+        sunday_qs = EquipmentInfoService.get_equipment_info_model('', 7)
+        sunday_qs = cls.query_equipment_info(sunday_qs, user_id, start_time, end_time, event_type,
+                                             uid_list)
+        result = monday_qs.union(tuesday_qs).union(wednesday_qs).union(thursday_qs).union(friday_qs).union(
+            saturday_qs).union(
+            sunday_qs)
+        count = result.count()
+        qs_page = cls.get_equipment_info_page(result, page, size)
+        return qs_page, count
+
+    @classmethod
+    def query_equipment_info(cls, qs, user_id, start_time, end_time, event_type,
+                             uid_list):
+        """
+        设备信息条件查询,根据分表设计,默认条件event_time大于七天前时间
+        @param qs: 设备信息查询对象
+        @param user_id: 设备用户id
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @param event_type: 事件类型
+        @param uid_list: 设备uid列表
+        @return: result 设备信息结果集
+        """
+        now_time = int(time.time())
+        # 获取七天前时间戳
+        seven_days_before_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
+        # 默认查询当前表event_time大于七天前时间
+        qs = qs.filter(event_time__gt=seven_days_before_time)
+        if user_id:
+            qs = qs.filter(device_user_id=user_id)
+        if event_type:
+            # 兼容AI查询
+            if ',' in event_type:
+                eventTypeList = event_type.split(',')
+                eventTypeList = [int(i.strip()) for i in eventTypeList]
+                qs = qs.filter(event_type__in=eventTypeList)
+            else:
+                qs = qs.filter(event_type=event_type)
+        if start_time and end_time:
+            qs = qs.filter(event_time__range=(start_time, end_time))
+        if uid_list:
+            uid_list = uid_list.split(',')
+            qs = qs.filter(device_uid__in=uid_list)
+        return qs
+
+    @classmethod
+    def get_equipment_info_page(cls, equipment_info_qs, page, size):
+        """
+        获取查询结果集进行排序、分页,遍历重命名字典key(主要针对原函数返回结果集)
+        @param equipment_info_qs: 设备信息结果集
+        @param page: 页数
+        @param size: 分页大小
+        @return: qs_page 遍历后的设备信息结果集
+        """
+        equipment_info_qs = equipment_info_qs.values('id', 'device_uid', 'device_nick_name', 'channel', 'event_type',
+                                                     'status', 'alarm',
+                                                     'event_time', 'receive_time', 'is_st', 'add_time',
+                                                     'storage_location', 'border_coords')
+
+        equipment_info_qs = equipment_info_qs.order_by('-event_time')
+        qs_page = equipment_info_qs[(page - 1) * size:page * size]
+        if qs_page and len(qs_page) > 0:
+            for item in qs_page:
+                event_time = item['event_time']
+                date_time = datetime.datetime.fromtimestamp(int(event_time)).strftime("%Y%m%d")
+                dt = date_time[2:8]
+                item['id'] = int(str(dt) + str(item['id']))
+                item['devUid'] = item['device_uid']
+                item['devNickName'] = item['device_nick_name']
+                item['Channel'] = item['channel']
+                item['eventType'] = item['event_type']
+                item['eventTime'] = item['event_time']
+                item['receiveTime'] = item['receive_time']
+                item['addTime'] = item['add_time']
+                item['borderCoords'] = item['border_coords']
+                item.pop('device_uid')
+                item.pop('device_nick_name')
+                item.pop('channel')
+                item.pop('event_type')
+                item.pop('event_time')
+                item.pop('receive_time')
+                item.pop('add_time')
+                item.pop('border_coords')
+        return qs_page