Преглед изворни кода

Merge remote-tracking branch 'origin/master'

peng пре 1 година
родитељ
комит
d23c7aba09

+ 4 - 11
Controller/AiController.py

@@ -212,21 +212,19 @@ class AiView(View):
                 userID_id = up["userID_id"]
                 if userID_id not in userID_ids:
                     now_time = int(time.time())
-                    eq_list.append(EquipmentInfoService.get_equipment_info_obj(
-                        local_date_time,
+                    EquipmentInfoService.randoms_insert_equipment_info(
                         device_user_id=userID_id,
                         event_time=n_time,
                         event_type=eventType,
                         device_uid=uid,
                         device_nick_name=nickname,
                         channel=channel,
-                        alarm='检查到{labels} \tChannel:{channel}'.format(labels=label_str, channel=channel),
-                        is_st=is_st,
-                        receive_time=receiveTime,
+                        alarm=label_str,
+                        is_st=3,
                         add_time=now_time,
                         storage_location=2,
                         border_coords=json.dumps(new_bounding_box_dict)
-                    ))
+                    )
                     userID_ids.append(userID_id)
 
                 # 推送标题
@@ -256,11 +254,6 @@ class AiView(View):
                         "errLine={errLine}, errMsg={errMsg}".format(errLine=e.__traceback__.tb_lineno, errMsg=repr(e)))
                     continue
             week = LocalDateTimeUtil.date_to_week(local_date_time)
-            # 分表批量存储
-            if eq_list and len(eq_list) > 0:
-                logger.info("AI存库中........")
-                result = EquipmentInfoService.equipment_info_bulk_create(week, eq_list)
-                logger.info("-.-存库结果{}".format(result))
             AiView.save_cloud_ai_tag(uid, int(n_time), eventType, week)
             return response.json(0)
 

+ 49 - 99
Controller/DetectController.py

@@ -1,5 +1,6 @@
 import json
 import logging
+import threading
 
 import oss2
 from django.http import JsonResponse
@@ -7,13 +8,10 @@ from django.views.generic.base import View
 
 from AnsjerPush.config import CONFIG_INFO, CONFIG_CN
 from AnsjerPush.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
-from Model.models import SysMsgModel
 from Object.RedisObject import RedisObject
-from Object.utils import LocalDateTimeUtil
 from Service.DevicePushService import DevicePushService
-from Service.EquipmentInfoService import EquipmentInfoService
 
-logger = logging.getLogger('v1_push')
+V1_PUSH_LOGGER = logging.getLogger('v1_push')
 
 
 # 旧移动侦测接口
@@ -27,7 +25,8 @@ class NotificationView(View):
         request.encoding = 'utf-8'
         return self.validation(request.POST)
 
