Prechádzať zdrojové kódy

shopify代码优化、app根据版本号获取智能算法

linhaohong 7 mesiacov pred
rodič
commit
03256e07e4

+ 254 - 1
AdminController/DeviceManagementController.py

@@ -19,8 +19,11 @@ from Ansjer.config import SERVER_DOMAIN_TEST, SERVER_DOMAIN_CN, SERVER_DOMAIN_US
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, UidUserModel, ExperienceAiModel, AiService, \
     AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, UIDCompanySerialModel, UidPushModel, \
-    CustomCustomerOrderInfo, CustomCustomerDevice
+    CustomCustomerOrderInfo, CustomCustomerDevice, DeviceVersionInfo
 from Object.AWS.AmazonS3Util import AmazonS3Util
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
+from Object.RedisObject import RedisObject
+
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -102,6 +105,16 @@ class DeviceManagement(View):
                 return self.call_add_app_device_type(request_dict, response, request)
             elif operation == 'getCustomerDeviceList':  # 查询扫码添加设备列表
                 return self.get_customer_device_list(request_dict, response)
+
+            # 设备型号版本
+            elif operation == 'getDeviceVerInfo':  # 查询设备型号版本列表
+                return self.get_device_ver_info(request_dict, response)
+            elif operation == 'addDeviceVerInfo':  # 添加设备型号版本
+                return self.add_device_ver_info(request_dict, response)
+            elif operation == 'editDeviceVerInfo':  # 编辑设备型号版本
+                return self.edit_device_ver_info(request_dict, response)
+            elif operation == 'delDeviceVerInfo':  # 删除设备型号版本
+                return self.del_device_ver_info(request_dict, response)
             else:
                 return response.json(444, 'operation')
 
@@ -1388,3 +1401,243 @@ class DeviceManagement(View):
 
         except Exception as e:
             return response.json(500, f'error_line:{e.__traceback__.tb_lineno}, error_msg:{repr(e)}')
