Переглянути джерело

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer into peng

peng 2 роки тому
батько
коміт
952d0d6346

+ 42 - 10
AdminController/DeviceManagementController.py

@@ -125,10 +125,11 @@ class DeviceManagement(View):
         if not all([model, type, lang, name, sort]):
             return response.json(444)
         type = int(type)
+        nowTime = int(time.time())
 
         try:
             with transaction.atomic():
-                # 判断包是否存在,并创建
+                # 判断包是否存在
                 new_bundle_list = []
                 for bundle_name in app_bundle_name:
                     if not bundle_name == '':
@@ -170,13 +171,29 @@ class DeviceManagement(View):
                     app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
                     app_bundle_qs = app_bundle_qs[0]['id']
                     app_device_type_qs.appbundle_set.add(app_bundle_qs)
+                device_type_qs = DeviceTypeModel.objects.filter(model=model, type=type)
+                if device_type_qs.exists():
+                    device_type_qs.update(updata_time=nowTime)
+                else:
+                    DeviceTypeModel.objects.create(name=name, model=model, type=type, ptz_type=model, icon=fileName,
+                                                   add_time=nowTime, update_time=nowTime)
                 return response.json(0)
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
 
-    @staticmethod
-    def get_device_info_list(request_dict, response):
+    @classmethod
+    def add_device_type(cls, name, model, type, fileName):
+        nowTime = int(time.time())
+        data = {
+            'name': name,
+            'model': model,
+            'type': type,
+            'icon': fileName
+        }
+
+    @classmethod
+    def get_device_info_list(cls, request_dict, response):
         pageNo = request_dict.get('pageNo', None)
         pageSize = request_dict.get('pageSize', None)
         UID = request_dict.get('UID', None)
@@ -235,16 +252,17 @@ class DeviceManagement(View):
                             device_info_list["datas"][k]['fields']['Type'] = device_type_qs[0]['name']
                         uid_set_qs = UidSetModel.objects.filter(
                             uid=device_info_list["datas"][k]['fields']['UID']).values('is_alexa', 'ip', 'version',
-                                                                                      'is_ai', 'is_human', 'cloud_vod')
+                                                                                      'is_ai', 'is_human', 'cloud_vod',
+                                                                                      'ucode', 'device_type')
                         if uid_set_qs.exists():
                             isAlexa = '是' if uid_set_qs[0]['is_alexa'] else '否'
                             isHuman = '是' if uid_set_qs[0]['is_human'] else '否'
-                            if uid_set_qs[0]['cloud_vod'] == 2:
-                                cloud_vod = '不支持'
-                            elif uid_set_qs[0]['cloud_vod'] == 1:
-                                cloud_vod = '开启'
+                            cloud_vod = CommonService.is_cloud_device(uid_set_qs[0]['ucode'],
+                                                                      uid_set_qs[0]['device_type'])
+                            if cloud_vod:
+                                cloud_vod = '支持'
                             else:
-                                cloud_vod = '关闭'
+                                cloud_vod = '不支持'
                             if uid_set_qs[0]['is_ai'] == 2:
                                 isAI = '不支持'
                             elif uid_set_qs[0]['is_ai'] == 1:
@@ -257,6 +275,20 @@ class DeviceManagement(View):
                             device_info_list["datas"][k]['fields']['cloudVod'] = cloud_vod
                             device_info_list["datas"][k]['fields']['ip'] = uid_set_qs[0]['ip']
                             device_info_list["datas"][k]['fields']['version'] = uid_set_qs[0]['version']
+                        uid_bucket_qs = UID_Bucket.objects.filter(
+                            uid=device_info_list["datas"][k]['fields']['UID']).values('status')
+                        #  0是关闭,1是开启
+                        if uid_bucket_qs.exists():
+                            res = []
+                            for uid_bucket in uid_bucket_qs:
+                                status = uid_bucket['status']
+                                res.append(status)
+                            if 1 in res:
+                                device_info_list["datas"][k]['fields']['status'] = 1
+                            else:
+                                device_info_list["datas"][k]['fields']['status'] = 0
+                        else:
+                            device_info_list["datas"][k]['fields']['status'] = 0
             return response.json(0, {'list': device_info_list, 'total': total})
         except Exception as e:
             print(e)
