123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- # -*- 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"])
|