| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831 | 
							- #!/usr/bin/env python3
 
- # -*- coding: utf-8 -*-
 
- import boto3
 
- import botocore
 
- import requests
 
- from django.db.models import Q
 
- from django.views.generic.base import View
 
- from Object.IPWeatherObject import IPQuery
 
- from Object.ResponseObject import ResponseObject
 
- from Object.TokenObject import TokenObject
 
- from Service.CommonService import CommonService
 
- from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
 
-     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
 
- class LogManagementView(View):
 
-     def get(self, request, *args, **kwargs):
 
-         request.encoding = 'utf-8'
 
-         operation = kwargs.get('operation')
 
-         return self.validation(request.GET, request, operation)
 
-     def post(self, request, *args, **kwargs):
 
-         request.encoding = 'utf-8'
 
-         operation = kwargs.get('operation')
 
-         return self.validation(request.POST, request, operation)
 
-     def validation(self, request_dict, request, operation):
 
-         language = request_dict.get('language', 'en')
 
-         response = ResponseObject(language, 'pc')
 
-         if operation == '??':
 
-             return 0
 
-         else:
 
-             tko = TokenObject(
 
-                 request.META.get('HTTP_AUTHORIZATION'),
 
-                 returntpye='pc')
 
-             # if tko.code != 0:
 
-             #     return response.json(tko.code)
 
-             response.lang = tko.lang
 
-             userID = tko.userID
 
-             if operation == 'getRequestList':
 
-                 return self.getRequestList(request_dict, response)
 
-             elif operation == 'getDeviceIotInfoList':
 
-                 return self.getDeviceIotInfoList(request_dict, response)
 
-             elif operation == 'requestPublishMqtt':
 
-                 return self.requestPublishMqtt(request_dict, response)
 
-             elif operation == 'getAccessLogList':
 
-                 return self.getAccessLogList(request_dict, response)
 
-             elif operation == 'getDeviceLogList':
 
-                 return self.getDeviceLogList(request_dict, response)
 
-             # 操作日志
 
-             elif operation == 'getOperationLogList':
 
-                 return self.getOperationLogList(request_dict, response)
 
-             elif operation == 'getAppLogList':  # 获取app日志
 
-                 return self.getAppLogList(request_dict, response)
 
-             elif operation == 'getScanLog':  # 获取扫码日志
 
-                 return self.getScanLog(request_dict, response)
 
-             elif operation == 'getAlarmLog':  # 获取警报日志
 
-                 return self.getAlarmLog(request_dict, response)
 
-             elif operation == 'getDomainLog':  # 获取域名日志
 
-                 return self.getDomainLog(request_dict, response)
 
-             elif operation == 'getDomainScanLog':  # 获取域名扫码日志
 
-                 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:
 
-                 return response.json(414)
 
-     def getRequestList(self, request_dict, response):
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         method = request_dict.get('method', None)
 
-         url = request_dict.get('url', None)
 
-         parameter = request_dict.get('parameter', None)
 
-         status_code = request_dict.get('status_code', None)
 
-         reason_phrase = request_dict.get('reason_phrase', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             request_qs = RequestRecordModel.objects.all()
 
-             if method:
 
-                 request_qs = request_qs.filter(method=method)
 
-             if url:
 
-                 request_qs = request_qs.filter(url__contains=url)
 
-             if parameter:
 
-                 request_qs = request_qs.filter(parameter__contains=parameter)
 
-             if status_code:
 
-                 request_qs = request_qs.filter(status_code=status_code)
 
-             if reason_phrase:
 
-                 request_qs = request_qs.filter(reason_phrase=reason_phrase)
 
-             count = request_qs.count()
 
-             request_qs = request_qs[(page - 1) * line:page * line]
 
-             qs_list = []
 
-             for requsetobj in request_qs:
 
-                 qs_list.append({
 
-                     'id': requsetobj.id,
 
-                     'method': requsetobj.method,
 
-                     'url': requsetobj.url,
 
-                     'parameter': requsetobj.parameter,
 
-                     # 时间保留小数点后两位
 
-                     'execute_time': round(requsetobj.execute_time, 2),
 
-                     'status_code': requsetobj.status_code,
 
-                     'reason_phrase': requsetobj.reason_phrase,
 
-                     'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
 
-                 })
 
-             return response.json(
 
-                 0, {'list': qs_list, 'total': count})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getDeviceIotInfoList(self, request_dict, response):
 
-         serial_number = request_dict.get('serial_number', None)
 
-         uid = request_dict.get('uid', None)
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             if serial_number or uid:
 
-                 if serial_number:
 
-                     iot_device_info_qs = iotdeviceInfoModel.objects.filter(
 
-                         serial_number__contains=serial_number)
 
-                 if uid:
 
-                     iot_device_info_qs = iotdeviceInfoModel.objects.filter(
 
-                         uid__contains=uid)
 
-                 if not iot_device_info_qs.exists():
 
-                     return response.json(0)
 
-                 total = len(iot_device_info_qs)
 
-                 iot_device_info_qs = iot_device_info_qs.values(
 
-                     'serial_number',
 
-                     'uid',
 
-                     'thing_name',
 
-                     'thing_groups',
 
-                     'add_time',
 
-                     'update_time')[(page - 1) * line:page * line]
 
-             else:
 
-                 total = iotdeviceInfoModel.objects.filter().count()
 
-                 iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
 
-                     'serial_number',
 
-                     'uid',
 
-                     'thing_name',
 
-                     'thing_groups',
 
-                     'add_time',
 
-                     'update_time')[(page - 1) * line:page * line]
 
