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