Selaa lähdekoodia

获取异常/异常详情百分比接口

locky 3 kuukautta sitten
vanhempi
commit
4cb39d5168
1 muutettua tiedostoa jossa 186 lisäystä ja 0 poistoa
  1. 186 0
      AdminController/LogManagementController.py

+ 186 - 0
AdminController/LogManagementController.py

@@ -67,6 +67,10 @@ class LogManagementView(View):
                 return self.getDeviceAbnormalEvent(request_dict, response)
             elif operation == 'getAbnormalEventValue':  # 获取设备异常事件编码/内容
                 return self.getAbnormalEventValue(response)
+            elif operation == 'getAbnormalPercentage':  # 获取异常百分比
+                return self.getAbnormalPercentage(request_dict, response)
+            elif operation == 'getAbnormalDetailsPercentage':  # 获取异常详情百分比
+                return self.getAbnormalDetailsPercentage(request_dict, response)
             else:
                 return response.json(414)
 
@@ -643,3 +647,185 @@ class LogManagementView(View):
             return response.json(0, {'list': unique_event_types})
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def getAbnormalPercentage(request_dict, response):
+        uid = request_dict.get('uid', None)
+        storage_code = request_dict.get('storageCode', None)
+        device_type = request_dict.get('deviceType', None)
+        version = request_dict.get('version', None)
+        event_type = request_dict.get('eventType', None)
+        report_type = request_dict.get('reportType', None)
+        event_time_range = request_dict.getlist('eventTimeRange[]', None)
+
+        try:
+            query = Q()
+            if uid:
+                query &= Q(uid=uid)
+            if storage_code:
+                # 同一单号都为uid或序列号
+                uid_qs = DeviceScheme.objects.filter(storage_code=storage_code).\
+                    values_list('serial_number', flat=True)
+                uid_list = list(uid_qs)
+                # 序列号,查询uid
+                if uid_list and len(uid_list[0]) == 9:
+                    uid_list = CommonService.get_uids_by_serial_numbers(uid_list)
+                query &= Q(uid__in=uid_list)
+            if device_type:
+                # 处理多个deviceType参数
+                device_types = [int(t.strip()) for t in device_type.split(',') if t.strip().isdigit()]
+                query &= Q(device_type__in=device_types)
+            if version:
+                query &= Q(version=version)
+            if report_type:
+                query &= Q(report_type=int(report_type))
+            if event_time_range:
+                start_time, end_time = int(
+                    event_time_range[0][:-3]), int(event_time_range[1][:-3])
+                query &= Q(event_time__gte=start_time, event_time__lte=end_time)
+            if event_type:
+                # 通过event查询对应的event_code
+                event_codes_from_event = AbnormalEventCode.objects.filter(
+                    event_type__in=event_type.split(',')
+                ).values_list('event_code', flat=True)
+                if event_codes_from_event.exists():
+                    query &= Q(event_code__in=event_codes_from_event)
+            
+            # 查询符合条件的异常事件
+            abnormal_events = AbnormalEvent.objects.filter(query)
+            total_count = abnormal_events.count()
+            
+            # 获取所有异常类型及其数量
+            event_type_stats = {}
+            if total_count > 0:
+                # 获取所有事件的event_code
+                event_codes = abnormal_events.values_list('event_code', flat=True)
+                
+                # 获取所有event_code对应的event_type
+                event_code_types = AbnormalEventCode.objects.filter(
+                    event_code__in=event_codes
+                ).values('event_code', 'event_type')
+                
+                # 创建event_code到event_type的映射
+                event_code_to_type = {item['event_code']: item['event_type'] for item in event_code_types}
+                
+                # 统计每个event_code的数量
+                for event in abnormal_events:
+                    event_type = event_code_to_type.get(event.event_code, '未知类型')
+                    if event_type in event_type_stats:
+                        event_type_stats[event_type] += 1
+                    else:
+                        event_type_stats[event_type] = 1
+            
+            # 计算百分比并格式化结果(保留两位小数)
+            statistics = []
+            for name, value in event_type_stats.items():
+                percentage = round((value / total_count) * 100, 2) if total_count > 0 else 0.00
+                statistics.append({
+                    'name': name,
+                    'value': value,
+                    'percentage': percentage
+                })
+            
+            # 按数量降序排序
+            statistics.sort(key=lambda x: x['value'], reverse=True)
+            
+            return response.json(0, {
+                'total': total_count,
+                'statistics': statistics
+            })
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def getAbnormalDetailsPercentage(request_dict, response):
+        uid = request_dict.get('uid', None)
+        storage_code = request_dict.get('storageCode', None)
+        device_type = request_dict.get('deviceType', None)
+        version = request_dict.get('version', None)
+        event_type = request_dict.get('eventType', None)
+        report_type = request_dict.get('reportType', None)
+        event_time_range = request_dict.getlist('eventTimeRange[]', None)
+
+        if not event_type:
+            return response.json(444)
+
+        try:
+            query = Q()
+            if uid:
+                query &= Q(uid=uid)
+            if storage_code:
+                # 同一单号都为uid或序列号
+                uid_qs = DeviceScheme.objects.filter(storage_code=storage_code). \
+                    values_list('serial_number', flat=True)
+                uid_list = list(uid_qs)
+                # 序列号,查询uid
+                if uid_list and len(uid_list[0]) == 9:
+                    uid_list = CommonService.get_uids_by_serial_numbers(uid_list)
+                query &= Q(uid__in=uid_list)
+            if device_type:
+                # 处理多个deviceType参数
+                device_types = [int(t.strip()) for t in device_type.split(',') if t.strip().isdigit()]
+                query &= Q(device_type__in=device_types)
+            if version:
+                query &= Q(version=version)
+            if report_type:
+                query &= Q(report_type=int(report_type))
+            if event_time_range:
+                start_time, end_time = int(
+                    event_time_range[0][:-3]), int(event_time_range[1][:-3])
+                query &= Q(event_time__gte=start_time, event_time__lte=end_time)
+
+            # 通过event查询对应的event_code
+            event_codes_from_event = AbnormalEventCode.objects.filter(event_type=event_type).\
+                values_list('event_code', flat=True)
+            if event_codes_from_event.exists():
+                query &= Q(event_code__in=event_codes_from_event)
+
+            # 查询符合条件的异常事件
+            abnormal_events = AbnormalEvent.objects.filter(query)
+            total_count = abnormal_events.count()
+
+            # 获取所有异常类型及其数量
+            event_type_stats = {}
+            if total_count > 0:
+                # 获取所有事件的event_code
+                event_codes = abnormal_events.values_list('event_code', flat=True)
+
+                # 获取所有event_code对应的event_type
+                event_code_types = AbnormalEventCode.objects.filter(
+                    event_type=event_type
+                ).values('event_code', 'event')
+
+                # 创建event_code到event_type的映射
+                event_code_to_type = {item['event_code']: item['event'] for item in event_code_types}
+
+                # 统计每个event_code的数量
+                for abnormal_event in abnormal_events:
+                    event = event_code_to_type.get(abnormal_event.event_code, '未知类型')
+                    if event in event_type_stats:
+                        event_type_stats[event] += 1
+                    else:
+                        event_type_stats[event] = 1
+
+            # 计算百分比并格式化结果(保留两位小数)
+            statistics = []
+            for name, value in event_type_stats.items():
+                percentage = round((value / total_count) * 100, 2) if total_count > 0 else 0.00
+                statistics.append({
+                    'name': name,
+                    'value': value,
+                    'percentage': percentage
+                })
+
+            # 按数量降序排序
+            statistics.sort(key=lambda x: x['value'], reverse=True)
+
+            return response.json(0, {
+                'category': event_type,  # 添加当前查看的异常类型
+                'total': total_count,
+                'statistics': statistics
+            })
+        except Exception as e:
+            print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))