Răsfoiți Sursa

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

linhaohong 7 luni în urmă
părinte
comite
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, \
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, UidUserModel, ExperienceAiModel, AiService, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, UidUserModel, ExperienceAiModel, AiService, \
     AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, UIDCompanySerialModel, UidPushModel, \
     AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, UIDCompanySerialModel, UidPushModel, \
-    CustomCustomerOrderInfo, CustomCustomerDevice
+    CustomCustomerOrderInfo, CustomCustomerDevice, DeviceVersionInfo
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.AmazonS3Util import AmazonS3Util
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
+from Object.RedisObject import RedisObject
+
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
@@ -102,6 +105,16 @@ class DeviceManagement(View):
                 return self.call_add_app_device_type(request_dict, response, request)
                 return self.call_add_app_device_type(request_dict, response, request)
             elif operation == 'getCustomerDeviceList':  # 查询扫码添加设备列表
             elif operation == 'getCustomerDeviceList':  # 查询扫码添加设备列表
                 return self.get_customer_device_list(request_dict, response)
                 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:
             else:
                 return response.json(444, 'operation')
                 return response.json(444, 'operation')
 
 
@@ -1388,3 +1401,243 @@ class DeviceManagement(View):
 
 
         except Exception as e:
         except Exception as e:
             return response.json(500, f'error_line:{e.__traceback__.tb_lineno}, error_msg:{repr(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.CustomCustomer import CustomCustomerController
 from Controller.MessagePush import EquipmentMessagePush
 from Controller.MessagePush import EquipmentMessagePush
 from Controller.Surveys import CloudStorageController
 from Controller.Surveys import CloudStorageController
-from Controller.UserDevice import UserSubscriptionController
+from Controller.UserDevice import UserSubscriptionController, DeviceVersionInfoController
 from Controller.CampaignController import AdDepartmentController
 from Controller.CampaignController import AdDepartmentController
 from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
 from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
 from django.urls import include
 from django.urls import include
@@ -385,6 +385,8 @@ urlpatterns = [
     re_path('customCustomer/(?P<operation>.*)$', CustomCustomerController.CustomCustomerView.as_view()),
     re_path('customCustomer/(?P<operation>.*)$', CustomCustomerController.CustomCustomerView.as_view()),
     re_path('adDepartment/(?P<operation>.*)$', AdDepartmentController.AdDepartmentView.as_view()),
     re_path('adDepartment/(?P<operation>.*)$', AdDepartmentController.AdDepartmentView.as_view()),
     re_path('shopify/(?P<operation>.*)$', ShopifyController.ShopifyView.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()
         return response.json()
 
 
     @staticmethod
     @staticmethod
-    def get_timezone_by_country(iso2):
+    def get_timezone_by_country(iso2: str):
+        iso2 = iso2.lower()
         timezone_map = {
         timezone_map = {
             "us": "America/New_York",  # 美国时区(例如:纽约)
             "us": "America/New_York",  # 美国时区(例如:纽约)
             "jp": "Asia/Tokyo",  # 日本时区
             "jp": "Asia/Tokyo",  # 日本时区
             "de": "Europe/Berlin",  # 德国时区
             "de": "Europe/Berlin",  # 德国时区
             "uk": "Europe/London",  # 英国时区
             "uk": "Europe/London",  # 英国时区
+            "gb": "Europe/London",  # 英国时区
             "eu": "Europe/Paris",  # 欧盟时区(默认设为法国巴黎)
             "eu": "Europe/Paris",  # 欧盟时区(默认设为法国巴黎)
         }
         }
         # 获取当前时间并格式化时间戳
         # 获取当前时间并格式化时间戳
@@ -122,8 +124,7 @@ class ShopifyView(View):
         else:
         else:
             return response.json(414)
             return response.json(414)
 
 
-    @staticmethod
-    def shopify_login(request_dict, response):
+    def shopify_login(self, request_dict, response):
         email = request_dict.get("email", None)
         email = request_dict.get("email", None)
         password = request_dict.get("password", None)
         password = request_dict.get("password", None)
         account_iso2 = request_dict.get("accountCountry", None)
         account_iso2 = request_dict.get("accountCountry", None)
@@ -145,88 +146,15 @@ class ShopifyView(View):
             return response.json(111)
             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)
             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)
         email = request_dict.get("email", None)
         country_code = request_dict.get("countryCode", None)
         country_code = request_dict.get("countryCode", None)
         password = request_dict.get("password", None)
         password = request_dict.get("password", None)
@@ -283,7 +211,8 @@ class ShopifyView(View):
         }
         }
         Device_User.objects.create(**user_data)
         Device_User.objects.create(**user_data)
         reds.del_data(key=email + '_identifyingCode')
         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):
     def search_account(self, request_dict, response):
         email = request_dict.get("email")
         email = request_dict.get("email")
@@ -505,3 +434,54 @@ class ShopifyView(View):
             return response.json(0)
             return response.json(0)
         except Exception as e:
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(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 = '退款状态'
         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):
 class VodHlsBase(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     id = models.AutoField(primary_key=True, verbose_name='主键')
     uid = models.CharField(max_length=20, db_index=True, verbose_name='uid')
     uid = models.CharField(max_length=20, db_index=True, verbose_name='uid')