shower.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. from mongoengine import DoesNotExist
  5. from apilib.monetary import RMB
  6. from apilib.utils_sys import memcache_lock
  7. from apps.web.constant import Const
  8. from apps.web.core.networking import MessageSender
  9. from apps.web.dealer.models import Dealer
  10. from apps.web.device.models import Group, Device
  11. from apps.web.eventer import EventBuilder
  12. from apps.web.eventer.base import WorkEvent
  13. from apps.web.helpers import device_lock_key
  14. from apps.web.user.models import ServiceProgress, Card, CardRechargeOrder, CardConsumeRecord
  15. logger = logging.getLogger(__name__)
  16. class builder(EventBuilder):
  17. def __getEvent__(self, device_event):
  18. return DepartmentShowerEvent(self.deviceAdapter, device_event)
  19. class DepartmentShowerEvent(WorkEvent):
  20. def update_card_dealer_and_type(self, cardNo, cardType = 'ID'):
  21. dealer = Dealer.objects.get(id = self.device['ownerId'])
  22. try:
  23. card = Card.objects.get(cardNo = cardNo, agentId = dealer.agentId)
  24. # 如果卡的经销商换了,不允许使用
  25. if card.dealerId and str(dealer.id) != card.dealerId:
  26. return None
  27. card.dealerId = self.device['ownerId']
  28. card.devNo = self.device['devNo']
  29. card.cardType = cardType
  30. return card.save()
  31. except DoesNotExist:
  32. card = Card(
  33. cardNo = cardNo,
  34. cardType = cardType,
  35. dealerId = str(dealer.id),
  36. agentId = str(dealer.agentId),
  37. )
  38. try:
  39. return card.save()
  40. except Exception as e:
  41. logger.error('can not save card info,cardNo=%s' % cardNo)
  42. logger.exception(e)
  43. except Exception as e:
  44. logger.exception(e)
  45. return None
  46. def do(self, **args):
  47. devNo = self.device['devNo']
  48. logger.info('department shower event detected, devNo=%s,msg=%s' % (devNo, self.event_data))
  49. # 用户放上了ID卡,到服务器上来同步卡的余额
  50. if self.event_data['cmd'] == 301:
  51. # 更新一次绑定关系
  52. # 检查用户是否换设备刷卡
  53. card = self.update_card_dealer_and_type(self.event_data['cardNo'], 'ID')
  54. if card is None:
  55. balance = 0
  56. elif card.frozen:
  57. balance = 0
  58. else:
  59. card_recharge_order = CardRechargeOrder.get_last_to_do_one(str(card.id))
  60. result = self.recharge_id_card(card = card,
  61. rechargeType = 'append',
  62. order = card_recharge_order)
  63. balance = result['balance']
  64. MessageSender.async_send(device = self.device, cmd = 301, payload = {
  65. 'cardNo': self.event_data['cardNo'], 'IMEI': self.device['devNo'],
  66. 'balance': int(balance * 100)
  67. })
  68. # 余额是0,设备不会工作,直接返回
  69. if RMB(balance) <= RMB(0):
  70. logger.info('this card balance is 0,cardId=%s' % (card.id))
  71. return
  72. # 更新设备的状态,并发通知消息给用户
  73. Device.update_dev_control_cache(self.device['devNo'], {'status': Const.DEV_WORK_STATUS_WORKING})
  74. # 登记下正在服务的信息
  75. ServiceProgress.register_card_service(self.device, -1, card)
  76. # 发消息给卡主
  77. group = Group.get_group(self.device['groupId'])
  78. desc = u'正在刷卡使用,开始计费,卡号:%s,卡名称:%s,地址信息:%s %s' % (
  79. card.cardNo, card.cardName,
  80. group['groupName'], group['address'])
  81. self.notify_balance_has_consume_for_card(card, 0.00, desc)
  82. elif self.event_data['cmd'] == 307:
  83. with memcache_lock(key = device_lock_key(self.device['devNo']), value = self.event_data['dsid'],
  84. expire = 360) as acquired:
  85. if acquired:
  86. devObj = Device.objects.get(devNo = devNo)
  87. minuteFee = devObj.otherConf.get('minuteFee', 10)
  88. replyAccountDict = {}
  89. for cardNo, cardValue in self.event_data['accounts'].items():
  90. card = self.update_card_dealer_and_type(cardNo, 'ID')
  91. # 检查该消费单是否核销了
  92. count = CardConsumeRecord.objects.filter(devNo = self.device['devNo'],
  93. sid = self.event_data['dsid']).count()
  94. # 如果有,就说明单已经核销了
  95. if count > 0:
  96. balance = card.balance
  97. else:
  98. balance = card.balance - RMB(cardValue['arrearage'] / 100.0)
  99. replyAccountDict.update({cardNo: int(balance * 100)})
  100. if count > 0:
  101. continue
  102. # 减掉余额
  103. self.consume_money_for_card(card, RMB(cardValue['arrearage'] / 100.0))
  104. # 记录数据
  105. spendTime = round(cardValue['arrearage'] / minuteFee, 2)
  106. self.record_consume_for_card(card, RMB(cardValue['arrearage'] / 100.0), u'花费时间:%s' % spendTime,
  107. {'spendTime': cardValue,
  108. 'spendMoney': cardValue['arrearage'] / 100.0},
  109. sid = self.event_data['dsid'])
  110. try:
  111. devInfo = MessageSender.send(self.device, 307,
  112. {'IMEI': self.device['devNo'], 'accounts': replyAccountDict,
  113. 'dsid': self.event_data['dsid']})
  114. except Exception, e:
  115. logger.info('send 307 error=%s' % e)
  116. return