# -*- coding: utf-8 -*- #!/usr/bin/env python import logging import time from apilib.monetary import RMB, VirtualCoin from apps.web.constant import DeviceCmdCode, USER_RECHARGE_TYPE from apps.web.core.accounting import Accounting from apps.web.core.adapter.base import fill_2_hexByte from apps.web.core.networking import MessageSender from apps.web.dealer.utils import consume_stock from apps.web.device.models import Device from apps.web.eventer.base import WorkEvent from apps.web.eventer import EventBuilder from apps.web.report.ledger import Ledger from apps.web.user.models import RefundMoneyRecord from apps.web.user.transaction_deprecated import refund_cash from apps.web.user.models import DuibijiOrderMap, MyUser, RechargeRecord from apps.web.utils import concat_user_login_entry_url logger = logging.getLogger(__name__) class builder(EventBuilder): def __getEvent__(self, device_event): data = self.deviceAdapter.analyze_event_data(device_event) if data is None: return None if data['funCode'] in ['D1', '13', '10','14']: return DuibijiWorkEvent(self.deviceAdapter, data) return None class DuibijiWorkEvent(WorkEvent): SUCCESS = "01" FAIL = "00" def do(self, **args): # 娃娃被抓取后,需要发送消息确认,然后记录消耗记录 funCode = self.event_data['funCode'] devNo = self.device['devNo'] if funCode in ['13','14']: coinCount = self.event_data['coinCount'] money = self.event_data['money'] if money == 0: return Accounting.recordOfflineCoin(self.device, int(time.time()), int(money)) devObj = Device.objects.get(devNo = devNo) consume_stock(devObj,coinCount,u'线下投币') logger.info('finished record stock ,devNo=%s' % devNo) elif funCode == 'D1': # 如果兑币发生故障,按照订单数据,进行现金退费 # 首先回应,已经收到报文 devOrderId = self.event_data['devOrderId'] self.deviceAdapter.ack_duibi_event(devOrderId) if self.event_data['result'] in ['00']: try: DuibijiOrderMap.objects.filter(devOrderId = devOrderId).remove() except Exception, e: return logger.info('duibi result is 00 and 02,it means nomal or starting') return try: mapRcd = DuibijiOrderMap.objects.get(devOrderId = devOrderId) except Exception, e: logger.error('can not find map rcd,maybe this order has dealed,e=%s,devNo=%s' % (e, devNo)) return rechargeRcdId = mapRcd.rechargeRcdId if not rechargeRcdId: logger.error('recharegeRcdId is None,devNo=%s' % devNo) return record = RechargeRecord.objects(id = rechargeRcdId).first() # type: RechargeRecord if not record: logger.error('recharge rcd is not exists. id = %s, devNo = %s' % (rechargeRcdId, devNo)) return price = record.money # 存在充值信息的情况下 说明需要 退还现金 refundMoney = record.money openId = record.openId user = record.user if not user: logger.error('may be dummy record: {}'.format(str(record))) return # 先分账,然后在处理退款 if not record.is_success: logger.debug('{} state is {}'.format(str(record), record.result)) return if not record.is_ledgered: ledger = Ledger(USER_RECHARGE_TYPE.RECHARGE, record) ledger.execute(journal=False, stats=True, check=False) refund_order = refund_cash( record, RMB(refundMoney), VirtualCoin(0), user = user) # type: RefundMoneyRecord if refund_order: logger.debug('refund cash apply success.') DuibijiOrderMap.objects.filter(devOrderId=devOrderId).remove() elif funCode == '10': # 返回设备的二维码 qr_code_url = concat_user_login_entry_url(l = self.device['logicalCode']) data = '' for char in qr_code_url: data += fill_2_hexByte(hex(ord(char)),2) try: devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self.device['devNo'],'funCode':'10','data':data}) self.deviceAdapter.check_result(devInfo) except Exception,e: logger.info('reply qrcode e=%s,devNo=%s' % (e,devNo))