Browse Source

首页查询初始化设备排序

locky 3 days ago
parent
commit
ac2674431a
2 changed files with 61 additions and 2 deletions
  1. 46 0
      Controller/EquipmentManagerV3.py
  2. 15 2
      Service/UserDeviceService.py

+ 46 - 0
Controller/EquipmentManagerV3.py

@@ -89,6 +89,8 @@ class EquipmentManagerV3(View):
             return self.verify_code(request_dict, response)
         elif operation == 'viewDevicePassword':
             return self.view_device_password(request_dict, response)
+        elif operation == 'editSortOrder':
+            return self.edit_sort_order(request_dict, response)
         else:
             return response.json(414)
 
@@ -823,6 +825,7 @@ class EquipmentManagerV3(View):
         if tko.code != 0:
             return response.json(tko.code)
         userID = tko.userID
+        UserDeviceService.init_device_sort_order(userID)
         group_id = int(request_dict.get('groupId', 0))
         # 查询设备列表以及设备uid集合
         dv_list, uid_list = UserDeviceService.query_device_list(userID, uid, NickName, page, line, group_id)
@@ -1416,3 +1419,46 @@ class EquipmentManagerV3(View):
             return response.json(0, res)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def edit_sort_order(request_dict, response):
+        """
+        修改设备排序
+        ids: 选中的设备id列表(单选或多选)
+        action: 操作类型(move/top/bottom)
+        target_id: 拖动目标id(仅单选拖动时用)
+        """
+        ids = request_dict.get('ids', None)
+        action = request_dict.get('action', None)
+        target_id = request_dict.get('target_id', None)
+        if not ids or not action:
+            return response.json(444, 'ids or action missing')
+        try:
+            # 查询所有设备,按sort_order排序
+            all_devices = list(Device_Info.objects.all().order_by('-sort_order', '-data_joined'))
+            id_to_device = {str(d.id): d for d in all_devices}
+            # 单选拖动排序
+            if action == 'move' and len(ids) == 1 and target_id:
+                moving_id = ids[0]
+                moving_device = id_to_device.get(str(moving_id))
+                target_device = id_to_device.get(str(target_id))
+                if not moving_device or not target_device:
+                    return response.json(173, 'device not found')
+                target_index = all_devices.index(target_device)
+                all_devices.remove(moving_device)
+                all_devices.insert(target_index, moving_device)
+            # 勾选框批量置顶/置底
+            elif action in ('top', 'bottom'):
+                selected_devices = [id_to_device[i] for i in ids if i in id_to_device]
+                other_devices = [d for d in all_devices if str(d.id) not in ids]
+                if action == 'top':
+                    all_devices = selected_devices + other_devices
+                else:
+                    all_devices = other_devices + selected_devices
+            # 重新赋值sort_order
+            for idx, device in enumerate(all_devices):
+                device.sort_order = len(all_devices) - idx
+                device.save(update_fields=['sort_order'])
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 15 - 2
Service/UserDeviceService.py

@@ -8,7 +8,7 @@
 """
 import logging
 
-from django.db.models import Q
+from django.db.models import Q, Max
 
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, UnicomDeviceInfo, \
     UIDModel, DeviceChannelUserSet, DeviceChannelUserPermission, DeviceSharePermission
@@ -45,7 +45,7 @@ class UserDeviceService:
                              'Type', 'isShare', 'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID',
                              'vodPrimaryMaster', 'userID__userEmail', 'version', 'isVod', 'isExist', 'NotificationMode',
                              'isCameraOpenCloud', 'serial_number', 'device_group_id', 'sort_order').\
-            order_by('-sort_order', '-data_joined')
+            order_by('sort_order', '-data_joined')
         CommonService.qs_to_list(dv_qs)
         exist_uid = []
         unique_results = []
@@ -343,3 +343,16 @@ class UserDeviceService:
         except Exception as e:
             LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return False
+
+    @staticmethod
+    def init_device_sort_order(userID):
+        # 初始化设备排序
+        uninit_devices = Device_Info.objects.filter(
+            userID_id=userID,
+            sort_order=0
+        ).exclude(Type__in=[200, 201]).order_by('-data_joined')
+        if uninit_devices.exists():
+            max_sort = Device_Info.objects.filter(userID_id=userID).aggregate(Max('sort_order'))['sort_order__max'] or 0
+            for idx, device in enumerate(uninit_devices):
+                device.sort_order = max_sort + idx + 1
+                device.save(update_fields=['sort_order'])