123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- # -*- 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
|