123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import datetime
- import logging
- from mongoengine import BooleanField, StringField, FloatField, DictField, DateTimeField
- from mongoengine.fields import IntField
- from typing import Optional
- from apps.web.constant import Const, ErrorCode
- from apps.web.core.db import Searchable
- logger = logging.getLogger(__name__)
- class APIServiceStartRecord(Searchable):
- orderNo = StringField(verbose_name = u'订单编号', default = None, unique = True)
- devNo = StringField(verbose_name = u'设备编号', default = u'')
- logicalCode = StringField(verbose_name = u'二维码编号', default = u'')
- port = StringField(verbose_name = u'端口号', default = u'')
- money = FloatField(verbose_name = u'消费金额', default = None)
- needTime = IntField(verbose_name = u'订购时长', default = None)
- consumeType = StringField(verbose_name = u'启动方式', default = u'')
- openId = StringField(verbose_name = u'openId', default = u'')
- cardNo = StringField(verbose_name = u'离线卡号', default = u'')
- status = StringField(verbose_name = u'订单状态', default = u'')
- startTime = StringField(verbose_name = u'订单开始时间', default = None)
- finishReason = StringField(verbose_name = u'订单结束原因', default = u'')
- leftTime = IntField(verbose_name = u'剩余时间', default = None)
- duration = IntField(verbose_name = u'使用时长', default = None)
- spendElec = FloatField(verbose_name = u'消耗电量', default = None)
- endTime = StringField(verbose_name = u'订单结束时间', default = None)
- extOrderNo = StringField(verbose_name = u'外部订单编号', default = u'')
- meta = {'collection': 'api_service_start_record', 'db_alias': 'default'}
- search_fields = ('openId', 'devNo', 'port', 'status', 'cardNo', 'consumeType')
- @classmethod
- def record_4_cy4_card(cls, data):
- if data.get('orderNo', '') != '':
- cls(
- orderNo = data['orderNo'],
- devNo = data['devNo'],
- logicalCode = data['logicalCode'],
- port = data['port'],
- money = data['money'],
- needTime = data['needTime'],
- consumeType = data['consumeType'],
- openId = data['openId'],
- cardNo = data['cardNo'],
- status = data['status'],
- startTime = data['startTime']
- ).save()
- else:
- apiRecord = cls.objects(
- status = 'PENDING',
- port = data['port'],
- devNo = data['devNo'],
- cardNo = data['cardNo'],
- startTime__gte = (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime(Const.DATE_FMT)
- ).order_by('-startTime').first()
- if apiRecord is None:
- return
- apiRecord.finishReason = data['finishReason']
- apiRecord.leftTime = data['leftTime']
- apiRecord.spendElec = data['spendElec']
- apiRecord.status = data['status']
- apiRecord.duration = data['duration']
- apiRecord.endTime = data['endTime']
- apiRecord.save()
- @classmethod
- def record_4_cy4_mobile(cls, data):
- if data.get('orderNo', '') != '':
- cls(
- orderNo = data['orderNo'],
- devNo = data['devNo'],
- logicalCode = data['logicalCode'],
- port = data['port'],
- money = data['money'],
- needTime = data['needTime'],
- consumeType = data['consumeType'],
- status = data['status'],
- startTime = data['startTime'],
- extOrderNo = data['extOrderNo']
- ).save()
- else:
- apiRecord = cls.objects(
- status = 'PENDING',
- port = data['port'],
- devNo = data['devNo'],
- startTime__gte = (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime(Const.DATE_FMT)
- ).order_by('-startTime').first()
- if apiRecord is None:
- return
- apiRecord.finishReason = data['finishReason']
- apiRecord.leftTime = data['leftTime']
- apiRecord.spendElec = data['spendElec']
- apiRecord.status = data['status']
- apiRecord.duration = data['duration']
- apiRecord.endTime = data['endTime']
- apiRecord.save()
- class APIStartDeviceRecord(Searchable):
- orderNo = StringField(verbose_name = "订单号(extOrderNo)", default = "", max_length = 100)
- userId = StringField(verbose_name = "用户ID", default = "")
- ownerId = StringField(verbose_name = '经销商ID', default = "")
- createTime = StringField(verbose_name = "调用方创建订单时间", default = "")
- channel = StringField(verbose_name = "channel")
- deviceCode = StringField(verbose_name = "设备逻辑编码(=logicalCode)", default = "")
- devNo = StringField(verbose_name = "设备ID", default = "")
- package = DictField(verbose_name = "套餐", default = {})
- notifyUrl = StringField(verbose_name = "回调通知地址", default = '')
- apiConf = DictField(verbose_name = "api配置", default = {})
- postActionResult = DictField(verbose_name = 'API后续处理', default = {})
- postActionTriggered = BooleanField(default = False)
- errCode = IntField(verbose_name = '错误码', default = ErrorCode.EXCEPTION)
- errMsg = StringField(verbose_name = '错误描述', default = u'系统错误')
- attachParas = DictField(verbose_name = '可变参数', default = {})
- servicedInfo = DictField(verbose_name = '服务信息', default = {})
- datetimeAdded = DateTimeField(verbose_name = "时间", default = datetime.datetime.now)
- meta = {
- "collection": "APIStartDeviceRecord",
- "db_alias": "logdata",
- # 'shard_key': ('orderNo',)
- }
- def __repr__(self):
- return 'APIStartDeviceRecord<id={},orderNo={}> user({}) use api to start device({}) with package({})'.format(
- str(self.id), self.orderNo, self.userId, self.deviceCode, self.package)
- def __str__(self):
- return self.__repr__()
- @property
- def used_port(self):
- if self.attachParas and 'chargeIndex' in self.attachParas and self.attachParas['chargeIndex']:
- return str(self.attachParas['chargeIndex'])
- return ''
- @property
- def openId(self):
- return self.userId
- @classmethod
- def get_api_record(cls, logicalCode, ext_order_no):
- # type:(str, str)->Optional[APIStartDeviceRecord]
- record = (cls.objects(orderNo = ext_order_no, deviceCode = logicalCode)
- .order_by('-createdTime')
- .first()) # type: APIStartDeviceRecord
- return record
- @property
- def is_from_api(self):
- return True
- @property
- def is_on_point(self):
- return False
- @property
- def is_from_user(self):
- return False
- def my_package(self, device):
- return dict(self.package)
|