|
@@ -1,781 +0,0 @@
|
|
|
-# -*- coding: utf-8 -*-
|
|
|
-# !/usr/bin/env python
|
|
|
-
|
|
|
-import logging
|
|
|
-
|
|
|
-import datetime
|
|
|
-import simplejson as json
|
|
|
-from mongoengine import DoesNotExist
|
|
|
-from typing import TYPE_CHECKING
|
|
|
-
|
|
|
-from apilib.utils_datetime import timestamp_to_dt
|
|
|
-from apilib.utils_json import JsonResponse
|
|
|
-from apps.web.api.exceptions import ApiAuthDeviceException, ApiNoDeviceException, ApiDeviceModeException
|
|
|
-from apps.web.api.jn_north.constant import RESPONSE_CODE
|
|
|
-from apps.web.api.utils import AES_CBC_PKCS5padding_decrypt, generate_json_token, AES_CBC_PKCS5padding_encrypt, parse_json_token
|
|
|
-from apps.web.common.models import District, TempValues
|
|
|
-from apps.web.constant import Const, ErrorCode
|
|
|
-from apps.web.core.exceptions import ServiceException
|
|
|
-from apps.web.core.models import SystemSettings
|
|
|
-from apps.web.device.models import Device, Group, Part
|
|
|
-from apps.web.south_intf.shangdong_platform import GroupIdMap, ShanDongNorther
|
|
|
-from apps.web.south_intf.zhejiang_fire import ZhejiangRSA, ZhejiangAddressType, ZhejiangZone, ZhejiangNorther, Company
|
|
|
-from apps.web.api.models import APIStartDeviceRecord
|
|
|
-
|
|
|
-logger = logging.getLogger(__name__)
|
|
|
-
|
|
|
-if TYPE_CHECKING:
|
|
|
- from apps.web.device.models import DeviceDict
|
|
|
-
|
|
|
-
|
|
|
-# 智慧消防智能管控平台向各平台采集数据
|
|
|
-# 获取公钥,此公钥用来加密密码
|
|
|
-def getPublicKey(request):
|
|
|
- logger.info('norther some one getPublicKey')
|
|
|
- publicKey = ZhejiangRSA.publicKeyHear.replace('-----BEGIN PUBLIC KEY-----\n', '').replace(
|
|
|
- '\n-----END PUBLIC KEY-----', '')
|
|
|
- publicKey = publicKey.replace('\n', '')
|
|
|
- # publicKey = base64.b64encode(publicKey)
|
|
|
- return JsonResponse({'code': 0, 'message': u'获取成功', 'data': {'publicKey': publicKey}})
|
|
|
-
|
|
|
-
|
|
|
-def loginFromNorth(request):
|
|
|
- logger.info('norther some one loginFromNorth')
|
|
|
- username = request.POST.get('username')
|
|
|
- enPassword = request.POST.get('password')
|
|
|
-
|
|
|
- password = ZhejiangRSA.decrypt(enPassword)
|
|
|
- if password is None:
|
|
|
- return JsonResponse({'code': '1', 'msg': u'用户名或者密码错误', 'data': None})
|
|
|
- try:
|
|
|
- obj = ZhejiangNorther.objects.get(usernameFromHear = username, passwordFromHear = password)
|
|
|
- except Exception, e:
|
|
|
- return JsonResponse({'code': '1', 'msg': u'用户名或者密码错误', 'data': None})
|
|
|
-
|
|
|
- return JsonResponse({'code': 0, 'message': u'获取成功', 'data': {'tokenId': obj.tokenId}})
|
|
|
-
|
|
|
-
|
|
|
-def getBuilding(request):
|
|
|
- def get_coordinates_and_nums(groupId):
|
|
|
- devs = Device.objects.filter(groupId = groupId)
|
|
|
- count = devs.count()
|
|
|
- if count == 0:
|
|
|
- return 0.0, 0.0, count
|
|
|
- for dev in devs:
|
|
|
- if dev.location is not None and dev.location.has_key('coordinates'):
|
|
|
- coord = dev.location['coordinates']
|
|
|
- return coord[0], coord[1], count
|
|
|
- return 0.0, 0.0, count
|
|
|
-
|
|
|
- agentId = request.META.get('HTTP_TOKENID', None)
|
|
|
- logger.info('norther getBuilding data ,token is %s' % agentId)
|
|
|
- if agentId is None:
|
|
|
- return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
|
|
|
- try:
|
|
|
- norther = ZhejiangNorther.objects.get(tokenId = agentId)
|
|
|
- except Exception, e:
|
|
|
- return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
|
|
|
-
|
|
|
- serviceCode = norther.serviceCodeFromNorth
|
|
|
-
|
|
|
- pageNo = int(request.POST.get('pageNo'))
|
|
|
- pageSize = int(request.POST.get('pageSize'))
|
|
|
-
|
|
|
- if request.POST.has_key('createDateB'):
|
|
|
- createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
|
|
|
- createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
|
|
|
-
|
|
|
- postId = request.POST.get('postId', None)
|
|
|
-
|
|
|
- if postId is None:
|
|
|
- dealerIds = [obj.ownerId for obj in Company.objects.filter(agentId = agentId)]
|
|
|
-
|
|
|
- if request.POST.has_key('updateDateE'):
|
|
|
- updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
|
|
|
- updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
|
|
|
- groups = Group.objects.filter(ownerId__in = dealerIds,
|
|
|
- dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
|
|
|
- else:
|
|
|
- groups = Group.objects.filter(ownerId__in = dealerIds,
|
|
|
- dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
|
|
|
- else:
|
|
|
- groups = Group.objects.filter(id = postId)
|
|
|
-
|
|
|
- total = groups.count()
|
|
|
- pageCount = total / pageSize + 1
|
|
|
- dataList = []
|
|
|
- for group in groups.paginate(pageNo, pageSize):
|
|
|
- lng, lnt, count = get_coordinates_and_nums(str(group.id))
|
|
|
- data = {
|
|
|
- 'buildingId': str(group.id),
|
|
|
- 'buildingName': group.groupName,
|
|
|
- 'companyId': group.ownerId,
|
|
|
- 'address': group.address,
|
|
|
- 'buildingType': ZhejiangAddressType.get_typeId(group.addressType),
|
|
|
- 'lat': lnt,
|
|
|
- 'lng': lng,
|
|
|
- 'regionCode': ZhejiangZone.get_distinct_id(District.get_area(group.districtId), group.address),
|
|
|
- 'deviceNum': count,
|
|
|
- 'producerCode': serviceCode
|
|
|
- }
|
|
|
- dataList.append(data)
|
|
|
-
|
|
|
- return JsonResponse({'code': 0, 'message': u'获取成功',
|
|
|
- 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
|
|
|
- 'list': dataList}})
|
|
|
-
|
|
|
-
|
|
|
-def getCompany(request):
|
|
|
- agentId = request.META.get('HTTP_TOKENID', None)
|
|
|
- if agentId is None:
|
|
|
- return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
|
|
|
-
|
|
|
- logger.info('norther getCompany,token is %s' % agentId)
|
|
|
-
|
|
|
- try:
|
|
|
- norther = ZhejiangNorther.objects.get(tokenId = agentId)
|
|
|
- except Exception, e:
|
|
|
- return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
|
|
|
-
|
|
|
- pageNo = int(request.POST.get('pageNo'))
|
|
|
- pageSize = int(request.POST.get('pageSize'))
|
|
|
-
|
|
|
- if request.POST.has_key('createDateB'):
|
|
|
- createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
|
|
|
- createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
|
|
|
-
|
|
|
- postId = request.POST.get('postId', None)
|
|
|
-
|
|
|
- if postId is None:
|
|
|
- if request.POST.has_key('updateDateE'):
|
|
|
- updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
|
|
|
- updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
|
|
|
- companys = Company.objects.filter(agentId = agentId,
|
|
|
- dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
|
|
|
- else:
|
|
|
- companys = Company.objects.filter(agentId = agentId, dateTimeAdded__gte = createDateB,
|
|
|
- dateTimeAdded__lte = createDateE)
|
|
|
- else:
|
|
|
- companys = Company.objects.filter(ownerId = postId)
|
|
|
-
|
|
|
- total = companys.count()
|
|
|
- pageCount = total / pageSize + 1
|
|
|
- dataList = []
|
|
|
- for com in companys.paginate(pageNo, pageSize):
|
|
|
- data = {
|
|
|
- 'companyId': str(com.ownerId),
|
|
|
- 'companyName': com.name,
|
|
|
- 'companyCode': com.unifiedSocialCreditCode,
|
|
|
- 'address': com.address,
|
|
|
- 'contactName': com.contactName,
|
|
|
- 'contactTel': com.telephone,
|
|
|
- }
|
|
|
- dataList.append(data)
|
|
|
-
|
|
|
- return JsonResponse({'code': 0, 'message': u'获取成功',
|
|
|
- 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
|
|
|
- 'list': dataList}})
|
|
|
-
|
|
|
-
|
|
|
-def getEquipment(request):
|
|
|
- agentId = request.META.get('HTTP_TOKENID', None)
|
|
|
- if agentId is None:
|
|
|
- return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
|
|
|
-
|
|
|
- logger.info('norther getEquipment,token is %s' % agentId)
|
|
|
-
|
|
|
- try:
|
|
|
- norther = ZhejiangNorther.objects.get(tokenId = agentId)
|
|
|
- except Exception, e:
|
|
|
- return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
|
|
|
-
|
|
|
- serviceCode = norther.serviceCodeFromNorth
|
|
|
-
|
|
|
- pageNo = int(request.POST.get('pageNo'))
|
|
|
- pageSize = int(request.POST.get('pageSize'))
|
|
|
-
|
|
|
- if request.POST.has_key('createDateB'):
|
|
|
- createDateB = timestamp_to_dt(int(request.POST.get('createDateB'))).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
- createDateE = timestamp_to_dt(int(request.POST.get('createDateE'))).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
-
|
|
|
- postId = request.POST.get('postId', None)
|
|
|
-
|
|
|
- companyDict = {}
|
|
|
- if postId is None:
|
|
|
- dealerIds = []
|
|
|
- for obj in Company.objects.filter(agentId = agentId):
|
|
|
- companyDict[obj.ownerId] = obj.manufacturer
|
|
|
- dealerIds.append(obj.ownerId)
|
|
|
- if request.POST.has_key('updateDateE'):
|
|
|
- updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
|
|
|
- updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
|
|
|
- devs = Device.objects.filter(ownerId__in = dealerIds,
|
|
|
- dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
|
|
|
- else:
|
|
|
- devs = Device.objects.filter(ownerId__in = dealerIds,
|
|
|
- dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
|
|
|
- else:
|
|
|
- company = Company.objects.get(ownerId = postId)
|
|
|
- companyDict[company.ownerId] = company.manufacturer
|
|
|
- devs = Device.objects.filter(ownerId = postId)
|
|
|
-
|
|
|
- total = devs.count()
|
|
|
- pageCount = total / pageSize + 1
|
|
|
- dataList = []
|
|
|
- for devObj in devs.paginate(pageNo, pageSize):
|
|
|
- group = Group.get_group(devObj.groupId)
|
|
|
-
|
|
|
- dev = Device.get_dev(devObj.devNo) # type: DeviceDict
|
|
|
-
|
|
|
- status = dev.status
|
|
|
- online = dev.online
|
|
|
- if status == Const.DEV_WORK_STATUS_FORBIDDEN:
|
|
|
- strStatus = '2' # 禁用
|
|
|
- elif not online:
|
|
|
- strStatus = '3' # 离线
|
|
|
- else:
|
|
|
- strStatus = '1' # 在线
|
|
|
-
|
|
|
- partNum = Part.objects.filter(logcicalCode = devObj.logicalCode).count()
|
|
|
-
|
|
|
- data = {
|
|
|
- 'deviceId': str(devObj.logicalCode),
|
|
|
- 'deviceName': u'充电桩',
|
|
|
- 'deviceType': '5', # 智能充电桩
|
|
|
- 'address': group.get('address', "") if group is not None else '',
|
|
|
- 'lat': devObj.location['coordinates'][1] if devObj.location is not None and devObj.location.has_key(
|
|
|
- 'coordinates') else 0.0,
|
|
|
- 'lng': devObj.location['coordinates'][0] if devObj.location is not None and devObj.location.has_key(
|
|
|
- 'coordinates') else 0.0,
|
|
|
- 'companyId': devObj.ownerId,
|
|
|
- 'buildingId': devObj.groupId,
|
|
|
- 'producerCode': serviceCode,
|
|
|
- 'installDate': devObj.dateTimeAdded,
|
|
|
- 'deviceStatus': strStatus,
|
|
|
- 'deviceManufactory': companyDict.get(devObj.ownerId, u'充电桩生产厂家'),
|
|
|
- 'partsNum': partNum
|
|
|
- }
|
|
|
-
|
|
|
- dataList.append(data)
|
|
|
-
|
|
|
- return JsonResponse({'code': 0, 'message': u'获取成功',
|
|
|
- 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
|
|
|
- 'list': dataList}})
|
|
|
-
|
|
|
-
|
|
|
-def getParts(request):
|
|
|
- agentId = request.META.get('HTTP_TOKENID', None)
|
|
|
- if agentId is None:
|
|
|
- return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
|
|
|
-
|
|
|
- logger.info('norther getParts,token is %s' % agentId)
|
|
|
-
|
|
|
- pageNo = int(request.POST.get('pageNo'))
|
|
|
- pageSize = int(request.POST.get('pageSize'))
|
|
|
-
|
|
|
- if request.POST.has_key('createDateB'):
|
|
|
- createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
|
|
|
- createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
|
|
|
-
|
|
|
- postId = request.POST.get('postId', None)
|
|
|
- companyDict = {}
|
|
|
- if postId is None:
|
|
|
- dealerIds = []
|
|
|
- for obj in Company.objects.filter(agentId = agentId):
|
|
|
- companyDict[obj.ownerId] = obj.manufacturer
|
|
|
- dealerIds.append(obj.ownerId)
|
|
|
-
|
|
|
- lcList = []
|
|
|
- for dealerId in dealerIds:
|
|
|
- groupIds = Group.get_group_ids_of_dealer(dealerId)
|
|
|
- devNoList = Device.get_devNos_by_group(groupIds)
|
|
|
- for devNo in devNoList:
|
|
|
- lcList.append(Device.get_logicalCode_by_devNo(devNo))
|
|
|
-
|
|
|
- if request.POST.has_key('updateDateE'):
|
|
|
- updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
|
|
|
- updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
|
|
|
- parts = Part.objects.filter(logicalCode__in = lcList,
|
|
|
- dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
|
|
|
- else:
|
|
|
- parts = Part.objects.filter(logicalCode__in = lcList,
|
|
|
- dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
|
|
|
-
|
|
|
- else:
|
|
|
- company = Company.objects.get(ownerId = postId)
|
|
|
- companyDict[company.ownerId] = company.manufacturer
|
|
|
- lcList = []
|
|
|
- groupIds = Group.get_group_ids_of_dealer(postId)
|
|
|
- devNoList = Device.get_devNos_by_group(groupIds)
|
|
|
- for devNo in devNoList:
|
|
|
- lcList.append(Device.get_logicalCode_by_devNo(devNo))
|
|
|
-
|
|
|
- parts = Part.objects.filter(logicalCode__in = lcList)
|
|
|
-
|
|
|
- total = parts.count()
|
|
|
- pageCount = total / pageSize + 1
|
|
|
- dataList = []
|
|
|
- logicalCodes = set([obj.logicalCode for obj in parts.paginate(pageNo, pageSize)])
|
|
|
- devDict = {}
|
|
|
- for lc in logicalCodes:
|
|
|
- dev = Device.get_dev_by_logicalCode(lc)
|
|
|
- group = Group.get_group(dev['groupId'])
|
|
|
- devDict[lc] = group['address']
|
|
|
-
|
|
|
- for obj in parts.paginate(pageNo, pageSize):
|
|
|
- data = {
|
|
|
- 'partsId': str(obj.id),
|
|
|
- 'partsName': u'标准充电口',
|
|
|
- 'address': devDict.get(obj.logicalCode),
|
|
|
- 'deviceId': obj.logicalCode,
|
|
|
- 'partsManufactory': companyDict.get(obj.ownerId, u'充电桩生产厂家'),
|
|
|
- 'installDate': obj.dateTimeAdded,
|
|
|
- 'partsStatus': '1',
|
|
|
- 'partsType': Part.objects(id = obj.id)[0].partType,
|
|
|
- }
|
|
|
-
|
|
|
- dataList.append(data)
|
|
|
-
|
|
|
- return JsonResponse({'code': 0, 'message': u'获取成功',
|
|
|
- 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
|
|
|
- 'list': dataList}})
|
|
|
-
|
|
|
-
|
|
|
-# ---- 以下为山东省能源局平台接口
|
|
|
-
|
|
|
-def queryToken(request):
|
|
|
- """
|
|
|
- 省平台 获取token接口
|
|
|
- OperatorID 组织机构代码
|
|
|
- OperatorSecret 组织机构的密钥
|
|
|
- :param request:
|
|
|
- :return:
|
|
|
- """
|
|
|
- payload = json.loads(request.body)
|
|
|
-
|
|
|
- logger.info("[query token] payload = {}".format(payload))
|
|
|
-
|
|
|
- try:
|
|
|
- Data = json.loads(request.body).get("Data")
|
|
|
- data = json.loads(AES_CBC_PKCS5padding_decrypt(Data))
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1002)"})
|
|
|
-
|
|
|
- OperatorID = data.get("OperatorID")
|
|
|
- OperatorSecret = data.get("OperatorSecret")
|
|
|
-
|
|
|
- logger.info("[query token] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
|
|
|
-
|
|
|
- if not all((OperatorID, OperatorSecret)):
|
|
|
- return JsonResponse({"Ret": 4003, "Msg": u"请求参数错误"})
|
|
|
-
|
|
|
- try:
|
|
|
- norther = ShanDongNorther.objects.filter(northOperatorID = OperatorID, northOperatorSecret = OperatorSecret).first()
|
|
|
- except DoesNotExist:
|
|
|
- return JsonResponse({"Ret": 4004, "Msg": u"请求参数错误"})
|
|
|
- except Exception as e:
|
|
|
- return JsonResponse({"Ret": 500, "Msg": u"系统错误"})
|
|
|
-
|
|
|
- expire = 60 * 60 * 24 * 7
|
|
|
- result = {
|
|
|
- "OperatorID": norther.agentOperatorID,
|
|
|
- "SuccStat": 0,
|
|
|
- "AccessToken": generate_json_token(data=norther.get_token_data(), expire=expire),
|
|
|
- "TokenAvailableTime": expire,
|
|
|
- "FailReason": None
|
|
|
- }
|
|
|
- logger.debug("[queryToken] return result = {}".format(result))
|
|
|
-
|
|
|
- # 拉取的时候加密 显式指明加密秘钥为 pull
|
|
|
- resultData = AES_CBC_PKCS5padding_encrypt(
|
|
|
- json.dumps(result),
|
|
|
- dataSecret=norther.pullDataSecret,
|
|
|
- dataSecretIV=norther.pullDataSecretIV
|
|
|
- )
|
|
|
- sig = norther.get_sig(resultData)
|
|
|
-
|
|
|
- return JsonResponse({
|
|
|
- "Ret": RESPONSE_CODE.SUCCESS,
|
|
|
- "Msg": u"请求成功",
|
|
|
- "Data": resultData,
|
|
|
- "Sig": sig
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
-def queryStationInfo(request):
|
|
|
- """
|
|
|
- 省平台拉去数据接口
|
|
|
- LastQueryTime 上次查询时间 格式 yyyy-MM-dd HH:mm:ss ,可以为空,如果不 填写,则查询所有的充电站信息
|
|
|
- PageNo
|
|
|
- PageSize
|
|
|
- :param request:
|
|
|
- :return:
|
|
|
- """
|
|
|
- token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
|
|
|
- logger.info('[queryStationsInfo] , token = {}'.format(token))
|
|
|
-
|
|
|
- # 验证身份
|
|
|
- tokenData = parse_json_token(token)
|
|
|
- if not tokenData:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
|
|
|
-
|
|
|
- # 获取这个平台下面的所有的northers记录
|
|
|
- northers = ShanDongNorther.get_norther(**tokenData)
|
|
|
- if not northers:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
|
|
|
-
|
|
|
- # 准备token所获取的参数信息
|
|
|
- norther = northers.first()
|
|
|
- northerMap = {norther.dealerId: norther for norther in northers}
|
|
|
- pullDataSecret = norther.pullDataSecret
|
|
|
- pullDataSecretIV = norther.pullDataSecretIV
|
|
|
-
|
|
|
- # 这个平台下的所有对接过的经销商
|
|
|
- dealerIds = [_.dealerId for _ in northers]
|
|
|
-
|
|
|
- try:
|
|
|
- Data = json.loads(request.body).get("Data")
|
|
|
- data = json.loads(AES_CBC_PKCS5padding_decrypt(
|
|
|
- Data,
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- ))
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
|
|
|
-
|
|
|
- logger.info('[queryStationsInfo] , data = {}'.format(data))
|
|
|
-
|
|
|
- pageNo = int(data.get('PageNo', 1))
|
|
|
- pageSize = int(data.get('PageSize', 10))
|
|
|
-
|
|
|
- filters = {
|
|
|
- "ownerId__in": dealerIds
|
|
|
- }
|
|
|
-
|
|
|
- # 查询充电站信息 (Group)
|
|
|
- query = Group.objects.filter(**filters).only("id")
|
|
|
- StationInfos = list()
|
|
|
-
|
|
|
- # 修改一下 只允许上传的是 汽车装的
|
|
|
- groupIds = [str(item.id) for item in query if Device.objects.filter(groupId = str(item.id), devType__code__in=[
|
|
|
- Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY_V2, Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY,
|
|
|
- Const.DEVICE_TYPE_CODE_CHARGING_HONGZHUO
|
|
|
- ]).count()]
|
|
|
-
|
|
|
- groupQuery = Group.objects.filter(id__in = groupIds).only("id", "ownerId")
|
|
|
- pageCount = groupQuery.count() / pageSize + 1
|
|
|
- for item in groupQuery.paginate(pageNo, pageSize):
|
|
|
- # 获取站点信息
|
|
|
- groupId = str(item.id)
|
|
|
- _norther = northerMap[item.ownerId]
|
|
|
-
|
|
|
- dev = Device.objects.filter(groupId = groupId)
|
|
|
- if not dev:
|
|
|
- continue
|
|
|
-
|
|
|
- # 我们的GroupID是24位,省平台的是20位,这个地方做个映射表
|
|
|
- GroupIdMap.add(groupId)
|
|
|
-
|
|
|
- StationInfos.append(ShanDongNorther.get_station(groupId, _norther))
|
|
|
-
|
|
|
- result = {
|
|
|
- "PageNo": pageNo,
|
|
|
- "ItemSize": pageSize,
|
|
|
- "PageCount": pageCount,
|
|
|
- "StationInfos": StationInfos
|
|
|
- }
|
|
|
- resultData = AES_CBC_PKCS5padding_encrypt(
|
|
|
- json.dumps(result),
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- )
|
|
|
- sig = norther.get_sig(resultData)
|
|
|
-
|
|
|
- logger.info("[queryStationsInfo], result = {}".format(resultData))
|
|
|
-
|
|
|
- return JsonResponse({
|
|
|
- "Ret": 0,
|
|
|
- "Msg": u"请求成功",
|
|
|
- "Data": resultData,
|
|
|
- "Sig": sig
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
-def queryStationStats(request):
|
|
|
- """
|
|
|
- 省平台 省级平台定期获取每个充电站在某个周期内的统计信息
|
|
|
- StationID
|
|
|
- StartTime
|
|
|
- EndTime
|
|
|
- :param request:
|
|
|
- :return:
|
|
|
- """
|
|
|
- token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
|
|
|
- logger.info('[queryStationStats] , token = {}'.format(token))
|
|
|
-
|
|
|
- # 验证身份
|
|
|
- tokenData = parse_json_token(token)
|
|
|
- if not tokenData:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
|
|
|
- northers = ShanDongNorther.get_norther(**tokenData)
|
|
|
- if not northers:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
|
|
|
-
|
|
|
- # 准备token所获取的参数信息
|
|
|
- norther = northers.first()
|
|
|
- pullDataSecret = norther.pullDataSecret
|
|
|
- pullDataSecretIV = norther.pullDataSecretIV
|
|
|
-
|
|
|
- logger.debug("[queryStationStats] request body = {}".format(request.body))
|
|
|
-
|
|
|
- if not request.body:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
|
|
|
-
|
|
|
- try:
|
|
|
- Data = json.loads(request.body).get("Data")
|
|
|
- data = json.loads(AES_CBC_PKCS5padding_decrypt(
|
|
|
- Data,
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- ))
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
|
|
|
-
|
|
|
- logger.info('[queryStationStats], data = {}'.format(data))
|
|
|
-
|
|
|
- stationID = data.get("StationID")
|
|
|
- startTime = data.get("StartTime")
|
|
|
- endTime = data.get("EndTime")
|
|
|
-
|
|
|
- startTimeObj = datetime.datetime.strptime(startTime, "%Y-%m-%d")
|
|
|
- endTimeObj = datetime.datetime.strptime(endTime, "%Y-%m-%d")
|
|
|
-
|
|
|
- groupId = GroupIdMap.get_groupId(stationID)
|
|
|
-
|
|
|
- res = ShanDongNorther.get_station_state(groupId, startTimeObj, endTimeObj)
|
|
|
- res.update({
|
|
|
- "StationID": stationID,
|
|
|
- "StartTime": startTime,
|
|
|
- "EndTime": endTime
|
|
|
- })
|
|
|
-
|
|
|
- result = {"StationStats": res}
|
|
|
- resultData = AES_CBC_PKCS5padding_encrypt(
|
|
|
- json.dumps(result),
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- )
|
|
|
- sig = norther.get_sig(resultData)
|
|
|
- logger.debug("[queryStationStats] return result = {}".format(result))
|
|
|
-
|
|
|
- return JsonResponse({
|
|
|
- "Ret": 0,
|
|
|
- "Msg": u"请求成功",
|
|
|
- "Data": resultData,
|
|
|
- "Sig": sig
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
-def queryStationStatus(request):
|
|
|
- """
|
|
|
- 省平台 用于批量查询设备实时状态
|
|
|
- :param request:
|
|
|
- :return:
|
|
|
- """
|
|
|
- token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
|
|
|
- logger.info('[queryStationStatus] , token = {}'.format(token))
|
|
|
-
|
|
|
- # 验证身份
|
|
|
- tokenData = parse_json_token(token)
|
|
|
- if not tokenData:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
|
|
|
- northers = ShanDongNorther.get_norther(**tokenData)
|
|
|
- if not northers:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
|
|
|
-
|
|
|
- # 准备token所获取的参数信息
|
|
|
- norther = northers.first()
|
|
|
- pullDataSecret = norther.pullDataSecret
|
|
|
- pullDataSecretIV = norther.pullDataSecretIV
|
|
|
-
|
|
|
- logger.debug("[queryStationStatus] request body = {}".format(request.body))
|
|
|
-
|
|
|
- if not request.body:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
|
|
|
-
|
|
|
- try:
|
|
|
- Data = json.loads(request.body).get("Data")
|
|
|
- data = json.loads(AES_CBC_PKCS5padding_decrypt(
|
|
|
- Data,
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- ))
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
|
|
|
-
|
|
|
- stationIDs = data.get("StationIDs")
|
|
|
- if not isinstance(stationIDs, list):
|
|
|
- return JsonResponse({"Ret": 4004, "Msg": u"系统错误"})
|
|
|
-
|
|
|
- StationStatusInfos = list()
|
|
|
- for stationID in stationIDs:
|
|
|
- groupId = GroupIdMap.get_groupId(stationID)
|
|
|
-
|
|
|
- StationStatusInfos.append(
|
|
|
- {
|
|
|
- "StationID": stationID,
|
|
|
- "ConnectorStatusInfos": ShanDongNorther.get_station_status(groupId)
|
|
|
- }
|
|
|
- )
|
|
|
-
|
|
|
- result = {
|
|
|
- "StationStatusInfos": StationStatusInfos
|
|
|
- }
|
|
|
- resultData = AES_CBC_PKCS5padding_encrypt(
|
|
|
- json.dumps(result),
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- )
|
|
|
- sig = norther.get_sig(resultData)
|
|
|
- logger.debug("[queryStationStatus] return result = {}".format(result))
|
|
|
-
|
|
|
- return JsonResponse({
|
|
|
- "Ret": 0,
|
|
|
- "Msg": u"请求成功",
|
|
|
- "Data": resultData,
|
|
|
- "Sig": sig
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
-def queryEquipBusinessPolicy(request):
|
|
|
- """
|
|
|
- 省平台 用于查询运营商的充电设备接口计费模型信息
|
|
|
- :param request:
|
|
|
- :return:
|
|
|
- """
|
|
|
- # 验证身份
|
|
|
- token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
|
|
|
- logger.info('[queryEquipBusinessPolicy] , token = {}'.format(token))
|
|
|
-
|
|
|
- tokenData = parse_json_token(token)
|
|
|
- if not tokenData:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
|
|
|
- northers = ShanDongNorther.get_norther(**tokenData)
|
|
|
- if not northers:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
|
|
|
-
|
|
|
- # 准备token所获取的参数信息
|
|
|
- norther = northers.first()
|
|
|
- pullDataSecret = norther.pullDataSecret
|
|
|
- pullDataSecretIV = norther.pullDataSecretIV
|
|
|
-
|
|
|
- # 验证参数
|
|
|
- logger.debug("[queryEquipBusinessPolicy] request body = {}".format(request.body))
|
|
|
-
|
|
|
- if not request.body:
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
|
|
|
-
|
|
|
- try:
|
|
|
- Data = json.loads(request.body).get("Data")
|
|
|
- data = json.loads(AES_CBC_PKCS5padding_decrypt(
|
|
|
- Data,
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- ))
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
|
|
|
-
|
|
|
- equipBizSeq = data.get("EquipBizSeq")
|
|
|
- connectorID = data.get("ConnectorID")
|
|
|
-
|
|
|
- policyInfo = ShanDongNorther.get_policy_info(connectorID)
|
|
|
-
|
|
|
- result = {
|
|
|
- "EquipBizSeq": equipBizSeq,
|
|
|
- "ConnectorID": connectorID,
|
|
|
- "SuccStat": 0 if policyInfo else 1,
|
|
|
- "FailReason": 0 if policyInfo else 1,
|
|
|
- "SumPeriod": 1,
|
|
|
- "PolicyInfos": [policyInfo] if policyInfo else None
|
|
|
- }
|
|
|
- resultData = AES_CBC_PKCS5padding_encrypt(
|
|
|
- json.dumps(result),
|
|
|
- dataSecret=pullDataSecret,
|
|
|
- dataSecretIV=pullDataSecretIV
|
|
|
- )
|
|
|
- sig = norther.get_sig(resultData)
|
|
|
-
|
|
|
- logger.debug("[queryEquipBusinessPolicy] return result = {}".format(result))
|
|
|
-
|
|
|
- return JsonResponse({
|
|
|
- "Ret": 0,
|
|
|
- "Msg": u"请求成功",
|
|
|
- "Data": resultData,
|
|
|
- "Sig": sig
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
-#####################
|
|
|
-#### 通用接口 ####
|
|
|
-#####################
|
|
|
-def send_api_order(payload, dealer, func):
|
|
|
- device = Device.get_dev_by_logicalCode(payload['deviceCode']) # type: DeviceDict
|
|
|
- if not device:
|
|
|
- raise ApiNoDeviceException()
|
|
|
-
|
|
|
- if not device.is_authorized_to_dealer(str(dealer.id)):
|
|
|
- raise ApiAuthDeviceException()
|
|
|
-
|
|
|
- if device.isApi == False:
|
|
|
- raise ApiDeviceModeException()
|
|
|
-
|
|
|
- record = APIStartDeviceRecord(orderNo = payload.get('orderNo', ''),
|
|
|
- deviceCode = payload.get('deviceCode', ''),
|
|
|
- createTime = payload.get('createTime', ''),
|
|
|
- notifyUrl = payload.get('payload', ''),
|
|
|
- apiConf = getattr(dealer, 'api_conf'),
|
|
|
- channel = payload.get('channel', ''),
|
|
|
- devNo = device['devNo'],
|
|
|
- ownerId = device['ownerId'],
|
|
|
- attachParas = payload.get('attachParas', {}))
|
|
|
- record.save()
|
|
|
-
|
|
|
- err_code = ErrorCode.EXCEPTION
|
|
|
- err_msg = u'系统错误'
|
|
|
- result = {}
|
|
|
-
|
|
|
- try:
|
|
|
- smartBox = device.deviceAdapter
|
|
|
- result = eval('smartBox.{}(record=payload)'.format(func))
|
|
|
-
|
|
|
- err_code = result.get('rst')
|
|
|
- err_msg = str(result.get('desc', ''))
|
|
|
-
|
|
|
- except ServiceException as e:
|
|
|
- logger.error('start device({}) failed error(code={},msg={})'.format(device['devNo'], e.result.get('result'),
|
|
|
- e.result.get('description')))
|
|
|
-
|
|
|
- err_code = e.result.get('result')
|
|
|
- err_msg = str(e.result.get('description'))
|
|
|
-
|
|
|
- except Exception as e:
|
|
|
- logger.exception('start device({}) failed error={}'.format(device['devNo'], e))
|
|
|
- err_code = ErrorCode.EXCEPTION
|
|
|
- err_msg = str(e)
|
|
|
-
|
|
|
- finally:
|
|
|
- try:
|
|
|
- record.errCode = err_code
|
|
|
- record.errMsg = err_msg
|
|
|
- record.servicedInfo = result
|
|
|
- record.servicedInfo.update({'function': func})
|
|
|
- record.save()
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
-
|
|
|
- return {'status': err_code, 'desc': err_msg, 'result': result}
|