+
+    @staticmethod
+    def get_device_ver_info(request_dict, response):
+        d_code = request_dict.get('dCode', None)
+        software_ver = request_dict.get('softwareVer', None)
+        device_type = request_dict.get('deviceType', None)
+        page = request_dict.get('pageNo', 1)  # 当前页码,默认为1
+        page_size = request_dict.get('pageSize', 10)  # 每页显示的记录数,默认为10
+
+        if not all([page, page_size]):
+            return response.json(444)
+        try:
+            device_ver_info_qs = DeviceVersionInfo.objects.all()
+            if d_code:
+                device_ver_info_qs = device_ver_info_qs.filter(d_code__icontains=d_code)
+            if software_ver:
+                device_ver_info_qs = device_ver_info_qs.filter(software_ver__icontains=software_ver)
+            if device_type:
+                device_ver_info_qs = device_ver_info_qs.filter(device_type=device_type)
+
+            # 对TimeAlbum结果进行分页
+            paginator = Paginator(device_ver_info_qs.order_by("-id"), page_size)
+            device_ver_infos = paginator.page(page)  # 获取当前页的数据
+
+            device_ver_info_list = []
+            # 对每个TimeAlbum,查询相关的AlbumMedia
+            for device_ver_info in device_ver_infos:
+                device_ver_info_list.append(
+                    {
+                        'deviceVerId': device_ver_info.id,
+                        'dCode': device_ver_info.d_code,
+                        'softwareVer': device_ver_info.software_ver,
+                        'firmwareVer': device_ver_info.firmware_ver,
+                        'videoCode': device_ver_info.video_code,
+                        'regionAlexa': device_ver_info.region_alexa,
+                        'supportsHumanTracking': device_ver_info.supports_human_tracking,
+                        'supportsCustomVoice': device_ver_info.supports_custom_voice,
+                        'supportsDualBandWifi': device_ver_info.supports_dual_band_wifi,
+                        'supportsFourPoint': device_ver_info.supports_four_point,
+                        'supports4g': device_ver_info.supports_4g,
+                        'supportsPTZ': device_ver_info.supports_ptz,
+                        'supportsAi': device_ver_info.supports_ai,
+                        'supportsCloudStorage': device_ver_info.supports_cloud_storage,
+                        'supportsAlexa': device_ver_info.supports_alexa,
+                        'deviceType': device_ver_info.device_type,
+                        'resolution': device_ver_info.resolution,
+                        'aiType': device_ver_info.ai_type,
+                        'supportsAlarm': device_ver_info.supports_alarm,
+                        'supportsNightVision': device_ver_info.supports_night_vision,
+                        'screenChannels': device_ver_info.screen_channels,
+                        'networkType': device_ver_info.network_type,
+                        'otherFeatures': device_ver_info.other_features,
+                        'createdTime': device_ver_info.created_time,
+                        'updatedTime': device_ver_info.updated_time
+                    }
+                )
+            return response.json(0, {
+                'total': paginator.count,
+                'list': device_ver_info_list,
+            })
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_device_ver_info(request_dict, response):
+        d_code = request_dict.get('dCode', None)
+        software_ver = request_dict.get('softwareVer', None)
+        firmware_ver = request_dict.get('firmwareVer', "")
+        video_code = request_dict.get('videoCode', None)
+        region_alexa = request_dict.get('regionAlexa', "")
+        supports_human_tracking = request_dict.get('supportsHumanTracking', 0)
+        supports_custom_voice = request_dict.get('supportsCustomVoice', 0)
+        supports_dual_band_wifi = request_dict.get('supportsDualBandWifi', 0)
+        supports_four_point = request_dict.get('supportsFourPoint', 0)
+        supports_4g = request_dict.get('supports4g', 0)
+        supports_ptz = request_dict.get('supportsPTZ', 0)
+        supports_ai = request_dict.get('supportsAi', 0)
+        supports_cloud_storage = request_dict.get('supportsCloudStorage', 0)
+        supports_alexa = request_dict.get('supportsAlexa', 0)
+        device_type = request_dict.get('deviceType', None)
+        resolution = request_dict.get('resolution', "")
+        ai_type = request_dict.get('aiType', 0)
+        supports_alarm = request_dict.get('supportsAlarm', None)
+        supports_night_vision = request_dict.get('supportsNightVision', 0)
+        screen_channels = request_dict.get('screenChannels', None)
+        network_type = request_dict.get('networkType', None)
+        other_features = request_dict.get('otherFeatures', None)
+        if not all([d_code, software_ver, video_code,
+                    device_type, supports_alarm,
+                    screen_channels, network_type]
+                   ):
+            return response.json(444)
+        try:
+            now_time = int(time.time())
+            ai_type = int(ai_type)
+            if other_features:
+                other_features = json.loads(other_features)
+            else:
+                other_features = None
+            if DeviceVersionInfo.objects.filter(d_code=d_code, software_ver=software_ver).exists():
+                return response.json(174)
+
+            DeviceVersionInfo.objects.create(
+                d_code=d_code,
+                software_ver=software_ver,
+                firmware_ver=firmware_ver,
+                video_code=video_code,
+                region_alexa=region_alexa,
+                supports_human_tracking=supports_human_tracking,
+                supports_custom_voice=supports_custom_voice,
+                supports_dual_band_wifi=supports_dual_band_wifi,
+                supports_four_point=supports_four_point,
+                supports_4g=supports_4g,
+                supports_ptz=supports_ptz,
+                supports_ai=supports_ai,
+                supports_cloud_storage=supports_cloud_storage,
+                supports_alexa=supports_alexa,
+                device_type=device_type,
+                resolution=resolution,
+                ai_type=ai_type,
+                supports_alarm=supports_alarm,
+                supports_night_vision=supports_night_vision,
+                screen_channels=screen_channels,
+                network_type=network_type,
+                other_features=other_features,
+                created_time=now_time,
+                updated_time=now_time
+            )
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+        return response.json(0)
+
+    @staticmethod
+    def edit_device_ver_info(request_dict, response):
+        device_ver_id = request_dict.get('deviceVerId', None)
+        d_code = request_dict.get('dCode', None)
+        software_ver = request_dict.get('softwareVer', None)
+        firmware_ver = request_dict.get('firmwareVer', "")
+        video_code = request_dict.get('videoCode', None)
+        region_alexa = request_dict.get('regionAlexa', "")
+        supports_human_tracking = request_dict.get('supportsHumanTracking', 0)
+        supports_custom_voice = request_dict.get('supportsCustomVoice', 0)
+        supports_dual_band_wifi = request_dict.get('supportsDualBandWifi', 0)
+        supports_four_point = request_dict.get('supportsFourPoint', 0)
+        supports_4g = request_dict.get('supports4g', 0)
+        supports_ptz = request_dict.get('supportsPTZ', 0)
+        supports_ai = request_dict.get('supportsAi', 0)
+        supports_cloud_storage = request_dict.get('supportsCloudStorage', 0)
+        supports_alexa = request_dict.get('supportsAlexa', 0)
+        device_type = request_dict.get('deviceType', None)
+        resolution = request_dict.get('resolution', "")
+        ai_type = request_dict.get('aiType', 0)
+        supports_alarm = request_dict.get('supportsAlarm', None)
+        supports_night_vision = request_dict.get('supportsNightVision', 0)
+        screen_channels = request_dict.get('screenChannels', None)
+        network_type = request_dict.get('networkType', None)
+        other_features = request_dict.get('otherFeatures', None)
+
+        if not all([device_ver_id, d_code, software_ver, video_code,
+                    device_type, supports_alarm, screen_channels, network_type]):
+            return response.json(444)
+        try:
+            now_time = int(time.time())
+            ai_type = int(ai_type)
+            device_version_info_qs = DeviceVersionInfo.objects.filter(id=device_ver_id).values('d_code', 'software_ver')
+            if not device_version_info_qs.exists():
+                return response.json(173)
+            if other_features:
+                other_features = json.loads(other_features)
+            else:
+                other_features = None
+
+            d_code = device_version_info_qs[0]['d_code']
+            software_ver = device_version_info_qs[0]['software_ver']
+            version_key = RedisKeyConstant.ZOSI_DEVICE_VERSION_INFO.value + software_ver + d_code
+            # 创建Redis对象
+            redis = RedisObject()
+            # 尝试从Redis中获取数据
+            version_info = redis.get_data(version_key)
+            if version_info:
+                # 如果在Redis中找到了数据,删除缓存
+                redis.del_data(version_key)
+
+            device_version_info_qs.update(
+                d_code=d_code,
+                software_ver=software_ver,
+                firmware_ver=firmware_ver,
+                video_code=video_code,
+                region_alexa=region_alexa,
+                supports_human_tracking=supports_human_tracking,
+                supports_custom_voice=supports_custom_voice,
+                supports_dual_band_wifi=supports_dual_band_wifi,
+                supports_four_point=supports_four_point,
+                supports_4g=supports_4g,
+                supports_ptz=supports_ptz,
+                supports_ai=supports_ai,
+                supports_cloud_storage=supports_cloud_storage,
+                supports_alexa=supports_alexa,
+                device_type=device_type,
+                resolution=resolution,
+                ai_type=ai_type,
+                supports_alarm=supports_alarm,
+                supports_night_vision=supports_night_vision,
+                screen_channels=screen_channels,
+                network_type=network_type,
+                other_features=other_features,
+                created_time=now_time,
+                updated_time=now_time
+            )
+
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def del_device_ver_info(request_dict, response):
+        device_ver_id = request_dict.get('deviceVerId', None)
+        if not device_ver_id:
+            return response.json(444)
+        device_version_info_qs = DeviceVersionInfo.objects.filter(id=device_ver_id)
+        if not device_version_info_qs.exists():
+            return response.json(174)
+
+        device_version_info = device_version_info_qs.first()  # Get the first instance
+        d_code = device_version_info.d_code
+        software_ver = device_version_info.software_ver
+        version_key = RedisKeyConstant.ZOSI_DEVICE_VERSION_INFO.value + software_ver + d_code
+        # 创建Redis对象
+        redis = RedisObject()
+        # 尝试从Redis中获取数据
+        version_info = redis.get_data(version_key)
+        if version_info:
+            # 如果在Redis中找到了数据,删除缓存
+            redis.del_data(version_key)
+        device_version_info_qs.delete()
+        return response.json(0)
+