@@ -661,7 +693,7 @@ class DeviceManagement(View):
             return response.json(0, res)
         except Exception as e:
             print(e)
-            return  response.json(500, (repr(e)))
+            return response.json(500, (repr(e)))
 
     @staticmethod
     def get_app_device_type_list(request_dict, response):

+ 5 - 10
AdminController/ServeManagementController.py

@@ -103,7 +103,7 @@ class serveManagement(View):
             elif operation == 'getCloudUserList':  # 获取云存用户信息
                 return self.getCloudUserList(request_dict, response)
             elif operation == 'deviceAttritionAlert':  # 流失预警
-                return self.deviceAttritionAlert(request_dict, response, request)
+                return self.deviceAttritionAlert(request_dict, response)
             elif operation == 'deactivationPackage':  # 停用套餐
                 return self.deactivationPackage(request_dict, response)
             elif operation == 'paypal-cycle-cancel':  # 取消循环扣款
@@ -1427,7 +1427,7 @@ class serveManagement(View):
             return response.json(500, repr(e))
 
     @classmethod
-    def deviceAttritionAlert(cls, request_dict, response, request):
+    def deviceAttritionAlert(cls, request_dict, response):
         """
         流失预警界面
         @param request_dict:
@@ -1521,16 +1521,11 @@ class serveManagement(View):
                         uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ucode', 'device_type')
                         ucode = uid_set_qs[0]['ucode'] if uid_set_qs.exists() else ''
                         device_type = uid_set_qs[0]['device_type'] if uid_set_qs.exists() else ''
-                        if len(ucode) > 4:
-                            number = ucode[-4]
-                        else:
-                            continue
-                        device_type_qs = DeviceTypeModel.objects.filter(type=device_type).values('model')
-                        model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
+                        cloud_vod = CommonService.is_cloud_device(ucode, device_type)
                         #  判断设备是否为ipc设备和是否支持云存
-                        if model == 2 and number in ['4', '5']:
+                        if cloud_vod:
                             device_number += 1
-                            item['device_number'] = device_number
+                    item['device_number'] = device_number
                 item['other_device'] = 0
                 not_upload_list.append(item)
             return response.json(0, {'result_list': not_upload_list, 'total': total})

+ 9 - 0
Ansjer/Config/gatewaySensorConfig.py

@@ -9,6 +9,15 @@
 SMART_SCENE_TOPIC = 'loocam/gateway_sensor/smart_scene/{}'
 GET_SCENE_TOPIC = 'loocam/gateway_sensor/get_scene/{}'
 
+# 智能场景事件
+SCENE_EVENT_CREATE = 1
+SCENE_EVENT_EDIT = 2
+SCENE_EVENT_DELETE = 3
+
+# 智能场景状态
+SCENE_STATUS_ON = 1
+SCENE_STATUS_OFF = 0
+
 # 传感器类型
 SENSOR_TYPE = {
     'door_magnet': 215,

+ 5 - 4
Controller/SensorGateway/EquipmentFamilyController.py

@@ -155,9 +155,10 @@ class EquipmentFamilyView(View):
         if not all([nick_name, serial_number, device_type]):
             return response.json(444, {'param': 'nick_name, serial_number, device_type'})
         device_info_qs = Device_Info.objects.filter(serial_number=serial_number, isShare=False)
-        if device_info_qs:
-            qs = device_info_qs.values('NickName', 'userID_id', 'userID__userEmail', 'userID__phone',
-                                       'userID__username', 'userID__NickName')
+        device_info_qs = device_info_qs.values('NickName', 'userID_id', 'userID__userEmail', 'userID__phone',
+                                               'userID__username', 'userID__NickName')
+        if device_info_qs.exists():
+            qs = device_info_qs
             nickname = qs[0]['NickName']
             device_user_id = qs[0]['userID_id']
             if device_user_id == user_id:
@@ -772,7 +773,7 @@ class EquipmentFamilyView(View):
             'created_time': now_time
         }
 
-        category = 0 if device_type == 200 or 201 else 1
+        category = 0 if device_type == 200 or device_type == 201 else 1
         data['category'] = category
         # 查询类别排序
         family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=int(family_id), category=category).values(

+ 29 - 24
Controller/SensorGateway/GatewayDeviceController.py

@@ -16,7 +16,8 @@ from django.views.generic.base import View
 
 from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC
 from Ansjer.config import CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
-    AWS_IOT_SES_ACCESS_CHINA_REGION
+    AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
 from Ansjer.config import LOGGER
 from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
 from Controller.SensorGateway.SmartSocketController import SmartSocketView
@@ -45,6 +46,10 @@ class GatewayDeviceView(View):
 
     def validation(self, request_dict, request, operation):
 
+        if operation == 'bind-serial-user':
+            response = ResponseObject()
+            return self.bind_serial_user(request_dict, response)
+
         token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
         lang = request_dict.get('lang', None)
         response = ResponseObject(lang) if lang else ResponseObject(token.lang)
@@ -63,8 +68,6 @@ class GatewayDeviceView(View):
             return self.my_family_list(user_id, response)
         elif operation == 'location-setting':
             return self.device_location_setting(user_id, request_dict, response)
-        elif operation == 'bind-serial-user':
-            return self.bind_serial_user(user_id, request_dict, response)
         elif operation == 'get-serial-user':
             return self.get_serial_user(user_id, request_dict, response)
 
@@ -283,20 +286,22 @@ class GatewayDeviceView(View):
         下发消息到设备
         """
         try:
