123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import datetime
- import logging
- from apilib.monetary import RMB, VirtualCoin
- from apps import serviceCache
- from apps.web.constant import Const, DEALER_CONSUMPTION_AGG_KIND
- from apps.web.core.device_define.water_despenser import CMD_CODE
- from apps.web.dealer.models import Dealer
- from apps.web.device.models import Device, Group
- from apps.web.eventer.base import WorkEvent
- from apps.web.eventer import EventBuilder
- from apps.web.south_intf.platform import notify_event_to_north
- from apps.web.user.models import ServiceProgress, MyUser
- from taskmanager.mediator import task_caller
- logger = logging.getLogger(__name__)
- class builder(EventBuilder):
- def __getEvent__(self, device_event):
- event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
- if not event_data or 'cmdCode' not in event_data:
- return None
- # EB是设备结束上报
- if event_data['cmdCode'] in ['EB', 'EC']:
- return WaterControllerWorkEvent(self.deviceAdapter, event_data)
- class WaterControllerWorkEvent(WorkEvent):
- def do(self, **args):
- devNo = self.device['devNo']
- logger.info('WaterController event detected, devNo=%s, curInfo=%s' % (devNo, self.event_data))
- port = self.event_data['port']
- try:
- ctrInfo = Device.get_dev_control_cache(self.device['devNo'])
- lineInfo = ctrInfo.get(port)
- reasonDesc = '设备停止'
- price = lineInfo['price']
- coins = lineInfo['coins']
- needTime = float(lineInfo['needTime'])
- leftTime = float(self.event_data.get('leftTime', 0))
- consumeDict = {'reason': reasonDesc, 'desc': reasonDesc, 'chargeIndex': port, 'leftTime': leftTime}
- group = Group.get_group(self.device['groupId'])
- user = MyUser.objects(openId=lineInfo['openId'], groupId=self.device['groupId']).first()
- refundedMoney = RMB((leftTime / needTime) * price)
- refundCoins = VirtualCoin((leftTime / needTime) * coins)
- isRefund = True
- if self.device.is_auto_refund is True and isRefund is True and lineInfo.get('vCardId', '') == '':
- is_cash = False
- if 'refundRMB_device_event' in self.device.owner.features and refundedMoney > RMB(0):
- is_cash = True
- consumeDict.update({DEALER_CONSUMPTION_AGG_KIND.COIN: VirtualCoin(coins).mongo_amount})
- if refundedMoney > RMB(0) or refundCoins > VirtualCoin(0):
- consumeDict.update(
- {DEALER_CONSUMPTION_AGG_KIND.COIN: (VirtualCoin(coins) - refundCoins).mongo_amount})
- self.refund_net_pay(user, lineInfo, refundedMoney, refundCoins, consumeDict, is_cash)
- ServiceProgress.update_progress_and_consume_rcd(self.device['ownerId'],
- {'open_id': lineInfo['openId'], 'port': int(port),
- 'device_imei': self.device['devNo'],
- 'isFinished': False}, consumeDict)
- extra = []
- if DEALER_CONSUMPTION_AGG_KIND.REFUNDED_COINS in consumeDict:
- extra.append({u'消费明细': u'消费{}金币,退款{}金币'.format(VirtualCoin(coins) - refundCoins, refundCoins)})
- elif DEALER_CONSUMPTION_AGG_KIND.REFUNDED_CASH in consumeDict:
- extra.append({u'消费金额': u'消费{}元,退款{}元'.format(RMB(price) - refundedMoney, refundedMoney)})
- self.notify_user_service_complete(
- service_name='服务完成',
- openid=user.managerialOpenId if user else '',
- port=port,
- address=group['address'],
- reason=reasonDesc,
- finished_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
- extra=extra
- )
- else:
- self.notify_user(user.managerialOpenId if user else '', 'service_complete',
- **{
- 'title': u'%s' % reasonDesc,
- 'service': u'设备服务(设备编号:%s, 端口:%s,地址:%s)' % (
- self.device['logicalCode'], port, group['address']),
- 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
- 'remark': u'谢谢您的支持'
- })
- ServiceProgress.update_progress_and_consume_rcd(self.device['ownerId'],
- {'open_id': lineInfo['openId'],
- 'port': int(port),
- 'device_imei': self.device['devNo'],
- 'isFinished': False}, consumeDict)
- finally:
- Device.clear_port_control_cache(devNo, str(port))
|