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