-             iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
 
-             # 获取序列号的uid
 
-             for iot_device_info in iot_device_info_list:
 
-                 if not iot_device_info['uid']:
 
-                     device_info_qs = Device_Info.objects.filter(
 
-                         serial_number__contains=iot_device_info['serial_number']).values('UID')
 
-                     if device_info_qs.exists():
 
-                         iot_device_info['uid'] = device_info_qs[0]['UID']
 
-             return response.json(
 
-                 0, {'list': iot_device_info_list, 'total': total})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     # 通用发布MQTT通知
 
-     @staticmethod
 
-     def requestPublishMqtt(request_dict, response):
 
-         msg = request_dict.get('msg', None)
 
-         thing_name = request_dict.get('thing_name', None)
 
-         topic_name = request_dict.get('topic_name', None)
 
-         if not all([msg, thing_name, topic_name]):
 
-             return response.json(444)
 
-         try:
 
-             msg = eval(msg)
 
-             identification_code = thing_name[thing_name.rindex('_') + 1:]
 
-             if not CommonService.req_publish_mqtt_msg(identification_code, topic_name, msg):
 
-                 return response.json(10044)
 
-             return response.json(0)
 
-         except Exception as e:
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getAccessLogList(self, request_dict, response):
 
-         user = request_dict.get('user', None)
 
-         operation = request_dict.get('operation', None)
 
-         status = request_dict.get('status', None)
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             if user or operation or status:
 
-                 if user:
 
-                     access_log_qs = Access_Log.objects.filter(
 
-                         user__contains=user)
 
-                 if operation:
 
-                     access_log_qs = Access_Log.objects.filter(
 
-                         operation__contains=operation)
 
-                 if status:
 
-                     access_log_qs = Access_Log.objects.filter(status=status)
 
-                 if not access_log_qs.exists():
 
-                     return response.json(0)
 
-                 total = access_log_qs.count()
 
-                 access_log_qs = access_log_qs.order_by('-time').values(
 
-                     'user', 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
 
-             else:
 
-                 total = Access_Log.objects.count()
 
-                 access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
 
-                                                                                      'operation', 'ip', 'status',
 
-                                                                                      'content', 'time')[
 
-                                 (page - 1) * line:page * line]
 
-             access_log_list = CommonService.qs_to_list(access_log_qs)
 
-             return response.json(0, {'list': access_log_list, 'total': total})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getDeviceLogList(self, request_dict, response):
 
-         uid = request_dict.get('uid', None)
 
-         serial_number = request_dict.get('serial_number', None)
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             if uid or serial_number:
 
-                 if uid:
 
-                     device_log_qs = DeviceLogModel.objects.filter(
 
-                         uid=uid)
 
-                 if serial_number:
 
-                     device_log_qs = DeviceLogModel.objects.filter(
 
-                         serial_number=serial_number)
 
-                 if not device_log_qs.exists():
 
-                     return response.json(0)
 
-                 total = device_log_qs.count()
 
-                 device_log_qs = device_log_qs.order_by(
 
-                     '-add_time').values()[(page - 1) * line:page * line]
 
-             else:
 
-                 total = DeviceLogModel.objects.count()
 
-                 device_log_qs = DeviceLogModel.objects.filter().order_by(
 
-                     '-add_time').values()[(page - 1) * line:page * line]
 
-             device_log_list = CommonService.qs_to_list(device_log_qs)
 
-             # 添加下载链接
 
-             aws_s3_client = boto3.client(
 
-                 's3',
 
-                 region_name=REGION_NAME,
 
-                 aws_access_key_id=ACCESS_KEY_ID,
 
-                 aws_secret_access_key=SECRET_ACCESS_KEY,
 
-                 config=botocore.client.Config(signature_version='s3v4'),
 
-             )
 
-             for device_log in device_log_list:
 
-                 obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
 
-                 obj = 'device_log/' + obj + \
 
-                       '/{}'.format(device_log['filename'])
 
