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