Bläddra i källkod

更新智能场景状态暂停或恢复定时任务

locky 1 år sedan
förälder
incheckning
c021ee3484
1 ändrade filer med 32 tillägg och 4 borttagningar
  1. 32 4
      Controller/SensorGateway/SmartSceneController.py

+ 32 - 4
Controller/SensorGateway/SmartSceneController.py

@@ -495,8 +495,8 @@ class SmartSceneView(View):
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
-    @staticmethod
-    def update_status(request_dict, response):
+    @classmethod
+    def update_status(cls, request_dict, response):
         """
         更新智能场景状态
         @param request_dict: 请求参数
@@ -519,7 +519,8 @@ class SmartSceneView(View):
                 'scene_status': scene_status
             }
             # 查询序列号
-            smart_scene_qs = SmartScene.objects.filter(id=smart_scene_id).values('device_id', 'sub_device_id')
+            smart_scene_qs = SmartScene.objects.filter(id=smart_scene_id).\
+                values('device_id', 'sub_device_id', 'mqtt_tasks')
             device_id = smart_scene_qs[0]['device_id']
             if device_id:
                 serial_number = Device_Info.objects.filter(id=device_id).values('serial_number')[0]['serial_number']
@@ -528,6 +529,10 @@ class SmartSceneView(View):
                 serial_number = GatewaySubDevice.objects.filter(id=sub_device_id).values('device__serial_number')[0][
                     'device__serial_number']
 
+            # 如果存在定时任务,暂停或恢复任务
+            mqtt_tasks = smart_scene_qs[0]['mqtt_tasks']
+            cls.pause_or_resume_job(scene_status, mqtt_tasks)
+
             topic_name = SMART_SCENE_TOPIC.format(serial_number)
 
             with transaction.atomic():
@@ -1273,9 +1278,32 @@ class SmartSceneView(View):
         """
         apscheduler_obj = ApschedulerObject()
         for mqtt_task in mqtt_tasks_list:
-            task_id = mqtt_task['task_id']
+            task_id = mqtt_task.get('task_id')
+            if not task_id:
+                # 如果task_id不存在,则跳过该任务
+                continue
             apscheduler_obj.del_job(task_id)
 
+    @staticmethod
+    def pause_or_resume_job(scene_status, mqtt_tasks):
+        """
+        暂停或恢复定时任务
+        @param scene_status: 场景状态
+        @param mqtt_tasks: mqtt任务列表
+        @return:
+        """
+        if not mqtt_tasks:
+            return
+        apscheduler_obj = ApschedulerObject()
+        job_func = apscheduler_obj.resume_job if scene_status else apscheduler_obj.pause_job
+        mqtt_tasks_list = eval(mqtt_tasks)
+        for mqtt_task in mqtt_tasks_list:
+            task_id = mqtt_task.get('task_id')
+            if not task_id:
+                # 如果task_id不存在,则跳过该任务
+                continue
+            job_func(task_id)
+
 
 #
 #                   ___====-_  _-====___