Bläddra i källkod

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer into linhaohong

linhaohong 1 år sedan
förälder
incheckning
1494afc3c6
1 ändrade filer med 25 tillägg och 19 borttagningar
  1. 25 19
      Controller/SensorGateway/SmartSceneController.py

+ 25 - 19
Controller/SensorGateway/SmartSceneController.py

@@ -792,10 +792,11 @@ class SmartSceneView(View):
                     values('device__serial_number')[0]['device__serial_number']
             topic_name = SMART_SCENE_TOPIC.format(serial_number)
             with transaction.atomic():
-                smart_scene_qs = SmartScene.objects.filter(id__in=smart_scene_id_list).values('scene_data')
+                smart_scene_qs = SmartScene.objects.filter(id__in=smart_scene_id_list)
 
                 # 删除定时任务
-                for smart_scene in smart_scene_qs:
+                smart_scene_data = smart_scene_qs.values('scene_data')
+                for smart_scene in smart_scene_data:
                     scene_data = smart_scene['scene_data']
                     if scene_data:
                         scene_data_dict = eval(scene_data)
@@ -1067,8 +1068,14 @@ class SmartSceneView(View):
         cls.del_aps_job(scene_data_dict)
         task_list = []
         mqtt_task_list = []
+        total_delay_time = 0
+
+        # 组织条件数据
+        condition = cls.get_condition(conditions_dict, now_time, tz)
+
         for task in tasks_list:
             sensor_type = int(task['device_type'])
+            total_delay_time += task['delay_time']
             # 处理插座数据
             # 不用添加到设备的任务列表,添加到mqtt任务列表
             if sensor_type == DEVICE_TYPE['socket']:
@@ -1088,7 +1095,7 @@ class SmartSceneView(View):
                     repeat = conditions_dict['time']['repeat']
 
                     task_temp['task_id'] = cls.create_aps_job(
-                        minutes, delay_time, tz, now_time, repeat, sensor_type, event_type, serial_number)
+                        condition, minutes, total_delay_time, tz, repeat, sensor_type, event_type, serial_number)
                 mqtt_task_list.append(task_temp)
             else:
                 task_temp = {
@@ -1122,7 +1129,7 @@ class SmartSceneView(View):
         scene_data = ''
         if mqtt_task_list:
             scene_data = {
-                'condition': cls.get_condition(conditions_dict, now_time, tz),
+                'condition': condition,
                 'task_list': mqtt_task_list
             }
 
@@ -1151,6 +1158,8 @@ class SmartSceneView(View):
                 time_string = CommonService.get_date_from_timestamp(now_time, tz)
                 time_string += ' {:02d}:{:02d}:00'.format(hour, minute)
                 time_stamp = CommonService.convert_to_timestamp(tz, time_string)
+                if time_stamp < now_time:
+                    time_stamp += 24 * 60 * 60
                 time_dict = {
                     'time_stamp': time_stamp
                 }
@@ -1236,14 +1245,14 @@ class SmartSceneView(View):
             return False
 
     @classmethod
-    def create_aps_job(cls, minutes, delay_time, tz, now_time, repeat, device_type, event_type, serial_number):
+    def create_aps_job(cls, condition, minutes, total_delay_time, tz, repeat, device_type, event_type, serial_number):
         """
         创建定时任务
         返回任务id和时间
+        @param condition: 条件数据
         @param minutes: 分钟时间
-        @param delay_time: 延迟时间
+        @param total_delay_time: 延迟时间
         @param tz: 时区
-        @param now_time: 当前时间
         @param repeat: 星期周期的十进制数
         @param device_type: 设备类型
         @param event_type: 事件类型
@@ -1254,21 +1263,13 @@ class SmartSceneView(View):
         apscheduler_obj = ApschedulerObject(tz)
         # 一次性任务
         if repeat == 0:
-            # 根据时间戳和时区获取年月日,拼接由分钟转换出来的时间
-            time_string = CommonService.get_date_from_timestamp(now_time, tz)
-            hour, minute = divmod(minutes, 60)
-            time_string += ' {:02d}:{:02d}:00'.format(hour, minute)
-            time_stamp = CommonService.convert_to_timestamp(tz, time_string)
-            # 加上延时,如果执行时间小于当前时间,延迟24小时执行
-            time_stamp += delay_time
-            if time_stamp < now_time:
-                time_stamp += 24 * 60 * 60
+            time_stamp = condition['time_dict']['time_stamp'] + total_delay_time
             task_id += str(time_stamp)
             apscheduler_obj.create_date_job(func=cls.pub_mqtt, task_id=task_id, time_stamp=time_stamp,
                                             args=(device_type, event_type, serial_number))
         # 周期任务
         else:
-            hour, minute, second, is_next_day = cls.handle_delay_time(minutes, delay_time)
+            hour, minute, second, is_next_day = cls.handle_delay_time(minutes, total_delay_time)
             # 加上延时,如果执行时间超过23:59,隔天执行
             weeks = cls.int_to_weeks(repeat, is_next_day)
             time_str = weeks + '_{:02d}{:02d}{:02d}'.format(hour, minute, second)
@@ -1314,7 +1315,11 @@ class SmartSceneView(View):
         next_day = 1 if is_next_day else 0
         for i, bit in enumerate(bin_str):
             if bit == '1':
-                weeks += str(i+next_day) + ','
+                # 7 -> 0
+                week = i + next_day
+                if week == 7:
+                    week = 0
+                weeks += str(week) + ','
         # 删除最后一个逗号并返回结果
         return weeks[:-1]
 
@@ -1369,7 +1374,7 @@ class SmartSceneView(View):
             if scene_status == SCENE_STATUS_OFF:
                 cls.pause_time_job(apscheduler_obj, scene_data_dict)
             else:
-                cls.resume_time_job(apscheduler_obj, time_type, scene_data_dict)
+                return cls.resume_time_job(apscheduler_obj, time_type, scene_data_dict)
 
     @staticmethod
     def pause_time_job(apscheduler_obj, scene_data_dict):
@@ -1433,6 +1438,7 @@ class SmartSceneView(View):
                     time_task['task_id'] = task_id
                 # 更新场景数据的时间戳
                 scene_data_dict['condition']['time_dict']['time_stamp'] = time_stamp
+                return scene_data_dict
 
 
 #