shuikong.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # -*- coding: utf-8 -*-
  2. from apps.web.core.adapter.base import *
  3. from apps.web.device.models import Device
  4. class DepartmentShower(SmartBox):
  5. def __init__(self, device):
  6. super(DepartmentShower, self).__init__(device)
  7. # 设备上报事件
  8. def analyze_event_data(self, data):
  9. pass
  10. def support_count_down(self,openId=None,port=None):
  11. return True
  12. def test(self, coins):
  13. return MessageSender.send(self.device, DeviceCmdCode.PAY_MONEY, {'IMEI': self._device['devNo'], 'duration': 60})
  14. def start_device(self, package, openId, attachParas):
  15. devInfo = MessageSender.send(self.device, DeviceCmdCode.GET_DEVINFO, {'IMEI': self._device['devNo']})
  16. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  17. raise ServiceException({'result': 2, 'description': u'淋浴器正在玩命找网络,建议您稍后再试或者试试刷卡使用'})
  18. if devInfo['remainder_time'] > 0 and devInfo.has_key('startMode') and devInfo['startMode'] == 'card':
  19. raise ServiceException({'result': 2, 'description': u'淋浴器正在忙,并且使用的是卡,不允许刷卡的时候再扫码使用!'})
  20. lastRemainderTime = devInfo['remainder_time']
  21. duration = int(package['time']*60)
  22. coins = float(package['coins'])
  23. devInfo = MessageSender.send(device = self.device,
  24. cmd = DeviceCmdCode.PAY_MONEY,
  25. payload = {
  26. 'IMEI': self._device['devNo'], 'duration': duration
  27. },
  28. timeout = MQTT_TIMEOUT.START_DEVICE)
  29. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  30. if devInfo['rst'] == 3:
  31. raise ServiceException({'result': 2, 'description': u'淋浴器正在刷卡使用,,请您等刷卡使用结束后,再使用'})
  32. raise ServiceException({'result': 2, 'description': u'淋浴器正在玩命找网络,您的金币还在,重试不会扣款,建议您稍后再试或者试试刷卡使用'})
  33. devCtrInfo = Device.get_dev_control_cache(devNo = self._device['devNo'])
  34. if devCtrInfo.has_key('openId') and devCtrInfo['openId'] != openId:
  35. devCtrInfo['coins'] = coins
  36. devCtrInfo['needTime'] = duration/60.0
  37. else:
  38. if ( not devCtrInfo.has_key('coins') ) or ( lastRemainderTime == 0.0 ):
  39. devCtrInfo['coins'] = coins
  40. else:
  41. devCtrInfo['coins'] += coins
  42. if ( not devCtrInfo.has_key('needTime') ) or ( lastRemainderTime == 0.0 ):
  43. devCtrInfo['needTime'] = duration/60.0
  44. else:
  45. devCtrInfo['needTime'] += duration/60.0
  46. devCtrInfo.update({
  47. 'openId': openId,
  48. 'status': Const.DEV_WORK_STATUS_WORKING,
  49. 'finishedTime': int(time.time()) + devInfo['remainder_time']
  50. })
  51. Device.update_dev_control_cache(self._device['devNo'], devCtrInfo)
  52. return devInfo
  53. def recharge_card(self, cardNo, money, orderNo=None):
  54. try:
  55. devInfo = MessageSender.send(self.device, 303,
  56. {'IMEI': self._device['devNo'], "cardNo": cardNo, 'balance': money * 100})
  57. if devInfo['rst'] != 0:
  58. if devInfo['rst'] == ErrorCode.DEVICE_CONN_FAIL:
  59. return {
  60. 'result': ErrorCode.DEVICE_CONN_FAIL,
  61. 'description': u'当前淋浴器正在玩命找网络,请您稍候再试'
  62. }, None
  63. else:
  64. return {
  65. 'result': ErrorCode.IC_RECHARGE_FAIL,
  66. 'description': u'当前充值的卡正在淋浴器上使用,无法进行充值'
  67. }, None
  68. return {
  69. 'result': ErrorCode.SUCCESS,
  70. 'description': ''
  71. }, None
  72. except Exception as e:
  73. logger.exception(e)
  74. return {
  75. 'result': ErrorCode.EXCEPTION,
  76. 'description': e.message
  77. }, None
  78. def set_dev_setting(self,setConf):
  79. minuteFee = setConf['minuteFee']
  80. devInfo = MessageSender.send(self.device, 306, {'IMEI': self._device['devNo'], "minuteFee": minuteFee})
  81. if 'rst' in devInfo and devInfo['rst'] != 0:
  82. if devInfo['rst'] == -1:
  83. raise ServiceException({'result': 2, 'description': u'当前淋浴器正在玩命找网络,请您稍候再试'})
  84. else:
  85. raise ServiceException({'result': 2, 'description': u'当前淋浴器忙,无法进行充值'})
  86. devObj = Device.objects.get(devNo = self._device['devNo'])
  87. devObj.otherConf['minuteFee'] = minuteFee
  88. devObj.save()
  89. return devInfo
  90. def get_dev_setting(self):
  91. devInfo = MessageSender.send(self.device, DeviceCmdCode.GET_DEVINFO, {'IMEI': self._device['devNo']})
  92. if 'rst' in devInfo and devInfo['rst'] != 0:
  93. if devInfo['rst'] == -1:
  94. raise ServiceException({'result': 2, 'description': u'当前淋浴器正在玩命找网络,请您稍候再试'})
  95. else:
  96. raise ServiceException({'result': 2, 'description': u'当前淋浴器忙,无法进行充值'})
  97. return {'minuteFee':devInfo['minuteFee']}
  98. def set_device_function_param(self,request,lastSetConf):
  99. if request.POST.has_key('minuteFee'):
  100. lastSetConf.update({'minuteFee': int(request.POST.get('minuteFee', 0))})
  101. self.set_dev_setting(lastSetConf)
  102. def get_left_time(self):
  103. devCtrInfo = Device.get_dev_control_cache(devNo = self._device['devNo'])
  104. if (devCtrInfo is None) or (not devCtrInfo.has_key('status')) or (devCtrInfo['status'] == Const.DEV_WORK_STATUS_IDLE):
  105. return 0.0,0.0
  106. if not devCtrInfo.has_key('needTime'):
  107. return 0.0,0.0
  108. needTime = devCtrInfo['needTime']
  109. devInfo = MessageSender.send(self.device, DeviceCmdCode.GET_DEVINFO, {'IMEI': self._device['devNo']})
  110. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  111. raise ServiceException({'result': 2, 'description': u'淋浴器正在玩命找网络,建议您稍后再试或者试试刷卡使用'})
  112. leftTime = devInfo['remainder_time']/60.0
  113. if leftTime <= 0:
  114. return 0.0,needTime
  115. return leftTime,needTime
  116. def count_down(self,request,dev,agent,group,devType,lastOpenId,port=None):
  117. surplus, sumtime = self.get_left_time()
  118. orderProcessing = False
  119. if surplus == 0.0 and sumtime == 0.0:
  120. orderProcessing = False
  121. return JsonResponse(
  122. {
  123. 'result': 1,
  124. 'description': '',
  125. 'payload': {
  126. 'surplus': surplus,
  127. 'sum': sumtime,
  128. 'name': group['groupName'],
  129. 'address': group['address'],
  130. 'code': devType.get('code'),
  131. 'orderProcessing': orderProcessing,
  132. 'logicalCode': dev['logicalCode'],
  133. 'user': 'me' if lastOpenId == request.user.openId else 'notme',
  134. 'agentFeatures': agent.features,
  135. }
  136. })
  137. def stop(self,port=None):
  138. devInfo = MessageSender.send(self.device, DeviceCmdCode.STOP_DEVICE, {'IMEI': self._device['devNo']})
  139. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  140. return JsonResponse({"result": 0, "description": u'网络连接异常,停止设备失败,请您重新尝试停掉设备', "payload": ''})
  141. devInfo['remainder_time'] = int(devInfo['remainder_time'] / 60.0)
  142. return devInfo
  143. #按照秒来退费
  144. def calc_stop_back_coins(self,totalFee,remainderTime,totalTime):
  145. refundFee = round(totalFee * (float(remainderTime) / (totalTime*60.0)),2)
  146. if refundFee > totalFee:
  147. refundFee = totalFee
  148. if refundFee <= 0.0:
  149. refundFee = 0.00
  150. return refundFee