Forráskód Böngészése

优化查询定制UID池及其设备绑定关系接口

linhaohong 3 hónapja
szülő
commit
dc2177a742

+ 51 - 66
AdminController/CloudServiceManage/AgentDeviceController.py

@@ -18,6 +18,7 @@ import traceback
 import threading
 import threading
 
 
 from django.db import transaction
 from django.db import transaction
+from django.db.models import Q
 from django.http import QueryDict
 from django.http import QueryDict
 from django.views import View
 from django.views import View
 from django.core.paginator import Paginator
 from django.core.paginator import Paginator
@@ -373,21 +374,7 @@ class AgentDeviceView(View):
 
 
     @classmethod
     @classmethod
     def custom_uid_bindings(cls, request_dict, response):
     def custom_uid_bindings(cls, request_dict, response):
-        """
-        查询定制UID池及其设备绑定关系
-        @param userID: 用户ID
-        @param request_dict: 请求参数
-            - uid: UID(模糊匹配)
-            - customer_name: 客户名称(模糊匹配)
-            - status: UID状态(0:未绑,1:绑定,2:弃用)
-            - device_mac: 设备MAC(模糊匹配)
-            - page: 页码(默认1)
-            - page_size: 每页数量(默认10)
-        @param response: 响应对象
-        @return: JSON响应(包含UID列表及分页信息)
-        """
         try:
         try:
-            # 解析请求参数
             uid = request_dict.get('uid', None)
             uid = request_dict.get('uid', None)
             customer_name = request_dict.get('customer_name', None)
             customer_name = request_dict.get('customer_name', None)
             status = request_dict.get('status', None)
             status = request_dict.get('status', None)
@@ -395,69 +382,67 @@ class AgentDeviceView(View):
             page = int(request_dict.get('page', 1))
             page = int(request_dict.get('page', 1))
             page_size = int(request_dict.get('pageSize', 20))
             page_size = int(request_dict.get('pageSize', 20))
 
 
-            # 查询 CustomUIDPool
-            custom_uid_pool_qs = CustomUIDPool.objects.all().order_by('-created_time')
-
-            # 应用筛选条件
+            filters = Q()
             if uid:
             if uid:
-                custom_uid_pool_qs = custom_uid_pool_qs.filter(uid__icontains=uid)
+                filters &= Q(uid__icontains=uid)
             if customer_name:
             if customer_name:
-                custom_uid_pool_qs = custom_uid_pool_qs.filter(customer_name__icontains=customer_name)
-            if status:
-                custom_uid_pool_qs = custom_uid_pool_qs.filter(status=status)
+                filters &= Q(customer_name__icontains=customer_name)
+            if status is not None:
+                filters &= Q(status=status)
 
 
-            # 如果传了 device_mac,先查 DeviceCustomUID 获取关联的UID,再过滤
             if device_mac:
             if device_mac:
                 bound_uids = DeviceCustomUID.objects.filter(
                 bound_uids = DeviceCustomUID.objects.filter(
                     device_mac__icontains=device_mac
                     device_mac__icontains=device_mac
                 ).values_list('uid', flat=True)
                 ).values_list('uid', flat=True)
-                custom_uid_pool_qs = custom_uid_pool_qs.filter(uid__in=bound_uids)
+                filters &= Q(uid__in=list(bound_uids))
 
 
-            # 分页处理
+            custom_uid_pool_qs = CustomUIDPool.objects.filter(filters).order_by('-created_time')
             paginator = Paginator(custom_uid_pool_qs, page_size)
             paginator = Paginator(custom_uid_pool_qs, page_size)
-            custom_uid_pool_page = paginator.page(page)
-
-            # 获取当前页的所有UID,用于批量查询设备绑定信息
-            uid_list = [custom_uid.uid for custom_uid in custom_uid_pool_page]
-
-            # 批量查询所有设备绑定信息(减少查询次数)
-            device_bindings_map = {}
-            if uid_list:
-                bindings = DeviceCustomUID.objects.filter(uid__in=uid_list)
-                for binding in bindings:
-                    if binding.uid not in device_bindings_map:
-                        device_bindings_map[binding.uid] = []
-                    device_bindings_map[binding.uid].append({
-                        'device_mac': binding.device_mac,
-                        'binding_status': binding.status,
-                        'binding_time': binding.created_time,
+            page_obj = paginator.page(page)
+
+            uid_list = [obj.uid for obj in page_obj]
+            bindings = DeviceCustomUID.objects.filter(uid__in=uid_list)
+
+            # 构建 uid -> 多条绑定记录 map
+            binding_map = {}
+            for b in bindings:
+                binding_map.setdefault(b.uid, []).append(b)
+
+            # 构建结果列表
+            result_list = []
+            for obj in page_obj:
+                uid_bindings = binding_map.get(obj.uid, [])
+                if uid_bindings:
+                    for bind in uid_bindings:
+                        result_list.append({
+                            'id': obj.id,
+                            'uid': obj.uid,
+                            'type': obj.type,
+                            'customer_name': obj.customer_name,
+                            'uid_status': obj.status,
+                            'created_time': obj.created_time,
+                            'updated_time': obj.updated_time,
+                            'device_mac': bind.device_mac,
+                            'device_status': bind.status,
+                        })
+                else:
+                    result_list.append({
+                        'id': obj.id,
+                        'uid': obj.uid,
+                        'type': obj.type,
+                        'customer_name': obj.customer_name,
+                        'uid_status': obj.status,
+                        'created_time': obj.created_time,
+                        'updated_time': obj.updated_time,
+                        'device_mac': '',
+                        'device_status': None,
                     })
                     })
 
 
-            # 构造返回数据
-            uid_list = []
-            for custom_uid in custom_uid_pool_page:
-                # 查询关联的设备绑定信息
-                device_binding = DeviceCustomUID.objects.filter(uid=custom_uid.uid).first()
-                uid_list.append({
-                    'id': custom_uid.id,
-                    'uid': custom_uid.uid,
-                    'type': custom_uid.type,
-                    'customer_name': custom_uid.customer_name,
-                    'uid_status': custom_uid.status,  # UID池状态
-                    'created_time': custom_uid.created_time,
-                    'updated_time': custom_uid.updated_time,
-                    'device_bindings': device_bindings_map.get(custom_uid.uid, []),
-                })
-
-            # 返回分页结果
-            response_data = {
-                'list': uid_list,
-                'total': paginator.count,
-            }
-
-            return response.json(0, response_data)
-
+            return response.json(0, {
+                'list': result_list,
+                'total': paginator.count
+            })
 
 
         except Exception as e:
         except Exception as e:
             print(e)
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, f'error_line:{e.__traceback__.tb_lineno}, error_msg:{repr(e)}')