qianglong.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import time
  6. from apilib.monetary import RMB, VirtualCoin, Ratio
  7. from apps.web.constant import Const
  8. from apps.web.device.models import Group, Device
  9. from apps.web.eventer.base import WorkEvent
  10. from apps.web.eventer import EventBuilder
  11. from apps.web.user.models import ServiceProgress, MyUser
  12. from apps.web.user.transaction_deprecated import refund_money
  13. logger = logging.getLogger(__name__)
  14. class builder(EventBuilder):
  15. def __getEvent__(self, device_event):
  16. event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
  17. return QiangLongEvent(self.deviceAdapter, event_data)
  18. class QiangLongEvent(WorkEvent):
  19. def do(self, **args):
  20. cmd = self.event_data.get("cmdCode")
  21. if cmd == "C0":
  22. portStr = self.event_data.get("portStr")
  23. devCache = Device.get_dev_control_cache(self.device.devNo) or dict()
  24. portCache = devCache.get(portStr)
  25. if not portCache:
  26. logger.error("<{}> has receive a finish event but no portCache exists!".format(self.device.devNo))
  27. return
  28. openId = portCache.get("openId")
  29. coins = portCache.get("coins")
  30. needTime = portCache.get("needTime")
  31. startTimeStamp = portCache.get("startTimeStamp")
  32. cardId = portCache.get("cardId")
  33. nowTimeStamp = int(time.time())
  34. duration = (nowTimeStamp - startTimeStamp) // 60
  35. if duration < 0:
  36. duration = 0
  37. elif duration > needTime:
  38. duration = needTime
  39. else:
  40. duration = duration
  41. user = MyUser.objects.filter(openId = openId, groupId = self.device.groupId).first()
  42. consumeDict = {
  43. "needTime": needTime,
  44. "duration": duration,
  45. "chargeIndex": portStr
  46. }
  47. if self.device.is_auto_refund:
  48. try:
  49. refundMoney = VirtualCoin(coins) * Ratio((needTime - duration) / needTime)
  50. except ZeroDivisionError:
  51. refundMoney = VirtualCoin(0)
  52. except Exception as e:
  53. refundMoney = VirtualCoin(0)
  54. logger.exception(e)
  55. if refundMoney > VirtualCoin(0):
  56. if cardId:
  57. self.record_refund_money_for_card(refundMoney, cardId)
  58. consumeDict.update({"cardId": cardId})
  59. else:
  60. refund_money(self.device, refundMoney, openId)
  61. consumeDict.update({"refundedMoney": refundMoney.mongo_amount})
  62. self.notify_user(
  63. user.managerialOpenId if user else '',
  64. 'refund_coins',
  65. **{
  66. 'title': u"金币退款",
  67. 'backCount': u'%s' % refundMoney.amount,
  68. 'finishTime': datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  69. }
  70. )
  71. group = Group.get_group(self.device.groupId)
  72. self.notify_user(
  73. managerialOpenId = user.managerialOpenId if user else "",
  74. templateName = "service_complete",
  75. title = u"设备编号:\\t\\t{logicalCode}-{port}\\n\\n服务地址:\\t\\t{group}\\n\\n订购时间:\\t\\t{needTime}分钟\\n\\n剩余时间:\\t\\t{leftTime}分钟".format(
  76. logicalCode = self.device["logicalCode"],
  77. port = portStr,
  78. group = group.get("address", ""),
  79. needTime = needTime,
  80. leftTime = needTime - duration
  81. ),
  82. service = u"充电服务",
  83. finishTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
  84. remark = u'谢谢您的支持'
  85. )
  86. ServiceProgress.update_progress_and_consume_rcd(
  87. self.device.ownerId,
  88. {
  89. "open_id": openId,
  90. "device_imei": self.device.devNo,
  91. "port": int(portStr),
  92. "isFinished": False
  93. },
  94. consumeDict = consumeDict
  95. )
  96. Device.clear_port_control_cache(self.device.devNo, portStr)
  97. elif cmd == "EE":
  98. self.do_card_start()
  99. def do_card_start(self):
  100. """
  101. 刷卡启动设备
  102. :return:
  103. """
  104. cardNo = self.event_data.get("cardNo")
  105. portStr = self.event_data.get("portStr")
  106. otherConf = self.device.get("otherConf", dict())
  107. cardCst = int(otherConf.get("cardCst", self.deviceAdapter.DEFAULT_CARD_CST))
  108. cardTime = int(otherConf.get("cardTime", self.deviceAdapter.DEFAULT_CARD_TIME))
  109. # if int(portStr) == 0:
  110. # logger.error("port 0 has been start!")
  111. # return self._smartBox._response_card(portStr, 0, 1)
  112. # 检查端口是否被占用
  113. result = self.deviceAdapter._query_port_status(portStr)
  114. if result.get("status") != Const.DEV_WORK_STATUS_IDLE:
  115. logger.error("port <{}> is working!".format(portStr))
  116. return self.deviceAdapter._response_card(portStr, 0, 1)
  117. # 是否是无效卡
  118. card = self.update_card_dealer_and_type(cardNo)
  119. if not card or not card.openId or card.frozen:
  120. logger.error("card can not use, cardNo is <{}>".format(cardNo))
  121. return self.deviceAdapter._response_card(portStr, 0, 5)
  122. # 端口号是 0 说明是查询余额
  123. if int(portStr) == 0:
  124. logger.info("-------------------------------- find card")
  125. return self.deviceAdapter._response_card(portStr, int(float(card.balance*100)), 255)
  126. if float(card.balance) < cardCst:
  127. logger.error("card balance not enough, cardNo is <{}>".format(cardNo))
  128. return self.deviceAdapter._response_card(portStr, int(float(card.balance * 100)), 3)
  129. # 都OK的话可以发送数据告诉主板准备启动了
  130. self.deviceAdapter._response_card(portStr, int(float(card.balance * 100) - (cardCst * 100)), 255)
  131. # 发送启动
  132. self.deviceAdapter._start(portStr, cardTime)
  133. # 卡扣费等等一系列操作
  134. self.consume_money_for_card(card, RMB(cardCst))
  135. orderNo, cardOrderNo = self.record_consume_for_card(card, RMB(cardCst))
  136. portCache = {
  137. "cardId": str(card.id),
  138. "cardNo": card.cardNo,
  139. "status": Const.DEV_WORK_STATUS_WORKING,
  140. "coins": cardCst,
  141. "startTime": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
  142. "openId": card.openId,
  143. "isStart": True,
  144. "needTime": cardTime,
  145. "startTimeStamp": int(time.time())
  146. }
  147. Device.update_dev_control_cache(self.device.devNo, {portStr: portCache})
  148. ServiceProgress.register_card_service(
  149. self.device,
  150. int(portStr),
  151. card,
  152. consumeOrder = {
  153. "money": RMB(cardCst).mongo_amount,
  154. "needTime": cardTime,
  155. "unit": u"分钟",
  156. "consumeType": "card",
  157. "orderNo": orderNo,
  158. "cardOrderNo": cardOrderNo,
  159. }
  160. )