+ 3 - 1
Ansjer/urls.py

@@ -29,7 +29,7 @@ from Controller.Cron import CronTaskController
 from Controller.CustomCustomer import CustomCustomerController
 from Controller.MessagePush import EquipmentMessagePush
 from Controller.Surveys import CloudStorageController
-from Controller.UserDevice import UserSubscriptionController
+from Controller.UserDevice import UserSubscriptionController, DeviceVersionInfoController
 from Controller.CampaignController import AdDepartmentController
 from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
 from django.urls import include
@@ -385,6 +385,8 @@ urlpatterns = [
     re_path('customCustomer/(?P<operation>.*)$', CustomCustomerController.CustomCustomerView.as_view()),
     re_path('adDepartment/(?P<operation>.*)$', AdDepartmentController.AdDepartmentView.as_view()),
     re_path('shopify/(?P<operation>.*)$', ShopifyController.ShopifyView.as_view()),
+    # 根据版本号获取设备配置信息
+    re_path('open/device/configuration/(?P<operation>.*)', DeviceVersionInfoController.DeviceVersionInfoView.as_view()),
 
 
     # 后台界面接口 -----------------------------------------------------

+ 64 - 84
Controller/ShopifyController.py

@@ -71,12 +71,14 @@ class ShopifyMultipass:
         return response.json()
 
     @staticmethod
-    def get_timezone_by_country(iso2):
+    def get_timezone_by_country(iso2: str):
+        iso2 = iso2.lower()
         timezone_map = {
             "us": "America/New_York",  # 美国时区(例如:纽约)
             "jp": "Asia/Tokyo",  # 日本时区
             "de": "Europe/Berlin",  # 德国时区
             "uk": "Europe/London",  # 英国时区
+            "gb": "Europe/London",  # 英国时区
             "eu": "Europe/Paris",  # 欧盟时区(默认设为法国巴黎)
         }
         # 获取当前时间并格式化时间戳
@@ -122,8 +124,7 @@ class ShopifyView(View):
         else:
             return response.json(414)
 
-    @staticmethod
-    def shopify_login(request_dict, response):
+    def shopify_login(self, request_dict, response):
         email = request_dict.get("email", None)
         password = request_dict.get("password", None)
         account_iso2 = request_dict.get("accountCountry", None)
@@ -145,88 +146,15 @@ class ShopifyView(View):
             return response.json(111)
 
         # 根据条件选择配置键
-        if shopify_country:
-            timestamp = ShopifyMultipass.get_timezone_by_country(shopify_country)
-            secret_key = f"{shopify_country}_multipass_secret"
-            multipass_secret = SHOPIFY_CONFIG[secret_key]
-            if shopify_country == "eu":
-                customer_data = {
-                    "email": email,
-                    "created_at": timestamp,
-                }
-                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-                redirect_url = f"https://eu.zositech.com/account/login/multipass/{token}"
-            elif shopify_country == "uk":
-                customer_data = {
-                    "email": email,
-                    "created_at": timestamp,
-                }
-                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-                redirect_url = f"https://www.zositech.co.uk/account/login/multipass/{token}"
-            elif shopify_country == "us":
-                customer_data = {
-                    "email": email,
-                    "created_at": timestamp,
-                }
-                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-                redirect_url = f"https://www.zositech.com/account/login/multipass/{token}"
-            else:
-                customer_data = {
-                    "email": email,
-                    "created_at": timestamp,
-                }
-                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-                redirect_url = f"https://www.zositech.{shopify_country}/account/login/multipass/{token}"
-            return response.json(0, redirect_url)
-        elif account_iso2 in ["de", "jp"]:
-            timestamp = ShopifyMultipass.get_timezone_by_country(account_iso2)
-            secret_key = f"{account_iso2}_multipass_secret"
-            multipass_secret = SHOPIFY_CONFIG[secret_key]
-            customer_data = {
-                "email": email,
-                "created_at": timestamp,
-            }
-            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-            redirect_url = f"https://www.zositech.{account_iso2}/account/login/multipass/{token}"
-            return response.json(0, redirect_url)
-        elif account_iso2 == "uk":
-            timestamp = ShopifyMultipass.get_timezone_by_country(account_iso2)
-            secret_key = f"{account_iso2}_multipass_secret"
-            multipass_secret = SHOPIFY_CONFIG[secret_key]
-            customer_data = {
-                "email": email,
-                "created_at": timestamp,
-            }
-            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-            redirect_url = f"https://www.zositech.co.uk/account/login/multipass/{token}"
-            return response.json(0, redirect_url)
-        elif CONFIG_INFO == CONFIG_EUR:
-            timestamp = ShopifyMultipass.get_timezone_by_country("eu")
-            secret_key = "eu_multipass_secret"
-            multipass_secret = SHOPIFY_CONFIG[secret_key]
-            customer_data = {
-                "email": email,
-                "created_at": timestamp,
-            }
-            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-            redirect_url = f"https://eu.zositech.com/account/login/multipass/{token}"
-            return response.json(0, redirect_url)
-        elif CONFIG_INFO == CONFIG_US:
-            timestamp = ShopifyMultipass.get_timezone_by_country("us")
-            secret_key = "us_multipass_secret"
-            multipass_secret = SHOPIFY_CONFIG[secret_key]
-            customer_data = {
-                "email": email,
-                "created_at": timestamp,
-            }
-            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
-            redirect_url = f"https://www.zositech.com/account/login/multipass/{token}"
+        shopify_domain = shopify_country
+        iso2 = account_iso2
+        redirect_url = self.shopify_login_url(shopify_domain, iso2, email)
+
+        if redirect_url:
             return response.json(0, redirect_url)
-        else:
-            return response.json(444)
+        return response.json(444)
 
-    @staticmethod
-    def shopify_register(request_dict, response):
+    def shopify_register(self, request_dict, response):
         email = request_dict.get("email", None)
         country_code = request_dict.get("countryCode", None)
         password = request_dict.get("password", None)
@@ -283,7 +211,8 @@ class ShopifyView(View):
         }
         Device_User.objects.create(**user_data)
         reds.del_data(key=email + '_identifyingCode')
