# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import logging from mongoengine import BooleanField, StringField, ListField, 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 DeviceVersionConfig(Searchable): moduleName = StringField(verbose_name = u'设备模块名称', default = '') version = StringField(verbose_name = u'最新版本号', default = '') matchVersions = ListField(verbose_name = u'匹配版本号', default = []) filePath = StringField(verbose_name = u'程序路径', default = '') allowable = BooleanField(verbose_name = u'是否允许升级', default = False) meta = {'collection': 'device_upgrade_config', 'db_alias': 'logdata'} 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 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)