# -*- 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']))