Browse Source

有主用户加日志/默认通道名称优化、新增FAQ链接、修复一键同步报错

zhangdongming 3 weeks ago
parent
commit
5ec77e3bbe

+ 3 - 1
AdminController/DeviceManagementController.py

@@ -1727,9 +1727,11 @@ class DeviceManagement(View):
 
             # 获取第一条匹配的记录(通常应该只有一条)
             version_config = version_config_qs.first()
+            # 直接使用数据库字段,不需要json.loads
             other_features = ''
             if version_config.other_features:
-                other_features = json.loads(version_config.other_features)
+                other_features = json.dumps(version_config.other_features)
+
             # 将数据库字段映射为驼峰命名的响应数据
             req_data = {
                 'dCode': version_config.d_code,

+ 1 - 0
Ansjer/urls.py

@@ -271,6 +271,7 @@ urlpatterns = [
     # FAQ
     url(r'^faq/upload', FAQController.FAQUploadView.as_view()),
     url(r'^faq/image/(?P<filePath>.*)$', FAQController.getFAQImage.as_view()),
+    url(r'^faq/helpLink/(?P<operation>.*)$', FAQController.HelpLinkView.as_view()),
     url(r'^faq/(?P<operation>.*)$', FAQController.FAQView.as_view()),
 
     # 苹果登录

+ 3 - 1
Controller/EquipmentManagerV3.py

@@ -231,6 +231,8 @@ class EquipmentManagerV3(View):
                 }
             ]
             res['isMainUserExists'] = 1
+            LOGGER.info('add设备已绑定其他用户uid:{} type:{} 主:{} Now:{} nickName:{}'
+                        .format(UID, Type, vodPrimaryUserID, userID, NickName))
             return response.json(0, res)
 
         # 日志数据
@@ -314,7 +316,7 @@ class EquipmentManagerV3(View):
                     if Type in dvr_type_list:
                         UidChannelSet_bulk = []
                         for i in range(1, ChannelIndex + 1):
-                            channel_name = 'channel' + str(i)  # channel1,channel2...
+                            channel_name = 'Channel ' + str(i)  # Channel 1,Channel 2...
                             UidChannelSet = UidChannelSetModel(uid_id=UidSet_id, channel=i, channel_name=channel_name)
                             UidChannelSet_bulk.append(UidChannelSet)
                         UidChannelSetModel.objects.bulk_create(UidChannelSet_bulk)

+ 85 - 2
Controller/FAQController.py

@@ -7,6 +7,7 @@ import time
 import traceback
 
 from django.core import serializers
+from django.db import models
 from django.http import HttpResponse
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
@@ -14,12 +15,13 @@ from django.views.generic.base import View
 
 import Ansjer
 from Ansjer.config import BASE_DIR, SERVER_TYPE, SERVER_DOMAIN, SERVER_DOMAIN_SSL
-from Model.models import FAQModel
+from Model.models import FAQModel, HelpLink
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from var_dump import var_dump
-
+from Ansjer.config import LOGGER
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService, ZositechHelpModel
 
@@ -389,3 +391,84 @@ class FAQView(View):
                 'content': json.dumps(data).replace("\'", "\"").replace("XX??????XX", "\'")
             })
         return response.json(0)
+
+
+class HelpLinkView(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 validation(self, request_dict, request, operation):
+        response = ResponseObject('en')
+        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 == 'queryFAQByDeviceType':  # 获取电池电量列表
+            return HelpLinkView.query_faq_by_device_type(request, request_dict, response)
+        else:
+            return response.json(414)
+
+    @staticmethod
+    def query_faq_by_device_type(request, request_dict, response):
+        """根据设备类型和语言查询帮助链接"""
+        device_type = request_dict.get('device_type', None)
+        # lang = request_dict.get('lang', 'en')
+        # app_bundle_id = request_dict.get('app_bundle_id', None)
+        lang = 'en'
+
+        if not device_type:
+            return response.json(444, {'message': 'device_type和lang参数不能为空'})
+
+        try:
+            device_type = int(device_type)
+            redis = RedisObject()
+            cache_key = RedisKeyConstant.HELP_LINK_TYPE.value + f'{device_type}:{lang}'
+
+            # 先尝试从缓存获取
+            cached_data = redis.get_data(cache_key)
+            if cached_data:
+                cached_data = json.loads(cached_data)
+                return response.json(0, cached_data)
+
+            # 优化数据库查询 - 单次查询获取结果
+            help_link = HelpLink.objects.filter(
+                models.Q(device_type=device_type) | models.Q(device_type=-1),
+                lang=lang,
+                is_active=True
+            ).order_by(
+                models.Case(
+                    models.When(device_type=device_type, then=0),
+                    default=1
+                )
+            ).first()
+
+            if not help_link:
+                return response.json(173)
+
+            # 构建返回数据
+            data = {
+                'url': help_link.url,
+                'title': help_link.title,
+                'description': help_link.description
+            }
+
+            # 设置缓存,过期时间30天
+            try:
+                redis.set_data(cache_key, json.dumps(data), RedisKeyConstant.EXPIRE_TIME_30_DAYS.value)
+            except Exception as e:
+                LOGGER.error(f"设置Redis缓存出错: {repr(e)}")
+                # 缓存失败不影响主流程
+
+            return response.json(0, data)
+
+        except Exception as e:
+            LOGGER.error(f"查询帮助链接出错: {repr(e)}")
+            return response.json(500)

+ 18 - 1
Model/models.py

@@ -5709,4 +5709,21 @@ class ProductTroubleshoot(models.Model):
 
     class Meta:
         db_table = 'product_troubleshoot'
-        verbose_name = "产品异常记录"
+        verbose_name = "产品异常记录"
+
+
+class HelpLink(models.Model):
+    """帮助链接表,关联设备类型和语言,存储对应的官网帮助链接"""
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    device_type = models.IntegerField(default=0, verbose_name='设备类型')
+    lang = models.CharField(max_length=16, verbose_name="语言")
+    url = models.CharField(max_length=512, verbose_name="帮助链接")
+    title = models.CharField(max_length=100, blank=True, verbose_name="链接标题")
+    description = models.CharField(max_length=200, blank=True, verbose_name="链接描述")
+    is_active = models.BooleanField(default=True, verbose_name="是否启用")
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'help_link'
+        verbose_name = "使用帮助链接"

+ 2 - 0
Object/Enums/RedisKeyConstant.py

@@ -33,6 +33,8 @@ class RedisKeyConstant(Enum):
     ACTIVITY_INFO = 'ACTIVITY:INFO'
     # 推送存储位置
     PUSH_STORAGE_CONFIG_UID = 'push:storage:config:uid:'
+    # 使用帮助链接
+    HELP_LINK_TYPE = 'help:link:type:'
 
     # Redis 过期时间常量 (秒)
     EXPIRE_TIME_60_SECONDS = 60    # 60秒