-                 download_url = aws_s3_client.generate_presigned_url(
 
-                     ClientMethod='get_object',
 
-                     Params={
 
-                         'Bucket': LOG_BUCKET,
 
-                         'Key': obj
 
-                     },
 
-                     ExpiresIn=3600
 
-                 )
 
-                 device_log['download_url'] = download_url
 
-             return response.json(0, {'list': device_log_list, 'total': total})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getOperationLogList(self, request_dict, response):
 
-         operation = request_dict.get('operation', None)
 
-         url = request_dict.get('url', None)
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             log_qs = LogModel.objects.all()
 
-             if operation:
 
-                 log_qs = log_qs.filter(operation__contains=operation)
 
-             if url:
 
-                 log_qs = log_qs.filter(url__contains=url)
 
-             count = log_qs.count()
 
-             log_qs = log_qs.values(
 
-                 'operation', 'url', 'content', 'ip', 'time')[
 
-                      (page - 1) * line:page * line]
 
-             log_list = list(log_qs)
 
-             return response.json(
 
-                 0, {'list': log_list, 'total': count})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getAppLogList(self, request_dict, response):
 
-         """
 
-         获取App日志信息
 
-         @param request_dict:请求参数
 
-         @param response:响应对象
 
-         @request_dict userID:用户ID
 
-         @request_dict uid:uid
 
-         @return:
 
-         """
 
-         userName = request_dict.get('userName', None)
 
-         uid = request_dict.get('uid', None)
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             app_log_qs = AppLogModel.objects.all()
 
-             if userName:
 
-                 app_log_qs = app_log_qs.filter(user__username=userName)
 
-             elif uid:
 
-                 app_log_qs = app_log_qs.filter(uid=uid)
 
-             count = app_log_qs.count()
 
-             log_qs = app_log_qs.values(
 
-                 'user__username', 'uid', 'average_delay', 'status', 'filename', 'add_time', 'user_id').order_by(
 
-                 '-add_time')[(page - 1) * line:page * line]
 
-             app_log_list = CommonService.qs_to_list(log_qs)
 
-             # 添加下载链接
 
-             aws_s3_client = boto3.client(
 
-                 's3',
 
-                 region_name=REGION_NAME,
 
-                 aws_access_key_id=ACCESS_KEY_ID,
 
-                 aws_secret_access_key=SECRET_ACCESS_KEY,
 
-                 config=botocore.client.Config(signature_version='s3v4'),
 
-             )
 
-             for app_log in app_log_list:
 
-                 filename = app_log['filename']
 
-                 if not filename.endswith('.txt'):
 
-                     filename += ".txt"
 
-                 obj = 'app_log/' + app_log['user_id'] + '/{}'.format(filename)
 
-                 appLog_url = aws_s3_client.generate_presigned_url(
 
-                     ClientMethod='get_object',
 
-                     Params={
 
-                         'Bucket': LOG_BUCKET,
 
-                         'Key': obj
 
-                     },
 
-                     ExpiresIn=3600
 
-                 )
 
-                 app_log['appLog_url'] = appLog_url
 
-             return response.json(0, {'list': app_log_list, 'total': count})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getScanLog(self, request_dict, response):
 
-         serial = request_dict.get('serial', None)
 
-         ip = request_dict.get('ip', None)
 
-         pageNo = request_dict.get('pageNo', None)
 
-         pageSize = request_dict.get('pageSize', None)
 
-         if not all([pageNo, pageSize]):
 
-             return response.json(444)
 
-         page = int(pageNo)
 
-         line = int(pageSize)
 
-         try:
 
-             scan_log_qs = AppScannedSerial.objects.all()
 
-             if serial:
 
-                 scan_log_qs = scan_log_qs.filter(serial__contains=serial)
 
-             if ip:
 
-                 scan_log_qs = scan_log_qs.filter(ip__contains=ip)
 
-             count = scan_log_qs.count()
 
-             scan_log_qs = scan_log_qs.order_by('-add_time').values(
 
-                 'serial', 'ip', 'add_time', 'update_time')[
 
-                           (page - 1) * line:page * line]
 
-             scan_log_list = list(scan_log_qs)
 
-             return response.json(
 
-                 0, {'list': scan_log_list, 'total': count})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     def getAlarmLog(self, request_dict, response):
 
-         page_no = request_dict.get('pageNo', None)
 
-         page_size = request_dict.get('pageSize', None)
 
-         uid = request_dict.get('uid', None)
 
-         if not all([page_no, page_size]):
 
-             return response.json(444)
 
-         page = int(page_no)
 
-         line = int(page_size)
 
-         try:
 
-             alarm_log_qs = StsFrequency.objects.all()
 
-             if uid:
 
