duoliyuan.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import uuid
  6. from apilib.monetary import RMB, VirtualCoin
  7. from apps.web.device.models import Device
  8. from apps.web.eventer.base import WorkEvent
  9. from apps.web.eventer import EventBuilder
  10. from apps.web.user.models import MyUser, RechargeRecord
  11. logger = logging.getLogger(__name__)
  12. class builder(EventBuilder):
  13. def __getEvent__(self, device_event):
  14. event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
  15. if event_data is None or 'cmdCode' not in event_data:
  16. return
  17. if event_data['cmdCode'] == '12':
  18. return ChargingDLYWorkEvent(self.deviceAdapter, event_data)
  19. return None
  20. class ChargingDLYWorkEvent(WorkEvent):
  21. def do(self, **args):
  22. devNo = self.device['devNo']
  23. logger.info('duoliyuan charging event detected, devNo=%s' % devNo)
  24. lineInfo = Device.update_port_control_cache(self.device['devNo'], self.event_data)
  25. try:
  26. if (not lineInfo.has_key('openId')) or lineInfo['openId'] is None:
  27. return
  28. openId = lineInfo['openId']
  29. user = MyUser.objects(openId = openId, groupId = self.device['groupId']).first()
  30. self.notify_charging_finished(user.managerialOpenId if user else '')
  31. # 如果需要退款,计算退款数据.
  32. if not self.device.is_auto_refund:
  33. return
  34. leftTime = lineInfo['leftTime']
  35. needTime = lineInfo['needTime']
  36. coins = RMB(lineInfo['coins'])
  37. backCoins = coins * (float(leftTime) / float(needTime))
  38. if leftTime == 0 or backCoins > coins:
  39. return
  40. if backCoins <= VirtualCoin(0):
  41. logger.debug('back coins is zero.')
  42. return
  43. # 添加金币
  44. try:
  45. MyUser.get_collection().update({'openId': lineInfo['openId'], 'groupId': self.device['groupId']},
  46. {'$inc': {'balance': backCoins.mongo_amount}})
  47. except Exception, e:
  48. logger.error('feedback coins error=%s' % e)
  49. return
  50. # 添加一条充值记录
  51. orderNo = str(uuid.uuid4())
  52. try:
  53. group = {}
  54. newRcd = RechargeRecord(orderNo = orderNo,
  55. coins = backCoins, openId = lineInfo['openId'],
  56. groupId = self.device['groupId'],
  57. devNo = devNo, logicalCode = self.device['logicalCode'],
  58. ownerId = self.device['ownerId'], groupName = group['groupName'],
  59. groupNumber = self.device['groupNumber'], address = group['address'],
  60. wxOrderNo = u'设备退币',
  61. devTypeName = self.device.devTypeName, nickname = '',
  62. result = 'success', via = 'refund')
  63. newRcd.save()
  64. except Exception, e:
  65. logger.exception('update record for feedback coins error=%s,orderNo=%s' % (e, orderNo))
  66. self.notify_user(user.managerialOpenId if user else '', 'refund_coins', **{
  67. 'title': u'充电已经结束。您订购的充电时间为%s分钟,还有:%s分钟的时间未使用完,给您退还成相应的金币,您下次可以接着使用哦' % (
  68. lineInfo['needTime'], self.event_data['leftTime']),
  69. 'backCount': u'金币:%s' % backCoins,
  70. 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  71. })
  72. finally:
  73. Device.clear_port_control_cache(devNo, str(lineInfo['port']))