|
@@ -11,7 +11,8 @@ from Object.ResponseObject import ResponseObject
|
|
from Object.TokenObject import TokenObject
|
|
from Object.TokenObject import TokenObject
|
|
from Service.CommonService import CommonService
|
|
from Service.CommonService import CommonService
|
|
from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
|
|
from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
|
|
- AppLogModel, AppScannedSerial, StsFrequency, DeviceDomainRegionModel, IPAddr, CountryModel, RegionModel
|
|
|
|
|
|
+ AppLogModel, AppScannedSerial, StsFrequency, DeviceDomainRegionModel, IPAddr, CountryModel, RegionModel, \
|
|
|
|
+ AbnormalEvent, DeviceTypeModel, AbnormalEventCode, DeviceScheme, ProductsScheme
|
|
from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET
|
|
from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET
|
|
|
|
|
|
|
|
|
|
@@ -62,8 +63,16 @@ class LogManagementView(View):
|
|
return self.getDomainLog(request_dict, response)
|
|
return self.getDomainLog(request_dict, response)
|
|
elif operation == 'getDomainScanLog': # 获取域名扫码日志
|
|
elif operation == 'getDomainScanLog': # 获取域名扫码日志
|
|
return self.getDomainScanLog(request_dict, response)
|
|
return self.getDomainScanLog(request_dict, response)
|
|
|
|
+ elif operation == 'getDeviceAbnormalEvent': # 获取设备异常事件
|
|
|
|
+ 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:
|
|
else:
|
|
- return response.json(404)
|
|
|
|
|
|
+ return response.json(414)
|
|
|
|
|
|
def getRequestList(self, request_dict, response):
|
|
def getRequestList(self, request_dict, response):
|
|
pageNo = request_dict.get('pageNo', None)
|
|
pageNo = request_dict.get('pageNo', None)
|
|
@@ -532,3 +541,291 @@ class LogManagementView(View):
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
except Exception as e:
|
|
except Exception as e:
|
|
return response.json(500, '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)))
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def getDeviceAbnormalEvent(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)
|
|
|
|
+ page_no = request_dict.get('pageNo', None)
|
|
|
|
+ page_size = request_dict.get('pageSize', None)
|
|
|
|
+
|
|
|
|
+ is_page = False
|
|
|
|
+ if all([page_no, page_size]):
|
|
|
|
+ is_page = True
|
|
|
|
+ page = int(page_no)
|
|
|
|
+ line = int(page_size)
|
|
|
|
+
|
|
|
|
+ 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)
|
|
|
|
+ count = abnormal_events.count()
|
|
|
|
+ event_list = abnormal_events.order_by('-event_time').values(
|
|
|
|
+ 'id', 'uid', 'device_type', 'version', 'event_code',
|
|
|
|
+ 'content', 'report_type', 'event_time', 'created_time'
|
|
|
|
+ )
|
|
|
|
+ # 分页
|
|
|
|
+ if is_page:
|
|
|
|
+ event_list = event_list[(page - 1) * line:page * line]
|
|
|
|
+
|
|
|
|
+ # 查询设备型号,异常信息,制作单信息
|
|
|
|
+ for event in event_list:
|
|
|
|
+ device_type = DeviceTypeModel.objects.filter(type=event['device_type']).first()
|
|
|
|
+ if device_type:
|
|
|
|
+ event['device_type'] = device_type.name
|
|
|
|
+ else:
|
|
|
|
+ event['device_type'] = ''
|
|
|
|
+
|
|
|
|
+ abnormal_event_code = AbnormalEventCode.objects.filter(event_code=event['event_code']).first()
|
|
|
|
+ if abnormal_event_code:
|
|
|
|
+ event['event'] = abnormal_event_code.event
|
|
|
|
+ event['event_type'] = abnormal_event_code.event_type
|
|
|
|
+ else:
|
|
|
|
+ event['event'] = ''
|
|
|
|
+
|
|
|
|
+ # 根据uid查序列号
|
|
|
|
+ serial_number = CommonService.get_serial_number_by_uid(event['uid'])
|
|
|
|
+ device_scheme_qs = DeviceScheme.objects.filter(serial_number=serial_number).values('storage_code')
|
|
|
|
+ if device_scheme_qs.exists():
|
|
|
|
+ storage_code = device_scheme_qs[0]['storage_code']
|
|
|
|
+ event['storage_code'] = storage_code
|
|
|
|
+ products_scheme_qs = ProductsScheme.objects.filter(
|
|
|
|
+ storage_code=storage_code).values(
|
|
|
|
+ 'main_controller', 'wifi', 'sensor', 'order_quantity', 'created_time')
|
|
|
|
+ if products_scheme_qs.exists():
|
|
|
|
+ event['scheme'] = '{}+{}+{}'.format(
|
|
|
|
+ products_scheme_qs[0]['main_controller'], products_scheme_qs[0]['wifi'], products_scheme_qs[0]['sensor'])
|
|
|
|
+ event['order_quantity'] = products_scheme_qs[0]['order_quantity']
|
|
|
|
+ event['shipping_date'] = products_scheme_qs[0]['created_time']
|
|
|
|
+
|
|
|
|
+ return response.json(0, {'list': list(event_list), 'total': count})
|
|
|
|
+ except Exception as e:
|
|
|
|
+ return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def getAbnormalEventValue(response):
|
|
|
|
+ try:
|
|
|
|
+ event_types = AbnormalEventCode.objects.values_list('event_type', flat=True)
|
|
|
|
+ # 使用Python的set去重
|
|
|
|
+ seen = set()
|
|
|
|
+ unique_event_types = [x for x in event_types if x not in seen and not seen.add(x)]
|
|
|
|
+ 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)))
|