Bläddra i källkod

合并test代码

zhangdongming 2 år sedan
förälder
incheckning
2e34fd1010

+ 3 - 1
AdminController/UserManageController.py

@@ -373,6 +373,8 @@ class UserManagement(View):
             for device_user in device_users:
                 role = device_user.role.first()
                 rid = role.rid if role else 1   # 不存在角色默认分配为'Users'
+                user_ex_qs = UserExModel.objects.filter(userID_id=device_user.userID).values('appBundleId')
+                app_bundle_id = user_ex_qs[0]['appBundleId'] if user_ex_qs.exists() else ''
                 user_list.append({
                     'userID': device_user.userID,
                     'username': device_user.username,
@@ -382,7 +384,7 @@ class UserManagement(View):
                     'userEmail': device_user.userEmail,
                     'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
                     'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
-                    'online': device_user.online,
+                    'appBundleId': app_bundle_id,
                 })
             print('user_list: ', user_list)
             return response.json(0, {'list': user_list, 'total': total})

+ 1 - 0
Controller/AiController.py

@@ -163,6 +163,7 @@ class AiView(View):
                     'uid': uid,
                     'addTime': nowTime,
                     'updTime': nowTime,
+                    'device_type': device_info_qs[0].Type
                 }
                 if interval:
                     qs_data['detect_interval'] = int(interval)

+ 9 - 1
Controller/AlgorithmShop/AlgorithmShopController.py

@@ -9,9 +9,10 @@
 import logging
 import time
 
+from django.db.models import F
 from django.views.generic.base import View
 
-from Model.models import DeviceAlgorithmExplain, DeviceAlgorithmBanner, DeviceUidAlgorithmType
+from Model.models import DeviceAlgorithmExplain, DeviceAlgorithmBanner, DeviceUidAlgorithmType, DeviceTypeAlgorithmInfo
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -135,6 +136,13 @@ class AlgorithmShopView(View):
                 'riskWarning': item['risk_warning'],
                 'basicFunction': item['algorithm_type__basic_function'],
             }
+            dt_info_qs = DeviceTypeAlgorithmInfo.objects.filter(algorithm_type=algorithm_dict['type']) \
+                .annotate(deviceName=F('device_name'), deviceType=F('device_type'),
+                          algorithmType=F('algorithm_type'),
+                          typeIcon=F('type_icon'),
+                          deviceLink=F('device_link'), ) \
+                .values('deviceName', 'deviceType', 'typeIcon', 'deviceLink')
+            algorithm_dict['recommendDevices'] = list(dt_info_qs)
             if uid:
                 setting = cls.get_uid_algorithm_info(item['algorithm_type__id'], uid)
                 algorithm_dict['setting'] = setting if setting else {'status': 0, 'function': {}}

+ 2 - 0
Controller/DetectController.py

@@ -222,6 +222,7 @@ class DetectControllerView(View):
         nowTime = int(time.time())
         if dvqs.exists():
             # 修改状态
+            device_type = dvqs[0].Type
             dvqs.update(NotificationMode=status)
             uid_set_qs = UidSetModel.objects.filter(uid=uid)
             # uid配置信息是否存在
@@ -245,6 +246,7 @@ class DetectControllerView(View):
                     'addTime': nowTime,
                     'updTime': nowTime,
                     'detect_status': status,
+                    'device_type': device_type
                 }
                 if interval:
                     qs_data['detect_interval'] = int(interval)

+ 11 - 23
Controller/DetectControllerV2.py

@@ -142,7 +142,9 @@ class DetectControllerViewV2(View):
 
             # 更新或创建uid_set数据
             nowTime = int(time.time())
-            uid_set_data = {}
+            uid_set_data = {
+                'device_type': device_info_qs[0].Type
+            }
 
             # 设置开关状态,0:关闭,1:开启
             if status:
@@ -296,10 +298,6 @@ class DetectControllerViewV2(View):
         if not region:
             return response.json(444, 'region')
         region = int(region)
-        # now_time = int(time.time())
-
-        # qs = Equipment_Info.objects.filter(userID_id=userID).order_by('-eventTime')
-        # qs = qs.filter(eventTime__gt=now_time - 3600 * 168)
         try:
             # 根据时间筛选消息推送
             if startTime and endTime:
@@ -312,19 +310,9 @@ class DetectControllerViewV2(View):
                 qs, count = EquipmentInfoService.get_equipment_info_week_all(page, line, userID, startTime, endTime,
                                                                              eventType,
                                                                              request_dict.get('uids', None))
-            # if startTime and endTime:
-            #     qs = qs.filter(eventTime__range=(startTime, endTime))
-            # if eventType:
-            #     if ',' in eventType:  # 兼容AI查询
-            #         eventTypeList = eventType.split(',')
-            #         eventTypeList = [int(i.strip()) for i in eventTypeList]
-            #         qs = qs.filter(eventType__in=eventTypeList)
-            #     else:
-            #         qs = qs.filter(eventType=eventType)
             uids = request_dict.get('uids', None)
             if uids:
                 uid_list = uids.split(',')
-                # qs = qs.filter(devUid__in=uid_list)
                 dvqs = Device_Info.objects.filter(UID__in=uid_list, userID_id=userID).values('UID', 'Type', 'NickName')
                 uid_type_dict = {}
                 for dv in dvqs:
@@ -334,14 +322,8 @@ class DetectControllerViewV2(View):
                 uid_type_dict = {}
                 for dv in dvqs:
                     uid_type_dict[dv['UID']] = {'type': dv['Type'], 'NickName': dv['NickName']}
-            # print(uid_type_dict)
             if not qs or count == 0 or not qs.exists():
                 return response.json(0, {'datas': [], 'count': 0})
-            # qs = qs.values('id', 'devUid', 'devNickName', 'Channel', 'eventType', 'status', 'alarm', 'eventTime',
-            #                'receiveTime', 'is_st', 'addTime', 'storage_location', 'borderCoords')
-
-            # count = qs.count()
-            # qr = qs[(page - 1) * line:page * line]
             qr = qs
             res = []
             auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
