Browse Source

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

peng 9 months ago
parent
commit
f25521907a

+ 3 - 1
Ansjer/urls.py

@@ -32,7 +32,7 @@ from Controller.CustomCustomer import CustomCustomerController
 from Controller.MessagePush import EquipmentMessagePush
 from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
 from Controller.Surveys import CloudStorageController
-from Controller.UserDevice import UserDeviceShareController, UserSubscriptionController
+from Controller.UserDevice import UserDeviceShareController, UserSubscriptionController, DeviceVersionInfoController
 from Controller.CampaignController import AppCampaignController, AdDepartmentController
 from Controller.UserDevice import SerialNumberCheckController
 from Model import views  # 定时任务,不要删除该行代码
@@ -287,6 +287,8 @@ urlpatterns = [
     re_path('adDepartment/(?P<operation>.*)$', AdDepartmentController.AdDepartmentView.as_view()),
     re_path('timeAlbum/(?P<operation>.*)$', TimeAlbumController.TimeAlbum.as_view()),
     re_path('shopify/(?P<operation>.*)$', ShopifyController.ShopifyView.as_view()),
+    # 根据版本号获取设备配置信息
+    re_path('open/device/configuration/(?P<operation>.*)', DeviceVersionInfoController.DeviceVersionInfoView.as_view()),
 
 
 

+ 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)))

+ 14 - 0
Object/Enums/RedisKeyConstant.py

@@ -0,0 +1,14 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : RedisKeyConstant.py
+@Time    : 2024/11/20 15:13
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from enum import Enum
+
+
+class RedisKeyConstant(Enum):
+    # 设备版本信息
+    ZOSI_DEVICE_VERSION_INFO = 'ZOSI:DEVICE:VERSION:'