-        return response.json(0)
+        redirect_url = self.shopify_login_url("", country_code, email)
+        return response.json(0, redirect_url)
 
     def search_account(self, request_dict, response):
         email = request_dict.get("email")
@@ -505,3 +434,54 @@ class ShopifyView(View):
             return response.json(0)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def shopify_login_url(shopify_domain: str, iso2: str, email: str):
+        iso2 = iso2.lower()
+        shopify_domain = shopify_domain.lower()
+        shopify_country_to_use = shopify_domain or iso2
+        timestamp = ShopifyMultipass.get_timezone_by_country(shopify_country_to_use)
+        customer_data = {
+            "email": email,
+            "created_at": timestamp,
+        }
+        if shopify_domain:
+            secret_key = f"{shopify_domain}_multipass_secret"
+            multipass_secret = SHOPIFY_CONFIG[secret_key]
+            if shopify_domain == "eu":
+                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+                redirect_url = f"https://eu.zositech.com/account/login/multipass/{token}"
+            elif shopify_domain == "uk":
+                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+                redirect_url = f"https://www.zositech.co.uk/account/login/multipass/{token}"
+            elif shopify_domain == "us":
+                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+                redirect_url = f"https://www.zositech.com/account/login/multipass/{token}"
+            else:
+                token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+                redirect_url = f"https://www.zositech.{shopify_domain}/account/login/multipass/{token}"
+            return redirect_url
+        elif iso2 in ["de", "jp"]:
+            secret_key = f"{iso2}_multipass_secret"
+            multipass_secret = SHOPIFY_CONFIG[secret_key]
+            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+            redirect_url = f"https://www.zositech.{iso2}/account/login/multipass/{token}"
+        elif iso2 == "gb":
+            secret_key = f"uk_multipass_secret"
+            multipass_secret = SHOPIFY_CONFIG[secret_key]
+            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+            redirect_url = f"https://www.zositech.co.uk/account/login/multipass/{token}"
+        elif CONFIG_INFO == CONFIG_EUR:
+            secret_key = "eu_multipass_secret"
+            multipass_secret = SHOPIFY_CONFIG[secret_key]
+            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+            redirect_url = f"https://eu.zositech.com/account/login/multipass/{token}"
+        elif CONFIG_INFO == CONFIG_US:
+            secret_key = "us_multipass_secret"
+            multipass_secret = SHOPIFY_CONFIG[secret_key]
+            token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+            redirect_url = f"https://www.zositech.com/account/login/multipass/{token}"
+        else:
+            return ""
+
+        return redirect_url