@@ -397,7 +379,8 @@ class DetectControllerViewV2(View):
                         bucket_name = vodqs[0]['bucket__bucket']
                         endpoint = vodqs[0]['bucket__endpoint']
                         bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                        ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'], etime=eventTime)
+                        ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'],
+                                                                        etime=eventTime)
                         if storage_location == 1:  # oss
                             thumb0 = bucket.sign_url('GET', ts, 3600,
                                                      params={'x-oss-process': 'video/snapshot,t_0000,w_700'})
@@ -428,7 +411,8 @@ class DetectControllerViewV2(View):
                             p['img_list'].append(img)
                         elif region == 2 and storage_location == 2:  # 2:国内,aws
                             response_url = aws_s3_guonei.generate_presigned_url('get_object',
-                                                                                Params={'Bucket': 'push', 'Key': thumbspng},
+                                                                                Params={'Bucket': 'push',
+                                                                                        'Key': thumbspng},
                                                                                 ExpiresIn=300)
                             img = response_url
                             p['img_list'].append(img)
@@ -449,11 +433,15 @@ class DetectControllerViewV2(View):
                 p['ai_event_type_list'] = []
                 if p['eventType'] in ai_all_event_type:  # 如果是ai消息类型,则分解eventType, 如:123 -> [1,2,3]
                     p['ai_event_type_list'] = list(map(int, str(p['eventType'])))
+                p['ai_event_type_list'] += EquipmentInfoService.get_combo_types(p['eventType'])
                 res.append(p)
             return response.json(0, {'datas': res, 'count': count})
         except Exception as e:
+            print(repr(e))
             return response.json(474)
 
+
+
     def do_update_interval(self, userID, request_dict, response):
         uid = request_dict.get('uid', None)
         interval = request_dict.get('interval', None)

+ 9 - 2
Controller/EquipmentManager.py

@@ -15,7 +15,7 @@ from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY, BASE_DIR
 from Ansjer.config import PUSH_REDIS_ADDRESS
 from Controller.DetectController import DetectControllerView
 from Model.models import Device_User, Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel, \
-    UIDCompanySerialModel, iotdeviceInfoModel, UidChannelSetModel, LogModel, UnicomDeviceInfo, SysMsgModel
+    UIDCompanySerialModel, iotdeviceInfoModel, UidChannelSetModel, LogModel, UnicomDeviceInfo, SysMsgModel, CountryModel
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -254,6 +254,7 @@ def modifyUserEquipmentInterface(request):
                     'ip': CommonService.get_ip_address(request),
                     'channel': ChannelIndex,
                     'nickname': nickname,
+                    'device_type': qs[0].Type
                 }
                 UidSetModel.objects.create(**uid_set_create_dict)
             Device_Info.objects.filter(UID=uid).update(NickName=nickname)
@@ -415,7 +416,7 @@ def addInterface(request):
                 isShare = False
 
                 is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'primaryUserID',
-                                                                                    'primaryMaster')
+                                                                                    'primaryMaster', 'Type')
 
                 if main_exist.exists():
                     vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
@@ -469,6 +470,10 @@ def addInterface(request):
                     # 判断是否有用户绑定
                     nowTime = int(time.time())
                     us_qs = UidSetModel.objects.filter(uid=UID)
+                    ip = CommonService.get_ip_address(request)
+                    ipInfo = CommonService.getIpIpInfo(ip, 'CN')
+                    country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
+                    country = country_qs.exists() if country_qs[0]['id'] else 0
                     if not us_qs.exists():
                         uid_set_create_dict = {
                             'uid': UID,
@@ -478,6 +483,8 @@ def addInterface(request):
                             'channel': ChannelIndex,
                             'nickname': NickName,
                             'version': version,
+                            'device_type': is_bind[0]['Type'],
+                            'tb_country': country
                         }
                         UidSetModel.objects.create(**uid_set_create_dict)
                     else:

+ 7 - 1
Controller/EquipmentManagerV2.py

@@ -9,7 +9,7 @@ from django.views.generic.base import View
 
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel, UidChannelSetModel, \
-    iotdeviceInfoModel, UIDModel
+    iotdeviceInfoModel, UIDModel, CountryModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -74,6 +74,10 @@ class EquipmentManagerV2(View):
                     # if is_bind:
                     #     return response.json(15)
                     try:
+                        ip = CommonService.get_ip_address(request)
+                        ipInfo = CommonService.getIpIpInfo(ip, 'CN')
+                        country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
+                        country = country_qs.exists() if country_qs[0]['id'] else 0
                         # 判断是否有用户绑定
                         nowTime = int(time.time())
                         us_qs = UidSetModel.objects.filter(uid=UID)
@@ -85,6 +89,8 @@ class EquipmentManagerV2(View):
                                 'ip': CommonService.get_ip_address(request),
                                 'channel': ChannelIndex,
                                 'nickname': NickName,
+                                'device_type': Type,
+                                'tb_country': country
                             }
                             UidSetModel.objects.create(**uid_set_create_dict)
                         else:

+ 18 - 7
Controller/EquipmentManagerV3.py

@@ -175,10 +175,7 @@ class EquipmentManagerV3(View):
                 ip = CommonService.get_ip_address(request)
                 ipInfo = CommonService.getIpIpInfo(ip, 'CN')
                 country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
-                if country_qs.exists():
-                    country = country_qs[0]['id']
-                else:
-                    country = '0'
+                country = country_qs.exists() if country_qs[0]['id'] else 0
                 region_id = Device_Region().get_device_region(ip)
                 region_alexa = 'CN' if region_id == 1 else 'ALL'
                 uid_set_create_dict = {
@@ -351,7 +348,7 @@ class EquipmentManagerV3(View):
                 isShare = False
 
                 is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'primaryUserID',
-                                                                                    'primaryMaster')
+                                                                                    'primaryMaster', 'Type')
 
                 if main_exist.exists():
                     vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
@@ -409,6 +406,9 @@ class EquipmentManagerV3(View):
                     UidSet_id = us_qs.first().id
                 else:
                     ip = CommonService.get_ip_address(request)
