# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import json from apps.web.device.models import Device, Group from apps.web.eventer.base import WorkEvent, logger from apps.web.eventer import EventBuilder from apps.web.user.models import MyUser class builder(EventBuilder): def __getEvent__(self, event_data): """ { "cmd" : 100, "port" : "02", "board" : "01", "IMEI" : "860344040810823", "status" : "lock", "data" : "68010204000016", "ts" : 1606467313 } """ if "status" in event_data: return GeZiGuiEvent(self.deviceAdapter, event_data) class GeZiGuiEvent(WorkEvent): def log_obj(self, obj): if isinstance(obj, dict): for k, v in obj.items(): if isinstance(v, object): obj[k] = str(v) if isinstance(obj, list) or isinstance(obj, tuple) or isinstance(obj, set): obj = map(lambda x: str(x) if isinstance(x, object) else x, obj) if isinstance(obj, unicode): obj = str(obj) # print("\33[33m" + json.dumps(obj,ensure_ascii=True,encoding="utf-8") + "\33[0m") return "\33[33m" + json.dumps(obj, ensure_ascii=False, encoding="utf-8") + "\33[0m" def do(self): """ 判断本次开门是谁开的,用户开启则推送给用户,经销商开启则推送给经销商 { "cmd" : 100, "port" : "02", "board" : "01", "IMEI" : "860344040810823", "status" : "lock", "data" : "68010204000016", "ts" : 1606467313 } """ ctrInfo = Device.get_dev_control_cache(self.device.devNo) boardNum = int(self.event_data.get("boardNum",0)) portNum = int(self.event_data.get("portNum", 0), 16) if not boardNum or not portNum: logger.info("invalid event. event data:{}".format(self.log_obj(self.event_data)),) # 端口号加载 最多两块板子48端口 portNum = str(portNum + 24) if boardNum == "02" else str(portNum) group = Group.get_group(self.device['groupId']) lineInfo = ctrInfo.get(portNum) if "openId" in lineInfo and "isStart" in lineInfo: user = MyUser.objects.filter(openId=lineInfo.get("openId"), groupId=self.device["groupId"]).first() # 给用户推送 self.notify_user(user.managerialOpenId, 'service_complete', **{ 'title': "欢迎使用自助寄存服务", 'service': '您的物品寄存在(设备编号:%s-%s号柜门,地址:%s)' % ( self.device['logicalCode'], portNum, group['address']), 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'remark': u'谢谢您的支持' }) else: # 给经销商推送 if self.event_data.get("status") == "lock": return else: self.notify_dealer( templateName="device_fault", title="检测到柜门锁弹开", device=u"{groupNumber}组-{logicalCode}".format(groupNumber=self.device["groupNumber"], logicalCode=self.device["logicalCode"]), location=u"{address}-{groupName}".format(address=group["address"], groupName=group["groupName"]), fault='(设备编号:%s,端口:%s,地址:%s)检测到柜门锁弹开' % ( self.device['logicalCode'], portNum, group['address']), notifyTime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") )