-    def validation(self, request_dict):
+    @staticmethod
+    def validation(request_dict):
         """
         设备触发报警消息推送
         @param request_dict:uidToken 加密uid
@@ -50,15 +49,17 @@ class NotificationView(View):
             uid = DevicePushService.decode_uid(etk, uidToken)  # 解密uid
             if len(uid) != 20 and len(uid) != 14:
                 return JsonResponse(status=200, data={'code': 404, 'msg': 'wrong uid'})
-            logger.info("旧移动侦测接口的uid:{},时间戳:{},事件类型:{}".format(uid, n_time, event_type))
+
+            V1_PUSH_LOGGER.info('旧移动侦测接口uid:{},时间戳:{},事件类型:{}'.format(uid, n_time, event_type))
+
             event_type = int(event_type)
-            pkey = '{uid}_{channel}_{event_type}_ptl'.format(uid=uid, event_type=event_type, channel=channel)
-            ykey = '{uid}_redis_qs'.format(uid=uid)
-            is_sys_msg = self.is_sys_msg(event_type)
-            if is_sys_msg is True:
-                dkey = '{uid}_{channel}_{event_type}_flag'.format(uid=uid, event_type=event_type, channel=channel)
+            pkey = '{}_{}_{}_ptl'.format(uid, event_type, channel)
+            ykey = '{}_redis_qs'.format(uid)
+            is_sys_msg = DevicePushService.judge_sys_msg(event_type)
+            if is_sys_msg:
+                dkey = '{}_{}_{}_flag'.format(uid, event_type, channel)
             else:
-                dkey = '{uid}_{channel}_flag'.format(uid=uid, channel=channel)
+                dkey = '{}_{}_flag'.format(uid, channel)
 
             have_ykey = redisObj.get_data(key=ykey)  # uid_set 数据库缓存
             have_pkey = redisObj.get_data(key=pkey)  # 一分钟限制key
@@ -66,8 +67,7 @@ class NotificationView(View):
 
             # 一分钟外,推送开启状态
             detect_med_type = 0  # 0推送旧机制 1存库不推送,2推送存库
-            # 暂时注销
-            if event_type != 606:
+            if event_type not in [606, 607]:
                 if have_pkey:
                     res_data = {'code': 0, 'msg': 'Push it once a minute'}
                     return JsonResponse(status=200, data=res_data)
@@ -79,7 +79,7 @@ class NotificationView(View):
                 # 从数据库查询出来
                 uid_push_qs = DevicePushService.query_uid_push(uid, event_type)
                 if not uid_push_qs.exists():
-                    logger.info('消息推送-uid_push 数据不存在')
+                    V1_PUSH_LOGGER.info('消息推送-uid_push 数据不存在')
                     return JsonResponse(status=200, data={'code': 176, 'msg': 'no uid_push data'})
                 # 修改redis数据,并设置过期时间为10分钟
                 uid_push_list = DevicePushService.qs_to_list(uid_push_qs)
@@ -114,111 +114,61 @@ class NotificationView(View):
                 redisObj.set_data(key=pkey, val=1, expire=60)
             auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
             bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')
-            kwag_args = {
+
+            # 推送相关参数
+            push_kwargs = {
                 'uid': uid,
                 'channel': channel,
                 'event_type': event_type,
                 'n_time': n_time,
             }
-            params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, 'is_st': is_st,
+            params = {'nickname': nickname, 'uid': uid, 'push_kwargs': push_kwargs, 'is_st': is_st,
                       'is_sys_msg': is_sys_msg, 'channel': channel, 'event_type': event_type, 'n_time': n_time,
                       'electricity': '', 'bucket': bucket, 'app_push': have_dkey, 'storage_location': 1, 'ai_type': 0,
                       'dealings_type': 0, 'detection': 0, 'device_type': 1, 'app_push_config': '',
                       'uid_set_push_list': uid_push_list}
-            #  推送以及报警消息存库
-            result = DevicePushService.save_msg_push(**params)
-            if result['code_date'] is None:
-                result['code_date'] = {'do_apns_code': '', 'do_fcm_code': '', 'do_jpush_code': ''}
-            if detect_med_type == 1:
-                result['code_date']['do_apns_code'] = '只存库不推送'
-                result['code_date']['do_fcm_code'] = '只存库不推送'
-                result['code_date']['do_jpush_code'] = '只存库不推送'
-            if is_sys_msg:
-                SysMsgModel.objects.bulk_create(result['sys_msg_list'])
-            else:
-                if result['new_device_info_list'] and len(result['new_device_info_list']) > 0:
-                    # 根据日期获得星期几
-                    week = LocalDateTimeUtil.date_to_week(result['local_date_time'])
-                    EquipmentInfoService.equipment_info_bulk_create(week, result['new_device_info_list'])
+
+            # 异步推送消息和保存数据
+            push_thread = threading.Thread(
+                target=push_and_save_data,
+                kwargs=params)
+            push_thread.start()
+
+            res_data = {}
             if is_st == '0' or is_st == '2':
-                print("is_st=0or2")
-                for up in uid_push_list:
-                    if up['push_type'] == 0:  # ios apns
-                        up['do_apns_code'] = result['code_date']['do_apns_code']
-                    elif up['push_type'] == 1:  # android gcm
-                        up['do_fcm_code'] = result['code_date']['do_fcm_code']
-                    elif up['push_type'] == 2:  # android jpush
-                        up['do_jpush_code'] = result['code_date']['do_jpush_code']
-                    del up['push_type']
-                    del up['userID_id']
-                    del up['userID__NickName']
-                    del up['lang']
-                    del up['tz']
-                    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'})
+                res_data = {'code': 0, 'msg': 'success 0 or 2'}
+                return JsonResponse(status=200, data=res_data)
 
             elif is_st == '1':
-                print("is_st=1")
-                # Endpoint以杭州为例,其它Region请按实际情况填写。
-                obj = '{uid}/{channel}/{filename}.jpeg'.format(uid=uid, channel=channel, filename=n_time)
-                # 设置此签名URL在60秒内有效。
-                url = bucket.sign_url('PUT', obj, 7200)
-                for up in uid_push_list:
-                    up['do_apns_code'] = result['code_date']['do_apns_code']
-                    up['do_fcm_code'] = result['code_date']['do_fcm_code']
-                    up['do_jpush_code'] = result['code_date']['do_jpush_code']
-                    del up['push_type']
-                    del up['userID_id']
-                    del up['userID__NickName']
-                    del up['lang']
-                    del up['tz']
-                    del up['uid_set__nickname']
-                    del up['uid_set__detect_interval']
-                    del up['uid_set__detect_group']
-                res_data = {'code': 0, 'img_push': url, 'msg': 'success'}
-                logger.info('推送响应,uid:{},n_time:{},事件类型:{},响应:{}'.format(uid, n_time, event_type, json.dumps(res_data)))
-                return JsonResponse(status=200, data=res_data)
+                obj = '{}/{}/{}.jpeg'.format(uid, channel, n_time)
+                url = bucket.sign_url('PUT', obj, 3600)
+                res_data = {'code': 0, 'img_push': url, 'msg': 'success 1'}
 
             elif is_st == '3':
-                print("is_st=3")
-                # 人形检测带动图
-                # Endpoint以杭州为例,其它Region请按实际情况填写。
                 img_url_list = []
                 for i in range(int(is_st)):
-                    obj = '{uid}/{channel}/{filename}_{st}.jpeg'. \
-                        format(uid=uid, channel=channel, filename=n_time, st=i)
-                    # 设置此签名URL在60秒内有效。
-                    url = bucket.sign_url('PUT', obj, 7200)
+                    obj = '{}/{}/{}_{}.jpeg'.format(uid, channel, n_time, i)
+                    url = bucket.sign_url('PUT', obj, 3600)
                     img_url_list.append(url)
 
-                for up in uid_push_list:
-                    up['do_apns_code'] = result['code_date']['do_apns_code']
-                    up['do_fcm_code'] = result['code_date']['do_fcm_code']
-                    up['do_jpush_code'] = result['code_date']['do_jpush_code']
-                    del up['push_type']
-                    del up['userID_id']
-                    del up['userID__NickName']
-                    del up['lang']
-                    del up['tz']
-                    del up['uid_set__nickname']
-                    del up['uid_set__detect_interval']
-                    del up['uid_set__detect_group']
-
                 res_data = {'code': 0, 'img_url_list': img_url_list, 'msg': 'success 3'}
-                logger.info('推送响应,uid:{},n_time:{},事件类型:{},响应:{}'.format(uid, n_time, event_type, json.dumps(res_data)))
-                return JsonResponse(status=200, data=res_data)
+
+            V1_PUSH_LOGGER.info('旧推送接口响应,uid:{},n_time:{},事件类型:{},响应:{}'.
+                                format(uid, n_time, event_type, json.dumps(res_data)))
+            return JsonResponse(status=200, data=res_data)
+
         except Exception as e:
-            logger.info('旧推送接口异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            V1_PUSH_LOGGER.info('旧推送接口异常,error_line:{},error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             data = {
-                'errLine': e.__traceback__.tb_lineno,
-                'errMsg': repr(e),
+                'error_line': e.__traceback__.tb_lineno,
+                'error_msg': repr(e)
             }
             return JsonResponse(status=200, data=json.dumps(data), safe=False)
 
-    def is_sys_msg(self, event_type):
-        event_type_list = [702, 703, 704]
-        if event_type in event_type_list:
-            return True
-        return False
+
+def push_and_save_data(**params):
+    uid = params['uid']
+    V1_PUSH_LOGGER.info('{}开始异步存表和推送'.format(uid))
+    # 保存推送数据和推送消息
+    result = DevicePushService.save_msg_push(**params)
+    V1_PUSH_LOGGER.info('{}存表和推送结果:{}'.format(uid, result))

+ 17 - 26
Controller/DetectControllerV2.py

@@ -67,14 +67,13 @@ class NotificationV2View(View):
                 return JsonResponse(status=200, data={'code': 404, 'msg': 'wrong uid'})
             TIME_LOGGER.info('开始推送,uid:{},n_time:{},事件类型:{}'.format(uid, n_time, event_type))
             # 判断是否为系统消息
-            is_sys_msg = DevicePushService.judge_sys_msg(int(event_type))
+            is_sys_msg = DevicePushService.judge_sys_msg(event_type)
             if is_sys_msg:
-                push_interval = '{uid}_{channel}_{event_type}_flag'.format(uid=uid, channel=channel,
-                                                                           event_type=event_type)
+                push_interval = '{}_{}_{}_flag'.format(uid, channel, event_type)
             else:
-                push_interval = '{uid}_{channel}_flag'.format(uid=uid, channel=channel)
+                push_interval = '{}_{}_flag'.format(uid, channel)
 
-            req_limiting = '{uid}_{channel}_{event_type}_ptl'.format(uid=uid, channel=channel, event_type=event_type)
+            req_limiting = '{}_{}_{}_ptl'.format(uid, channel, event_type)
             cache_req_limiting = redis_obj.get_data(key=req_limiting)  # 获取请求限流缓存数据
             cache_app_push = redis_obj.get_data(key=push_interval)  # 获取APP推送消息时间间隔缓存数据
             if event_type not in [606, 607]:
@@ -113,13 +112,14 @@ class NotificationV2View(View):
                 aws_s3_client = DevicePushService.get_s3_client(region=region)
                 bucket = 'foreignpush' if region == 1 else 'push'
 
-            kwag_args = {
+            # 推送相关参数
+            push_kwargs = {
                 'uid': uid,
                 'channel': channel,
                 'event_type': event_type,
                 'n_time': n_time,
             }
-            params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, 'is_st': is_st, 'region': region,
+            params = {'nickname': nickname, 'uid': uid, 'push_kwargs': push_kwargs, 'is_st': is_st, 'region': region,
                       'is_sys_msg': is_sys_msg, 'channel': channel, 'event_type': event_type, 'n_time': n_time,
                       'electricity': electricity, 'bucket': bucket, 'aws_s3_client': aws_s3_client,
                       'app_push': cache_app_push, 'storage_location': 2, 'ai_type': ai_type, 'device_type': device_type,
@@ -146,32 +146,23 @@ class NotificationV2View(View):
                 'region': region,
                 'aws_s3_client': aws_s3_client
             }
-            result_dict = DevicePushService.get_push_url(**kwargs)
+            res_data = DevicePushService.get_res_data(**kwargs)
 
             TIME_LOGGER.info('推送响应,uid:{},n_time:{},事件类型:{},响应:{}'.format(
-                uid, n_time, event_type, json.dumps(result_dict)))
-            return JsonResponse(status=200, data=result_dict)
+                uid, n_time, event_type, json.dumps(res_data)))
+            return JsonResponse(status=200, data=res_data)
         except Exception as e:
-            logger.info('V2推送接口异常, errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            logger.info('V2推送接口异常,error_line:{},error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             data = {
-                'errLine': e.__traceback__.tb_lineno,
-                'errMsg': repr(e),
+                'error_line': e.__traceback__.tb_lineno,
+                'error_msg': repr(e)
             }
             return JsonResponse(status=200, data=json.dumps(data), safe=False)
 
 
 def push_and_save_data(**params):
-    TIME_LOGGER.info('{}开始推送,是否未过推送间隔:{}'.format(params['uid'], params['app_push']))
-    # 推送消息,生成推送数据列表
+    uid = params['uid']
+    TIME_LOGGER.info('{}开始异步存表和推送'.format(uid))
+    # 保存推送数据和推送消息
     result = DevicePushService.save_msg_push(**params)
-    # 保存推送数据
-    TIME_LOGGER.info('{}开始异步存表'.format(params['uid']))
-    save_success = DevicePushService.save_sys_msg(
-        params['is_sys_msg'],
-        result['local_date_time'],
-        result['sys_msg_list'],
-        result['new_device_info_list'])
-    if save_success:
-        TIME_LOGGER.info('{}异步存表成功'.format(params['uid']))
-    else:
-        TIME_LOGGER.info('{}异步存表失败'.format(params['uid']))
+    TIME_LOGGER.info('{}存表和推送结果:{}'.format(uid, result))

+ 11 - 23
Controller/gatewayController.py

@@ -11,10 +11,7 @@ from django.views.generic.base import View
 from AnsjerPush.Config.gatewaySensorConfig import SENSOR_TYPE, EVENT_TYPE
 from AnsjerPush.config import LOGGER
 from Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info, SceneLog, SmartScene, CountryModel
-from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
-from Object.utils import LocalDateTimeUtil
-from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.HuaweiPushService.HuaweiPushService import HuaweiPushObject
 from Service.PushService import PushObject
@@ -112,28 +109,19 @@ class GatewayView(View):
             if not device_info_qs.exists():
                 return response.json(173)
 
-            equipment_info_list = []
-
+            # 推送表存储数据
+            equipment_info_kwargs = {
+                'device_uid': serial_number,
+                'device_nick_name': nickname,
+                'event_type': event_type,
+                'event_time': n_time,
+                'add_time': n_time,
+                'alarm': alarm
+            }
             for device_info in device_info_qs:
                 user_id = device_info['userID_id']
-
-                # 组织存储数据
-                local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
-                equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
-                    local_date_time,
-                    add_time=n_time,
-                    event_time=n_time,
-                    receive_time=n_time,
-                    device_uid=serial_number,
-                    device_nick_name=nickname,
-                    alarm=alarm,
-                    event_type=event_type,
-                    device_user_id=user_id,
-                ))
-                if equipment_info_list:
-                    # 根据日期获得星期几
-                    week = LocalDateTimeUtil.date_to_week(local_date_time)
-                    EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
+                equipment_info_kwargs['device_user_id'] = user_id
+                EquipmentInfoService.randoms_insert_equipment_info(**equipment_info_kwargs)
 
                 # 查询推送配置数据
                 gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \

+ 580 - 0
Model/models.py

@@ -579,6 +579,586 @@ class EquipmentInfoSunday(models.Model):
         app_label = "db2"
 
 
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
+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 = 'db2'
+
+
 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')

+ 202 - 165
Service/DevicePushService.py

@@ -140,77 +140,105 @@ class DevicePushService:
     @classmethod
     def save_msg_push(cls, **params):
         """