+                    ipInfo = CommonService.getIpIpInfo(ip, 'CN')
+                    country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
+                    country = country_qs.exists() if country_qs[0]['id'] else 0
                     region_id = Device_Region().get_device_region(ip)
                     region_alexa = 'CN' if region_id == 1 else 'ALL'
                     uid_set_create_dict = {
@@ -420,6 +420,8 @@ class EquipmentManagerV3(View):
                         'nickname': NickName,
                         'version': version,
                         'region_alexa': region_alexa,
+                        'device_type': is_bind[0]['Type'],
+                        'tb_country': country
                     }
                     UidSet = UidSetModel.objects.create(**uid_set_create_dict)
                     UidSet_id = UidSet.id
@@ -555,15 +557,21 @@ class EquipmentManagerV3(View):
                     if deviceData.__contains__('NickName'):
                         us_qs.update(nickname=nickname)
                 else:
+                    ip = CommonService.get_ip_address(request)
+                    ipInfo = CommonService.getIpIpInfo(ip, 'CN')
+                    country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
+                    country = country_qs.exists() if country_qs[0]['id'] else 0
                     ChannelIndex = qs[0].ChannelIndex
                     nowTime = int(time.time())
                     uid_set_create_dict = {
                         'uid': uid,
                         'addTime': nowTime,
                         'updTime': nowTime,
-                        # 'ip': CommonService.get_ip_address(request),
+                        'ip': CommonService.get_ip_address(request),
                         'channel': ChannelIndex,
                         'nickname': nickname,
+                        'device_type': qs[0].Type,
+                        'tb_country': country
                     }
                     UidSetModel.objects.create(**uid_set_create_dict)
                 di_qs = Device_Info.objects.filter(UID=uid)
@@ -646,7 +654,8 @@ class EquipmentManagerV3(View):
                                                                     'SpaceSum', 'MirrorType', 'RecordType',
                                                                     'OutdoorModel', 'WIFIName', 'isDetector',
                                                                     'DetectorRank', 'is_human', 'is_custom_voice',
-                                                                    'is_ptz', 'double_wifi', 'is_ai', 'mobile_4g')
+                                                                    'is_ptz', 'double_wifi', 'is_ai', 'mobile_4g',
+                                                                    'ai_type')
         uv_dict = {}
         for us in us_qs:
             uv_dict[us['uid']] = {
@@ -675,6 +684,7 @@ class EquipmentManagerV3(View):
                 'double_wifi': us['double_wifi'],
                 'mobile4G': us['mobile_4g'],
                 'is_ai': us['is_ai'],
+                'ai_type': us['ai_type'],
                 'isSupportFourPoint': us['isSupportFourPoint'],
             }
             # 从uid_channel里面取出通道配置信息
@@ -781,6 +791,7 @@ class EquipmentManagerV3(View):
                 p['double_wifi'] = uv_dict[p_uid]['double_wifi']
                 p['mobile4G'] = uv_dict[p_uid]['mobile4G']
                 p['is_ai'] = uv_dict[p_uid]['is_ai']
+                p['ai_type'] = uv_dict[p_uid]['ai_type']
                 p['isSupportFourPoint'] = uv_dict[p_uid]['isSupportFourPoint']
                 # 设备昵称 调用影子信息昵称,先阶段不可
                 if uv_dict[p_uid]['nickname']:

+ 107 - 3
Controller/FeedBack.py

@@ -19,8 +19,11 @@ import oss2
 from django.db import transaction
 from django.views.generic.base import View
 
-from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
-from Model.models import FeedBackModel, StatResModel
+from Ansjer.config import CONFIG_TEST, CONFIG_CN, CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_REGION, \
+    AWS_SES_ACCESS_REGION
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
+from Model.models import FeedBackModel, StatResModel, PushInaccurateFeedback
+from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -58,6 +61,10 @@ class FeedBackView(View):
                 return self.do_delete_by_admin(userID, request_dict, response)
             elif operation == 'deleteImage':
                 return self.do_delete_image(userID, request_dict, response)
+            elif operation == 'submitted':  # 查询是否已提交过推送图片反馈
+                return self.submitted(userID, request_dict, response)
+            elif operation == 'pushInaccurate':     # 用户反馈推送不准确
+                return self.push_inaccurate(userID, request_dict, response)
             else:
                 return response.json(414)
         else:
@@ -298,4 +305,101 @@ class FeedBackView(View):
         print(names)
         print(len(names))
 
