duibiji.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import logging
  4. import time
  5. from apilib.monetary import RMB, VirtualCoin
  6. from apps.web.constant import DeviceCmdCode, USER_RECHARGE_TYPE
  7. from apps.web.core.accounting import Accounting
  8. from apps.web.core.adapter.base import fill_2_hexByte
  9. from apps.web.core.networking import MessageSender
  10. from apps.web.dealer.utils import consume_stock
  11. from apps.web.device.models import Device
  12. from apps.web.eventer.base import WorkEvent
  13. from apps.web.eventer import EventBuilder
  14. from apps.web.report.ledger import Ledger
  15. from apps.web.user.models import RefundMoneyRecord
  16. from apps.web.user.transaction_deprecated import refund_cash
  17. from apps.web.user.models import DuibijiOrderMap, MyUser, RechargeRecord
  18. from apps.web.utils import concat_user_login_entry_url
  19. logger = logging.getLogger(__name__)
  20. class builder(EventBuilder):
  21. def __getEvent__(self, device_event):
  22. data = self.deviceAdapter.analyze_event_data(device_event)
  23. if data is None:
  24. return None
  25. if data['funCode'] in ['D1', '13', '10','14']:
  26. return DuibijiWorkEvent(self.deviceAdapter, data)
  27. return None
  28. class DuibijiWorkEvent(WorkEvent):
  29. SUCCESS = "01"
  30. FAIL = "00"
  31. def do(self, **args):
  32. # 娃娃被抓取后,需要发送消息确认,然后记录消耗记录
  33. funCode = self.event_data['funCode']
  34. devNo = self.device['devNo']
  35. if funCode in ['13','14']:
  36. coinCount = self.event_data['coinCount']
  37. money = self.event_data['money']
  38. if money == 0:
  39. return
  40. Accounting.recordOfflineCoin(self.device, int(time.time()), int(money))
  41. devObj = Device.objects.get(devNo = devNo)
  42. consume_stock(devObj,coinCount,u'线下投币')
  43. logger.info('finished record stock ,devNo=%s' % devNo)
  44. elif funCode == 'D1': # 如果兑币发生故障,按照订单数据,进行现金退费
  45. # 首先回应,已经收到报文
  46. devOrderId = self.event_data['devOrderId']
  47. self.deviceAdapter.ack_duibi_event(devOrderId)
  48. if self.event_data['result'] in ['00']:
  49. try:
  50. DuibijiOrderMap.objects.filter(devOrderId = devOrderId).remove()
  51. except Exception, e:
  52. return
  53. logger.info('duibi result is 00 and 02,it means nomal or starting')
  54. return
  55. try:
  56. mapRcd = DuibijiOrderMap.objects.get(devOrderId = devOrderId)
  57. except Exception, e:
  58. logger.error('can not find map rcd,maybe this order has dealed,e=%s,devNo=%s' % (e, devNo))
  59. return
  60. rechargeRcdId = mapRcd.rechargeRcdId
  61. if not rechargeRcdId:
  62. logger.error('recharegeRcdId is None,devNo=%s' % devNo)
  63. return
  64. record = RechargeRecord.objects(id = rechargeRcdId).first() # type: RechargeRecord
  65. if not record:
  66. logger.error('recharge rcd is not exists. id = %s, devNo = %s' % (rechargeRcdId, devNo))
  67. return
  68. price = record.money
  69. # 存在充值信息的情况下 说明需要 退还现金
  70. refundMoney = record.money
  71. openId = record.openId
  72. user = record.user
  73. if not user:
  74. logger.error('may be dummy record: {}'.format(str(record)))
  75. return
  76. # 先分账,然后在处理退款
  77. if not record.is_success:
  78. logger.debug('{} state is {}'.format(str(record), record.result))
  79. return
  80. if not record.is_ledgered:
  81. ledger = Ledger(USER_RECHARGE_TYPE.RECHARGE, record)
  82. ledger.execute(journal=False, stats=True, check=False)
  83. refund_order = refund_cash(
  84. record, RMB(refundMoney), VirtualCoin(0), user = user) # type: RefundMoneyRecord
  85. if refund_order:
  86. logger.debug('refund cash apply success.')
  87. DuibijiOrderMap.objects.filter(devOrderId=devOrderId).remove()
  88. elif funCode == '10': # 返回设备的二维码
  89. qr_code_url = concat_user_login_entry_url(l = self.device['logicalCode'])
  90. data = ''
  91. for char in qr_code_url:
  92. data += fill_2_hexByte(hex(ord(char)),2)
  93. try:
  94. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  95. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self.device['devNo'],'funCode':'10','data':data})
  96. self.deviceAdapter.check_result(devInfo)
  97. except Exception,e:
  98. logger.info('reply qrcode e=%s,devNo=%s' % (e,devNo))