LogManagementController.py 37 KB

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