-        return response.json(0)
+        return response.json(0)
+
+    @staticmethod
+    def submitted(user_id, request_dict, response):
+        equipment_info_id = request_dict.get('equipment_info_id', None)
+        uid = request_dict.get('uid', None)
+        is_st = request_dict.get('is_st', None)
+        event_type = request_dict.get('event_type', None)
+        event_time = request_dict.get('event_time', None)
+        channel = request_dict.get('channel', None)
+        if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):
+            return response.json(444)
+        is_st, event_type, channel = int(is_st), int(event_type), int(channel)
+        # 查询数据是否存在
+        push_inaccurate_feedback_qs = PushInaccurateFeedback.objects.filter(equipment_info_id=equipment_info_id,
+                                                                            user_id=user_id, uid=uid, channel=channel,
+                                                                            event_type=event_type, event_time=event_time,
+                                                                            is_st=is_st)
+        if push_inaccurate_feedback_qs.exists():
+            return response.json(174)
+        # 查询图片是否存在s3
+        if CONFIG_INFO == CONFIG_TEST or CONFIG_INFO == CONFIG_CN:  # 国内
+            region_name = AWS_IOT_SES_ACCESS_CHINA_REGION
+            aws_access_key_id = AWS_ACCESS_KEY_ID[0]
+            secret_access_key = AWS_SECRET_ACCESS_KEY[0]
+            bucket = 'push'
+        else:  # 国外
+            region_name = AWS_SES_ACCESS_REGION
+            aws_access_key_id = AWS_ACCESS_KEY_ID[1]
+            secret_access_key = AWS_SECRET_ACCESS_KEY[1]
+            bucket = 'foreignpush'
+        if is_st == 3:
+            key = '{uid}/{channel}/{event_time}_0.jpeg'.format(uid=uid, channel=channel, event_time=event_time)
+        else:
+            key = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid, channel=channel, event_time=event_time)
+        try:
+            s3 = AmazonS3Util(
+                aws_access_key_id=aws_access_key_id,
+                secret_access_key=secret_access_key,
+                region_name=region_name
+            )
+            have_object = s3.get_object(bucket, key)
+            if have_object:
+                return response.json(0)
+            else:
+                return response.json(174)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @staticmethod
+    def push_inaccurate(user_id, request_dict, response):
+        equipment_info_id = request_dict.get('equipment_info_id', None)
+        uid = request_dict.get('uid', None)
+        is_st = request_dict.get('is_st', None)
+        event_type = request_dict.get('event_type', None)
+        event_time = request_dict.get('event_time', None)
+        channel = request_dict.get('channel', None)
+        if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):
+            return response.json(444)
+
+        if CONFIG_INFO == CONFIG_TEST or CONFIG_INFO == CONFIG_CN:  # 国内
+            region_name = AWS_IOT_SES_ACCESS_CHINA_REGION
+            aws_access_key_id = AWS_ACCESS_KEY_ID[0]
+            secret_access_key = AWS_SECRET_ACCESS_KEY[0]
+            source_bucket = 'push'
+        else:  # 国外
+            region_name = AWS_SES_ACCESS_REGION
+            aws_access_key_id = AWS_ACCESS_KEY_ID[1]
+            secret_access_key = AWS_SECRET_ACCESS_KEY[1]
+            source_bucket = 'foreignpush'
+
+        now_time = int(time.time())
+        is_st = int(is_st)
+        try:
+            s3 = AmazonS3Util(
+                aws_access_key_id=aws_access_key_id,
+                secret_access_key=secret_access_key,
+                region_name=region_name
+            )
+            if is_st != 3:
+                file_path = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid,
+                                                                       channel=channel,
+                                                                       event_time=event_time)
+                s3.copy_obj(source_bucket, 'push-inaccurate', file_path)
+            else:
+                for index in range(3):
+                    file_path = '{uid}/{channel}/{event_time}_{index}.jpeg'.format(uid=uid,
+                                                                                   channel=channel,
+                                                                                   event_time=event_time,
+                                                                                   index=index)
+                    s3.copy_obj(source_bucket, 'push-inaccurate', file_path)
+            PushInaccurateFeedback.objects.create(equipment_info_id=equipment_info_id,
+                                                  user_id=user_id, event_type=event_type,
+                                                  uid=uid, channel=channel, add_time=now_time,
+                                                  is_st=is_st, event_time=event_time)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))

+ 3 - 1
Controller/MessagePush/EquipmentMessagePush.py

@@ -13,7 +13,7 @@ import time
 from django.db import transaction
 from django.views.generic.base import View
 
-from Model.models import AiService, UidSetModel
+from Model.models import AiService, UidSetModel, Device_Info
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -80,11 +80,13 @@ class EquipmentMessagePushView(View):
                 n_time = int(time.time())
                 status = int(status)
                 uid_set_qs = UidSetModel.objects.filter(uid=uid)
+                device_qs = Device_Info.objects.filter(UID=uid)
                 if not uid_set_qs.exists():
                     qs_data = {
                         'uid': uid,
                         'addTime': n_time,
                         'updTime': n_time,
+                        'device_type': device_qs[0].Type if device_qs.exists() else 0
                     }
                     if interval:
                         qs_data['new_detect_interval'] = int(interval)

+ 58 - 13
Controller/RegionController.py

@@ -1,15 +1,13 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 import json
 import time
 
+from django.db.models import F
 from django.views import View
 
-from Model.models import RegionModel, CountryModel, LanguageModel, CountryLanguageModel
-from Object.uidManageResponseObject import uidManageResponseObject
+from Model.models import RegionModel, CountryModel, LanguageModel, CountryLanguageModel, App_Info
 from Object.TokenObject import TokenObject
+from Object.uidManageResponseObject import uidManageResponseObject
 from Service.CommonService import CommonService
-from Service.ModelService import ModelService
 
 
 class RegionView(View):
@@ -27,13 +25,13 @@ class RegionView(View):
         return self.validate(request_dict, operation)
 
     def validate(self, request_dict, operation):
-        token = TokenObject(request_dict.get('token', None))
-
         response = uidManageResponseObject()
-
         if operation == 'getCountry':
             return self.get_country(request_dict, response)
+        elif operation == 'getCountryAndDomainName':
+            return self.get_country_and_domain_name(request_dict, response)
         else:
+            token = TokenObject(request_dict.get('token', None))
             if token.code != 0:
                 return response.json(token.code)
 
@@ -71,7 +69,7 @@ class RegionView(View):
         else:
             return response.json(444)
 
-    def do_update(self,  userID, request_dict, response):
+    def do_update(self, userID, request_dict, response):
         # perm = ModelService.check_perm_uid_manage(userID, 0)
         # if not perm:
         #     return response.json(309)
@@ -155,9 +153,10 @@ class RegionView(View):
             now_time = int(time.time())
             # countries = json.loads(countries)
 
-            country_qs =CountryModel.objects.filter(number=number)
+            country_qs = CountryModel.objects.filter(number=number)
             if not country_qs.exists():
-                country = CountryModel(number=number, region_id=region_id, add_time=now_time, update_time=now_time, country_name=countries)
+                country = CountryModel(number=number, region_id=region_id, add_time=now_time, update_time=now_time,
+                                       country_name=countries)
                 country.save()
             else:
                 country = country_qs[0]
@@ -166,7 +165,8 @@ class RegionView(View):
                 country_language_qs = CountryLanguageModel.objects.filter(language_id=item, country_id=country.id)
                 if not country_language_qs.exists():
                     countryLanguage = CountryLanguageModel(
-                        country_name=res[item], language_id=item, country_id=country.id, add_time=now_time, update_time=now_time)
+                        country_name=res[item], language_id=item, country_id=country.id, add_time=now_time,
+                        update_time=now_time)
                     countryLanguage.save()
             return response.json(0)
         else:
