123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781 |
- # -*- 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}
|