__init__.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import time
  6. from functools import wraps
  7. from typing import TYPE_CHECKING
  8. from apps.web.device.timescale import FluentedEngine
  9. if TYPE_CHECKING:
  10. from apps.web.core.adapter.base import SmartBox
  11. from apps.web.eventer.base import WorkEvent
  12. logger = logging.getLogger(__name__)
  13. class EventBuilder(object):
  14. def __init__(self, smartBox):
  15. # type:(SmartBox)->None
  16. self.deviceAdapter = smartBox
  17. @property
  18. def device(self):
  19. return self.deviceAdapter.device
  20. @property
  21. def support_507_power(self):
  22. return False
  23. def getEvent(self, device_event):
  24. event = self.__getEvent__(device_event)
  25. if not event:
  26. return event
  27. else:
  28. event.isPlayback = device_event.pop('playback', False)
  29. event.recvTime = device_event.pop('recvTime', int(time.time()))
  30. return event
  31. def __getEvent__(self, device_event):
  32. # type:(dict)->Event
  33. raise NotImplementedError('must implement __getEvent__.')
  34. class Event(object):
  35. def __init__(self, smartBox):
  36. # type:(SmartBox)->None
  37. self.deviceAdapter = smartBox # type: SmartBox
  38. self.isPlayback = False
  39. self.recvTime = int(time.time())
  40. @property
  41. def device(self):
  42. return self.deviceAdapter.device
  43. @property
  44. def dealer(self):
  45. """
  46. 使用的时候再动态查询 减少数据库访问次数
  47. """
  48. return self.deviceAdapter.device.owner
  49. def do(self, **args):
  50. pass
  51. def is_notify_dealer(self):
  52. return False
  53. def is_notify_user(self):
  54. return False
  55. def notify_user(self, managerialOpenId, templateName, url = None, **kwargs):
  56. try:
  57. if not self.dealer:
  58. logger.error('dealer is null')
  59. return
  60. if not managerialOpenId:
  61. logger.error('managerialOpenId is null')
  62. return
  63. from taskmanager.mediator import task_caller
  64. task_caller('report_to_user_via_wechat', openId = managerialOpenId, dealerId = str(self.dealer.id),
  65. templateName = templateName, url = url, **kwargs)
  66. except Exception as e:
  67. logger.exception(e)
  68. def notify_dealer(self, templateName, **kwargs):
  69. try:
  70. if not self.dealer or not self.dealer.managerialOpenId:
  71. return
  72. from taskmanager.mediator import task_caller
  73. task_caller('report_to_dealer_via_wechat', openId = self.dealer.managerialOpenId,
  74. dealerId = str(self.dealer.id),
  75. templateName = templateName,
  76. **kwargs)
  77. # 合伙人一起推送
  78. groups = self.device.group
  79. partnerDict = groups.get('partnerDict')
  80. if partnerDict:
  81. from apps.web.dealer.models import Dealer
  82. for id in partnerDict:
  83. partner = Dealer.objects.filter(id=id).first()
  84. if partner and partner.devFaultPushDealerSwitch: # 有合伙人 并且打开了故障通知开关
  85. task_caller('report_to_dealer_via_wechat', openId=partner.managerialOpenId,
  86. dealerId=id,
  87. templateName=templateName,
  88. **kwargs)
  89. else:
  90. pass
  91. except Exception as e:
  92. logger.exception(e)
  93. def notify_service_complete(self, managerialOpenId, title, service, finishTime = None):
  94. finishTime = finishTime or datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  95. self.notify_user(managerialOpenId, 'service_complete',
  96. **{
  97. 'title': title,
  98. 'service': service,
  99. 'finishTime': finishTime,
  100. 'remark': u'谢谢您的支持'
  101. }
  102. )
  103. def notify_refund_coins(self, managerialOpenId, title, backCount, finishTime = None):
  104. finishTime = finishTime or datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  105. self.notify_user(managerialOpenId, 'refund_coins',
  106. **{
  107. 'title': title,
  108. 'backCount': backCount,
  109. 'finishTime': finishTime
  110. }
  111. )
  112. @property
  113. def support_playback(self):
  114. return False
  115. # 粤万通功率记录装饰器 临时使用 不干扰本来业务处理功率上报的逻辑 额外将power进入新的处理程序进行处理 后续驱动全网修改之后 直接将装饰器注释即可
  116. def powerRecorder(stop=False):
  117. def wrapper(f):
  118. @wraps(f)
  119. def inner(eventer, *args, **kwargs):
  120. res = f(eventer, *args, **kwargs)
  121. try:
  122. from apps.web.device.models import Device
  123. if not eventer.device.support_power_graph:
  124. otherConf = eventer.device.get("otherConf", dict())
  125. otherConf["supportPG"] = True
  126. Device.objects.get(devNo=eventer.device.devNo).update(otherConf=otherConf)
  127. Device.invalid_device_cache(eventer.device.devNo)
  128. # 相当于重载一次
  129. # eventer.device = Device.get_dev(eventer.device.devNo)
  130. # 停止事件上来的时候 事件内部处理时再去请求一次功率 这个就不需要了 直接置为0吧
  131. power = eventer.event_data["power"] if not stop else 0
  132. port = eventer.event_data["portStr"]
  133. FluentedEngine().in_power_udp(
  134. devNo=eventer.device.devNo,
  135. port=str(port),
  136. ts=int(time.time()),
  137. power=power,
  138. voltage=None,
  139. current=None
  140. )
  141. except KeyError:
  142. logging.error("record yuewantong power error, eventer is {}, params = {}, {}".format(eventer, args, kwargs))
  143. return res
  144. return inner
  145. return wrapper