zhangdongming 3 nedēļas atpakaļ
vecāks
revīzija
bd2af8a3b7
1 mainītis faili ar 36 papildinājumiem un 33 dzēšanām
  1. 36 33
      Controller/DeviceManagement/DeviceGroupController.py

+ 36 - 33
Controller/DeviceManagement/DeviceGroupController.py

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