+ 107 - 0
Controller/UserDevice/DeviceVersionInfoController.py

@@ -0,0 +1,107 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : DeviceVersionInfoController.py
+@Time    : 2024/11/20 14:20
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import json
+
+from django.http import QueryDict
+from django.views import View
+from Ansjer.config import LOGGER
+
+from Model.models import DeviceVersionInfo
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
+from Object.RedisObject import RedisObject
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+class DeviceVersionInfoView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def delete(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        delete = QueryDict(request.body)
+        if not delete:
+            delete = request.GET
+        return self.validation(delete, request, operation)
+
+    def put(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        put = QueryDict(request.body)
+        return self.validation(put, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        response = ResponseObject('cn')
+        tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        if tko.code != 0:
+            return response.json(tko.code)
+        response.lang = tko.lang
+        userID = tko.userID
+        if operation == 'getInfo':
+            return self.get_device_version_info(userID, request, request_dict, response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def get_device_version_info(cls, user_id, request, request_dict, response):
+        # 从请求字典中获取uid和version
+        uid = request_dict.get('uid')
+        version = request_dict.get('version')
+
+        # 检查version是否存在
+        if not version:
+            return response.json(444)  # 错误代码:没有提供version
+
+        try:
+            # 示例输入字符串
+            ip = CommonService.get_ip_address(request)
+            LOGGER.info(f'获取设备版本配置信息 user: {user_id}, uid: {uid}, version: {version}, ip: {ip} ')
+
+            # 从右侧分割字符串,获取版本和设备代码
+            ver, d_code = version.rsplit('.', 1)  # 使用从右到左分割
+            ver = ver.replace('V', '')  # 移除版本前的'V'
+
+            # 创建Redis对象
+            redis = RedisObject()
+            # 构建Redis键
+            version_key = RedisKeyConstant.ZOSI_DEVICE_VERSION_INFO.value + ver + d_code
+
+            # 尝试从Redis中获取数据
+            version_info = redis.get_data(version_key)
+            if version_info:
+                # 如果在Redis中找到了数据,直接返回
+                return response.json(0, json.loads(version_info))
+
+            # 从数据库查询设备版本信息
+            device_version_qs = DeviceVersionInfo.objects.filter(d_code=d_code, software_ver=ver).values()
+            if not device_version_qs.exists():
+                return response.json(173)  # 错误代码:未找到设备版本信息
+
+            # 从QuerySet中获取设备信息
+            device_info = device_version_qs
+
+            # 将设备信息序列化为JSON
+            device_json = json.dumps(device_info[0])
+
+            # 将数据写入Redis,以便后续使用
+            redis.set_data(version_key, device_json, 60 * 60 * 24)  # 设置TTL为24小时
+            # 返回设备信息
+            return response.json(0, device_info[0])
+
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 32 - 0
Model/models.py

@@ -5189,6 +5189,38 @@ class InAppRefund(models.Model):
         verbose_name = '退款状态'
 
 
+class DeviceVersionInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    d_code = models.CharField(max_length=32, verbose_name='设备产品码', default='')
+    software_ver = models.CharField(max_length=32, verbose_name='设备版本', default='')
+    firmware_ver = models.CharField(max_length=32, verbose_name='固件版本', default='')
+    video_code = models.SmallIntegerField(default=0, verbose_name='编码类型')  # 0:264,1:265
+    region_alexa = models.CharField(max_length=8, verbose_name='设备Alexa区域', default='ALL', null=True)  # ALL, CN, EU, US
+    supports_human_tracking = models.BooleanField(default=False, verbose_name='是否支持人形追踪')
+    supports_custom_voice = models.BooleanField(default=False, verbose_name='是否支持自定义语音')
+    supports_dual_band_wifi = models.BooleanField(default=False, verbose_name='是否支持双频Wifi')
+    supports_four_point = models.BooleanField(default=False, verbose_name='是否支持预置点')
+    supports_4g = models.BooleanField(default=False, verbose_name='是否支持4G')
+    supports_ptz = models.BooleanField(default=False, verbose_name='是否支持云台')
+    supports_ai = models.BooleanField(default=False, verbose_name='是否支持AI')
+    supports_cloud_storage = models.BooleanField(default=False, verbose_name='是否支持云存储')
+    supports_alexa = models.BooleanField(default=False, verbose_name='是否支持Alexa')
+    device_type = models.SmallIntegerField(default=0, verbose_name='设备类型')
+    resolution = models.CharField(max_length=20, verbose_name='分辨率', default='')
+    ai_type = models.IntegerField(default=0, verbose_name='检测类型')  # 智能算法值
+    supports_alarm = models.BooleanField(default=False, verbose_name='是否支持声光报警')
+    supports_night_vision = models.BooleanField(default=False, verbose_name='是否支持夜视模式')
+    screen_channels = models.IntegerField(default=1, verbose_name='屏幕通道数')  # 默认为0
+    network_type = models.IntegerField(default=1, verbose_name='网络类型')  # 1:无线,2:有线,3:无线+有线,4:4G
+    other_features = models.JSONField(null=True, verbose_name='其它功能')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'device_version_info'
+        verbose_name = '设备版本信息'
+
+
 class VodHlsBase(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     uid = models.CharField(max_length=20, db_index=True, verbose_name='uid')