-        推送消息,返回推送数据列表
+        保存推送数据和推送消息
         @param params: 推送参数
-        @return: dict
+        @return: bool
         """
-        new_device_info_list = []
         sys_msg_list = []
-        userID_ids = []
-        kwag_args = params['kwag_args']
-        code_data = {'do_apns_code': '', 'do_fcm_code': '', 'do_jpush_code': ''}
-        local_date_time = ''
-        # push_permission = True 多通道权限限制接收
+        saved_user_id_list = []
+        uid = params['uid']
+        push_kwargs = params['push_kwargs']
+        now_time = int(time.time())
         try:
             params['event_tag'] = cls.get_event_tag(params['ai_type'], params['event_type'], params['detection'])
             is_app_push = True if params['event_type'] in [606, 607] else \
-                cls.is_send_app_push(params['event_type'], params['event_tag'], params['app_push_config'],
-                                     params['app_push'], params['uid'])
+                cls.is_send_app_push(
+                    params['event_type'], params['event_tag'], params['app_push_config'], params['app_push'], uid)
+
+            equipment_info_list = []
+            equipment_info_model = EquipmentInfoService.randoms_choice_equipment_info()
             for up in params['uid_set_push_list']:
-                appBundleId = up['appBundleId']
-                token_val = up['token_val']
                 lang = up['lang']
                 tz = up['tz']
                 if tz is None or tz == '':
                     tz = 0
-                # 发送标题
-                msg_title = cls.get_msg_title(nickname=params['nickname'])
-                # 发送内容
-                msg_text = cls.get_msg_text(channel=params['channel'], n_time=params['n_time'], lang=lang, tz=tz,
-                                            event_type=params['event_type'], ai_type=params['ai_type'],
-                                            device_type=params['device_type'], electricity=params['electricity'],
-                                            dealings_type=params['dealings_type'], event_tag=params['event_tag']
-                                            )
-                kwag_args['appBundleId'] = appBundleId
-                kwag_args['token_val'] = token_val
-                kwag_args['msg_title'] = msg_title
-                kwag_args['msg_text'] = msg_text
-                if params['event_type'] in [606, 607] and up['push_type'] in [5, 6]:
-                    kwag_args['jg_token_val'] = up['jg_token_val']
-                else:
-                    if 'jg_token_val' in kwag_args:
-                        kwag_args.pop('jg_token_val')
-                local_date_time = CommonService.get_now_time_str(n_time=params['n_time'], tz=tz, lang='cn')
-                local_date_time = local_date_time[0:10]
-                # 以下是存库
-                userID_id = up["userID_id"]
-                if userID_id not in userID_ids:
-                    now_time = int(time.time())
+
+                # 保存系统消息或推送消息数据
+                user_id = up['userID_id']
+                if user_id not in saved_user_id_list:  # 防止同一用户重复写入数据
+                    # 系统消息
                     if params['is_sys_msg']:
                         sys_msg_text = cls.get_msg_text(channel=params['channel'], n_time=params['n_time'], lang=lang,
                                                         tz=tz, is_sys=1, device_type=params['device_type'],
                                                         event_type=params['event_type'],
-                                                        electricity=params['electricity'],
-                                                        )
-                        sys_msg_list.append(SysMsgModel(userID_id=userID_id, msg=sys_msg_text, addTime=now_time,
-                                                        updTime=now_time, uid=params['uid'],
-                                                        eventType=params['event_type']))
+                                                        electricity=params['electricity'])
+                        sys_msg_list.append(SysMsgModel(userID_id=user_id, msg=sys_msg_text, addTime=now_time,
+                                                        updTime=now_time, uid=uid, eventType=params['event_type']))
+                    # 保存推送消息
+                    else:
+                        params['userID_id'] = user_id
+                        equipment_info_list.append(
+                            equipment_info_model(
+                                device_user_id=params['userID_id'],
+                                event_time=params['n_time'],
+                                event_type=params['event_type'],
+                                device_uid=params['uid'],
+                                device_nick_name=params['nickname'],
+                                channel=params['channel'],
+                                alarm='Motion \tChannel:{}'.format(params['channel']),
+                                is_st=params['is_st'],
+                                add_time=int(time.time()),
+                                storage_location=params['storage_location'],
+                                event_tag=params['event_tag'],
+                                answer_status=True if params['dealings_type'] == 1 else False
+                            )
+                        )
+                    saved_user_id_list.append(user_id)
+
+                # 推送
+                if is_app_push:
+                    push_type = up['push_type']
+                    if params['event_type'] in [606, 607] and push_type in [5, 6]:
+                        push_kwargs['jg_token_val'] = up['jg_token_val']
                     else:
-                        params['userID_id'] = userID_id
-                        # push_permission = DevicePushService.check_share_permission(userID_id,
-                        # params['channel'],params['uid'])
-                        new_device_info_list.append(cls.created_device_vo(local_date_time, **params))
-                    userID_ids.append(userID_id)
-                params['appBundleId'] = appBundleId
-                params['token_val'] = token_val
-                params['lang'] = lang
-                params['tz'] = tz
-                params['kwag_args'] = kwag_args
-                code_data = cls.send_app_msg_push(up['push_type'], **params) if is_app_push else code_data
-            return {'code_date': code_data, 'new_device_info_list': new_device_info_list, 'sys_msg_list': sys_msg_list,
-                    'local_date_time': local_date_time}
+                        if 'jg_token_val' in push_kwargs:
+                            push_kwargs.pop('jg_token_val')
+
+                    appBundleId = up['appBundleId']
+                    token_val = up['token_val']
+                    # 发送标题
+                    msg_title = cls.get_msg_title(nickname=params['nickname'])
+                    # 发送内容
+                    msg_text = cls.get_msg_text(channel=params['channel'], n_time=params['n_time'], lang=lang, tz=tz,
+                                                event_type=params['event_type'], ai_type=params['ai_type'],
+                                                device_type=params['device_type'], electricity=params['electricity'],
+                                                dealings_type=params['dealings_type'], event_tag=params['event_tag']
+                                                )
+
+                    # 补齐推送参数
+                    push_kwargs['appBundleId'] = appBundleId
+                    push_kwargs['token_val'] = token_val
+                    push_kwargs['msg_title'] = msg_title
+                    push_kwargs['msg_text'] = msg_text
+                    params['push_kwargs'] = push_kwargs
+                    params['appBundleId'] = appBundleId
+                    params['token_val'] = token_val
+                    params['lang'] = lang
+                    params['tz'] = tz
+
+                    push_result = cls.send_app_msg_push(push_type, **params)
+                    LOGGING.info('{}推送类型:{},推送结果:{}'.format(uid, push_type, push_result))
+
+            # 写入系统消息
+            if sys_msg_list:
+                SysMsgModel.objects.bulk_create(sys_msg_list)
+            if equipment_info_list:
+                equipment_info_model.objects.bulk_create(equipment_info_list)
+
+            return True
         except Exception as e:
-            LOGGING.info('推送消息或存表异常: errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            LOGGING.info('推送消息或存表异常: error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
 
     @classmethod
     def get_event_tag(cls, ai_type, event_type, detection=0):
@@ -270,83 +298,74 @@ class DevicePushService:
     @classmethod
     def send_app_msg_push(cls, push_type, **param):
         """