+            # 更新影子为离线状态
+            data = {
+                "state": {"reported": {"online": 0}}
+            }
+            iot_data_plane = None
             thing_name = 'LC_' + serial_number
             if 'test' == CONFIG_INFO or CONFIG_INFO == 'cn':
-                # 创建IoT客户端
                 iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_CHINA_ID,
                                                         AWS_IOT_SES_ACCESS_CHINA_SECRET,
                                                         AWS_IOT_SES_ACCESS_CHINA_REGION)
-                # 更新影子为离线状态
-                data = {
-                    "state": {
-                        "reported": {
-                            "online": 0
-                        }
-                    }
-                }
+
+            elif 'us' == CONFIG_INFO:
+                iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_SECRET,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA)
+            if iot_data_plane:
                 res = iot_data_plane.update_thing_shadow(thing_name, data)
                 LOGGER.info('删除插座更新设备影子状态{}'.format(res))
             #  下发设备进行重置
@@ -461,17 +466,19 @@ class GatewayDeviceView(View):
         data['accumulatedTime'] = socket_power_qs[0]['accumulated_time']
         return data
 
-    @classmethod
-    def bind_serial_user(cls, user_id, request_dict, response):
+    @staticmethod
+    def bind_serial_user(request_dict, response):
         """
-        绑定网关序列号和用户id
-        @param user_id: 用户id
+        绑定序列号和用户id
         @param request_dict: 请求参数字典
+        @request_dict user_id: 用户id
+        @request_dict serial_number: 序列号
         @param response: 响应对象
         @return:
         """
-        serial_number = request_dict.get('serialNumber')
-        if not serial_number:
+        user_id = request_dict.get('user_id')
+        serial_number = request_dict.get('serial_number')
+        if not all([user_id, serial_number]):
             return response.json(444)
         try:
             redis_obj = RedisObject()
@@ -480,11 +487,10 @@ class GatewayDeviceView(View):
                 return response.json(178)
             return response.json(0)
         except Exception as e:
-            print(e)
-            return response.json(177, repr(e))
+            return response.json(500, repr(e))
 
