models.py 7.5 KB

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