123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import datetime
- import logging
- import uuid
- from apilib.monetary import RMB, VirtualCoin
- from apps.web.device.models import Device
- from apps.web.eventer.base import WorkEvent
- from apps.web.eventer import EventBuilder
- from apps.web.user.models import MyUser, RechargeRecord
- logger = logging.getLogger(__name__)
- class builder(EventBuilder):
- def __getEvent__(self, device_event):
- event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
- if event_data is None or 'cmdCode' not in event_data:
- return
- if event_data['cmdCode'] == '12':
- return ChargingDLYWorkEvent(self.deviceAdapter, event_data)
- return None
- class ChargingDLYWorkEvent(WorkEvent):
- def do(self, **args):
- devNo = self.device['devNo']
- logger.info('duoliyuan charging event detected, devNo=%s' % devNo)
- lineInfo = Device.update_port_control_cache(self.device['devNo'], self.event_data)
- try:
- if (not lineInfo.has_key('openId')) or lineInfo['openId'] is None:
- return
- openId = lineInfo['openId']
- user = MyUser.objects(openId = openId, groupId = self.device['groupId']).first()
- self.notify_charging_finished(user.managerialOpenId if user else '')
- # 如果需要退款,计算退款数据.
- if not self.device.is_auto_refund:
- return
- leftTime = lineInfo['leftTime']
- needTime = lineInfo['needTime']
- coins = RMB(lineInfo['coins'])
- backCoins = coins * (float(leftTime) / float(needTime))
- if leftTime == 0 or backCoins > coins:
- return
- if backCoins <= VirtualCoin(0):
- logger.debug('back coins is zero.')
- return
- # 添加金币
- try:
- MyUser.get_collection().update({'openId': lineInfo['openId'], 'groupId': self.device['groupId']},
- {'$inc': {'balance': backCoins.mongo_amount}})
- except Exception, e:
- logger.error('feedback coins error=%s' % e)
- return
- # 添加一条充值记录
- orderNo = str(uuid.uuid4())
- try:
- group = {}
- newRcd = RechargeRecord(orderNo = orderNo,
- coins = backCoins, openId = lineInfo['openId'],
- groupId = self.device['groupId'],
- devNo = devNo, logicalCode = self.device['logicalCode'],
- ownerId = self.device['ownerId'], groupName = group['groupName'],
- groupNumber = self.device['groupNumber'], address = group['address'],
- wxOrderNo = u'设备退币',
- devTypeName = self.device.devTypeName, nickname = '',
- result = 'success', via = 'refund')
- newRcd.save()
- except Exception, e:
- logger.exception('update record for feedback coins error=%s,orderNo=%s' % (e, orderNo))
- self.notify_user(user.managerialOpenId if user else '', 'refund_coins', **{
- 'title': u'充电已经结束。您订购的充电时间为%s分钟,还有:%s分钟的时间未使用完,给您退还成相应的金币,您下次可以接着使用哦' % (
- lineInfo['needTime'], self.event_data['leftTime']),
- 'backCount': u'金币:%s' % backCoins,
- 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
- })
- finally:
- Device.clear_port_control_cache(devNo, str(lineInfo['port']))
|