@@ -242,7 +242,8 @@ class RegionView(View):
             count = region_qs.count()
 
             if region_qs.exists():
-                region_qs = region_qs[start: end].values('country_id', 'country_name', 'country__number', 'country__region__name', 'add_time', 'update_time')
+                region_qs = region_qs[start: end].values('country_id', 'country_name', 'country__number',
+                                                         'country__region__name', 'add_time', 'update_time')
             else:
                 region_qs = []
             res = {
@@ -281,6 +282,50 @@ class RegionView(View):
         else:
             return response.json(444)
 
+    @staticmethod
+    def get_country_and_domain_name(request_dict, response):
+        lang = request_dict.get('lang', None)
+        app_bundle_id = request_dict.get('app_bundle_id', None)
+        time_stamp = request_dict.get('time_stamp', None)
+        time_stamp_token = request_dict.get('time_stamp_token', None)
+
+        if not all([lang, app_bundle_id, time_stamp, time_stamp_token]):
+            return response.json(444)
+
+        try:
+            # 校验时间戳token
+            time_stamp_token = int(CommonService.decode_data(time_stamp_token))
+            time_stamp = int(time_stamp)
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+            if time_stamp_token != time_stamp or distance > 60000 or distance < -60000:  # 为了全球化时间控制在一天内
+                return response.json(404)
+
+            # 查询app名
+            app_inf_qs = App_Info.objects.filter(appBundleId=app_bundle_id).values('appName')
+            if not app_inf_qs.exists():
+                return response.json(173)
+
+            lang_qs = LanguageModel.objects.filter(lang=lang)
+            if not lang_qs.exists():
+                lang_qs = LanguageModel.objects.filter(lang='en')
+            lang = lang_qs[0]
+
+            # 根据app名返回相应域名
+            app_name = app_inf_qs[0]['appName']
+            country_qs = CountryLanguageModel.objects.filter(language_id=lang.id).annotate(
+                country_number=F('country__number'), push_api=F('country__region__push_api'))
+            if 'Zosi' in app_name:
+                country_qs = country_qs.annotate(api=F('country__region__zosi_api'))
+            elif 'Loocam' in app_name:
+                country_qs = country_qs.annotate(api=F('country__region__loocam_api'))
+            else:
+                country_qs = country_qs.annotate(api=F('country__region__api'))
+            country_qs = country_qs.values('country_name', 'country_number', 'api', 'push_api')
+            return response.json(0, list(country_qs))
+        except Exception as e:
+            return response.json(500, repr(e))
+
     def get_country_info(self, userID, request_dict, response):
         # perm = ModelService.check_perm_uid_manage(userID, 0)
         # if not perm:

+ 55 - 0
Controller/TestApi.py

@@ -146,6 +146,8 @@ class testView(View):
             return self.write_redis_list(response)
         elif operation == 'read_redis_list':
             return self.read_redis_list(response)
+        elif operation == 'playM3u8':
+            return self.play_m3u8(request_dict, response)
         else:
             return 123
 
@@ -1010,3 +1012,56 @@ class testView(View):
                 serial = redis_obj.lpop('serial_redis_list')
                 print(serial)
         return response.json(0)
+
+    @staticmethod
+    def play_m3u8(request_dict, response):  # 根据sts播放m3u8 视频流
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        storeTime = request_dict.get('time', None)
+        now_time = int(time.time())
+        try:
+            vh_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=storeTime, endTime__gte=now_time). \
+                values("sec", "fg", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")
+            if not vh_qs.exists():
+                return response.json(173)
+            fg = vh_qs[0]['fg']
+            bucket__region = vh_qs[0]['bucket__region']
+            bucket_name = vh_qs[0]['bucket__bucket']
+
+            session = Session(
+                aws_access_key_id=AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]],
+                aws_secret_access_key=AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]],
+                region_name=bucket__region
+            )
+            conn = session.client('s3')
+            playlist_entries = []
+            fg = int(fg)
+            # ts_count = fg & 0xf
+            # fg 64位整型,低四位代表ts文件总数,然后进行位运算,一次移四位,每四位转为十进制即为当前ts文件的秒数
+            for i in range(15):
+                shift = (i + 1) * 4
+                duration = (fg >> shift) & 0xf
+                if duration > 0:
+                    tsFile = '{uid}/vod{channel}/{time}/ts{i}.ts'. \
+                        format(uid=uid, channel=channel, time=storeTime, i=i)
+                    response_url = conn.generate_presigned_url(
+                        'get_object',
+                        Params={
+                            'Bucket': bucket_name,
+                            'Key': tsFile
+                        },
+                        ExpiresIn=24*60*60
+                    )
+                    playlist_entries.append({
+                        'name': response_url,
+                        'duration': duration,
+                    })
+
+            playlist = PlaylistGenerator(playlist_entries).generate()
+            response = HttpResponse(playlist)
+            response['Content-Type'] = 'application/octet-stream'
+            response['Content-Disposition'] = 'attachment;filename="play.m3u8"'
+            return response
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 7 - 1
Controller/UidSetController.py

@@ -26,7 +26,7 @@ from django.views.generic.base import View
 
 from Model.models import UidSetModel, Device_User, Device_Info, UidPushModel, Equipment_Info, UID_Preview, UID_Bucket, \
     VodHlsModel, Order_Model, OssCrdModel, UidUserModel, UidChannelSetModel, User_Brand, ExperienceContextModel, \
-    StsCrdModel, Unused_Uid_Meal, UIDMainUser, LogModel
+    StsCrdModel, Unused_Uid_Meal, UIDMainUser, LogModel, CountryModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -339,6 +339,10 @@ class UidSetView(View):
                 di_qs = Device_Info.objects.filter(UID=uid, userID=userID)
                 if di_qs.exists():
                     di = di_qs[0]