-        发送app消息推送
+        发送推送
+        @param push_type: 推送类型
+        @return push_result: bool
         """
         try:
-            kwargs = param['kwag_args']
-            result = {'do_apns_code': '', 'do_fcm_code': '', 'do_jpush_code': '', 'do_xmpush_code': '',
-                      'do_vivopush_code': '', 'do_meizupush_code': '', 'do_oppopush_code': ''}
-            # 判断是否进行APP消息推送,如app_push不为空,则不进行推送
-            if not param['app_push']:
-                LOGGING.info('APP准备推送:{}, {}'.format(param['uid'], param))
-
-                # is_st为1或3,且推送类型为apns,gcm,华为,异步推送图片
-                if (param['is_st'] == 1 or param['is_st'] == 3) and \
-                        (push_type == 0 or push_type == 1 or push_type == 3):
-                    if param['is_st'] == 1:
-                        key = '{}/{}/{}.jpeg'.format(param['uid'], param['channel'], param['n_time'])
-                    else:
-                        key = '{}/{}/{}_0.jpeg'.format(param['uid'], param['channel'], param['n_time'])
-                    push_thread = threading.Thread(target=cls.async_send_picture_push, args=(
-                        push_type, param['aws_s3_client'], param['bucket'], key,
-                        param['uid'], param['appBundleId'], param['token_val'], param['event_type'], param['n_time'],
-                        param['kwag_args']['msg_title'], param['kwag_args']['msg_text'], param['channel']))
-                    push_thread.start()
-                # 不推图
+            push_kwargs = param['push_kwargs']
+            push_result = False
+
+            # is_st为1或3,且推送类型为apns,gcm,华为,异步推送图片
+            if (param['is_st'] == 1 or param['is_st'] == 3) and \
+                    (push_type == 0 or push_type == 1 or push_type == 3):
+                if param['is_st'] == 1:
+                    key = '{}/{}/{}.jpeg'.format(param['uid'], param['channel'], param['n_time'])
                 else:
+                    key = '{}/{}/{}_0.jpeg'.format(param['uid'], param['channel'], param['n_time'])
+                # 开始异步推送图片
+                push_thread = threading.Thread(target=cls.async_send_picture_push, args=(
+                    push_type, param['aws_s3_client'], param['bucket'], key,
+                    param['uid'], param['appBundleId'], param['token_val'], param['event_type'], param['n_time'],
+                    push_kwargs['msg_title'], push_kwargs['msg_text'], param['channel']))
+                push_thread.start()
+                push_result = True
+
+            # 不推图
+            else:
+                if push_type in [0, 1, 2]:
+                    kwargs = {
+                        'nickname': param['uid'],
+                        'app_bundle_id': param['appBundleId'],
+                        'token_val': param['token_val'],
+                        'n_time': param['n_time'],
+                        'event_type': param['event_type'],
+                        'msg_title': push_kwargs['msg_title'],
+                        'msg_text': push_kwargs['msg_text'],
+                        'uid': param['uid'],
+                        'channel': param['channel']
+                    }
+
                     if push_type == 0:  # ios apns
-                        result['do_apns_code'] = PushObject.ios_apns_push(param['uid'], param['appBundleId'],
-                                                                          param['token_val'], param['n_time'],
-                                                                          param['event_type'],
-                                                                          param['kwag_args']['msg_title'],
-                                                                          param['kwag_args']['msg_text'],
-                                                                          param['uid'], param['channel'])
+                        push_result = PushObject.ios_apns_push(**kwargs)
                     elif push_type == 1:  # android gcm
-                        result['do_fcm_code'] = PushObject.android_fcm_push(param['uid'], param['appBundleId'],
-                                                                            param['token_val'], param['n_time'],
-                                                                            param['event_type'],
-                                                                            param['kwag_args']['msg_title'],
-                                                                            param['kwag_args']['msg_text'],
-                                                                            param['uid'], param['channel'])
+                        push_result = PushObject.android_fcm_push(**kwargs)
                     elif push_type == 2:  # android jpush
-                        result['do_jpush_code'] = PushObject.android_jpush(param['uid'], param['appBundleId'],
-                                                                           param['token_val'], param['n_time'],
-                                                                           param['event_type'],
-                                                                           param['kwag_args']['msg_title'],
-                                                                           param['kwag_args']['msg_text'],
-                                                                           param['channel'])
-                    elif push_type == 3:
-                        huawei_push_object = HuaweiPushObject()
-                        huawei_push_object.send_push_notify_message(**kwargs)
-                    elif push_type == 4:  # android xmpush
+                        kwargs.pop('uid')
+                        push_result = PushObject.android_jpush(**kwargs)
+
+                elif push_type == 3:
+                    huawei_push_object = HuaweiPushObject()
+                    huawei_push_object.send_push_notify_message(**push_kwargs)
+                elif push_type == 4:  # android xmpush
+                    if param['event_type'] in [606, 607]:
+                        channel_id = 111934
+                    else:
                         channel_id = 104551
-                        result['do_xmpush_code'] = cls.do_xmpush(channel_id=channel_id, **kwargs)
-                    elif push_type == 5:  # android vivopush
-                        result['do_vivopush_code'] = PushObject.android_vivopush(**kwargs)
-                    elif push_type == 6:  # android oppopush
-                        channel_id = 'DEVICE_REMINDER'
-                        result['do_oppopush_code'] = cls.do_oppopush(channel_id=channel_id, **kwargs)
-                    elif push_type == 7:  # android meizupush
-                        result['do_meizupush_code'] = PushObject.android_meizupush(**kwargs)
-            return result
+                    cls.do_xmpush(channel_id=channel_id, **push_kwargs)
+                    push_result = True
+                elif push_type == 5:  # android vivopush
+                    push_result = PushObject.android_vivopush(**push_kwargs)
+                elif push_type == 6:  # android oppopush
+                    channel_id = 'DEVICE_REMINDER'
+                    cls.do_oppopush(channel_id=channel_id, **push_kwargs)
+                    push_result = True
+                elif push_type == 7:  # android meizupush
+                    push_result = PushObject.android_meizupush(**push_kwargs)
+            return push_result
         except Exception as e:
-            LOGGING.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return None
-
-    @classmethod
-    def save_sys_msg(cls, is_sys_msg, local_date_time, sys_msg_list, new_device_info_list):
-        """
-        保存系统消息&设备推送消息存库
-        """
-        if is_sys_msg:
-            SysMsgModel.objects.bulk_create(sys_msg_list)
-        else:
-            # new 分表批量存储 设备信息
-            if new_device_info_list and len(new_device_info_list) > 0:
-                # 根据日期获得星期几
-                week = LocalDateTimeUtil.date_to_week(local_date_time)
-                EquipmentInfoService.equipment_info_bulk_create(week, new_device_info_list)
-        return True
+            LOGGING.info('发送推送异常,error_line:{},error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
 
     @classmethod
     def created_device_vo(cls, local_date_time, **params):
@@ -371,6 +390,24 @@ class DevicePushService:
             answer_status=True if params['dealings_type'] == 1 else False
         )
 
+    @staticmethod
+    def save_equipment_info(**params):
+        kwargs = {
+            'device_user_id': params['userID_id'],
+            'event_time': params['n_time'],
+            'event_type': params['event_type'],
+            'device_uid': params['uid'],
+            'device_nick_name': params['nickname'],
+            'channel': params['channel'],
+            'alarm': 'Motion \tChannel:{}'.format(params['channel']),
+            'is_st': params['is_st'],
+            'add_time': int(time.time()),
+            'storage_location': params['storage_location'],
+            'event_tag': params['event_tag'],
+            'answer_status': True if params['dealings_type'] == 1 else False
+        }
+        EquipmentInfoService.randoms_insert_equipment_info(**kwargs)
+
     @staticmethod
     def get_msg_title(nickname):
         """
