toushi.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import uuid
  6. from apilib.monetary import RMB, VirtualCoin
  7. from apps.web.device.models import Group, Device
  8. from apps.web.eventer.base import FaultEvent, WorkEvent
  9. from apps.web.eventer import EventBuilder
  10. from apps.web.user.models import MyUser, RechargeRecord
  11. logger = logging.getLogger(__name__)
  12. class builder(EventBuilder):
  13. def __getEvent__(self, device_event):
  14. event_data = self.deviceAdapter.analyze_event_data(device_event['data'])
  15. if event_data is None or 'cmdCode' not in event_data:
  16. return None
  17. if event_data.get('cmdCode') == 100 and event_data.has_key('type'):
  18. return ChargingTOUSHIWorkEvent(self.deviceAdapter, event_data)
  19. if event_data.get('cmdCode') == 100:
  20. return TOUSHIFaultEvent(self.deviceAdapter, event_data)
  21. class TOUSHIFaultEvent(FaultEvent):
  22. def do(self, **args):
  23. try:
  24. group = Group.get_group(self.device['groupId'])
  25. lineInfo = Device.get_dev_control_cache(self.device['devNo'])
  26. # 确认是用户不当引起的故障
  27. if lineInfo:
  28. openId = lineInfo.get('openId')
  29. if not openId:
  30. logger.error("Array has an error,lose openId")
  31. return
  32. user = MyUser.objects(openId = openId, groupId = self.device['groupId']).first()
  33. coins = RMB(lineInfo['coins'])
  34. try:
  35. MyUser.get_collection().update({'openId': lineInfo['openId'], 'groupId': self.device['groupId']},
  36. {'$inc': {'balance': coins.mongo_amount}})
  37. except Exception, e:
  38. logger.error('feedback coins error=%s' % e)
  39. return
  40. # 添加一条充值记录
  41. orderNo = str(uuid.uuid4())
  42. try:
  43. newRcd = RechargeRecord(orderNo = orderNo,
  44. coins = VirtualCoin(coins), openId = lineInfo['openId'],
  45. groupId = self.device['groupId'],
  46. devNo = self.device['devNo'], logicalCode = self.device['logicalCode'],
  47. ownerId = self.device['ownerId'], groupName = group['groupName'],
  48. groupNumber = self.device['groupNumber'], address = group['address'],
  49. wxOrderNo = u'设备退币',
  50. devTypeName = self.device.devTypeName, nickname = '',
  51. result = 'success', via = 'refund')
  52. newRcd.save()
  53. except Exception, e:
  54. logger.exception('update record for feedback coins error=%s,orderNo=%s' % (e, orderNo))
  55. # 提示用户关闭盖子或者洗衣机故障
  56. self.notify_user(user.managerialOpenId if user else '', 'refund_coins', **{
  57. 'title': u'本次您订购的{}洗衣未成功进行,金币已经退给您的账户,请查看洗衣机是否关闭机盖或者联系管理员处理哦'.format(lineInfo['washName']),
  58. 'backCount': u'金币:{}'.format(coins),
  59. 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  60. })
  61. # 不是人为引起的
  62. else:
  63. self.notify_dealer('device_fault', **{
  64. 'title': u'注意!注意!您的设备发生故障',
  65. 'device': u'组号::%s, 二维码编号:%s' % (self.device['groupNumber'], self.device['logicalCode']),
  66. 'location': u'组名称:%s, 地址:%s' % (group['groupName'], group['address']),
  67. 'fault': self.event_data['faultReason'],
  68. 'notifyTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  69. })
  70. finally:
  71. Device.update_dev_control_cache(self.device['devNo'], {})
  72. class ChargingTOUSHIWorkEvent(WorkEvent):
  73. def do(self, **args):
  74. if self.event_data['faultCode'] == '01':
  75. try:
  76. lineInfo = Device.get_dev_control_cache(self.device['devNo'])
  77. openId = lineInfo.get('openId')
  78. if not openId:
  79. logger.error("Array has an error,lose openId")
  80. return
  81. user = MyUser.objects(openId = openId, groupId = self.device['groupId']).first()
  82. managerialOpenId = user.managerialOpenId if user else ''
  83. if not managerialOpenId:
  84. return
  85. group = Group.get_group(self.device['groupId'])
  86. self.notify_user(managerialOpenId, 'service_complete', **{
  87. 'title': u'您订购的服务已经完成',
  88. 'service': u'洗衣服务(设备编号:%s, 地址:%s)' % (self.device['logicalCode'], group['address']),
  89. 'finishTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  90. 'remark': u'谢谢您的支持'
  91. })
  92. except Exception, e:
  93. logger.exception('you have an error in ChargingTOUSHIWorkEvent,error info is {}' % (e))
  94. finally:
  95. Device.update_dev_control_cache(self.device['devNo'], {})