# -*- coding: utf-8 -*- # !/usr/bin/env python import logging from mongoengine import DoesNotExist from apilib.monetary import RMB, VirtualCoin from apilib.utils_datetime import to_datetime from apps.web.constant import DEALER_CONSUMPTION_AGG_KIND 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 UserVirtualCard, ServiceProgress, MyUser 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['cmdCode'] in ['FB', 'FD', '01', '02']: return HeshuiChongdianEvent(self.deviceAdapter, event_data) return None class HeshuiChongdianEvent(WorkEvent): def support_playback(self): return True def do(self, **args): devNo = self.device['devNo'] logger.info('heshuichongdian event detected, devNo=%s' % (devNo,)) try: port = self.event_data['port'] cmdCode = self.event_data['cmdCode'] if cmdCode == 'FD': leftTime = self.event_data['leftTime'] else: leftTime = 0 lineInfo = Device.clear_port_control_cache(self.device['devNo'], str(port)) recvTime = to_datetime(self.recvTime) if not lineInfo or ('startTime' not in lineInfo): return if cmdCode in ['FB', 'FD']: usedTime = int(lineInfo['needTime'] / 60.0 - leftTime) else: usedTime = self.event_data['usedTime'] # 单位秒 group = self.device.group if cmdCode == 'FB': reason = u'使用结束。' elif cmdCode == 'FD': reason = u'使用(结束/异常)。' else: reason = u'使用结束' consumeDict = {'reason': reason} if lineInfo.has_key('consumeRcdId'): # 退额度 try: vCardId = lineInfo['vCardId'] vCard = UserVirtualCard.objects.get(id = vCardId) except DoesNotExist, e: logger.info('can not find the vCard id = %s' % vCardId) return # 通知服务结束 self.notify_user(self.get_managerialOpenId_by_openId(lineInfo['openId']) if vCard else '', 'service_complete', **{ 'title': reason, 'service': u'设备编号:%s,地址:%s' % (self.device['logicalCode'], group['address']), 'finishTime': recvTime.strftime('%Y-%m-%d %H:%M:%S'), 'remark': u'谢谢您的支持' }) ServiceProgress.update_progress_and_consume_rcd(self.device['ownerId'], {'open_id': lineInfo['openId'], 'port': port, 'device_imei': self.device['devNo'], 'isFinished': False}, consumeDict) else: # 非虚拟卡的方式 user = MyUser.objects(openId = lineInfo['openId'], groupId = self.device['groupId']).first() # 通知服务结束 self.notify_user(user.managerialOpenId if user else '', 'service_complete', **{ 'title': reason, 'service': u'设备编号:%s,地址:%s' % (self.device['logicalCode'], group['address']), 'finishTime': recvTime.strftime('%Y-%m-%d %H:%M:%S'), 'remark': u'谢谢您的支持' }) ServiceProgress.update_progress_and_consume_rcd(self.device['ownerId'], {'open_id': lineInfo['openId'], 'port': port, 'device_imei': self.device['devNo'], 'isFinished': False}, consumeDict) if cmdCode == 'FB': # 充电正常结束的不予退费 return if not self.device.is_auto_refund: # 开关关闭,不予退费 return coins = lineInfo['coins'] if cmdCode == 'FD': needTime = lineInfo['needTime'] / 60.0 if leftTime == -1: refundMoney = round((needTime - usedTime) / float(needTime) * float(coins), 2) else: refundMoney = round(float(leftTime) / float(needTime) * float(coins), 2) else: needTime = lineInfo['needTime'] refundMoney = round((needTime - usedTime) / float(needTime) * float(coins), 2) if refundMoney > coins: refundMoney = coins consumeDict = {} self.refund_net_pay(user, lineInfo, RMB(refundMoney), VirtualCoin(0), consumeDict, True) refund = RMB(consumeDict.get(DEALER_CONSUMPTION_AGG_KIND.REFUNDED_CASH, '0.00')) if refund > RMB(0): self.notify_user(user.managerialOpenId if user else '', 'refund_coins', **{ 'title': reason, 'backCount': u'%s元' % refund, 'finishTime': recvTime.strftime('%Y-%m-%d %H:%M:%S') }) finally: pass