|
@@ -1,11 +1,13 @@
|
|
|
# @Author : Rocky
|
|
|
# @File : DeviceGroupController.py
|
|
|
# @Time : 2025/1/22 9:51
|
|
|
+from collections import Counter
|
|
|
+
|
|
|
from django.db import transaction
|
|
|
-from django.db.models import Count
|
|
|
from django.db.models import Q
|
|
|
from django.views import View
|
|
|
|
|
|
+from Ansjer.config import LOGGER
|
|
|
from Model.models import DeviceGroup, Device_Info
|
|
|
from Service.CommonService import CommonService
|
|
|
|
|
@@ -45,39 +47,40 @@ class DeviceGroupView(View):
|
|
|
@staticmethod
|
|
|
def query_group_quantity(request_dict, user_id, response):
|
|
|
"""
|
|
|
- 查询分组数量(优化版:减少数据库查询次数,提升性能)
|
|
|
- @param request_dict: 请求参数
|
|
|
- @param user_id: 用户ID
|
|
|
- @param response: 响应对象
|
|
|
- @return: 包含分组信息和设备总数的响应
|
|
|
+ 完全重写的分组数量查询(确保正确性)
|
|
|
"""
|
|
|
+ try:
|
|
|
+ groups = DeviceGroup.objects.filter(user_id=user_id)
|
|
|
+ if not groups.exists():
|
|
|
+ return response.json(0, {'total': 0, 'device_groups': []})
|
|
|
+
|
|
|
+ device_group_ids = Device_Info.objects.filter(
|
|
|
+ userID_id=user_id,
|
|
|
+ isExist=1
|
|
|
+ ).values_list('device_group_id', flat=True)
|
|
|
+
|
|
|
+ count_map = Counter(device_group_ids)
|
|
|
+
|
|
|
+ device_groups = []
|
|
|
+ total_count = 0
|
|
|
+
|
|
|
+ for group in groups:
|
|
|
+ device_count = count_map.get(group.id, 0)
|
|
|
+ device_groups.append({
|
|
|
+ 'id': group.id,
|
|
|
+ 'group_name': group.group_name,
|
|
|
+ 'device_quantity': device_count
|
|
|
+ })
|
|
|
+ total_count += device_count
|
|
|
+
|
|
|
+ return response.json(0, {
|
|
|
+ 'total': total_count,
|
|
|
+ 'device_groups': device_groups
|
|
|
+ })
|
|
|
|
|
|
- # 1. 一次查询获取所有分组ID和名称(仅1次数据库查询)
|
|
|
- device_groups = list(DeviceGroup.objects.filter(user_id=user_id).values('id', 'group_name'))
|
|
|
- if not device_groups:
|
|
|
- return response.json(0, {'total': 0, 'device_groups': []})
|
|
|
-
|
|
|
- # 2. 提取所有分组ID,批量查询设备数量(仅1次数据库查询)
|
|
|
- group_ids = [group['id'] for group in device_groups]
|
|
|
- device_counts = dict(
|
|
|
- Device_Info.objects.filter(device_group_id__in=group_ids)
|
|
|
- .values('device_group_id')
|
|
|
- .annotate(count=Count('id')) # 聚合计算每个分组的设备数
|
|
|
- .values_list('device_group_id', 'count') # 转换为(id, count)格式
|
|
|
- )
|
|
|
-
|
|
|
- # 3. 内存中组装数据(无额外数据库查询)
|
|
|
- device_total = 0
|
|
|
- for group in device_groups:
|
|
|
- # 从字典中获取数量,默认0(避免不存在的分组ID报错)
|
|
|
- count = device_counts.get(group['id'], 0)
|
|
|
- group['device_quantity'] = count
|
|
|
- device_total += count
|
|
|
-
|
|
|
- return response.json(0, {
|
|
|
- 'total': device_total,
|
|
|
- 'device_groups': device_groups
|
|
|
- })
|
|
|
+ except Exception as e:
|
|
|
+ LOGGER.error(f"查询分组数量失败: {str(e)}")
|
|
|
+ return response.json(1, "系统错误")
|
|
|
|
|
|
@staticmethod
|
|
|
def query_group_device(request_dict, user_id, response):
|
|
@@ -91,7 +94,7 @@ class DeviceGroupView(View):
|
|
|
device_group_id = request_dict.get('device_group_id', None)
|
|
|
if not device_group_id:
|
|
|
return response.json(444)
|
|
|
- device_info_qs = Device_Info.objects.filter(device_group_id=device_group_id).values('NickName', 'Type')
|
|
|
+ device_info_qs = Device_Info.objects.filter(device_group_id=device_group_id).values('id', 'NickName', 'Type')
|
|
|
if not device_info_qs.exists():
|
|
|
return response.json(0, [])
|
|
|
res = list(device_info_qs)
|