delixi.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. from apps.web.constant import Const
  6. from apps.web.device.models import Group, Part, Device
  7. from apps.web.eventer.base import FaultEvent, WorkEvent
  8. from apps.web.eventer import EventBuilder
  9. from apps.web.south_intf.platform import notify_event_to_north
  10. from apps.web.south_intf.zhejiang_fire import send_event_to_zhejiang
  11. from apps.web.user.models import ServiceProgress, MyUser
  12. from apps.web.user.transaction_deprecated import refund_money
  13. logger = logging.getLogger(__name__)
  14. class builder(EventBuilder):
  15. def __getEvent__(self, device_event):
  16. if device_event['data'].get('cmd') == 120:
  17. return DELIXIAlertEvent(self.deviceAdapter, device_event)
  18. event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
  19. if not event_data:
  20. return None
  21. if event_data['cmdCode'] == 100:
  22. return ChargingDLXWorkEvent(self.deviceAdapter, event_data)
  23. class DELIXIAlertEvent(FaultEvent):
  24. def __Analyze_alert_data(self, data):
  25. alertInfo = {'cmdCode': data['cmd'], 'logicalCode': self.device['logicalCode']}
  26. address = Group.get_group(self.device['groupId'])['address']
  27. # 这里判断数据格式
  28. if 'status' not in data:
  29. logger.error('Data arrays have no keywords status')
  30. return
  31. # 这里做漏电告警处理
  32. if '5' in data['status']:
  33. electricityNum = str(int(data['values'][0:4], 16)) + 'mA'
  34. alertInfo['electricity'] = {'electricityNum': electricityNum,
  35. 'address': address,
  36. 'reasonCode': '12',
  37. 'reason': u'在{}编号为{}发生漏电,漏电量为{}'
  38. .format(address, self.device['logicalCode'], electricityNum)}
  39. # 这里做高温告警处理
  40. if '6' in data['status']:
  41. temperatureAccess = [index for index, acces in enumerate(data['status'], 1) if acces == '6']
  42. temperatureAlertList = []
  43. for i in temperatureAccess:
  44. temperatureValue = str(int(data['values'][(i - 1) * 4:(i - 1) * 4 + 4], 16))
  45. temperatureAlertList.append(
  46. {'temperatureValue': temperatureValue,
  47. 'address': address,
  48. 'reasonCode': '11',
  49. 'reason': u'在{}编号为{}的设备有高温预警,当前温度为{}摄氏度'
  50. .format(address, self.device['logicalCode'], temperatureValue)})
  51. alertInfo['temperature'] = temperatureAlertList
  52. return alertInfo
  53. def do(self, **args):
  54. # 判断不存在的设备网上报
  55. if not self.device['ownerId']:
  56. logger.error('This device cant find a dealer')
  57. return
  58. # 是否存在温感和电感
  59. temperaturePart = Part.objects(logicalCode = self.device['logicalCode'], partType = '3001')
  60. electricityPart = Part.objects(logicalCode = self.device['logicalCode'], partType = '3002')
  61. if not temperaturePart.count() or not electricityPart.count():
  62. logger.error(
  63. 'There are no transformers in the locigalcode {} equipment'.format(self.device['logicalCode']))
  64. return
  65. # 处理数据
  66. eventInfo = self.__Analyze_alert_data(self.event_data['data'])
  67. try:
  68. # 先处理高温情况
  69. if eventInfo.has_key('temperature'):
  70. for InfoDetail in eventInfo['temperature']:
  71. send_event_to_zhejiang(self.dealer, self.device, InfoDetail, partId = temperaturePart[0].id)
  72. # 提示用户
  73. group = Group.get_group(self.device['groupId'])
  74. self.notify_dealer('device_fault', **{
  75. 'title': u'注意!注意!您的设备发生故障',
  76. 'device': u'组号::%s, 二维码编号:%s' % (self.device['groupNumber'], self.device['logicalCode']),
  77. 'location': u'组名称:%s, 地址:%s' % (group['groupName'], group['address']),
  78. 'fault': InfoDetail['reason'],
  79. 'notifyTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  80. })
  81. # 处理漏电情况
  82. elif eventInfo.has_key('electricity'):
  83. # 获取漏电告警插件
  84. send_event_to_zhejiang(self.dealer, self.device, eventInfo['electricity'],
  85. partId = electricityPart[0].id)
  86. # 提示用户
  87. group = Group.get_group(self.device['groupId'])
  88. self.notify_dealer('device_fault', **{
  89. 'title': u'注意!注意!您的设备发生故障',
  90. 'device': u'组号::%s, 二维码编号:%s' % (self.device['groupNumber'], self.device['logicalCode']),
  91. 'location': u'组名称:%s, 地址:%s' % (group['groupName'], group['address']),
  92. 'fault': eventInfo['electricity']['reason'],
  93. 'notifyTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  94. })
  95. except:
  96. logger.error('Array {} nonspecification'.format(eventInfo))
  97. return
  98. self.record(detail = eventInfo)
  99. class ChargingDLXWorkEvent(WorkEvent):
  100. # 不处理
  101. def do(self, **args):
  102. if self.event_data['chargeStatus'] == '01':
  103. return
  104. if self.event_data['reasonCode'] == '04':
  105. devNo = self.device['devNo']
  106. try:
  107. lineInfo = Device.update_port_control_cache(devNo, self.event_data)
  108. backCoins = lineInfo['coins']
  109. openId = lineInfo['openId']
  110. group = Group.get_group(self.device['groupId'])
  111. title = u"\\n\\n结束原因:\\t\\t{reason}\\n\\n设备编号:\\t\\t{logicalCode}-{port}\\n\\n设备地址:\\t\\t{address}\\n\\n".format(
  112. reason = self.event_data["reason"],
  113. logicalCode = self.device["logicalCode"],
  114. port = lineInfo['port'],
  115. address = group["address"],
  116. )
  117. consumeDict = {'chargeIndex': lineInfo['port'], 'reason': lineInfo['reason']}
  118. # 通知充电完成
  119. user = MyUser.objects(openId = openId, groupId = self.device['groupId']).first()
  120. self.notify_user(
  121. managerialOpenId = user.managerialOpenId if user else "",
  122. templateName = "service_complete",
  123. title = title,
  124. service = u"充电服务",
  125. finishTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  126. remark = u'谢谢您的支持')
  127. if not self.device.is_auto_refund:
  128. ServiceProgress.update_progress_and_consume_rcd(
  129. self.device['ownerId'],
  130. {'open_id': openId, 'device_imei': devNo,
  131. 'port': lineInfo['port'], 'isFinished': False}, consumeDict
  132. )
  133. else:
  134. refund_money(self.device, backCoins, lineInfo['openId'])
  135. consumeDict.update({'refundedMoney': str(backCoins)})
  136. ServiceProgress.update_progress_and_consume_rcd(
  137. self.device['ownerId'],
  138. {'open_id': openId, 'device_imei': devNo,
  139. 'port': lineInfo['port'], 'isFinished': False}, consumeDict)
  140. desc = u'您使用的%s号端口充电,共付款:%s金币,给您退款:%s金币' % (
  141. lineInfo['port'], lineInfo['coins'], backCoins)
  142. self.notify_user(user.managerialOpenId if user else '', 'refund_coins', **{
  143. 'title': desc,
  144. 'backCount': u'金币:%s' % backCoins,
  145. 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  146. })
  147. except Exception as e:
  148. logger.error(e)
  149. finally:
  150. Device.clear_port_control_cache(devNo, str(self.event_data['port']))
  151. notify_event_to_north(self.dealer, self.device, level = Const.EVENT_NORMAL,
  152. desc = self.event_data["reason"])