瀏覽代碼

场景日志记录及推送

peng 3 年之前
父節點
當前提交
965df1972b
共有 2 個文件被更改,包括 155 次插入1 次删除
  1. 117 1
      Controller/gatewayController.py
  2. 38 0
      Model/models.py

+ 117 - 1
Controller/gatewayController.py

@@ -9,7 +9,7 @@ import time
 
 from django.views.generic.base import View
 
-from Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info
+from Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info, SceneLog, SmartScene
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
@@ -32,6 +32,8 @@ class GatewayView(View):
         response = ResponseObject()
         if operation == 'gatewayPush':  # 网关推送
             return self.gateway_push(request_dict, response)
+        elif operation == 'sceneLogPush':  # 网关推送
+            return self.scene_log_push(request_dict, response)
         else:
             return response.json(414)
 
@@ -163,3 +165,117 @@ class GatewayView(View):
         except Exception as e:
             logger.info('---网关推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))
+
+    @staticmethod
+    def scene_log_push(request_dict, response):
+        """
+        网关推送
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @request_dict ieee_addr: 长地址
+        @request_dict src_addr: 短地址
+        @request_dict sensor_type: 传感器类型
+        @request_dict event_type: 事件类型
+        @request_dict alarm: 消息内容
+        @param response: 响应对象
+        @return: response
+        """
+        logger = logging.getLogger('info')
+        scene_id = request_dict.get('sceneId', None)
+        status = request_dict.get('status', None)
+        logger.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
+        if not all([scene_id, status]):
+            return response.json(444)
+
+        smart_scene_qs = SmartScene.objects.filter(id=scene_id).values('scene_name', 'conditions', 'tasks', 'device_id',
+                                                                       'sub_device_id', 'user_id')
+        if not smart_scene_qs.exists():
+            return response.json(174)
+
+        nickname = ''
+        scene_name = smart_scene_qs[0]['scene_name']
+        tasks = smart_scene_qs[0]['tasks']
+        device_id = smart_scene_qs[0]['device_id']
+        sub_device_id = smart_scene_qs[0]['sub_device_id']
+        n_time = int(time.time())
+        user_id = smart_scene_qs[0]['user_id']
+        log_dict = {
+            'scene_id': scene_id,
+            'scene_name': scene_name,
+            'tasks': tasks,
+            'status': status,
+            'device_id': device_id,
+            'sub_device_id': sub_device_id,
+            'created_time': n_time,
+            }
+        tasks = eval(tasks)
+
+        # if sub_device_id:
+        #     sub_device_info_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('device_id', 'nickname')
+        #     nickname = sub_device_info_qs[0]['nickname']
+        #     device_id = sub_device_info_qs[0]['device_id']
+        #
+        # device_info_qs = Device_Info.objects.filter(id=device_id).values('userID_id', 'NickName')
+        # if not device_info_qs.exists():
+        #     return response.json(173)
+        # if not nickname:
+        #     nickname = device_info_qs[0]['NickName']
+        #
+        # user_id = device_info_qs[0]['userID_id']
+
+        try:
+            # 存储日志
+            # scene_log = {
+            #     'conditions': conditions,
+            #     'tasks': tasks
+            # }
+            # log_dict['scene_log'] = json.dumps(scene_log)
+            SceneLog.objects.create(**log_dict)
+
+            # 推送日志
+            gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
+                values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
+                       'tz')
+            if not gateway_push_qs.exists():
+                return response.json(174)
+            for task in tasks:
+                event_type = task['event_type']
+                if event_type == '1001':
+                    kwargs = {
+                        'n_time': n_time,
+                        'event_type': event_type,
+                        'nickname': nickname,
+                    }
+                    event_info = task['value']
+                    # 推送到每台登录账号的手机
+                    for gateway_push in gateway_push_qs:
+                        app_bundle_id = gateway_push['app_bundle_id']
+                        push_type = gateway_push['push_type']
+                        token_val = gateway_push['token_val']
+                        lang = gateway_push['lang']
+                        tz = gateway_push['tz'] if gateway_push['tz'] else 0
+
+                        # 获取推送所需数据
+                        # msg_title = GatewayPushService.get_msg_title(app_bundle_id, nickname)
+                        # msg_text = GatewayPushService.get_msg_text(n_time, tz, lang, event_info)
+
+                        kwargs['msg_title'] = nickname
+                        kwargs['msg_text'] = event_info
+                        kwargs['app_bundle_id'] = app_bundle_id
+                        kwargs['token_val'] = token_val
+
+                        try:
+                            # 推送消息
+                            if push_type == 0:  # ios apns
+                                GatewayPushService.ios_apns_push(**kwargs)
+                            elif push_type == 1:  # android gcm
+                                GatewayPushService.android_fcm_push(**kwargs)
+                            elif push_type == 2:  # android 极光推送
+                                GatewayPushService.android_jpush(**kwargs)
+                        except Exception as e:
+                            logger.info('场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                            continue
+            return response.json(0)
+        except Exception as e:
+            logger.info('---场景日志推送接口异常--- {}'.format(repr(e)))
+            return response.json(500, repr(e))

+ 38 - 0
Model/models.py

@@ -2366,3 +2366,41 @@ class UnicomFlowPush(models.Model):
         verbose_name = '联通流量用量推送'
         verbose_name_plural = verbose_name
         app_label = 'db2'
+
+
+class SceneLog(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    scene_name = models.CharField(default='', max_length=100, verbose_name='场景名称')
+    scene_id = models.IntegerField(default=0, verbose_name='关联场景id')
+    device_id = models.CharField(default='', max_length=32, verbose_name='关联网关id')
+    sub_device_id = models.IntegerField(default=0, verbose_name='关联子设备id')
+    tasks = models.TextField(default='', verbose_name=u'任务')
+    status = models.SmallIntegerField(default=0, verbose_name='场景状态')
+    created_time = models.IntegerField(default=0, verbose_name='场景触发时间')
+
+    class Meta:
+        db_table = 'scene_log'
+        verbose_name = '场景日志'
+        verbose_name_plural = verbose_name
+        app_label = 'db2'
+
+class SmartScene(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记id')
+    user = models.ForeignKey(Device_User, to_field='userID', default='', on_delete=models.CASCADE,
+                             verbose_name='关联用户表id')
+    device_id = models.CharField(default='', max_length=32, verbose_name=u'关联设备信息id')
+    sub_device_id = models.IntegerField(default=0, verbose_name=u'关联子设备表id')
+    scene_name = models.CharField(default='', max_length=100, verbose_name=u'场景名称')
+    conditions = models.TextField(default='', verbose_name=u'条件')
+    tasks = models.TextField(default='', verbose_name=u'任务')
+    is_all_day = models.SmallIntegerField(default=0, verbose_name=u'是否全天')  # 0: 不设置时间, 1: 全天, 2: 非全天
+    effective_time_id = models.IntegerField(default=0, verbose_name=u'关联场景执行时间id')
+    is_enable = models.BooleanField(default=True, verbose_name=u'是否开启')
+    device_data = models.TextField(default='', verbose_name=u'设备场景数据')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'smart_scene'
+        verbose_name = '智能场景'
+        verbose_name_plural = verbose_name