water_controller.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. from apilib.monetary import RMB, VirtualCoin
  6. from apps import serviceCache
  7. from apps.web.constant import Const, DEALER_CONSUMPTION_AGG_KIND
  8. from apps.web.core.device_define.water_despenser import CMD_CODE
  9. from apps.web.dealer.models import Dealer
  10. from apps.web.device.models import Device, Group
  11. from apps.web.eventer.base import WorkEvent
  12. from apps.web.eventer import EventBuilder
  13. from apps.web.south_intf.platform import notify_event_to_north
  14. from apps.web.user.models import ServiceProgress, MyUser
  15. from taskmanager.mediator import task_caller
  16. logger = logging.getLogger(__name__)
  17. class builder(EventBuilder):
  18. def __getEvent__(self, device_event):
  19. event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
  20. if not event_data or 'cmdCode' not in event_data:
  21. return None
  22. # EB是设备结束上报
  23. if event_data['cmdCode'] in ['EB', 'EC']:
  24. return WaterControllerWorkEvent(self.deviceAdapter, event_data)
  25. class WaterControllerWorkEvent(WorkEvent):
  26. def do(self, **args):
  27. devNo = self.device['devNo']
  28. logger.info('WaterController event detected, devNo=%s, curInfo=%s' % (devNo, self.event_data))
  29. port = self.event_data['port']
  30. try:
  31. ctrInfo = Device.get_dev_control_cache(self.device['devNo'])
  32. lineInfo = ctrInfo.get(port)
  33. reasonDesc = '设备停止'
  34. price = lineInfo['price']
  35. coins = lineInfo['coins']
  36. needTime = float(lineInfo['needTime'])
  37. leftTime = float(self.event_data.get('leftTime', 0))
  38. consumeDict = {'reason': reasonDesc, 'desc': reasonDesc, 'chargeIndex': port, 'leftTime': leftTime}
  39. group = Group.get_group(self.device['groupId'])
  40. user = MyUser.objects(openId=lineInfo['openId'], groupId=self.device['groupId']).first()
  41. refundedMoney = RMB((leftTime / needTime) * price)
  42. refundCoins = VirtualCoin((leftTime / needTime) * coins)
  43. isRefund = True
  44. if self.device.is_auto_refund is True and isRefund is True and lineInfo.get('vCardId', '') == '':
  45. is_cash = False
  46. if 'refundRMB_device_event' in self.device.owner.features and refundedMoney > RMB(0):
  47. is_cash = True
  48. consumeDict.update({DEALER_CONSUMPTION_AGG_KIND.COIN: VirtualCoin(coins).mongo_amount})
  49. if refundedMoney > RMB(0) or refundCoins > VirtualCoin(0):
  50. consumeDict.update(
  51. {DEALER_CONSUMPTION_AGG_KIND.COIN: (VirtualCoin(coins) - refundCoins).mongo_amount})
  52. self.refund_net_pay(user, lineInfo, refundedMoney, refundCoins, consumeDict, is_cash)
  53. ServiceProgress.update_progress_and_consume_rcd(self.device['ownerId'],
  54. {'open_id': lineInfo['openId'], 'port': int(port),
  55. 'device_imei': self.device['devNo'],
  56. 'isFinished': False}, consumeDict)
  57. extra = []
  58. if DEALER_CONSUMPTION_AGG_KIND.REFUNDED_COINS in consumeDict:
  59. extra.append({u'消费明细': u'消费{}金币,退款{}金币'.format(VirtualCoin(coins) - refundCoins, refundCoins)})
  60. elif DEALER_CONSUMPTION_AGG_KIND.REFUNDED_CASH in consumeDict:
  61. extra.append({u'消费金额': u'消费{}元,退款{}元'.format(RMB(price) - refundedMoney, refundedMoney)})
  62. self.notify_user_service_complete(
  63. service_name='服务完成',
  64. openid=user.managerialOpenId if user else '',
  65. port=port,
  66. address=group['address'],
  67. reason=reasonDesc,
  68. finished_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  69. extra=extra
  70. )
  71. else:
  72. self.notify_user(user.managerialOpenId if user else '', 'service_complete',
  73. **{
  74. 'title': u'%s' % reasonDesc,
  75. 'service': u'设备服务(设备编号:%s, 端口:%s,地址:%s)' % (
  76. self.device['logicalCode'], port, group['address']),
  77. 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  78. 'remark': u'谢谢您的支持'
  79. })
  80. ServiceProgress.update_progress_and_consume_rcd(self.device['ownerId'],
  81. {'open_id': lineInfo['openId'],
  82. 'port': int(port),
  83. 'device_imei': self.device['devNo'],
  84. 'isFinished': False}, consumeDict)
  85. finally:
  86. Device.clear_port_control_cache(devNo, str(port))