models.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. from mongoengine import BooleanField, StringField, FloatField, DictField, DateTimeField
  6. from mongoengine.fields import IntField
  7. from typing import Optional
  8. from apps.web.constant import Const, ErrorCode
  9. from apps.web.core.db import Searchable
  10. logger = logging.getLogger(__name__)
  11. class APIServiceStartRecord(Searchable):
  12. orderNo = StringField(verbose_name = u'订单编号', default = None, unique = True)
  13. devNo = StringField(verbose_name = u'设备编号', default = u'')
  14. logicalCode = StringField(verbose_name = u'二维码编号', default = u'')
  15. port = StringField(verbose_name = u'端口号', default = u'')
  16. money = FloatField(verbose_name = u'消费金额', default = None)
  17. needTime = IntField(verbose_name = u'订购时长', default = None)
  18. consumeType = StringField(verbose_name = u'启动方式', default = u'')
  19. openId = StringField(verbose_name = u'openId', default = u'')
  20. cardNo = StringField(verbose_name = u'离线卡号', default = u'')
  21. status = StringField(verbose_name = u'订单状态', default = u'')
  22. startTime = StringField(verbose_name = u'订单开始时间', default = None)
  23. finishReason = StringField(verbose_name = u'订单结束原因', default = u'')
  24. leftTime = IntField(verbose_name = u'剩余时间', default = None)
  25. duration = IntField(verbose_name = u'使用时长', default = None)
  26. spendElec = FloatField(verbose_name = u'消耗电量', default = None)
  27. endTime = StringField(verbose_name = u'订单结束时间', default = None)
  28. extOrderNo = StringField(verbose_name = u'外部订单编号', default = u'')
  29. meta = {'collection': 'api_service_start_record', 'db_alias': 'default'}
  30. search_fields = ('openId', 'devNo', 'port', 'status', 'cardNo', 'consumeType')
  31. @classmethod
  32. def record_4_cy4_card(cls, data):
  33. if data.get('orderNo', '') != '':
  34. cls(
  35. orderNo = data['orderNo'],
  36. devNo = data['devNo'],
  37. logicalCode = data['logicalCode'],
  38. port = data['port'],
  39. money = data['money'],
  40. needTime = data['needTime'],
  41. consumeType = data['consumeType'],
  42. openId = data['openId'],
  43. cardNo = data['cardNo'],
  44. status = data['status'],
  45. startTime = data['startTime']
  46. ).save()
  47. else:
  48. apiRecord = cls.objects(
  49. status = 'PENDING',
  50. port = data['port'],
  51. devNo = data['devNo'],
  52. cardNo = data['cardNo'],
  53. startTime__gte = (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime(Const.DATE_FMT)
  54. ).order_by('-startTime').first()
  55. if apiRecord is None:
  56. return
  57. apiRecord.finishReason = data['finishReason']
  58. apiRecord.leftTime = data['leftTime']
  59. apiRecord.spendElec = data['spendElec']
  60. apiRecord.status = data['status']
  61. apiRecord.duration = data['duration']
  62. apiRecord.endTime = data['endTime']
  63. apiRecord.save()
  64. @classmethod
  65. def record_4_cy4_mobile(cls, data):
  66. if data.get('orderNo', '') != '':
  67. cls(
  68. orderNo = data['orderNo'],
  69. devNo = data['devNo'],
  70. logicalCode = data['logicalCode'],
  71. port = data['port'],
  72. money = data['money'],
  73. needTime = data['needTime'],
  74. consumeType = data['consumeType'],
  75. status = data['status'],
  76. startTime = data['startTime'],
  77. extOrderNo = data['extOrderNo']
  78. ).save()
  79. else:
  80. apiRecord = cls.objects(
  81. status = 'PENDING',
  82. port = data['port'],
  83. devNo = data['devNo'],
  84. startTime__gte = (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime(Const.DATE_FMT)
  85. ).order_by('-startTime').first()
  86. if apiRecord is None:
  87. return
  88. apiRecord.finishReason = data['finishReason']
  89. apiRecord.leftTime = data['leftTime']
  90. apiRecord.spendElec = data['spendElec']
  91. apiRecord.status = data['status']
  92. apiRecord.duration = data['duration']
  93. apiRecord.endTime = data['endTime']
  94. apiRecord.save()
  95. class APIStartDeviceRecord(Searchable):
  96. orderNo = StringField(verbose_name = "订单号(extOrderNo)", default = "", max_length = 100)
  97. userId = StringField(verbose_name = "用户ID", default = "")
  98. ownerId = StringField(verbose_name = '经销商ID', default = "")
  99. createTime = StringField(verbose_name = "调用方创建订单时间", default = "")
  100. channel = StringField(verbose_name = "channel")
  101. deviceCode = StringField(verbose_name = "设备逻辑编码(=logicalCode)", default = "")
  102. devNo = StringField(verbose_name = "设备ID", default = "")
  103. package = DictField(verbose_name = "套餐", default = {})
  104. notifyUrl = StringField(verbose_name = "回调通知地址", default = '')
  105. apiConf = DictField(verbose_name = "api配置", default = {})
  106. postActionResult = DictField(verbose_name = 'API后续处理', default = {})
  107. postActionTriggered = BooleanField(default = False)
  108. errCode = IntField(verbose_name = '错误码', default = ErrorCode.EXCEPTION)
  109. errMsg = StringField(verbose_name = '错误描述', default = u'系统错误')
  110. attachParas = DictField(verbose_name = '可变参数', default = {})
  111. servicedInfo = DictField(verbose_name = '服务信息', default = {})
  112. datetimeAdded = DateTimeField(verbose_name = "时间", default = datetime.datetime.now)
  113. meta = {
  114. "collection": "APIStartDeviceRecord",
  115. "db_alias": "logdata",
  116. # 'shard_key': ('orderNo',)
  117. }
  118. def __repr__(self):
  119. return 'APIStartDeviceRecord<id={},orderNo={}> user({}) use api to start device({}) with package({})'.format(
  120. str(self.id), self.orderNo, self.userId, self.deviceCode, self.package)
  121. def __str__(self):
  122. return self.__repr__()
  123. @property
  124. def used_port(self):
  125. if self.attachParas and 'chargeIndex' in self.attachParas and self.attachParas['chargeIndex']:
  126. return str(self.attachParas['chargeIndex'])
  127. return ''
  128. @property
  129. def openId(self):
  130. return self.userId
  131. @classmethod
  132. def get_api_record(cls, logicalCode, ext_order_no):
  133. # type:(str, str)->Optional[APIStartDeviceRecord]
  134. record = (cls.objects(orderNo = ext_order_no, deviceCode = logicalCode)
  135. .order_by('-createdTime')
  136. .first()) # type: APIStartDeviceRecord
  137. return record
  138. @property
  139. def is_from_api(self):
  140. return True
  141. @property
  142. def is_on_point(self):
  143. return False
  144. @property
  145. def is_from_user(self):
  146. return False
  147. def my_package(self, device):
  148. return dict(self.package)