-                 alarm_log_qs = alarm_log_qs.filter(uid=uid)
 
-             count = alarm_log_qs.count()
 
-             alarm_log_qs = alarm_log_qs.order_by('-updateTime').values('id', 'uid', 'frequency', 'updateTime',
 
-                                                                        'addTime')[(page - 1) * line:page * line]
 
-             return response.json(0, {'list': list(alarm_log_qs), 'total': count})
 
-         except Exception as e:
 
-             print(e)
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     @staticmethod
 
-     def getDomainLog(request_dict, response):
 
-         page_no = request_dict.get('pageNo', None)
 
-         page_size = request_dict.get('pageSize', None)
 
-         serial_number = request_dict.get('serialNumber', None)
 
-         if not all([page_no, page_size]):
 
-             return response.json(444)
 
-         page = int(page_no)
 
-         line = int(page_size)
 
-         try:
 
-             device_domain_qs = DeviceDomainRegionModel.objects.filter(~Q(country_code=''))
 
-             if serial_number:
 
-                 device_domain_qs = device_domain_qs.filter(serial_number__contains=serial_number)
 
-             count = device_domain_qs.count()
 
-             device_domain_qs = device_domain_qs.order_by('-update_time').values()[(page - 1) * line:page * line]
 
-             device_domain_list = []
 
-             for device_domain in device_domain_qs:
 
-                 ip = device_domain['ip']
 
-                 region_id = device_domain['region_id']
 
-                 country_code = device_domain['country_code']
 
-                 ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('region')
 
-                 if ip_addr_qs.exists():
 
-                     region = ip_addr_qs[0]['region']
 
-                 else:
 
-                     ip_qs = IPQuery(ip)
 
-                     region = ip_qs.region
 
-                 # 港澳台返回美洲域名
 
-                 if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
 
-                     country_code = region
 
-                 # 查询域名数据
 
-                 region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
 
-                 api = 'https://www.dvema.com/'
 
-                 region_name = '美洲'
 
-                 if region_qs.exists():
 
-                     api = region_qs[0]['api']
 
-                     region_name = region_qs[0]['name']
 
-                 api_region = region_name + '域名'
 
-                 device_domain_list.append({
 
-                     'id': device_domain['id'],
 
-                     'serial_number': device_domain['serial_number'],
 
-                     'ip': ip,
 
-                     'region_id': region_id,
 
-                     'country_code': country_code,
 
-                     'api': api,
 
-                     'api_region': api_region,
 
-                     'add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
 
-                     'update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
 
-                 })
 
-             return response.json(0, {'list': device_domain_list, 'total': count})
 
-         except Exception as e:
 
-             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-     @staticmethod
 
-     def getDomainScanLog(request_dict, response):
 
-         serial_number = request_dict.get('serialNumber', None)
 
-         if not all([serial_number]):
 
-             return response.json(444)
 
-         try:
 
-             scan_log_qs = AppScannedSerial.objects.filter(serial__contains=serial_number).values('ip', 'add_time',
 
-                                                                                                  'update_time')
 
-             device_domain_qs = DeviceDomainRegionModel.objects.filter(serial_number__contains=serial_number).values()
 
-             res = {}
 
-             if scan_log_qs.exists() and device_domain_qs.exists():
 
-                 device_domain = device_domain_qs[0]
 
-                 domain_ip = device_domain['ip']
 
-                 region_id = device_domain['region_id']
 
-                 country_code = device_domain['country_code']
 
-                 ip_addr_qs = IPAddr.objects.filter(ip=domain_ip, is_geoip2=False).values('region')
 
-                 if ip_addr_qs.exists():
 
-                     region = ip_addr_qs[0]['region']
 
-                 else:
 
-                     ip_qs = IPQuery(domain_ip)
 
-                     region = ip_qs.region
 
-                 # 港澳台返回美洲域名
 
-                 if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
 
-                     country_code = region
 
-                 # 查询域名数据
 
-                 region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
 
-                 api = 'https://www.dvema.com/'
 
-                 region_name = '美洲'
 
-                 if region_qs.exists():
 
-                     api = region_qs[0]['api']
 
-                     region_name = region_qs[0]['name']
 
-                 api_region = region_name + '域名'
 
-                 res = {
 
-                     'serial_number': device_domain['serial_number'],
 
-                     'domain_ip': domain_ip,
 
-                     'scan_ip': device_domain_qs[0]['ip'],
 
-                     'region_id': region_id,
 
-                     'country_code': country_code,
 
-                     'api': api,
 
-                     'api_region': api_region,
 
-                     'domain_add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
 
-                     'domain_update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
 
-                     'scan_add_time': device_domain_qs[0]['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
 
-                     'scan_update_time': device_domain_qs[0]['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
 
-                 }
 
-             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 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)))
 
 
  |