+                    ip = CommonService.get_ip_address(request)
+                    ipInfo = CommonService.getIpIpInfo(ip, 'CN')
+                    country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
+                    country = country_qs.exists() if country_qs[0]['id'] else 0
                     nowTime = int(time.time())
                     uid_set_create_dict = {
                         'uid': di.UID,
@@ -347,6 +351,8 @@ class UidSetView(View):
                         'ip': CommonService.get_ip_address(request),
                         'channel': di.ChannelIndex,
                         'nickname': di.NickName,
+                        'device_type': di.Type,
+                        'tb_country': country
                     }
                     for k, v in deviceData.items():
                         uid_set_create_dict[k] = v

+ 12 - 3
Controller/UidUser.py

@@ -21,7 +21,7 @@ from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
-from Model.models import UID_Bucket, UID_Preview, UidSetModel
+from Model.models import UID_Bucket, UID_Preview, UidSetModel, CountryModel
 from Model.models import UidUserModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -87,7 +87,9 @@ def addInterface(request):
                                 'updTime': nowTime,
                                 'ip': CommonService.get_ip_address(request),
                                 'channel': ChannelIndex,
-                                'nickname': NickName}
+                                'nickname': NickName,
+                                'device_type': Type
+                            }
                             UidSetModel.objects.create(**uid_set_create_dict)
                     except Exception as e:
                         return response.json(10, repr(e))
@@ -429,6 +431,10 @@ def v3addInterface(request):
                         # 判断影子信息
                         nowTime = int(time.time())
                         us_qs = UidSetModel.objects.filter(uid=UID)
+                        ip = CommonService.get_ip_address(request)
+                        ipInfo = CommonService.getIpIpInfo(ip, 'CN')
+                        country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
+                        country = country_qs.exists() if country_qs[0]['id'] else 0
                         if not us_qs.exists():
                             uid_set_create_dict = {
                                 'uid': UID,
@@ -436,7 +442,10 @@ def v3addInterface(request):
                                 'updTime': nowTime,
                                 'ip': CommonService.get_ip_address(request),
                                 'channel': ChannelIndex,
-                                'nickname': NickName}
+                                'nickname': NickName,
+                                'device_type': Type,
+                                'tb_country': country
+                            }
                             UidSetModel.objects.create(**uid_set_create_dict)
                     except Exception as e:
                         return response.json(10, repr(e))

+ 117 - 33
Controller/UserController.py

@@ -1337,55 +1337,89 @@ class v2forgetPwdCodeView(TemplateView):
         email = request_dict.get('email', None)
         country_code = request_dict.get('country_code', None)
         sign_name = request_dict.get('sign_name', None)
+        number = request_dict.get('number', None)
+        lang = request_dict.get('lang', None)
+        if lang is None:
+            return response.json(444, 'lang')
         if phone is not None:
             phone = phone.strip()
             if country_code is None:
-                return self.do_send_phone_code(phone, response, sign_name)
+                return self.do_send_phone_code(phone, response, sign_name, number, lang)
             else:
-                return self.do_v2_send_phone_code(country_code, phone, response, sign_name)
+                return self.do_v2_send_phone_code(country_code, phone, response, sign_name, number, lang)
         elif email is not None:
-            return self.do_send_email_code(email, response)
+            return self.do_send_email_code(email, response, number, lang)
         else:
             return response.json(444, 'phone')
 
-    def do_send_phone_code(self, phone, response, sign_name):
+    def do_send_phone_code(self, phone, response, sign_name, number, lang):
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(100)
         user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone))
         if not user_qs.exists():
             return response.json(102)
+        users = user_qs.values().first()
+        res = {}
         reds = RedisObject()
         reds_key = str(phone) + '_forgetPwdResetCode'
         resetCode = reds.get_data(key=reds_key)
         reds_key_ttl = reds.get_ttl(key=reds_key)
         if reds_key_ttl > 240 and resetCode:
-            # if identifyingCode :
             return response.json(90)
-        # if resetCode is True:
-        #     return response.json(120)
         resetCode = RandomStr(6, True)
         if sign_name == 'zosi':
             sign_ms = '周视'
         else:
             sign_ms = 'Ansjer'
+
+        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        region_country = users['region_country']
+        lang_id = LanguageModel.objects.filter(lang=lang).values('id')
+        region_qs = CountryLanguageModel.objects.filter(country_id=region_country, language_id=lang_id[0]['id']).values(
+            'country_name')
+        res['region'] = region_qs[0]['country_name'] if region_qs.exists() else ''
         aliSms = AliSmsObject()
-        res = aliSms.send_code_sms(phone=phone, code=resetCode, sign_name=sign_ms,
-                                   temp_msg='SMS_151675019')
-        if res["Code"] == "OK":
-            if not reds.set_data(key=reds_key, val=resetCode, expire=300):
-                return response.json(10, '生成缓存错误')
-            return response.json(0)
+        if not number or number == '0':
+            res['status'] = 0
+            user_qs.update(last_login=now_time, language=lang)
+            msg_res = aliSms.send_code_sms(phone=phone, code=resetCode, sign_name=sign_ms,
+                                           temp_msg='SMS_151675019')
+            if msg_res["Code"] == "OK":
+                if not reds.set_data(key=reds_key, val=resetCode, expire=300):
+                    res['Message'] = '生成缓存错误'
+                    return response.json(10, res)
+            else:
+                res['Message'] = msg_res['Message']
+                return response.json(10, res)
         else:
-            return response.json(10, res["Message"])
+            number = int(number)
+            if number != region_country and region_country != 0:
+                res['status'] = 1
+                user_qs.update(last_login=now_time, language=lang)
+            else:
+                res['status'] = 0
+                user_qs.update(last_login=now_time, language=lang, region_country=number)
+                msg_res = aliSms.send_code_sms(phone=phone, code=resetCode, sign_name=sign_ms,
+                                               temp_msg='SMS_151675019')
+                if msg_res["Code"] == "OK":
+                    if not reds.set_data(key=reds_key, val=resetCode, expire=300):
+                        res['Message'] = '生成缓存错误'
+                        return response.json(10, res)
+                else:
+                    res['Message'] = msg_res['Message']
+                    return response.json(10, res)
+        return response.json(0, res)
 
