# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import logging from apps.web.constant import Const from apps.web.device.models import Group, Part, Device from apps.web.eventer.base import FaultEvent, WorkEvent from apps.web.eventer import EventBuilder from apps.web.south_intf.platform import notify_event_to_north from apps.web.south_intf.zhejiang_fire import send_event_to_zhejiang from apps.web.user.models import ServiceProgress, MyUser from apps.web.user.transaction_deprecated import refund_money logger = logging.getLogger(__name__) class builder(EventBuilder): def __getEvent__(self, device_event): if device_event['data'].get('cmd') == 120: return DELIXIAlertEvent(self.deviceAdapter, device_event) event_data = self.deviceAdapter.analyze_event_data(device_event['data']) if not event_data: return None if event_data['cmdCode'] == 100: return ChargingDLXWorkEvent(self.deviceAdapter, event_data) class DELIXIAlertEvent(FaultEvent): def __Analyze_alert_data(self, data): alertInfo = {'cmdCode': data['cmd'], 'logicalCode': self.device['logicalCode']} address = Group.get_group(self.device['groupId'])['address'] # 这里判断数据格式 if 'status' not in data: logger.error('Data arrays have no keywords status') return # 这里做漏电告警处理 if '5' in data['status']: electricityNum = str(int(data['values'][0:4], 16)) + 'mA' alertInfo['electricity'] = {'electricityNum': electricityNum, 'address': address, 'reasonCode': '12', 'reason': u'在{}编号为{}发生漏电,漏电量为{}' .format(address, self.device['logicalCode'], electricityNum)} # 这里做高温告警处理 if '6' in data['status']: temperatureAccess = [index for index, acces in enumerate(data['status'], 1) if acces == '6'] temperatureAlertList = [] for i in temperatureAccess: temperatureValue = str(int(data['values'][(i - 1) * 4:(i - 1) * 4 + 4], 16)) temperatureAlertList.append( {'temperatureValue': temperatureValue, 'address': address, 'reasonCode': '11', 'reason': u'在{}编号为{}的设备有高温预警,当前温度为{}摄氏度' .format(address, self.device['logicalCode'], temperatureValue)}) alertInfo['temperature'] = temperatureAlertList return alertInfo def do(self, **args): # 判断不存在的设备网上报 if not self.device['ownerId']: logger.error('This device cant find a dealer') return # 是否存在温感和电感 temperaturePart = Part.objects(logicalCode = self.device['logicalCode'], partType = '3001') electricityPart = Part.objects(logicalCode = self.device['logicalCode'], partType = '3002') if not temperaturePart.count() or not electricityPart.count(): logger.error( 'There are no transformers in the locigalcode {} equipment'.format(self.device['logicalCode'])) return # 处理数据 eventInfo = self.__Analyze_alert_data(self.event_data['data']) try: # 先处理高温情况 if eventInfo.has_key('temperature'): for InfoDetail in eventInfo['temperature']: send_event_to_zhejiang(self.dealer, self.device, InfoDetail, partId = temperaturePart[0].id) # 提示用户 group = Group.get_group(self.device['groupId']) self.notify_dealer('device_fault', **{ 'title': u'注意!注意!您的设备发生故障', 'device': u'组号::%s, 二维码编号:%s' % (self.device['groupNumber'], self.device['logicalCode']), 'location': u'组名称:%s, 地址:%s' % (group['groupName'], group['address']), 'fault': InfoDetail['reason'], 'notifyTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') }) # 处理漏电情况 elif eventInfo.has_key('electricity'): # 获取漏电告警插件 send_event_to_zhejiang(self.dealer, self.device, eventInfo['electricity'], partId = electricityPart[0].id) # 提示用户 group = Group.get_group(self.device['groupId']) self.notify_dealer('device_fault', **{ 'title': u'注意!注意!您的设备发生故障', 'device': u'组号::%s, 二维码编号:%s' % (self.device['groupNumber'], self.device['logicalCode']), 'location': u'组名称:%s, 地址:%s' % (group['groupName'], group['address']), 'fault': eventInfo['electricity']['reason'], 'notifyTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') }) except: logger.error('Array {} nonspecification'.format(eventInfo)) return self.record(detail = eventInfo) class ChargingDLXWorkEvent(WorkEvent): # 不处理 def do(self, **args): if self.event_data['chargeStatus'] == '01': return if self.event_data['reasonCode'] == '04': devNo = self.device['devNo'] try: lineInfo = Device.update_port_control_cache(devNo, self.event_data) backCoins = lineInfo['coins'] openId = lineInfo['openId'] group = Group.get_group(self.device['groupId']) title = u"\\n\\n结束原因:\\t\\t{reason}\\n\\n设备编号:\\t\\t{logicalCode}-{port}\\n\\n设备地址:\\t\\t{address}\\n\\n".format( reason = self.event_data["reason"], logicalCode = self.device["logicalCode"], port = lineInfo['port'], address = group["address"], ) consumeDict = {'chargeIndex': lineInfo['port'], 'reason': lineInfo['reason']} # 通知充电完成 user = MyUser.objects(openId = openId, groupId = self.device['groupId']).first() self.notify_user( managerialOpenId = user.managerialOpenId if user else "", templateName = "service_complete", title = title, service = u"充电服务", finishTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), remark = u'谢谢您的支持') if not self.device.is_auto_refund: ServiceProgress.update_progress_and_consume_rcd( self.device['ownerId'], {'open_id': openId, 'device_imei': devNo, 'port': lineInfo['port'], 'isFinished': False}, consumeDict ) else: refund_money(self.device, backCoins, lineInfo['openId']) consumeDict.update({'refundedMoney': str(backCoins)}) ServiceProgress.update_progress_and_consume_rcd( self.device['ownerId'], {'open_id': openId, 'device_imei': devNo, 'port': lineInfo['port'], 'isFinished': False}, consumeDict) desc = u'您使用的%s号端口充电,共付款:%s金币,给您退款:%s金币' % ( lineInfo['port'], lineInfo['coins'], backCoins) self.notify_user(user.managerialOpenId if user else '', 'refund_coins', **{ 'title': desc, 'backCount': u'金币:%s' % backCoins, 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') }) except Exception as e: logger.error(e) finally: Device.clear_port_control_cache(devNo, str(self.event_data['port'])) notify_event_to_north(self.dealer, self.device, level = Const.EVENT_NORMAL, desc = self.event_data["reason"])