-    @classmethod
-    def get_serial_user(cls, user_id, request_dict, response):
+    @staticmethod
+    def get_serial_user(user_id, request_dict, response):
         """
         获取用户id绑定网关序列号
         @param user_id: 用户id
@@ -499,8 +505,7 @@ class GatewayDeviceView(View):
                 return response.json(173)
             return response.json(0, {'serialNumber': serial_number})
         except Exception as e:
-            print(e)
-            return response.json(177, repr(e))
+            return response.json(500, repr(e))
 
     @classmethod
     def update_socket(cls, serial_number, device_name, user_id, region):

+ 9 - 5
Controller/SensorGateway/SmartSceneController.py

@@ -12,7 +12,8 @@ from django.db import transaction
 from django.db.models import F, Q, Count
 from django.views import View
 
-from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SENSOR_TYPE, EVENT_TYPE
+from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SENSOR_TYPE, EVENT_TYPE, SCENE_EVENT_CREATE, \
+    SCENE_EVENT_EDIT, SCENE_EVENT_DELETE, SCENE_STATUS_ON, SCENE_STATUS_OFF
 from Model.models import FamilyRoomDevice, GatewaySubDevice, FamilyRoom, SmartScene, EffectiveTime, Device_Info, \
     SceneLog
 from Object.ResponseObject import ResponseObject
@@ -222,7 +223,8 @@ class SmartSceneView(View):
                 'updated_time': now_time,
             }
             msg = {
-                'scene_status': 1
+                'scene_event': SCENE_EVENT_CREATE,
+                'scene_status': SCENE_STATUS_ON
             }
             # 处理设置时间
             if is_all_day is not None:
@@ -313,7 +315,7 @@ class SmartSceneView(View):
                     return response.json(444, {'error param': 'invalid isAllDay'})
 
                 msg['time'] = time_dict
-                msg['smart_scene_id'] = smart_scene_qs.id
+                msg['scene_id'] = smart_scene_qs.id
                 task_list = []
                 for task in tasks_list:
                     task_temp = {
@@ -466,8 +468,9 @@ class SmartSceneView(View):
             return response.json(444, {'error param': 'smartSceneId and status'})
         try:
             smart_scene_id = int(smart_scene_id)
-            scene_status = 1 if is_enable == 'True' else 0
+            scene_status = SCENE_STATUS_ON if is_enable == 'True' else SCENE_STATUS_OFF
             msg = {
+                'scene_event': SCENE_EVENT_EDIT,
                 'scene_id': smart_scene_id,
                 'scene_status': scene_status
             }
@@ -737,7 +740,8 @@ class SmartSceneView(View):
                 for smart_scene_id in smart_scene_id_list:
                     # 通知设备删除场景id
                     msg = {
-                        'smart_scene_delete': int(smart_scene_id)
+                        'scene_event': SCENE_EVENT_DELETE,
+                        'scene_id': int(smart_scene_id)
                     }
                     success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
                     try:

+ 4 - 4
Controller/SensorGateway/SmartSocketController.py

@@ -569,21 +569,21 @@ class SmartSocketView(View):
         startTime = request_dict.get('startTime', None)
         endTime = request_dict.get('endTime', None)
         if not all([page, size, serial_number]):
-            return response.json(444, {'errno: page or size or serial_number'})
+            return response.json(444, 'errno: page or size or serial_number')
         page, size = int(page), int(size)
 
         try:
             if startTime is None and endTime is None:
                 scene_log_qs = SceneLog.objects.filter(device_id=serial_number).values('tasks', 'status',
                                                                                        'created_time').order_by(
-                    '-created_time')[(page - 1) * size:page * size]
+                    '-created_time', '-id')[(page - 1) * size:page * size]
                 if not scene_log_qs.exists():
                     return response.json(0, [])
             else:
                 scene_log_qs = SceneLog.objects.filter(device_id=serial_number, created_time__gte=startTime,
                                                        created_time__lt=endTime).values('tasks', 'status',
                                                                                         'created_time').order_by(
-                    '-created_time')[(page - 1) * size:page * size]
+                    '-created_time','-id')[(page - 1) * size:page * size]
                 if not scene_log_qs.exists():
                     return response.json(0, [])
             log_list = []
@@ -883,4 +883,4 @@ class SmartSocketView(View):
         try:
             requests.post(url=url, data=data, timeout=5)
         except Exception as e:
-            print(repr(e))
+            print(repr(e))

+ 37 - 43
MiddleWare/requestRecord.py

@@ -22,56 +22,50 @@ class RequestRecordMiddleware(MiddlewareMixin):
             method = request.method
             url = request.path
 
-            # 获取请求参数并转为字符串
-            if method == 'GET':
-                parameter = json.dumps(request.GET.dict())
-            elif method == 'POST':
-                parameter = json.dumps(request.POST.dict())
-            else:
-                parameter = ''
-            content = eval(str(response.content, 'utf-8'))  # bytes 转为 dict
-            # 请求是否成功
-            if content['code']:
-                old_key = 'code'
-                new_key = 'result_code'
-                new_dict = {new_key: content.pop(old_key)}
-                for key, value in content.items():
-                    new_dict[key] = value
-                content = new_dict.copy()
-            if content['result_code'] != 0:
-                LOGGER.info('请求路径:{}, 请求方式:{}, 输入数据:{}, 输出数据:{}, 响应状态:{}'.format(url, method, parameter, content, response.status_code))
-            if response.status_code == 500:  # 处理没有捕获异常的情况
-                request_record_data = {
-                    'method': method,
-                    'url': url,
-                    'parameter': parameter,
-                    'execute_time': execute_time,
-                    'status_code': 500,
-                    'reason_phrase': response.reason_phrase,
-                }
-                RequestRecordModel.objects.create(**request_record_data)
-            elif response.content:  # 处理捕获异常的情况
-                # print('content: ', response.content)
-                # content = eval(str(response.content, 'utf-8'))  # bytes 转为 dict
-                # logger = logging.getLogger('info')
-                # logger.info('content: {}'.format(content))
-                error_flag = False
-                reason_phrase = ''
-                if 'result_code' in content and (content['result_code'] == 500 or content['result_code'] == 474):
-                    reason_phrase = content['result']
-                    error_flag = True
-                elif 'code' in content and content['code'] == 500:  # ResponseObject.returntype == 'pc'
-                    reason_phrase = content['data']
-                    error_flag = True
-                if error_flag:
+            if url != '/cloudstorage/getsignsts':
+                # 获取请求参数并转为字符串
+                if method == 'GET':
+                    parameter = json.dumps(request.GET.dict())
+                elif method == 'POST':
+                    parameter = json.dumps(request.POST.dict())
+                else:
+                    parameter = ''
+                content = eval(str(response.content, 'utf-8'))  # bytes 转为 dict
+
+                # 记录响应码不为0的接口日志
+                if ('result_code' in content and content['result_code'] != 0) or \
+                        ('code' in content and content['code'] != 0):
+                    LOGGER.info('请求路径:{}, 请求方式:{}, 输入数据:{}, 输出数据:{}, 响应状态:{}'.
+                                format(url, method, parameter, content, response.status_code))
+
+                if response.status_code == 500:  # 处理没有捕获异常的情况
                     request_record_data = {
                         'method': method,
                         'url': url,
                         'parameter': parameter,
                         'execute_time': execute_time,
                         'status_code': 500,
-                        'reason_phrase': reason_phrase,
+                        'reason_phrase': response.reason_phrase,
                     }
                     RequestRecordModel.objects.create(**request_record_data)
+                elif response.content:  # 处理捕获异常的情况
+                    error_flag = False
+                    reason_phrase = ''
+                    if 'result_code' in content and (content['result_code'] == 500 or content['result_code'] == 474):
+                        reason_phrase = content['result']
+                        error_flag = True
+                    elif 'code' in content and content['code'] == 500:  # ResponseObject.returntype == 'pc'
+                        reason_phrase = content['data']
+                        error_flag = True
+                    if error_flag:
+                        request_record_data = {
+                            'method': method,
+                            'url': url,
+                            'parameter': parameter,
+                            'execute_time': execute_time,
+                            'status_code': 500,
+                            'reason_phrase': reason_phrase,
+                        }
+                        RequestRecordModel.objects.create(**request_record_data)
         finally:
             return response

+ 22 - 3
Model/models.py

@@ -1270,7 +1270,7 @@ class UID_Bucket(models.Model):
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
-    status = models.SmallIntegerField(default=0, verbose_name='状态[0:开启,1:关闭]')
+    status = models.SmallIntegerField(default=0, verbose_name='状态[0:关闭,1:开启]')  # 修改2023/5/15(原状态[0:开启,1:关闭])
     endTime = models.BigIntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updateTime = models.BigIntegerField(verbose_name='更新时间', default=0)
@@ -2095,7 +2095,7 @@ class PermissionModel(models.Model):
 
 class LogModel(models.Model):
     id = models.AutoField(primary_key=True)
-    operation = models.CharField(max_length=100, default='', verbose_name='操作描述')
+    operation = models.TextField(default='', verbose_name='操作描述')
     time = models.IntegerField(default=0, verbose_name='操作时间')
     ip = models.CharField(default='', max_length=24, verbose_name='用户ip')
     user = models.ForeignKey(UserModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户id')
@@ -2884,7 +2884,7 @@ class UnicomCombo(models.Model):
     package_id = models.CharField(default='', max_length=32, verbose_name=u'联通套餐id')
     combo_name = models.CharField(default='', max_length=32, verbose_name=u'套餐名称')
     status = models.SmallIntegerField(default=0, verbose_name='状态{0:开启,1:停用}')
-    # 套餐类型 0:商用,1:初始化赠送,2:赠送套餐
+    # 套餐类型 0:联通商用,1:联通初始化赠送,2:联通赠送套餐,3:五兴电信
     combo_type = models.SmallIntegerField(default=0, verbose_name='套餐类型')
     flow_total = models.IntegerField(default=0, blank=True, verbose_name=u'流量总量值 单位(MB)')
     expiration_days = models.IntegerField(default=0, blank=True, verbose_name=u'有效期天数')
@@ -3529,3 +3529,22 @@ class SocketSchedule(models.Model):
         db_table = 's_socket_schedule'
         verbose_name = '插座排程'
         verbose_name_plural = verbose_name
+
+
+class ExchangeCode(models.Model):
+    id = models.AutoField(primary_key=True)
+    code = models.CharField(max_length=32, unique=True, verbose_name='兑换码')
+    status = models.BooleanField(default=False, verbose_name='状态(0-未使用,1-已使用)')
+    is_down = models.BooleanField(default=0, verbose_name='是否已下载 0-未下载,1-已下载')
+    package_type = models.SmallIntegerField(default=0, verbose_name='套餐包类型 0-联通,1-五兴,2-其它')
+    package_id = models.BigIntegerField(default=0, verbose_name='套餐包id')
+    expire_time = models.IntegerField(default=0, verbose_name='过期时间')
+    # 备用字段
+    spare_1 = models.CharField(default='', blank=True, max_length=64, verbose_name=u'备用字段1')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'exchange_code'
+        verbose_name = '套餐包兑换码'
+        verbose_name_plural = verbose_name

+ 19 - 1
Service/CommonService.py

@@ -17,7 +17,7 @@ from pyipip import IPIPDatabase
 from Ansjer.config import BASE_DIR, SERVER_DOMAIN_SSL, CONFIG_INFO, CONFIG_TEST, CONFIG_CN, SERVER_DOMAIN_TEST, \
     SERVER_DOMAIN_CN, SERVER_DOMAIN_US, CONFIG_US, CONFIG_EUR, SERVER_DOMAIN_LIST, SERVER_DOMAIN_EUR
 from Controller.CheckUserData import RandomStr
-from Model.models import iotdeviceInfoModel, Device_Info, UIDModel
+from Model.models import iotdeviceInfoModel, Device_Info, UIDModel, AppDeviceType
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -727,3 +727,21 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             return content
         elif order_type == 2:
             pass
+
+    @staticmethod
+    def is_cloud_device(ucode, device_type):
+        """
+        设备是否支持云存
+        @param ucode: 设备版本
+        @param device_type: 设备类型
+        """
+        if len(ucode) > 4:
+            number = ucode[-4]
+        else:
+            return False
+        device_type_qs = AppDeviceType.objects.filter(type=device_type).values('model')
+        model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
+        #  判断设备是否为ipc设备和是否支持云存
+        if model == 2 and number in ['4', '5']:
+            return True
+        return False