-    def do_v2_send_phone_code(self, country_code, phone, response, sign_name):
+    def do_v2_send_phone_code(self, country_code, phone, response, sign_name, number, lang):
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(100)
         user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone))
         if not user_qs.exists():
             return response.json(102)
+        users = user_qs.values().first()
+        res = {}
         reds = RedisObject()
         reds_key = str(phone) + '_forgetPwdResetCode'
         resetCode = reds.get_data(key=reds_key)
@@ -1408,23 +1442,54 @@ class v2forgetPwdCodeView(TemplateView):
             temp_msg = 'SMS_172200051'
             rec_phone = str(country_code) + str(phone)
             sign_ms = 'Ansjer'
-
-        res = aliSms.send_code_sms(phone=rec_phone, code=resetCode, sign_name=sign_ms,
-                                   temp_msg=temp_msg)
-        if res["Code"] == "OK":
-            if not reds.set_data(key=reds_key, val=resetCode, expire=300):
-                return response.json(10, '生成缓存错误')
-            return response.json(0)
+        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        region_country = users['region_country']
+        lang_id = LanguageModel.objects.filter(lang=lang).values('id')
+        region_qs = CountryLanguageModel.objects.filter(country_id=region_country, language_id=lang_id[0]['id']).values(
+            'country_name')
+        res['region'] = region_qs[0]['country_name'] if region_qs.exists() else ''
+        if not number or number == '0':
+            res['status'] = 0
+            user_qs.update(last_login=now_time, language=lang)
+            msg_res = aliSms.send_code_sms(phone=rec_phone, code=resetCode, sign_name=sign_ms,
+                                           temp_msg=temp_msg)
+            if msg_res["Code"] == "OK":
+                if not reds.set_data(key=reds_key, val=resetCode, expire=300):
+                    res['Message'] = '生成缓存错误'
+                    return response.json(10, res)
+            else:
+                res['Message'] = msg_res['Message']
+                return response.json(10, res)
         else:
-            return response.json(10, res["Message"])
+            number = int(number)
+            if number != region_country and region_country != 0:
+                res['status'] = 1
+                user_qs.update(last_login=now_time, language=lang)
+            else:
+                res['status'] = 0
+                user_qs.update(last_login=now_time, language=lang, region_country=number)
+                msg_res = aliSms.send_code_sms(phone=rec_phone, code=resetCode, sign_name=sign_ms,
+                                               temp_msg=temp_msg)
+                if msg_res["Code"] == "OK":
+                    if not reds.set_data(key=reds_key, val=resetCode, expire=300):
+                        res['Message'] = '生成缓存错误'
+                        return response.json(10, res)
+                else:
+                    res['Message'] = msg_res['Message']
+                    return response.json(10, res)
+
+        return response.json(0, res)
 
-    def do_send_email_code(self, email, response):
+
+    def do_send_email_code(self, email, response, number, lang):
         data_valid = DataValid()
         if data_valid.email_validate(email) is not True:
             return response.json(105)
         user_qs = Device_User.objects.filter(Q(userEmail=email) | Q(username=email))
         if not user_qs.exists():
             return response.json(104)
+        users = user_qs.values().first()
+        res = {}
         reds = RedisObject()
         resetCode = reds.get_data(key=email + '_forgetPwdResetCode')
         if resetCode is True:
@@ -1435,14 +1500,35 @@ class v2forgetPwdCodeView(TemplateView):
         send_data = TemplateService.email_message(type='forgetCode', language=response.lang)
         send_body = send_data['body'].format(userEmail=email, email_valid_code=resetCode)
         ses = SesClassObject()
+        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        region_country = users['region_country']
+        lang_id = LanguageModel.objects.filter(lang=lang).values('id')
+        region_qs = CountryLanguageModel.objects.filter(country_id=region_country, language_id=lang_id[0]['id']).values(
+            'country_name')
+        res['region'] = region_qs[0]['country_name'] if region_qs.exists() else ''
+        if not number or number == '0':
+            res['status'] = 0
+            user_qs.update(last_login=now_time, language=lang)
+            send_res = ses.alyEmailCode(send_address_list=[email], subject=send_data['title'], body=send_body)
+            if send_res is not True:
+                reds.del_data(key=email + '_forgetPwdResetCode')
+                res['Message'] = '发送邮件失败'
+                return response.json(44, res)
+        else:
+            number = int(number)
+            if number != region_country and region_country != 0:
+                res['status'] = 1
+                user_qs.update(last_login=now_time, language=lang)
+            else:
+                res['status'] = 0
+                user_qs.update(last_login=now_time, language=lang, region_country=number)
+                send_res = ses.alyEmailCode(send_address_list=[email], subject=send_data['title'], body=send_body)
+                if send_res is not True:
+                    reds.del_data(key=email + '_forgetPwdResetCode')
+                    res['Message'] = '发送邮件失败'
+                    return response.json(44, res)
 
-        # send_res = ses.send_email(send_address_list=[email], subject=send_data['title'], body=send_body)
-        # 阿里云发送邮箱
-        send_res = ses.alyEmailCode(send_address_list=[email], subject=send_data['title'], body=send_body)
-        if send_res is not True:
-            reds.del_data(key=email + '_forgetPwdResetCode')
-            return response.json(44)
-        return response.json(0)
+        return response.json(0, res)
 
 
 # 忘记密码v2
@@ -4269,5 +4355,3 @@ class DeleteUser(View):
         if user_qs.exists():
             user_qs.delete()
         return response.json(0)
-
-

+ 36 - 0
Model/models.py

@@ -563,6 +563,25 @@ class EquipmentInfoSunday(models.Model):
         app_label = "PushModel"
 
 
