Browse Source

设备异常日志

locky 2 months ago
parent
commit
05ec142d88
3 changed files with 104 additions and 6 deletions
  1. 3 1
      AnsjerPush/urls.py
  2. 77 0
      Controller/ReportController.py
  3. 24 5
      Model/models.py

+ 3 - 1
AnsjerPush/urls.py

@@ -1,7 +1,7 @@
 from django.urls import path, re_path
 
 from Controller import DetectController, ShadowController, DetectControllerV2, AiController, gatewayController, \
-    PowerWarningController, InitController, CustomizedPushController, DeviceReportController
+    PowerWarningController, InitController, CustomizedPushController, DeviceReportController, ReportController
 from Controller.ComboCron import ComboCronPushController
 from Controller.Cron import CronTaskController
 
@@ -17,6 +17,8 @@ urlpatterns = [
     re_path(r'init/(?P<operation>.*)', InitController.InitView.as_view()),
     re_path(r'^AiService/(?P<operation>.*)$', AiController.AiView.as_view()),
     re_path(r'^gatewayService/(?P<operation>.*)$', gatewayController.GatewayView.as_view()),
+
+    re_path('report/(?P<operation>.*)$', ReportController.ReportView.as_view()),
     re_path('unicom/device/combo/(?P<operation>.*)$', ComboCronPushController.ComboCronPushView.as_view()),
     re_path('customized_push/(?P<operation>.*)', CustomizedPushController.CustomizedPushView.as_view()),
     re_path('push/device/report/(?P<operation>.*)$', DeviceReportController.DeviceReportView.as_view()),

+ 77 - 0
Controller/ReportController.py

@@ -0,0 +1,77 @@
+# @Author    : Rocky
+# @File      : ReportController.py
+# @Time      : 2025/5/12 10:42
+import json
+import time
+
+from django.views import View
+
+from AnsjerPush.config import LOGGER
+from Object.RedisObject import RedisObject
+from Object.ResponseObject import ResponseObject
+from Model.models import AbnormalEvent
+
+
+class ReportView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(json.loads(request.body), operation)
+
+    def validation(self, request_dict, operation):
+        response = ResponseObject()
+        if operation == 'abnormalEvent':  # 上报异常事件
+            return self.abnormal_event(request_dict, response)
+
+    @staticmethod
+    def abnormal_event(request_dict, response):
+        LOGGER.info('上报异常事件参数:{}'.format(request_dict))
+        uid = request_dict.get('uid')
+        device_type = request_dict.get('device_type')
+        version = request_dict.get('version')
+        event_list = request_dict.get('event_list')
+
+        if not all([uid, device_type, version, event_list]):
+            return response.json(444)
+
+        # 同一设备限制十分钟之内不能重复请求
+        redis_obj = RedisObject()
+        key = 'report_abnormal_event_{}'.format(uid)
+        ttl = redis_obj.get_ttl(key)
+        if ttl > 0:
+            res = {
+                'limit_time': ttl
+            }
+            return response.json(10, res)
+        redis_obj.set_data(key=key, val=1, expire=600)
+
+        try:
+            device_type = int(device_type)
+            now_time = int(time.time())
+
+            # 批量创建异常事件数据
+            abnormal_event_list = []
+            data = {
+                'uid': uid,
+                'device_type': device_type,
+                'version': version,
+                'created_time': now_time,
+                'report_type': 0
+            }
+            for event in event_list:
+                data['event_code'] = event['event_code']
+                data['event_time'] = event['event_time']
+                if event.get('content'):
+                    data['content'] = event['content']
+                abnormal_event = AbnormalEvent(**data)
+                abnormal_event_list.append(abnormal_event)
+            AbnormalEvent.objects.bulk_create(abnormal_event_list)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 24 - 5
Model/models.py

@@ -328,7 +328,7 @@ class EquipmentInfo1(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -357,7 +357,7 @@ class EquipmentInfo2(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -386,7 +386,7 @@ class EquipmentInfo3(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -415,7 +415,7 @@ class EquipmentInfo4(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -444,7 +444,7 @@ class EquipmentInfo5(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -3507,3 +3507,22 @@ class DeviceDailyReport(models.Model):
         verbose_name = '设备日报记录表'
         verbose_name_plural = verbose_name
         app_label = 'db2'
+
+
+class AbnormalEvent(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    uid = models.CharField(default='', max_length=20, verbose_name='uid')
+    device_type = models.IntegerField(default=0, verbose_name='设备类型')
+    version = models.CharField(default='', max_length=64, verbose_name='设备版本')
+    event_code = models.CharField(default='', max_length=16, verbose_name='异常事件编码')
+    content = models.TextField(default='', verbose_name='异常内容')
+    # 上报类型, 0: 自动上报, 1: 手动上报
+    report_type = models.IntegerField(default=0, verbose_name='上报类型')
+    event_time = models.IntegerField(default=0, verbose_name='异常事件触发时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'abnormal_event'
+        verbose_name = '异常事件'
+        app_label = 'db2'
+