@@ -548,7 +585,7 @@ class DevicePushService:
         }
         response = requests.post(url, data=data, headers=headers)
         if response.status_code == 200:
-            LOGGING.info('uid为{},小米推送结果:{}'.format(uid, response.json()))
+            LOGGING.info('uid:{},时间:{}小米推送结果:{}'.format(uid, n_time, response.json()))
             return response.json()
 
     @staticmethod
@@ -610,62 +647,62 @@ class DevicePushService:
     def async_send_picture_push(cls, push_type, aws_s3_client, bucket, key, uid, appBundleId,
                                 token_val, event_type, n_time, msg_title, msg_text, channel):
         """
-        异步APP图片推送
+        异步推送图片
         """
         try:
-            image_url = aws_s3_client.generate_presigned_url('get_object',
-                                                             Params={'Bucket': bucket, 'Key': key},
-                                                             ExpiresIn=3600)
-            LOGGING.info('推送图片url:{}'.format(image_url))
+            image_url = aws_s3_client.generate_presigned_url(
+                'get_object', Params={'Bucket': bucket, 'Key': key}, ExpiresIn=3600)
+            push_result = False
             if push_type == 0:
-                PushObject.ios_apns_push(uid, appBundleId, token_val, n_time, event_type, msg_title, msg_text,
-                                         uid, channel, image_url)
+                push_result = PushObject.ios_apns_push(
+                    uid, appBundleId, token_val, n_time, event_type, msg_title, msg_text, uid, channel, image_url)
             elif push_type == 1:
