LogManagementController.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import boto3
  4. import botocore
  5. import requests
  6. from django.db.models import Q
  7. from django.views.generic.base import View
  8. from Object.IPWeatherObject import IPQuery
  9. from Object.ResponseObject import ResponseObject
  10. from Object.TokenObject import TokenObject
  11. from Service.CommonService import CommonService
  12. from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
  13. AppLogModel, AppScannedSerial, StsFrequency, DeviceDomainRegionModel, IPAddr, CountryModel, RegionModel, \
  14. AbnormalEvent, DeviceTypeModel, AbnormalEventCode, DeviceScheme, ProductsScheme
  15. from Ansjer.config import REGION_NAME, LOG_BUCKET
  16. from django.conf import settings
  17. ACCESS_KEY_ID = settings.ACCESS_KEY_ID
  18. SECRET_ACCESS_KEY = settings.SECRET_ACCESS_KEY
  19. class LogManagementView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def validation(self, request_dict, request, operation):
  29. language = request_dict.get('language', 'en')
  30. response = ResponseObject(language, 'pc')
  31. if operation == '??':
  32. return 0
  33. else:
  34. tko = TokenObject(
  35. request.META.get('HTTP_AUTHORIZATION'),
  36. returntpye='pc')
  37. # if tko.code != 0:
  38. # return response.json(tko.code)
  39. response.lang = tko.lang
  40. userID = tko.userID
  41. if operation == 'getRequestList':
  42. return self.getRequestList(request_dict, response)
  43. elif operation == 'getDeviceIotInfoList':
  44. return self.getDeviceIotInfoList(request_dict, response)
  45. elif operation == 'requestPublishMqtt':
  46. return self.requestPublishMqtt(request_dict, response)
  47. elif operation == 'getAccessLogList':
  48. return self.getAccessLogList(request_dict, response)
  49. elif operation == 'getDeviceLogList':
  50. return self.getDeviceLogList(request_dict, response)
  51. # 操作日志
  52. elif operation == 'getOperationLogList':
  53. return self.getOperationLogList(request_dict, response)
  54. elif operation == 'getAppLogList': # 获取app日志
  55. return self.getAppLogList(request_dict, response)
  56. elif operation == 'getScanLog': # 获取扫码日志
  57. return self.getScanLog(request_dict, response)
  58. elif operation == 'getAlarmLog': # 获取警报日志
  59. return self.getAlarmLog(request_dict, response)
  60. elif operation == 'getDomainLog': # 获取域名日志
  61. return self.getDomainLog(request_dict, response)
  62. elif operation == 'getDomainScanLog': # 获取域名扫码日志
  63. return self.getDomainScanLog(request_dict, response)
  64. elif operation == 'getDeviceAbnormalEvent': # 获取设备异常事件
  65. return self.getDeviceAbnormalEvent(request_dict, response)
  66. elif operation == 'getAbnormalEventValue': # 获取设备异常事件编码/内容
  67. return self.getAbnormalEventValue(response)
  68. elif operation == 'getAbnormalPercentage': # 获取异常百分比
  69. return self.getAbnormalPercentage(request_dict, response)
  70. elif operation == 'getAbnormalDetailsPercentage': # 获取异常详情百分比
  71. return self.getAbnormalDetailsPercentage(request_dict, response)
  72. else:
  73. return response.json(414)
  74. def getRequestList(self, request_dict, response):
  75. pageNo = request_dict.get('pageNo', None)
  76. pageSize = request_dict.get('pageSize', None)
  77. method = request_dict.get('method', None)
  78. url = request_dict.get('url', None)
  79. parameter = request_dict.get('parameter', None)
  80. status_code = request_dict.get('status_code', None)
  81. reason_phrase = request_dict.get('reason_phrase', None)
  82. if not all([pageNo, pageSize]):
  83. return response.json(444)
  84. page = int(pageNo)
  85. line = int(pageSize)
  86. try:
  87. request_qs = RequestRecordModel.objects.all()
  88. if method:
  89. request_qs = request_qs.filter(method=method)
  90. if url:
  91. request_qs = request_qs.filter(url__contains=url)
  92. if parameter:
  93. request_qs = request_qs.filter(parameter__contains=parameter)
  94. if status_code:
  95. request_qs = request_qs.filter(status_code=status_code)
  96. if reason_phrase:
  97. request_qs = request_qs.filter(reason_phrase=reason_phrase)
  98. count = request_qs.count()
  99. request_qs = request_qs[(page - 1) * line:page * line]
  100. qs_list = []
  101. for requsetobj in request_qs:
  102. qs_list.append({
  103. 'id': requsetobj.id,
  104. 'method': requsetobj.method,
  105. 'url': requsetobj.url,
  106. 'parameter': requsetobj.parameter,
  107. # 时间保留小数点后两位
  108. 'execute_time': round(requsetobj.execute_time, 2),
  109. 'status_code': requsetobj.status_code,
  110. 'reason_phrase': requsetobj.reason_phrase,
  111. 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
  112. })
  113. return response.json(
  114. 0, {'list': qs_list, 'total': count})
  115. except Exception as e:
  116. print(e)
  117. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  118. def getDeviceIotInfoList(self, request_dict, response):
  119. serial_number = request_dict.get('serial_number', None)
  120. uid = request_dict.get('uid', None)
  121. pageNo = request_dict.get('pageNo', None)
  122. pageSize = request_dict.get('pageSize', None)
  123. if not all([pageNo, pageSize]):
  124. return response.json(444)
  125. page = int(pageNo)
  126. line = int(pageSize)
  127. try:
  128. if serial_number or uid:
  129. if serial_number:
  130. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  131. serial_number__contains=serial_number)
  132. if uid:
  133. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  134. uid__contains=uid)
  135. if not iot_device_info_qs.exists():
  136. return response.json(0)
  137. total = len(iot_device_info_qs)
  138. iot_device_info_qs = iot_device_info_qs.values(
  139. 'serial_number',
  140. 'uid',
  141. 'thing_name',
  142. 'thing_groups',
  143. 'add_time',
  144. 'update_time')[(page - 1) * line:page * line]
  145. else:
  146. total = iotdeviceInfoModel.objects.filter().count()
  147. iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
  148. 'serial_number',
  149. 'uid',
  150. 'thing_name',
  151. 'thing_groups',
  152. 'add_time',
  153. 'update_time')[(page - 1) * line:page * line]
  154. iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
  155. # 获取序列号的uid
  156. for iot_device_info in iot_device_info_list:
  157. if not iot_device_info['uid']:
  158. device_info_qs = Device_Info.objects.filter(
  159. serial_number__contains=iot_device_info['serial_number']).values('UID')
  160. if device_info_qs.exists():
  161. iot_device_info['uid'] = device_info_qs[0]['UID']
  162. return response.json(
  163. 0, {'list': iot_device_info_list, 'total': total})
  164. except Exception as e:
  165. print(e)
  166. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  167. # 通用发布MQTT通知
  168. @staticmethod
  169. def requestPublishMqtt(request_dict, response):
  170. msg = request_dict.get('msg', None)
  171. thing_name = request_dict.get('thing_name', None)
  172. topic_name = request_dict.get('topic_name', None)
  173. if not all([msg, thing_name, topic_name]):
  174. return response.json(444)
  175. try:
  176. msg = eval(msg)
  177. identification_code = thing_name[thing_name.rindex('_') + 1:]
  178. if not CommonService.req_publish_mqtt_msg(identification_code, topic_name, msg):
  179. return response.json(10044)
  180. return response.json(0)
  181. except Exception as e:
  182. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  183. def getAccessLogList(self, request_dict, response):
  184. user = request_dict.get('user', None)
  185. operation = request_dict.get('operation', None)
  186. status = request_dict.get('status', None)
  187. pageNo = request_dict.get('pageNo', None)
  188. pageSize = request_dict.get('pageSize', None)
  189. if not all([pageNo, pageSize]):
  190. return response.json(444)
  191. page = int(pageNo)
  192. line = int(pageSize)
  193. try:
  194. if user or operation or status:
  195. if user:
  196. access_log_qs = Access_Log.objects.filter(
  197. user__contains=user)
  198. if operation:
  199. access_log_qs = Access_Log.objects.filter(
  200. operation__contains=operation)
  201. if status:
  202. access_log_qs = Access_Log.objects.filter(status=status)
  203. if not access_log_qs.exists():
  204. return response.json(0)
  205. total = access_log_qs.count()
  206. access_log_qs = access_log_qs.order_by('-time').values(
  207. 'user', 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  208. else:
  209. total = Access_Log.objects.count()
  210. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  211. 'operation', 'ip', 'status',
  212. 'content', 'time')[
  213. (page - 1) * line:page * line]
  214. access_log_list = CommonService.qs_to_list(access_log_qs)
  215. return response.json(0, {'list': access_log_list, 'total': total})
  216. except Exception as e:
  217. print(e)
  218. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  219. def getDeviceLogList(self, request_dict, response):
  220. uid = request_dict.get('uid', None)
  221. serial_number = request_dict.get('serial_number', None)
  222. pageNo = request_dict.get('pageNo', None)
  223. pageSize = request_dict.get('pageSize', None)
  224. if not all([pageNo, pageSize]):
  225. return response.json(444)
  226. page = int(pageNo)
  227. line = int(pageSize)
  228. try:
  229. if uid or serial_number:
  230. if uid:
  231. device_log_qs = DeviceLogModel.objects.filter(
  232. uid=uid)
  233. if serial_number:
  234. device_log_qs = DeviceLogModel.objects.filter(
  235. serial_number=serial_number)
  236. if not device_log_qs.exists():
  237. return response.json(0)
  238. total = device_log_qs.count()
  239. device_log_qs = device_log_qs.order_by(
  240. '-add_time').values()[(page - 1) * line:page * line]
  241. else:
  242. total = DeviceLogModel.objects.count()
  243. device_log_qs = DeviceLogModel.objects.filter().order_by(
  244. '-add_time').values()[(page - 1) * line:page * line]
  245. device_log_list = CommonService.qs_to_list(device_log_qs)
  246. # 添加下载链接
  247. aws_s3_client = boto3.client(
  248. 's3',
  249. region_name=REGION_NAME,
  250. aws_access_key_id=ACCESS_KEY_ID,
  251. aws_secret_access_key=SECRET_ACCESS_KEY,
  252. config=botocore.client.Config(signature_version='s3v4'),
  253. )
  254. for device_log in device_log_list:
  255. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  256. obj = 'device_log/' + obj + \
  257. '/{}'.format(device_log['filename'])
  258. download_url = aws_s3_client.generate_presigned_url(
  259. ClientMethod='get_object',
  260. Params={
  261. 'Bucket': LOG_BUCKET,
  262. 'Key': obj
  263. },
  264. ExpiresIn=3600
  265. )
  266. device_log['download_url'] = download_url
  267. return response.json(0, {'list': device_log_list, 'total': total})
  268. except Exception as e:
  269. print(e)
  270. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  271. def getOperationLogList(self, request_dict, response):
  272. operation = request_dict.get('operation', None)
  273. url = request_dict.get('url', None)
  274. pageNo = request_dict.get('pageNo', None)
  275. pageSize = request_dict.get('pageSize', None)
  276. if not all([pageNo, pageSize]):
  277. return response.json(444)
  278. page = int(pageNo)
  279. line = int(pageSize)
  280. try:
  281. log_qs = LogModel.objects.all()
  282. if operation:
  283. log_qs = log_qs.filter(operation__contains=operation)
  284. if url:
  285. log_qs = log_qs.filter(url__contains=url)
  286. count = log_qs.count()
  287. log_qs = log_qs.values(
  288. 'operation', 'url', 'content', 'ip', 'time')[
  289. (page - 1) * line:page * line]
  290. log_list = list(log_qs)
  291. return response.json(
  292. 0, {'list': log_list, 'total': count})
  293. except Exception as e:
  294. print(e)
  295. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  296. def getAppLogList(self, request_dict, response):
  297. """
  298. 获取App日志信息
  299. @param request_dict:请求参数
  300. @param response:响应对象
  301. @request_dict userID:用户ID
  302. @request_dict uid:uid
  303. @return:
  304. """
  305. userName = request_dict.get('userName', None)
  306. uid = request_dict.get('uid', None)
  307. pageNo = request_dict.get('pageNo', None)
  308. pageSize = request_dict.get('pageSize', None)
  309. if not all([pageNo, pageSize]):
  310. return response.json(444)
  311. page = int(pageNo)
  312. line = int(pageSize)
  313. try:
  314. app_log_qs = AppLogModel.objects.all()
  315. if userName:
  316. app_log_qs = app_log_qs.filter(user__username=userName)
  317. elif uid:
  318. app_log_qs = app_log_qs.filter(uid=uid)
  319. count = app_log_qs.count()
  320. log_qs = app_log_qs.values(
  321. 'user__username', 'uid', 'average_delay', 'status', 'filename', 'add_time', 'user_id').order_by(
  322. '-add_time')[(page - 1) * line:page * line]
  323. app_log_list = CommonService.qs_to_list(log_qs)
  324. # 添加下载链接
  325. aws_s3_client = boto3.client(
  326. 's3',
  327. region_name=REGION_NAME,
  328. aws_access_key_id=ACCESS_KEY_ID,
  329. aws_secret_access_key=SECRET_ACCESS_KEY,
  330. config=botocore.client.Config(signature_version='s3v4'),
  331. )
  332. for app_log in app_log_list:
  333. filename = app_log['filename']
  334. if not filename.endswith('.txt'):
  335. filename += ".txt"
  336. obj = 'app_log/' + app_log['user_id'] + '/{}'.format(filename)
  337. appLog_url = aws_s3_client.generate_presigned_url(
  338. ClientMethod='get_object',
  339. Params={
  340. 'Bucket': LOG_BUCKET,
  341. 'Key': obj
  342. },
  343. ExpiresIn=3600
  344. )
  345. app_log['appLog_url'] = appLog_url
  346. return response.json(0, {'list': app_log_list, 'total': count})
  347. except Exception as e:
  348. print(e)
  349. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  350. def getScanLog(self, request_dict, response):
  351. serial = request_dict.get('serial', None)
  352. ip = request_dict.get('ip', None)
  353. pageNo = request_dict.get('pageNo', None)
  354. pageSize = request_dict.get('pageSize', None)
  355. if not all([pageNo, pageSize]):
  356. return response.json(444)
  357. page = int(pageNo)
  358. line = int(pageSize)
  359. try:
  360. scan_log_qs = AppScannedSerial.objects.all()
  361. if serial:
  362. scan_log_qs = scan_log_qs.filter(serial__contains=serial)
  363. if ip:
  364. scan_log_qs = scan_log_qs.filter(ip__contains=ip)
  365. count = scan_log_qs.count()
  366. scan_log_qs = scan_log_qs.order_by('-add_time').values(
  367. 'serial', 'ip', 'add_time', 'update_time')[
  368. (page - 1) * line:page * line]
  369. scan_log_list = list(scan_log_qs)
  370. return response.json(
  371. 0, {'list': scan_log_list, 'total': count})
  372. except Exception as e:
  373. print(e)
  374. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  375. def getAlarmLog(self, request_dict, response):
  376. page_no = request_dict.get('pageNo', None)
  377. page_size = request_dict.get('pageSize', None)
  378. uid = request_dict.get('uid', None)
  379. if not all([page_no, page_size]):
  380. return response.json(444)
  381. page = int(page_no)
  382. line = int(page_size)
  383. try:
  384. alarm_log_qs = StsFrequency.objects.all()
  385. if uid:
  386. alarm_log_qs = alarm_log_qs.filter(uid=uid)
  387. count = alarm_log_qs.count()
  388. alarm_log_qs = alarm_log_qs.order_by('-updateTime').values('id', 'uid', 'frequency', 'updateTime',
  389. 'addTime')[(page - 1) * line:page * line]
  390. return response.json(0, {'list': list(alarm_log_qs), 'total': count})
  391. except Exception as e:
  392. print(e)
  393. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  394. @staticmethod
  395. def getDomainLog(request_dict, response):
  396. page_no = request_dict.get('pageNo', None)
  397. page_size = request_dict.get('pageSize', None)
  398. serial_number = request_dict.get('serialNumber', None)
  399. if not all([page_no, page_size]):
  400. return response.json(444)
  401. page = int(page_no)
  402. line = int(page_size)
  403. try:
  404. device_domain_qs = DeviceDomainRegionModel.objects.filter(~Q(country_code=''))
  405. if serial_number:
  406. device_domain_qs = device_domain_qs.filter(serial_number__contains=serial_number)
  407. count = device_domain_qs.count()
  408. device_domain_qs = device_domain_qs.order_by('-update_time').values()[(page - 1) * line:page * line]
  409. device_domain_list = []
  410. for device_domain in device_domain_qs:
  411. ip = device_domain['ip']
  412. region_id = device_domain['region_id']
  413. country_code = device_domain['country_code']
  414. ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('region')
  415. if ip_addr_qs.exists():
  416. region = ip_addr_qs[0]['region']
  417. else:
  418. ip_qs = IPQuery(ip)
  419. region = ip_qs.region
  420. # 港澳台返回美洲域名
  421. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  422. country_code = region
  423. # 查询域名数据
  424. region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
  425. api = 'https://www.dvema.com/'
  426. region_name = '美洲'
  427. if region_qs.exists():
  428. api = region_qs[0]['api']
  429. region_name = region_qs[0]['name']
  430. api_region = region_name + '域名'
  431. device_domain_list.append({
  432. 'id': device_domain['id'],
  433. 'serial_number': device_domain['serial_number'],
  434. 'ip': ip,
  435. 'region_id': region_id,
  436. 'country_code': country_code,
  437. 'api': api,
  438. 'api_region': api_region,
  439. 'add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  440. 'update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  441. })
  442. return response.json(0, {'list': device_domain_list, 'total': count})
  443. except Exception as e:
  444. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  445. @staticmethod
  446. def getDomainScanLog(request_dict, response):
  447. serial_number = request_dict.get('serialNumber', None)
  448. if not all([serial_number]):
  449. return response.json(444)
  450. try:
  451. scan_log_qs = AppScannedSerial.objects.filter(serial__contains=serial_number).values('ip', 'add_time',
  452. 'update_time')
  453. device_domain_qs = DeviceDomainRegionModel.objects.filter(serial_number__contains=serial_number).values()
  454. res = {}
  455. if scan_log_qs.exists() and device_domain_qs.exists():
  456. device_domain = device_domain_qs[0]
  457. domain_ip = device_domain['ip']
  458. region_id = device_domain['region_id']
  459. country_code = device_domain['country_code']
  460. ip_addr_qs = IPAddr.objects.filter(ip=domain_ip, is_geoip2=False).values('region')
  461. if ip_addr_qs.exists():
  462. region = ip_addr_qs[0]['region']
  463. else:
  464. ip_qs = IPQuery(domain_ip)
  465. region = ip_qs.region
  466. # 港澳台返回美洲域名
  467. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  468. country_code = region
  469. # 查询域名数据
  470. region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
  471. api = 'https://www.dvema.com/'
  472. region_name = '美洲'
  473. if region_qs.exists():
  474. api = region_qs[0]['api']
  475. region_name = region_qs[0]['name']
  476. api_region = region_name + '域名'
  477. res = {
  478. 'serial_number': device_domain['serial_number'],
  479. 'domain_ip': domain_ip,
  480. 'scan_ip': device_domain_qs[0]['ip'],
  481. 'region_id': region_id,
  482. 'country_code': country_code,
  483. 'api': api,
  484. 'api_region': api_region,
  485. 'domain_add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  486. 'domain_update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  487. 'scan_add_time': device_domain_qs[0]['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  488. 'scan_update_time': device_domain_qs[0]['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  489. }
  490. return response.json(0, res)
  491. except Exception as e:
  492. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  493. @staticmethod
  494. def getDeviceAbnormalEvent(request_dict, response):
  495. uid = request_dict.get('uid', None)
  496. storage_code = request_dict.get('storageCode', None)
  497. device_type = request_dict.get('deviceType', None)
  498. version = request_dict.get('version', None)
  499. event_type = request_dict.get('eventType', None)
  500. report_type = request_dict.get('reportType', None)
  501. event_time_range = request_dict.getlist('eventTimeRange[]', None)
  502. page_no = request_dict.get('pageNo', None)
  503. page_size = request_dict.get('pageSize', None)
  504. is_page = False
  505. if all([page_no, page_size]):
  506. is_page = True
  507. page = int(page_no)
  508. line = int(page_size)
  509. try:
  510. query = Q()
  511. if uid:
  512. query &= Q(uid=uid)
  513. if storage_code:
  514. # 同一单号都为uid或序列号
  515. uid_qs = DeviceScheme.objects.filter(storage_code=storage_code).\
  516. values_list('serial_number', flat=True)
  517. uid_list = list(uid_qs)
  518. # 序列号,查询uid
  519. if uid_list and len(uid_list[0]) == 9:
  520. uid_list = CommonService.get_uids_by_serial_numbers(uid_list)
  521. query &= Q(uid__in=uid_list)
  522. if device_type:
  523. # 处理多个deviceType参数
  524. device_types = [int(t.strip()) for t in device_type.split(',') if t.strip().isdigit()]
  525. query &= Q(device_type__in=device_types)
  526. if version:
  527. query &= Q(version=version)
  528. if report_type:
  529. query &= Q(report_type=int(report_type))
  530. if event_time_range:
  531. start_time, end_time = int(
  532. event_time_range[0][:-3]), int(event_time_range[1][:-3])
  533. query &= Q(event_time__gte=start_time, event_time__lte=end_time)
  534. if event_type:
  535. # 通过event查询对应的event_code
  536. event_codes_from_event = AbnormalEventCode.objects.filter(
  537. event_type__in=event_type.split(',')
  538. ).values_list('event_code', flat=True)
  539. if event_codes_from_event.exists():
  540. query &= Q(event_code__in=event_codes_from_event)
  541. abnormal_events = AbnormalEvent.objects.filter(query)
  542. count = abnormal_events.count()
  543. event_list = abnormal_events.order_by('-event_time').values(
  544. 'id', 'uid', 'device_type', 'version', 'event_code',
  545. 'content', 'report_type', 'event_time', 'created_time'
  546. )
  547. # 分页
  548. if is_page:
  549. event_list = event_list[(page - 1) * line:page * line]
  550. # 查询设备型号,异常信息,制作单信息
  551. for event in event_list:
  552. device_type = DeviceTypeModel.objects.filter(type=event['device_type']).first()
  553. if device_type:
  554. event['device_type'] = device_type.name
  555. else:
  556. event['device_type'] = ''
  557. abnormal_event_code = AbnormalEventCode.objects.filter(event_code=event['event_code']).first()
  558. if abnormal_event_code:
  559. event['event'] = abnormal_event_code.event
  560. event['event_type'] = abnormal_event_code.event_type
  561. else:
  562. event['event'] = ''
  563. # 根据uid查序列号
  564. serial_number = CommonService.get_serial_number_by_uid(event['uid'])
  565. device_scheme_qs = DeviceScheme.objects.filter(serial_number=serial_number).values('storage_code')
  566. if device_scheme_qs.exists():
  567. storage_code = device_scheme_qs[0]['storage_code']
  568. event['storage_code'] = storage_code
  569. products_scheme_qs = ProductsScheme.objects.filter(
  570. storage_code=storage_code).values(
  571. 'main_controller', 'wifi', 'sensor', 'order_quantity', 'created_time')
  572. if products_scheme_qs.exists():
  573. event['scheme'] = '{}+{}+{}'.format(
  574. products_scheme_qs[0]['main_controller'], products_scheme_qs[0]['wifi'], products_scheme_qs[0]['sensor'])
  575. event['order_quantity'] = products_scheme_qs[0]['order_quantity']
  576. event['shipping_date'] = products_scheme_qs[0]['created_time']
  577. return response.json(0, {'list': list(event_list), 'total': count})
  578. except Exception as e:
  579. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  580. @staticmethod
  581. def getAbnormalEventValue(response):
  582. try:
  583. event_types = AbnormalEventCode.objects.values_list('event_type', flat=True)
  584. # 使用Python的set去重
  585. seen = set()
  586. unique_event_types = [x for x in event_types if x not in seen and not seen.add(x)]
  587. return response.json(0, {'list': unique_event_types})
  588. except Exception as e:
  589. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  590. @staticmethod
  591. def getAbnormalPercentage(request_dict, response):
  592. uid = request_dict.get('uid', None)
  593. storage_code = request_dict.get('storageCode', None)
  594. device_type = request_dict.get('deviceType', None)
  595. version = request_dict.get('version', None)
  596. event_type = request_dict.get('eventType', None)
  597. report_type = request_dict.get('reportType', None)
  598. event_time_range = request_dict.getlist('eventTimeRange[]', None)
  599. try:
  600. query = Q()
  601. if uid:
  602. query &= Q(uid=uid)
  603. if storage_code:
  604. # 同一单号都为uid或序列号
  605. uid_qs = DeviceScheme.objects.filter(storage_code=storage_code).\
  606. values_list('serial_number', flat=True)
  607. uid_list = list(uid_qs)
  608. # 序列号,查询uid
  609. if uid_list and len(uid_list[0]) == 9:
  610. uid_list = CommonService.get_uids_by_serial_numbers(uid_list)
  611. query &= Q(uid__in=uid_list)
  612. if device_type:
  613. # 处理多个deviceType参数
  614. device_types = [int(t.strip()) for t in device_type.split(',') if t.strip().isdigit()]
  615. query &= Q(device_type__in=device_types)
  616. if version:
  617. query &= Q(version=version)
  618. if report_type:
  619. query &= Q(report_type=int(report_type))
  620. if event_time_range:
  621. start_time, end_time = int(
  622. event_time_range[0][:-3]), int(event_time_range[1][:-3])
  623. query &= Q(event_time__gte=start_time, event_time__lte=end_time)
  624. if event_type:
  625. # 通过event查询对应的event_code
  626. event_codes_from_event = AbnormalEventCode.objects.filter(
  627. event_type__in=event_type.split(',')
  628. ).values_list('event_code', flat=True)
  629. if event_codes_from_event.exists():
  630. query &= Q(event_code__in=event_codes_from_event)
  631. # 查询符合条件的异常事件
  632. abnormal_events = AbnormalEvent.objects.filter(query)
  633. total_count = abnormal_events.count()
  634. # 获取所有异常类型及其数量
  635. event_type_stats = {}
  636. if total_count > 0:
  637. # 获取所有事件的event_code
  638. event_codes = abnormal_events.values_list('event_code', flat=True)
  639. # 获取所有event_code对应的event_type
  640. event_code_types = AbnormalEventCode.objects.filter(
  641. event_code__in=event_codes
  642. ).values('event_code', 'event_type')
  643. # 创建event_code到event_type的映射
  644. event_code_to_type = {item['event_code']: item['event_type'] for item in event_code_types}
  645. # 统计每个event_code的数量
  646. for event in abnormal_events:
  647. event_type = event_code_to_type.get(event.event_code, '未知类型')
  648. if event_type in event_type_stats:
  649. event_type_stats[event_type] += 1
  650. else:
  651. event_type_stats[event_type] = 1
  652. # 计算百分比并格式化结果(保留两位小数)
  653. statistics = []
  654. for name, value in event_type_stats.items():
  655. percentage = round((value / total_count) * 100, 2) if total_count > 0 else 0.00
  656. statistics.append({
  657. 'name': name,
  658. 'value': value,
  659. 'percentage': percentage
  660. })
  661. # 按数量降序排序
  662. statistics.sort(key=lambda x: x['value'], reverse=True)
  663. return response.json(0, {
  664. 'total': total_count,
  665. 'statistics': statistics
  666. })
  667. except Exception as e:
  668. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  669. @staticmethod
  670. def getAbnormalDetailsPercentage(request_dict, response):
  671. uid = request_dict.get('uid', None)
  672. storage_code = request_dict.get('storageCode', None)
  673. device_type = request_dict.get('deviceType', None)
  674. version = request_dict.get('version', None)
  675. event_type = request_dict.get('eventType', None)
  676. report_type = request_dict.get('reportType', None)
  677. event_time_range = request_dict.getlist('eventTimeRange[]', None)
  678. if not event_type:
  679. return response.json(444)
  680. try:
  681. query = Q()
  682. if uid:
  683. query &= Q(uid=uid)
  684. if storage_code:
  685. # 同一单号都为uid或序列号
  686. uid_qs = DeviceScheme.objects.filter(storage_code=storage_code). \
  687. values_list('serial_number', flat=True)
  688. uid_list = list(uid_qs)
  689. # 序列号,查询uid
  690. if uid_list and len(uid_list[0]) == 9:
  691. uid_list = CommonService.get_uids_by_serial_numbers(uid_list)
  692. query &= Q(uid__in=uid_list)
  693. if device_type:
  694. # 处理多个deviceType参数
  695. device_types = [int(t.strip()) for t in device_type.split(',') if t.strip().isdigit()]
  696. query &= Q(device_type__in=device_types)
  697. if version:
  698. query &= Q(version=version)
  699. if report_type:
  700. query &= Q(report_type=int(report_type))
  701. if event_time_range:
  702. start_time, end_time = int(
  703. event_time_range[0][:-3]), int(event_time_range[1][:-3])
  704. query &= Q(event_time__gte=start_time, event_time__lte=end_time)
  705. # 通过event查询对应的event_code
  706. event_codes_from_event = AbnormalEventCode.objects.filter(event_type=event_type).\
  707. values_list('event_code', flat=True)
  708. if event_codes_from_event.exists():
  709. query &= Q(event_code__in=event_codes_from_event)
  710. # 查询符合条件的异常事件
  711. abnormal_events = AbnormalEvent.objects.filter(query)
  712. total_count = abnormal_events.count()
  713. # 获取所有异常类型及其数量
  714. event_type_stats = {}
  715. if total_count > 0:
  716. # 获取所有事件的event_code
  717. event_codes = abnormal_events.values_list('event_code', flat=True)
  718. # 获取所有event_code对应的event_type
  719. event_code_types = AbnormalEventCode.objects.filter(
  720. event_type=event_type
  721. ).values('event_code', 'event')
  722. # 创建event_code到event_type的映射
  723. event_code_to_type = {item['event_code']: item['event'] for item in event_code_types}
  724. # 统计每个event_code的数量
  725. for abnormal_event in abnormal_events:
  726. event = event_code_to_type.get(abnormal_event.event_code, '未知类型')
  727. if event in event_type_stats:
  728. event_type_stats[event] += 1
  729. else:
  730. event_type_stats[event] = 1
  731. # 计算百分比并格式化结果(保留两位小数)
  732. statistics = []
  733. for name, value in event_type_stats.items():
  734. percentage = round((value / total_count) * 100, 2) if total_count > 0 else 0.00
  735. statistics.append({
  736. 'name': name,
  737. 'value': value,
  738. 'percentage': percentage
  739. })
  740. # 按数量降序排序
  741. statistics.sort(key=lambda x: x['value'], reverse=True)
  742. return response.json(0, {
  743. 'category': event_type, # 添加当前查看的异常类型
  744. 'total': total_count,
  745. 'statistics': statistics
  746. })
  747. except Exception as e:
  748. print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  749. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))