+class PushInaccurateFeedback(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键id')
+    equipment_info_id = models.CharField(default='', max_length=32, verbose_name='推送表id')
+    user_id = models.CharField(default='', max_length=32, verbose_name='用户id')
+    uid = models.CharField(default='', max_length=32, verbose_name='uid')
+    channel = models.PositiveSmallIntegerField(default=1, verbose_name='通道')
+    # 事件类型, 1,2,3,3:aws rekognition识别,其他为设备识别
+    event_type = models.IntegerField(default=0, verbose_name='事件类型')
+    event_time = models.CharField(default='', max_length=16, verbose_name='事件时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否多图')  # 1:单图, 3:多图
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'push_inaccurate_feedback'
+        verbose_name = '推送不准确反馈表'
+        verbose_name_plural = verbose_name
+        app_label = 'PushModel'
+
+
 class Ai_Push_Info(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     devUid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备ID')
@@ -1191,6 +1210,7 @@ class UidSetModel(models.Model):
     new_detect_interval = models.IntegerField(blank=True, verbose_name='新加-消息提醒间隔', default=60)  # 秒
     tb_country = models.IntegerField(blank=True, default=0, verbose_name='国家')
     device_type = models.SmallIntegerField(default=0, verbose_name='设备类型')
+    ai_type = models.SmallIntegerField(default=0, verbose_name='检测类型')
 
     class Meta:
         db_table = 'uid_set'
@@ -2892,6 +2912,22 @@ class DeviceUidAlgorithmType(models.Model):
         verbose_name_plural = verbose_name
 
 
+class DeviceTypeAlgorithmInfo(models.Model):
+    id = models.AutoField(primary_key=True)
+    device_name = models.CharField(blank=True, max_length=32, default='', verbose_name='设备类型名称')
+    device_type = models.SmallIntegerField(default=0, verbose_name='设备类型')
+    algorithm_type = models.SmallIntegerField(default=0, verbose_name='算法类型')
+    type_icon = models.CharField(blank=True, max_length=255, default='', verbose_name='设备类型icon')
+    device_link = models.CharField(blank=True, max_length=255, default='', verbose_name='设备购买链接')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'device_type_algorithm_info'
+        verbose_name = '设备类型关联算法'
+        verbose_name_plural = verbose_name
+
+
 class VodHlsSummary(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='回放汇总列表主键')
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)

+ 26 - 0
Object/AWS/AmazonS3Util.py

@@ -110,3 +110,29 @@ class AmazonS3Util:
                 "存储桶 {} 不存在,或者你没有权限.".format(bucket_name))
             exists = False
         return exists
+
+    def get_object(self, bucket, key):
+        """
+        获取对象
+        @param bucket: 存储桶
+        @param key: 文件
+        @return : boolean
+        """
+        try:
+            self.client_conn.get_object(Bucket=bucket, Key=key)
+            return True
+        except self.client_conn.exceptions.NoSuchKey:
+            return False
+
+    def copy_obj(self, source_bucket, to_bucket, file_key):
+        """
+        复制对象
+        @param source_bucket: 原存储桶
+        @param file_key: 文件名称
+        @param to_bucket: 新存储桶
+        """
+        source_dict = {
+            'Bucket': source_bucket,
+            'Key': file_key
+        }
+        self.session_conn.meta.client.copy(source_dict, to_bucket, file_key)

+ 102 - 0
Service/EquipmentInfoService.py

@@ -169,6 +169,8 @@ class EquipmentInfoService:
         if event_type:
             # 多类型查询
             eventTypeList = cls.get_comb_event_type(event_type)
+            eventTypeList += cls.get_combo_type_bins(event_type)
+            eventTypeList = list(set(eventTypeList))
             qs = qs.filter(event_type__in=eventTypeList)
         if start_time and end_time:
             qs = qs.filter(event_time__range=(start_time, end_time))
@@ -309,3 +311,103 @@ class EquipmentInfoService:
         logger.info(type(equipment_info))
         logger.info(equipment_info)
         return equipment_info
+
+    @classmethod
+    def get_combo_types(cls, event_type):
+        """
+        获取设备算法组合类型
+        @param event_type:
+        @return:
+        """
+        try:
+            types = []
+            res_type = cls.is_type_exist(event_type)
+            if res_type == 0:
+                return types
+            combo_types = [51, 57, 58, 60]
+            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(combo_types[i])
+            return types
+
+        except Exception as e:
+            print('推送错误异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return event_type
+
+    @classmethod
+    def is_type_exist(cls, event_type):
+        """
+        判断类型是否存在列表
+        @param event_type:
+        @return: 0 or event_type
+        """
+        combo_types = cls.combo_type_all()
+        if not combo_types:
+            return 0
+        if event_type in combo_types:
+            return event_type
+        return 0
+
+    @staticmethod
+    def combo_type_all():
+        """
+        获取所有组合类型
+        @return:
+        """
+        arr_list = []
+        event_arr = []
+        resource_list = [1, 2, 4, 8]
+        for i in range(2, len(resource_list) + 1):
+            arr_list += list(itertools.combinations(resource_list, i))  # 表示从 [1,2,3,4] 中选出 3个元素的组合情况
+        for i in arr_list:
+            val = 0
+            for item in i:
+                val += item
+            event_arr.append(int(EquipmentInfoService.dec_to_bin(val)))
+        return event_arr
+
+    @staticmethod
+    def dec_to_bin(num):
+        """
+        十进制转二进制
+        @param num:
+        @return:
+        """
+        result = ""
+        while num != 0:
+            ret = num % 2
+            num //= 2
+            result = str(ret) + result
+        return result
+
+    @staticmethod
+    def get_combo_type_bins(event_type):
+        """
+        获取组合类型二进制列表
+        @param event_type: 标签类型
+        @return:
+        """
+        res_list = []
+        try:
+            if ',' in event_type:
+                res_list = event_type.split(',')
+                res_list = [int(i.strip()) for i in res_list]
+            else:
+                res_list = [int(event_type)]
+            combo_types = [51, 57, 58, 60]
+            for e_item in res_list:
+                bins = EquipmentInfoService.combo_type_all()
+                if e_item in combo_types:
+                    event_label = combo_types.index(e_item) + 1
+                    for item in bins:
+                        val = str(item)
+                        val_len = len(val)
+                        if val_len >= event_label and int(val[val_len - event_label]) == 1:
+                            res_list.append(int(item))
+            return res_list
+        except Exception as e:
+            print('推送错误异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return res_list