Jelajahi Sumber

优化算法类型int值过大无法存储

zhangdongming 2 tahun lalu
induk
melakukan
7396d31a94

+ 15 - 1
AnsjerPush/Config/aiConfig.py

@@ -19,4 +19,18 @@ AI_IDENTIFICATION_TAGS_DICT = {
     '2': 'Pet',
     '3': 'Vehicle',
     '4': 'Package'
-}
+}
+
+DEVICE_EVENT_TYPE = {
+    1: 51,
+    2: 57,
+    4: 58,
+    16: 59,
+    8: 60,
+    32: 61,
+    64: 62,
+    128: 63,
+    256: 64,
+    512: 65,
+    1024: 66
+}

+ 1 - 3
Controller/DetectControllerV2.py

@@ -7,7 +7,6 @@ import boto3
 import botocore
 import jpush as jpush
 from botocore import client
-from django.db import transaction
 from django.http import JsonResponse
 from django.views.generic.base import View
 from pyfcm import FCMNotification
@@ -96,7 +95,6 @@ class NotificationV2View(View):
                 logger.info('消息推送-uid_push 数据不存在')
                 return JsonResponse(status=200, data={'code': 176, 'msg': 'no uid_push data'})
             ai_type = uid_push_qs.first()['uid_set__ai_type']
-            event_type = self.get_combo_msg_type(ai_type, event_type)  # 解析消息事件类型看是否多类型组合
             # 将uid_set以及uid_push 转数组列表
             uid_set_push_list = DevicePushService.cache_uid_push(uid_push_qs)
             nickname = uid_set_push_list[0]['uid_set__nickname']
@@ -122,7 +120,7 @@ class NotificationV2View(View):
             params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, '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}
+                      'app_push': cache_app_push, 'storage_location': 2, 'ai_type': ai_type}
             logger.info('已创建s3对象,推送数据为:{}'.format(params))
             # APP消息推送与获取报警消息数据列表
             result = DevicePushService.save_msg_push(uid_set_push_list, **params)

+ 14 - 0
Model/models.py

@@ -360,6 +360,8 @@ class EquipmentInfoMonday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -392,6 +394,8 @@ class EquipmentInfoTuesday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -424,6 +428,8 @@ class EquipmentInfoWednesday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -456,6 +462,8 @@ class EquipmentInfoThursday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -488,6 +496,8 @@ class EquipmentInfoFriday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -520,6 +530,8 @@ class EquipmentInfoSaturday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -552,6 +564,8 @@ class EquipmentInfoSunday(models.Model):
     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类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):

+ 80 - 6
Service/DevicePushService.py

@@ -18,11 +18,13 @@ import jpush as jpush
 import requests
 from pyfcm import FCMNotification
 
+from AnsjerPush.Config.aiConfig import DEVICE_EVENT_TYPE
 from AnsjerPush.config import CONFIG_INFO, CONFIG_CN
 from AnsjerPush.config import JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE, XMPUSH_CONFIG, OPPOPUSH_CONFIG
 from Model.models import UidPushModel, SysMsgModel, DeviceSharePermission, DeviceChannelUserSet, \
-    DeviceChannelUserPermission
+    DeviceChannelUserPermission, UidSetModel
 from Object.ETkObject import ETkObject
+from Object.RedisObject import RedisObject
 from Object.UidTokenObject import UidTokenObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
@@ -111,6 +113,7 @@ class DevicePushService:
         local_date_time = ''
         push_permission = True
         try:
+            params['event_tag'] = cls.get_event_tag(params['ai_type'], params['event_type'])
             for up in uid_set_push_list:
                 appBundleId = up['appBundleId']
                 token_val = up['token_val']
@@ -149,22 +152,72 @@ class DevicePushService:
                     else:
                         LOGGING.info('分表存数据start------')
                         params['userID_id'] = userID_id
-                        push_permission = DevicePushService.check_share_permission(userID_id, params['channel'],
-                                                                                   params['uid'])
-                        if push_permission:
-                            new_device_info_list.append(cls.created_device_vo(local_date_time, **params))
+                        # 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 push_permission else code_data
+                code_data = cls.send_app_msg_push(up['push_type'], **params)
             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}
         except Exception as e:
             LOGGING.info('推送消息或存表异常: errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+    @classmethod
+    def get_event_tag(cls, ai_type, event_type):
+        """
+        获取事件标签
+        """
+        if ai_type > 0:
+            event_res = DEVICE_EVENT_TYPE.get(event_type, 0)
+            if event_res > 0:
+                return str(event_res) + ','
+            event_type = cls.dec_to_bin(event_type)
+            types = cls.get_combo_types(event_type)
+            return ','.join(types) + ','
+        return str(event_type) + ','
+
+    @classmethod
+    def get_combo_types(cls, event_type):
+        """
+        获取设备算法组合类型
+        51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警(提示:有人出现),58:车型,59:宠物,60:人脸,61:异响,
+        62:区域闯入,63:区域闯出,64:长时间无人检测,65:长时间无人检测,66:往来检测
+        0:代表空字符,702:摄像头休眠,703:摄像头唤醒,704:电量过低
+        AWS AI识别 1:人形,2:车型,3:宠物,4:包裹。云端AI类型
+        @param event_type:
+        @return:
+        """
+        try:
+            types = []
+            combo_types = list(DEVICE_EVENT_TYPE.values())
+            event_type = str(event_type)
+            len_type = len(event_type)
+            for i in range(0, len_type):
+                e_type = int(event_type[len_type - 1 - i])
+                if e_type == 1:
+                    types.append(str(combo_types[i]))
+            return types
+        except Exception as e:
+            print('推送错误异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return event_type
+
+    @staticmethod
+    def dec_to_bin(num):
+        """
+        十进制转二进制
+        """
+        result = ""
+        while num != 0:
+            ret = num % 2
+            num //= 2
+            result = str(ret) + result
+        return result
+
     @classmethod
     def send_app_msg_push(cls, push_type, **param):
         """
@@ -249,6 +302,7 @@ class DevicePushService:
             add_time=int(time.time()),
             storage_location=params['storage_location'],
             border_coords='',
+            event_tag=params['event_tag']
         )
 
     @staticmethod
@@ -595,3 +649,23 @@ class DevicePushService:
         if not channel_permission_qs.exists():
             return False
         return True
+
+    @classmethod
+    def is_algorithm_type(cls, uid, event_type):
+        """
+        判断是否是算法类型 62、63、64、65、66不限制推送
+        """
+        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ai_type')
+        if not uid_set_qs.exists():
+            return False
+        if uid_set_qs[0]['ai_type'] == 0:
+            return False
+        event_types = [62, 63, 64, 65, 66]
+        event_res = DEVICE_EVENT_TYPE.get(event_type, 0)
+        if event_res in event_types:
+            return True
+        event_types2 = cls.get_combo_types(event_type)
+        if not event_types2:
+            return False
+        c = [x for x in event_types if x in event_types2]
+        return True if c else False