|
@@ -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)}')
|