-                PushObject.android_fcm_push(uid, appBundleId, token_val, n_time, event_type, msg_title,
-                                            msg_text, uid, channel, image_url)
+                push_result = PushObject.android_fcm_push(
+                    uid, appBundleId, token_val, n_time, event_type, msg_title, msg_text, uid, channel, image_url)
             elif push_type == 3:
                 huawei_push_object = HuaweiPushObject()
-                huawei_push_object.send_push_notify_message(token_val=token_val, msg_title=msg_title, msg_text=msg_text,
-                                                            uid=uid, event_type=event_type, n_time=n_time,
-                                                            image_url=image_url)
+                push_result = huawei_push_object.send_push_notify_message(
+                    token_val=token_val, msg_title=msg_title, msg_text=msg_text, uid=uid, event_type=event_type,
+                    n_time=n_time, image_url=image_url)
+
+            LOGGING.info('{}推送图片,push_type:{},推送结果:{}'.format(uid, push_type, push_result))
         except Exception as e:
-            LOGGING.info('图片推送异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            LOGGING.info('异步推送图片异常,error_line:{},error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
-    def get_push_url(**kwargs):
-        """
-        获取推送URL,设备根本当前返回结果进行数据上传
-        @return: re_data
-        """
-        re_data = {'code': 0, 'msg': 'success'}
-        if kwargs['is_st'] == 0 or kwargs['is_st'] == 2:
-            re_data['msg'] = 'success 0 or 2'
-        elif kwargs['is_st'] == 1:
-            key_name = '{uid}/{channel}/{filename}.jpeg' \
-                .format(uid=kwargs['uid'], channel=kwargs['channel'], filename=kwargs['n_time'])
-            re_args = {'Key': key_name}
+    def get_res_data(**kwargs):
+        """
+        获取响应数据
+        @return: res_data
+        """
+        res_data = {'code': 0, 'msg': 'success'}
+        is_st = kwargs['is_st']
+        if is_st == 0 or is_st == 2:
+            res_data['msg'] = 'success 0 or 2'
+        elif is_st == 1:
+            key_name = '{}/{}/{}.jpeg'.format(kwargs['uid'], kwargs['channel'], kwargs['n_time'])
+            params = {'Key': key_name}
             if kwargs['region'] == 2:  # 2:国内
-                re_args['Bucket'] = 'push'
+                params['Bucket'] = 'push'
             else:  # 1:国外
-                re_args['Bucket'] = 'foreignpush'
-            response_url = DevicePushService.generate_s3_url(kwargs['aws_s3_client'], re_args)
-            re_data['img_push'] = response_url
-            re_data['msg'] = 'success 1'
-        elif kwargs['is_st'] == 3:
+                params['Bucket'] = 'foreignpush'
+            img_url = DevicePushService.generate_s3_url(kwargs['aws_s3_client'], params)
+            res_data['img_push'] = img_url
+            res_data['msg'] = 'success 1'
+        elif is_st == 3:
             img_url_list = []
             if kwargs['region'] == 2:  # 2:国内
-                re_args = {'Bucket': 'push'}
+                params = {'Bucket': 'push'}
             else:  # 1:国外
-                re_args = {'Bucket': 'foreignpush'}
+                params = {'Bucket': 'foreignpush'}
             for i in range(kwargs['is_st']):
-                key_name = '{uid}/{channel}/{filename}_{st}.jpeg'. \
-                    format(uid=kwargs['uid'], channel=kwargs['channel'], filename=kwargs['n_time'], st=i)
-                re_args['Key'] = key_name
-                response_url = DevicePushService.generate_s3_url(kwargs['aws_s3_client'], re_args)
-                img_url_list.append(response_url)
-            re_data['img_url_list'] = img_url_list
-            re_data['msg'] = 'success 3'
-        return re_data
+                key_name = '{}/{}/{}_{}.jpeg'.format(kwargs['uid'], kwargs['channel'], kwargs['n_time'], i)
+                params['Key'] = key_name
+                img_url = DevicePushService.generate_s3_url(kwargs['aws_s3_client'], params)
+                img_url_list.append(img_url)
+            res_data['img_url_list'] = img_url_list
+            res_data['msg'] = 'success 3'
+        return res_data
 
     @staticmethod
     def generate_s3_url(aws_s3_client, params):

+ 33 - 1
Service/EquipmentInfoService.py

@@ -7,12 +7,23 @@
 @Software: PyCharm
 """
 import logging
+import random
 
 from django.db import transaction
 
 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
+from AnsjerPush.config import LOGGER
+
+EQUIPMENT_INFO_LIST = [
+    EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, EquipmentInfo4, EquipmentInfo5, EquipmentInfo6,
+    EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10,
+    EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15, EquipmentInfo16,
+    EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20]
 
 
 class EquipmentInfoService:
@@ -80,3 +91,24 @@ class EquipmentInfoService:
             er_log.exception(repr(e))
             er_log.error(repr(e))
             return False
+
+    @staticmethod
+    def randoms_insert_equipment_info(**kwargs):
+        """
+        随机一个推送数据表存储数据
+        """
+        equipment_info_list = [
+            EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, EquipmentInfo4, EquipmentInfo5, EquipmentInfo6,
+            EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10,
+            EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15, EquipmentInfo16,
+            EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20]
+        try:
+            random_model = random.choice(equipment_info_list)
+            LOGGER.info('随机存表参数:{},表:{}'.format(kwargs, random_model))
+            random_model.objects.create(**kwargs)
+        except Exception as e:
+            LOGGER.info('随机存储推送数据异常: error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def randoms_choice_equipment_info():
+        return random.choice(EQUIPMENT_INFO_LIST)

+ 9 - 4
Service/HuaweiPushService/HuaweiPushService.py

@@ -18,7 +18,7 @@ class HuaweiPushObject:
         push_admin.initialize_app(self.app_id, self.app_secret)
 
     def send_push_notify_message(self, token_val, msg_title, msg_text, image_url=None, uid='', nickname='', n_time='',
-                                 event_type='', channel='', app_bundle_id='', appBundleId=''):
+                                 event_type='0', channel='', app_bundle_id='', appBundleId=''):
         """
         发送推送消息
         @param token_val: 手机推送token
@@ -32,16 +32,19 @@ class HuaweiPushObject:
         @param channel: 通道
         @param app_bundle_id: APP包id
         @param appBundleId: APP包id
-        @return:
+        @return: bool
         """
         LOGGER.info(
             '华为推送参数: uid:{}, token_val:{}, msg_title:{}, msg_text:{}, image_url:{}, event_type:{}, n_time:{}'.format(
                 uid, token_val, msg_title, msg_text, image_url, event_type, n_time))
 
-        self.send_notify_message(msg_title, msg_text, image_url, uid, nickname, event_type, n_time, token_val)
+        send_succeed = self.send_notify_message(msg_title, msg_text, image_url, uid, nickname,
+                                                event_type, n_time, token_val)
         if int(event_type) in [606, 607]:
             self.send_data_message(uid, event_type, n_time, token_val)
 
+        return send_succeed
+
     def send_notify_message(self, msg_title, msg_text, image_url, uid, nickname, event_type, n_time, token_val):
         """
         发送通知推送
@@ -53,7 +56,7 @@ class HuaweiPushObject:
         @param event_type:
         @param n_time:
         @param token_val:
-        @return: None
+        @return: bool
         """
         LOGGER.info('{}进入发送通知推送函数'.format(uid))
         msg_title = '设备昵称: {}'.format(msg_title)
@@ -94,8 +97,10 @@ class HuaweiPushObject:
             response = messaging.send_message(message, verify_peer=certifi.where())
             LOGGER.info('{}华为通知推送响应: {}'.format(uid, json.dumps(vars(response))))
             assert (response.code == '80000000')
+            return True
         except Exception as e:
             LOGGER.info('华为通知推送异常: {}'.format(repr(e)))
+            return False
 
     @staticmethod
     def send_data_message(uid, event_type, n_time, token_val):

+ 31 - 25
Service/PushService.py

@@ -117,7 +117,7 @@ class PushObject:
         @param uid: uid
         @param channel: 通道
         @param launch_image: 推送图片链接
-        @return: None
+        @return: bool
         """
         pem_path = os.path.join(BASE_DIR, APNS_CONFIG[app_bundle_id]['pem_path'])
         LOGGER.info('IOS推送: app_bundle_id:{}, pem_path:{}'.format(app_bundle_id, pem_path))
@@ -134,8 +134,10 @@ class PushObject:
             res = cli.push(n=n, device_token=token_val, topic=app_bundle_id)
             LOGGER.info('IOS推送响应状态码{},params,uid:{},{}'.format(res.status_code, uid, json.dumps(push_data)))
             assert res.status_code == 200
+            return True
         except Exception as e:
             LOGGER.info('IOS推送异常: {}, 证书路径: {}'.format(repr(e), pem_path))
+            return False
 
     @staticmethod
     def android_fcm_push(nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
@@ -152,9 +154,8 @@ class PushObject:
         @param uid: uid
         @param channel: 通道
         @param image: 推送图片链接
-        @return: None
+        @return: bool
         """
-        logger = logging.getLogger('info')
         try:
             serverKey = FCM_CONFIG[app_bundle_id]
             push_service = FCMNotification(api_key=serverKey)
@@ -168,14 +169,17 @@ class PushObject:
                 push_data['direct_boot_ok'] = True
             result = push_service.notify_single_device(registration_id=token_val, message_title=msg_title,
                                                        message_body=msg_text, data_message=push_data,
+                                                       click_action='android.intent.action.VIEW',
                                                        extra_kwargs={'default_sound': True,
                                                                      'default_vibrate_timings': True,
                                                                      'default_light_settings': True,
-                                                                     }
+                                                                     },
                                                        )
             LOGGER.info('fcm推送结果:{}'.format(result))
+            return True
         except Exception as e:
             LOGGER.info('fcm推送异常:{}'.format(repr(e)))
+            return False
 
     @staticmethod
     def android_jpush(nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text, channel=1):
@@ -189,7 +193,7 @@ class PushObject:
         @param msg_title: 推送标题
         @param msg_text: 推送内容
         @param channel: 设备通道
-        @return: None
+        @return: bool
         """
         try:
             app_key = JPUSH_CONFIG[app_bundle_id]['Key']
@@ -209,8 +213,10 @@ class PushObject:
             push.platform = jpush.all_
             res = push.send()
             assert res.status_code == 200
+            return True
         except Exception as e:
             LOGGER.info('极光推送异常:{}'.format(repr(e)))
+            return False
 
     @staticmethod
     def android_xmpush(channel_id, nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
@@ -228,9 +234,8 @@ class PushObject:
         @param uid: uid
         @param channel: 通道
         @param image: 推送图片链接
-        @return: None
+        @return: bool
         """
-        logger = logging.getLogger('info')
         try:
             url = 'https://api.xmpush.xiaomi.com/v3/message/regid'
             app_secret = XMPUSH_CONFIG[app_bundle_id]
@@ -263,10 +268,12 @@ class PushObject:
                 'Authorization': 'key={}'.format(app_secret)
             }
             response = requests.post(url, data=data, headers=headers)
-            logger.info("小米推送返回值:{}".format(response.json()))
+            LOGGER.info("小米推送返回值:{}".format(response.json()))
             assert response.status_code == 200
+            return True
         except Exception as e:
-            return repr(e)
+            LOGGER.info("小米推送异常:{}".format(repr(e)))
+            return False
 
     @staticmethod
     def android_vivopush(token_val, n_time, event_type, msg_title, msg_text, app_bundle_id='', uid='', channel='1',
@@ -285,9 +292,8 @@ class PushObject:
         @param uid: uid
         @param image: 推送图片链接
         @param channel: 通道
-        @return: None
+        @return: bool
         """
-        logger = logging.getLogger('info')
         try:
             app_bundle_id = app_bundle_id if app_bundle_id != '' else appBundleId
             # 获取redis里面的authToken
@@ -325,12 +331,13 @@ class PushObject:
                 .client_custom_map(**push_data) \
                 .message_dict()
             rec = sender_send.send(message)
-            logger.info('vivo推送结果:{}, 设备uid:{}'.format(rec, uid))
+            LOGGER.info('vivo推送结果:{}, 设备uid:{}'.format(rec, uid))
             if rec['result'] == 0 and event_type in [606, 607]:
                 PushObject.jpush_transparent_transmission(msg_title, msg_text, app_bundle_id, jg_token_val, push_data)
-            return rec
+            return True
         except Exception as e:
-            logger.info('vivo推送异常:{}'.format(e))
+            LOGGER.info('vivo推送异常:{}'.format(e))
+            return False
 
     @staticmethod
     def android_oppopush(channel_id, nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
@@ -349,9 +356,8 @@ class PushObject:
         @param uid: uid
         @param channel: 通道
         @param image: 推送图片链接
-        @return: None
+        @return: bool
         """
-        logger = logging.getLogger('info')
         try:
             """
             android 国内oppo APP消息提醒推送
@@ -400,11 +406,13 @@ class PushObject:
             }
 
             response = requests.post(push_url, data=push_data, headers=headers)
-            logger.info("oppo推送返回值:{}".format(response.json()))
+            LOGGER.info("oppo推送返回值:{}".format(response.json()))
             if response.status_code == 200 and event_type in [606, 607]:
                 PushObject.jpush_transparent_transmission(msg_title, msg_text, app_bundle_id, jg_token_val, extra_data)
+            return True
         except Exception as e:
-            return repr(e)
+            LOGGER.info("oppo推送异常:{}".format(repr(e)))
+            return False
 
     @staticmethod
     def android_meizupush(token_val, n_time, event_type, msg_title, msg_text, uid='', channel='1',
@@ -422,9 +430,8 @@ class PushObject:
         @param uid: uid
         @param image: 推送图片链接
         @param channel: 通道
-        @return: None
+        @return: bool
         """
-        logger = logging.getLogger('info')
         try:
             #  获取包和AppSecret
             app_bundle_id = app_bundle_id if app_bundle_id != '' else appBundleId
@@ -463,10 +470,11 @@ class PushObject:
             }
             # 进行推送
             response = requests.post(url, data=data)
-            logger.info("魅族推送结果:{}".format(response.json()))
-            return response.status_code
+            LOGGER.info("魅族推送结果:{}".format(response.json()))
+            return True
         except Exception as e:
-            return repr(e)
+            LOGGER.info("魅族推送异常:{}".format(repr(e)))
+            return False
 
     @staticmethod
     def jpush_transparent_transmission(msg_title, msg_text, app_bundle_id, token_val, extra_data):
@@ -490,7 +498,5 @@ class PushObject:
             push.platform = jpush.all_
             res = push.send()
             assert res.status_code == 200
-            LOGGER.info('token为{}的极光透传返回结果:{}'.format(token_val, res))
         except Exception as e:
-            LOGGER.info('token为{}极光透传返回结果, errLine:{}, errMsg:{}'.format(token_val, e.__traceback__.tb_lineno, repr(e)))
             return repr(e)