Explorar o código

查询产品入库列表优化代码

zhangdongming hai 2 meses
pai
achega
aeb8bc68ef
Modificáronse 1 ficheiros con 122 adicións e 86 borrados
  1. 122 86
      AdminController/ProductsSchemeManageController.py

+ 122 - 86
AdminController/ProductsSchemeManageController.py

@@ -419,96 +419,132 @@ class ProductsSchemeManageView(View):
         @param response: 响应对象
         @return: 响应对象包含设备方案列表
         """
-        serial_number = request_dict.get("serialNumber", None)
-        storage_code = request_dict.get("storageCode", None)
-        device_type = request_dict.get("deviceType", None)
-        phone_model = request_dict.get("phoneModel", None)
-        page = request_dict.get("page", 1)
-        page_size = request_dict.get("pageSize", 20)
+        # 提取请求参数并提供默认值
+        filters = {
+            'serial_number': request_dict.get("serialNumber"),
+            'storage_code': request_dict.get("storageCode"),
+            'device_type': request_dict.get("deviceType"),
+            'phone_model': request_dict.get("phoneModel"),
+        }
+        page = int(request_dict.get("page", 1))
+        page_size = int(request_dict.get("pageSize", 20))
 
         try:
-            # 获取设备方案查询集
-            device_scheme_qs = DeviceScheme.objects.all()
-
-            # 过滤条件
-            if serial_number:
-                device_scheme_qs = device_scheme_qs.filter(serial_number=serial_number)
-            if storage_code:
-                device_scheme_qs = device_scheme_qs.filter(storage_code__icontains=storage_code)
-            if device_type:
-                device_scheme_qs = device_scheme_qs.filter(device_type=device_type)
-            if phone_model:
-                device_scheme_qs = device_scheme_qs.filter(phone_model__icontains=phone_model)
-
-            # 分页
-            paginator = Paginator(device_scheme_qs.order_by('-created_time'), page_size)
-            device_schemes = paginator.page(page)
-
-            # 构建返回数据
+            # 构建基础查询集
+            queryset = DeviceScheme.objects.all().order_by('-created_time')
+
+            # 应用过滤条件
+            if filters['serial_number']:
+                queryset = queryset.filter(serial_number=filters['serial_number'])
+            if filters['storage_code']:
+                queryset = queryset.filter(storage_code__icontains=filters['storage_code'])
+            if filters['device_type']:
+                queryset = queryset.filter(device_type=filters['device_type'])
+            if filters['phone_model']:
+                queryset = queryset.filter(phone_model__icontains=filters['phone_model'])
+
+            # 分页处理
+            paginator = Paginator(queryset, page_size)
+            try:
+                current_page = paginator.page(page)
+            except EmptyPage:
+                current_page = paginator.page(paginator.num_pages)
+
+            # 批量预取关联数据
             device_list = []
-            for device in device_schemes.object_list:
-                # 获取关联的产品方案信息
-                product_scheme = ProductsScheme.objects.filter(storage_code=device.storage_code).first()
-
-                device_type_qs = DeviceTypeModel.objects.filter(type=device.device_type).values('name')
-                device_name = device.device_type
-                if device_type_qs.exists():
-                    device_name = device_type_qs[0]['name']
-                status = 'N/A'
-                if device.device_type != 0:
-                    serial_qs = CompanySerialModel.objects.filter(serial_number=device.serial_number[0:6]).values(
-                        'status')
-                    status = '已激活' if serial_qs.exists() and serial_qs[0]['status'] > 1 else '未激活'
-                device_data = {
-                    'id': device.id,
-                    'serialNumber': device.serial_number,
-                    'deviceType': device_name,
-                    'phoneModel': device.phone_model,
-                    'storageCode': device.storage_code,
-                    'createdTime': device.created_time,
-                    'updatedTime': device.updated_time,
-                    'snStatus': status
+            if current_page.object_list:
+                # 准备批量查询所需数据
+                storage_codes = {device.storage_code for device in current_page}
+                serial_prefixes = {device.serial_number[:6] for device in current_page}
+                device_types = {device.device_type for device in current_page}
+
+                # 批量获取关联数据
+                product_schemes_map = {
+                    ps.storage_code: ps
+                    for ps in ProductsScheme.objects.filter(storage_code__in=storage_codes)
+                }
+                device_type_names = {
+                    dt['type']: dt['name']
+                    for dt in DeviceTypeModel.objects.filter(type__in=device_types).values('type', 'name')
                 }
-                if product_scheme:
-                    # 提取需要拼接的字段值(按顺序)
-                    scheme_fields = [
-                        product_scheme.flash,
-                        product_scheme.ddr,
-                        product_scheme.main_controller,
-                        product_scheme.wifi,
-                        product_scheme.four_g,
-                        product_scheme.ad,
-                        product_scheme.phy,
-                        product_scheme.sensor
-                    ]
-
-                    # 过滤空值并拼接为字符串
-                    scheme_data = '+'.join([str(field) for field in scheme_fields if field])
-
-                    device_data.update({
-                        'orderNumber': product_scheme.order_number if product_scheme.order_number else '',
-                        'type': 'NVR' if product_scheme.device_type == 1 else 'IPC',
-                        'flash': product_scheme.flash if product_scheme.flash else '',
-                        'ddr': product_scheme.ddr if product_scheme.ddr else '',
-                        'mainController': product_scheme.main_controller if product_scheme.main_controller else '',
-                        'wifi': product_scheme.wifi if product_scheme.wifi else '',
-                        'fourG': product_scheme.four_g if product_scheme.four_g else '',
-                        'ad': product_scheme.ad if product_scheme.ad else '',
-                        'phy': product_scheme.phy if product_scheme.phy else '',
-                        'sensor': product_scheme.sensor if product_scheme.sensor else '',
-                        'orderQuantity': product_scheme.order_quantity if product_scheme.order_quantity else '',
-                        'customerCode': product_scheme.customer_code if product_scheme.customer_code else '',
-                        'schemeData': scheme_data,
-                        'remark': product_scheme.remark if product_scheme.remark else ''
-                    })
-                device_list.append(device_data)
-
-            data = {
+                serial_statuses = {
+                    cs.serial_number: cs
+                    for cs in CompanySerialModel.objects.filter(serial_number__in=serial_prefixes)
+                }
+
+                # 构建设备数据
+                device_list = [
+                    ProductsSchemeManageView.build_device_data(
+                        device,
+                        product_schemes_map.get(device.storage_code),
+                        device_type_names.get(device.device_type, device.device_type),
+                        serial_statuses.get(device.serial_number[:6])
+                    )
+                    for device in current_page
+                ]
+
+            return response.json(0, {
                 'list': device_list,
-                'total': paginator.count,
-            }
+                'total': paginator.count
+            })
 
-            return response.json(0, data)
         except Exception as e:
-            print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            LOGGER.error("设备方案列表查询异常")
+            return response.json(500, f'服务器错误: {str(e)}')
+
+    @staticmethod
+    def build_device_data(device, product_scheme, device_type_name, serial_status):
+        """构建单个设备数据字典"""
+        # 设备基础数据
+        device_data = {
+            'id': device.id,
+            'serialNumber': device.serial_number,
+            'deviceType': device_type_name,
+            'phoneModel': device.phone_model,
+            'storageCode': device.storage_code,
+            'createdTime': device.created_time,
+            'updatedTime': device.updated_time,
+            'snStatus': 'N/A',
+            'aTime': 'N/A',
+        }
+
+        # 序列号激活信息
+        if device.device_type != 0 and serial_status:
+            device_data['snStatus'] = '已激活' if serial_status.status > 1 else '未激活'
+            device_data['aTime'] = datetime.datetime.fromtimestamp(
+                serial_status.update_time
+            ).strftime('%Y-%m-%d %H:%M:%S')
+
+        # 添加产品方案信息
+        if product_scheme:
+            # 构建方案数据字符串
+            scheme_parts = [
+                product_scheme.flash,
+                product_scheme.ddr,
+                product_scheme.main_controller,
+                product_scheme.wifi,
+                product_scheme.four_g,
+                product_scheme.ad,
+                product_scheme.phy,
+                product_scheme.sensor
+            ]
+            scheme_data = '+'.join(filter(None, map(str, scheme_parts)))
+
+            device_data.update({
+                'orderNumber': product_scheme.order_number or '',
+                'type': 'NVR' if product_scheme.device_type == 1 else 'IPC',
+                'flash': product_scheme.flash or '',
+                'ddr': product_scheme.ddr or '',
+                'mainController': product_scheme.main_controller or '',
+                'wifi': product_scheme.wifi or '',
+                'fourG': product_scheme.four_g or '',
+                'ad': product_scheme.ad or '',
+                'phy': product_scheme.phy or '',
+                'sensor': product_scheme.sensor or '',
+                'orderQuantity': product_scheme.order_quantity or '',
+                'customerCode': product_scheme.customer_code or '',
+                'schemeData': scheme_data,
+                'remark': product_scheme.remark or ''
+            })
+
+        return device_data