Bladeren bron

美洲服通过定时任务保存推送数据

locky 1 jaar geleden
bovenliggende
commit
f3c4d0c58a
3 gewijzigde bestanden met toevoegingen van 93 en 22 verwijderingen
  1. 4 1
      AnsjerPush/urls.py
  2. 70 0
      Controller/Cron/CronTaskController.py
  3. 19 21
      Service/DevicePushService.py

+ 4 - 1
AnsjerPush/urls.py

@@ -3,6 +3,7 @@ from django.urls import path, re_path
 from Controller import DetectController, ShadowController, DetectControllerV2, AiController, gatewayController, \
     PowerWarningController, InitController
 from Controller.ComboCron import ComboCronPushController
+from Controller.Cron import CronTaskController
 
 urlpatterns = [
     path('deviceShadow/generateUTK', ShadowController.generate_utk),
@@ -15,5 +16,7 @@ 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('unicom/device/combo/(?P<operation>.*)$', ComboCronPushController.ComboCronPushView.as_view())
+    re_path('unicom/device/combo/(?P<operation>.*)$', ComboCronPushController.ComboCronPushView.as_view()),
+
+    re_path('cron/create/(?P<operation>.*)', CronTaskController.CronTaskView.as_view()),
 ]

+ 70 - 0
Controller/Cron/CronTaskController.py

@@ -0,0 +1,70 @@
+# @Author    : Rocky
+# @File      : CronTaskController.py
+# @Time      : 2023/12/11 15:47
+import threading
+
+from django.views import View
+
+from Object.RedisObject import RedisObject
+from Object.ResponseObject import ResponseObject
+from Model.models import EquipmentInfo1, EquipmentInfo2, EquipmentInfo3, \
+    EquipmentInfo4, EquipmentInfo5, EquipmentInfo6, EquipmentInfo7, EquipmentInfo8, EquipmentInfo9, EquipmentInfo10, \
+    EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15, EquipmentInfo16, \
+    EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20
+from Service.EquipmentInfoService import EQUIPMENT_INFO_DICT, EQUIPMENT_INFO_KEY_LIST
+
+# 每次写入的数据条数
+size = 1000
+
+
+class CronTaskView(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):
+        response = ResponseObject()
+        if operation == 'equipment_info':
+            return self.equipment_info(response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def equipment_info(cls, response):
+        for equipment_info_key in EQUIPMENT_INFO_KEY_LIST:
+            # 异步保存数据
+            kwargs = {
+                'equipment_info_key': equipment_info_key
+            }
+            push_thread = threading.Thread(
+                target=cls.save_equipment_info,
+                kwargs=kwargs)
+            push_thread.start()
+        return response.json(0)
+
+    @staticmethod
+    def save_equipment_info(**kwargs):
+        equipment_info_key = kwargs['equipment_info_key']
+        equipment_info_model = EQUIPMENT_INFO_DICT[equipment_info_key]
+
+        # 读取缓存的前n条数据批量写入
+        redis_obj = RedisObject()
+        equipment_info_redis_list = redis_obj.lrange(equipment_info_key, 0, size - 1)
+        redis_obj.ltrim(equipment_info_key, size, -1)
+
+        equipment_info_list = []
+        for equipment_info in equipment_info_redis_list:
+            equipment_info_data = eval(equipment_info)
+            # 设备昵称存在表情,解码utf-8
+            if equipment_info_data.get('device_nick_name') is not None:
+                equipment_info_data['device_nick_name'] = equipment_info_data['device_nick_name']. \
+                    encode('UTF-8', 'ignore').decode('UTF-8')
+            equipment_info_list.append(equipment_info_model(**equipment_info_data))
+        equipment_info_model.objects.bulk_create(equipment_info_list)

+ 19 - 21
Service/DevicePushService.py

@@ -245,27 +245,25 @@ class DevicePushService:
                 end = 0
                 equipment_info_len = redis_obj.llen(equipment_info_key)
 
-                # if CONFIG_INFO == CONFIG_US:
-                #     # 美洲服批量保存300条数据
-                #     if equipment_info_len >= 500:
-                #         end = 499
-                # else:
-                # 缓存数据多于100条,批量保存前100条,否则保存全部
-                equipment_info_len = redis_obj.llen(equipment_info_key)
-                end = 99 if equipment_info_len > 100 else equipment_info_len - 1
-
-                if end != 0:
-                    equipment_info_redis_list = redis_obj.lrange(equipment_info_key, 0, end)
-                    redis_obj.ltrim(equipment_info_key, end+1, -1)
-
-                    for equipment_info in equipment_info_redis_list:
-                        equipment_info_data = eval(equipment_info)
-                        # 设备昵称存在表情,解码utf-8
-                        if equipment_info_data.get('device_nick_name') is not None:
-                            equipment_info_data['device_nick_name'] = equipment_info_data['device_nick_name'].\
-                                encode('UTF-8', 'ignore').decode('UTF-8')
-                        equipment_info_list.append(equipment_info_model(**equipment_info_data))
-                    equipment_info_model.objects.bulk_create(equipment_info_list)
+                # 一键通话和视频通话需要实时写入数据
+                # 美洲服通过定时任务写入数据
+                if params['event_type'] in [606, 607] or CONFIG_INFO != CONFIG_US:
+                    # 缓存数据多于100条,批量保存前100条,否则保存全部
+                    equipment_info_len = redis_obj.llen(equipment_info_key)
+                    end = 99 if equipment_info_len > 100 else equipment_info_len - 1
+
+                    if end != 0:
+                        equipment_info_redis_list = redis_obj.lrange(equipment_info_key, 0, end)
+                        redis_obj.ltrim(equipment_info_key, end+1, -1)
+
+                        for equipment_info in equipment_info_redis_list:
+                            equipment_info_data = eval(equipment_info)
+                            # 设备昵称存在表情,解码utf-8
+                            if equipment_info_data.get('device_nick_name') is not None:
+                                equipment_info_data['device_nick_name'] = equipment_info_data['device_nick_name'].\
+                                    encode('UTF-8', 'ignore').decode('UTF-8')
+                            equipment_info_list.append(equipment_info_model(**equipment_info_data))
+                        equipment_info_model.objects.bulk_create(equipment_info_list)
 
             return True
         except Exception as e: