zhiyangji.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import time
  4. from apilib.utils_datetime import to_datetime
  5. from apilib.utils_json import JsonResponse
  6. from apps.web.constant import DeviceCmdCode, MQTT_TIMEOUT, ErrorCode, Const
  7. from apps.web.core.adapter.base import SmartBox
  8. from apps.web.core.exceptions import ServiceException
  9. from apps.web.core.networking import MessageSender
  10. from apps.web.device.models import Device
  11. from apps.web.core.device_define import PackageDict
  12. class ZhiyangjiBox(SmartBox):
  13. def __init__(self, device):
  14. super(ZhiyangjiBox, self).__init__(device)
  15. def test(self, coins):
  16. now_time = datetime.datetime.now()
  17. return MessageSender.send(device = self.device, cmd = DeviceCmdCode.PAY_MONEY, payload = {
  18. 't': int(time.mktime(now_time.timetuple())),
  19. 'duration': 300
  20. })
  21. def stop(self, port = None):
  22. Device.invalid_device_control_cache(self.device.devNo)
  23. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.STOP_DEVICE, payload = {
  24. 't': int(time.time())
  25. })
  26. if devInfo['rst'] == 0:
  27. if 'left_time' in devInfo:
  28. devInfo['remainder_time'] = int(devInfo['left_time'] / 60.0)
  29. else:
  30. devInfo['remainder_time'] = int(devInfo['remainder_time'] / 60.0)
  31. return devInfo
  32. def start_device(self, package, openId, attachParas):
  33. #: 首先检查设备是否在线
  34. duration = PackageDict(package).estimated_duraion
  35. now_time = datetime.datetime.now()
  36. devInfo = MessageSender.send(device = self.device,
  37. cmd = DeviceCmdCode.PAY_MONEY,
  38. payload = {
  39. 't': int(time.mktime(now_time.timetuple())),
  40. 'duration': duration
  41. },
  42. timeout = MQTT_TIMEOUT.START_DEVICE)
  43. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  44. current_dev_type_name = self.device['devType']['name']
  45. if current_dev_type_name == u'其他':
  46. current_dev_type_name = u'自助设备'
  47. if devInfo['rst'] == -1:
  48. description = u'当前' + current_dev_type_name + u'正在玩命找网络,您的金币还在,重试不会扣款,建议您试试旁边其他设备,或者试试投硬币,或者稍后再试哦'
  49. raise ServiceException({'result': ErrorCode.DEVICE_CONN_FAIL, 'description': description})
  50. elif devInfo['rst'] == 1:
  51. description = u'当前' + current_dev_type_name + u'正在忙,无响应,您的金币还在,重试不会扣款,请试试其他线路,或者请稍后再试哦'
  52. raise ServiceException({'result': ErrorCode.BOARD_UART_TIMEOUT, 'description': description})
  53. if 'left_time' in devInfo:
  54. # 新版本设置到设备后, 时间是上次还剩下的时间加上本次下发的时间
  55. needTime = devInfo['left_time']
  56. devInfo['finishedTime'] = (int(time.mktime(now_time.timetuple())) + int(needTime))
  57. Device.update_dev_control_cache(
  58. self.device['devNo'],
  59. {
  60. 'status': Const.DEV_WORK_STATUS_WORKING,
  61. 'finishedTime': devInfo['finishedTime'],
  62. 'openId': openId,
  63. 'startTime': now_time.strftime('%Y-%m-%d %H:%M:%S'),
  64. 'needTime': needTime,
  65. 'vCardId': self._vcard_id
  66. })
  67. return devInfo
  68. else:
  69. # 老版本去模块取时间
  70. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.GET_DEVINFO, payload = {
  71. 'fields': ['remainder_time']
  72. })
  73. if devInfo.has_key('rst') and devInfo['rst'] == 0 and devInfo.has_key('remainder_time'):
  74. needTime = devInfo['remainder_time'] / 1000.0
  75. else:
  76. needTime = duration
  77. devInfo['finishedTime'] = (int(time.time()) + int(needTime))
  78. Device.update_dev_control_cache(self.device.devNo,
  79. {
  80. 'status': Const.DEV_WORK_STATUS_WORKING,
  81. 'finishedTime': devInfo['finishedTime'],
  82. 'openId': openId,
  83. 'startTime': now_time.strftime('%Y-%m-%d %H:%M:%S'),
  84. 'needTime': needTime,
  85. 'vCardId': self._vcard_id
  86. })
  87. return devInfo
  88. def get_left_time(self):
  89. ctrInfo = Device.get_dev_control_cache(self.device['devNo'])
  90. if (ctrInfo is None) or (not ctrInfo.has_key('status')) or (
  91. ctrInfo['status'] == Const.DEV_WORK_STATUS_IDLE):
  92. return 0.0, 0.0
  93. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.GET_DEVINFO,
  94. payload = {'fields': ['remainder_time', 'left_time']})
  95. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  96. if ctrInfo.has_key('startTime') and ctrInfo.has_key('needTime'):
  97. startTime = to_datetime(ctrInfo['startTime'])
  98. needTime = ctrInfo['needTime'] / 60.0
  99. leftTime = needTime - (datetime.datetime.now() - startTime).total_seconds() / 60.0
  100. return leftTime, needTime
  101. current_dev_type_name = self.device['devType']['name']
  102. if current_dev_type_name == u'其他':
  103. current_dev_type_name = u'自助设备'
  104. if devInfo['rst'] == -1:
  105. description = u'当前' + current_dev_type_name + u'正在玩命找网络,建议您试试旁边其他设备,或者试试投硬币,或者稍后再试哦'
  106. raise ServiceException({'result': 2, 'description': description})
  107. elif devInfo['rst'] == 1:
  108. description = u'当前' + current_dev_type_name + u'正在忙,无响应,请稍后再试哦'
  109. raise ServiceException({'result': 2, 'description': description})
  110. if 'left_time' in devInfo:
  111. # 新版本换一个字段,以秒为单位
  112. leftTime = devInfo['left_time']
  113. needTime = ctrInfo.get('needTime', leftTime)
  114. elif 'remainder_time' in devInfo:
  115. # 老版本是以毫秒为单位
  116. leftTime = devInfo['remainder_time'] / 1000.0
  117. needTime = ctrInfo.get('needTime', leftTime)
  118. elif ctrInfo.has_key('startTime') and ctrInfo.has_key('needTime'):
  119. startTime = to_datetime(ctrInfo['startTime'])
  120. needTime = ctrInfo['needTime'] / 60.0
  121. leftTime = needTime - (datetime.datetime.now() - startTime).total_seconds() / 60.0
  122. return leftTime, needTime
  123. else:
  124. return 0.0, 0.0
  125. if leftTime == 0.0: # 顺便清理下状态
  126. Device.invalid_device_control_cache(self.device['devNo'])
  127. if needTime < leftTime:
  128. needTime = leftTime
  129. return leftTime / 60.0, needTime / 60.0
  130. def support_count_down(self, openId = None, port = None):
  131. return True
  132. def count_down(self, request, dev, agent, group, devType, lastOpenId, port = None):
  133. surplus, sumtime = self.get_left_time()
  134. orderProcessing = False
  135. if surplus == 0.0 and sumtime == 0.0:
  136. orderProcessing = True
  137. return JsonResponse(
  138. {
  139. 'result': 1,
  140. 'description': '',
  141. 'payload': {
  142. 'surplus': surplus,
  143. 'sum': sumtime,
  144. 'name': group['groupName'],
  145. 'address': group['address'],
  146. 'code': devType.get('code'),
  147. 'orderProcessing': orderProcessing,
  148. 'logicalCode': dev['logicalCode'],
  149. 'user': 'me' if lastOpenId == request.user.openId else 'notme',
  150. 'agentFeatures': agent.features,
  151. }
  152. })