123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- # coding=utf-8
- import json
- import logging
- import datetime
- from mongoengine import DoesNotExist
- from django.views.decorators.http import require_POST
- from apilib.utils_datetime import to_datetime
- from apilib.utils_json import JsonResponse
- from apps.web.api.jn_north.constant import RESPONSE_CODE
- from apps.web.api.jn_north.utils import get_stations_info,get_station_status,get_get_station_state,get_policy_info
- from apps.web.api.utils import AES_CBC_PKCS5padding_encrypt, AES_CBC_PKCS5padding_decrypt, generate_json_token, parse_json_token
- from apps.web.device.models import Group, Device
- from apps.web.south_intf.shangdong_platform import ShanDongNorther, GroupIdMap
- logger = logging.getLogger(__name__)
- @require_POST
- def queryToken(request):
- """
- 通过账号密码获取token
- """
- logger.debug("[queryToken] request body = {}".format(request.body))
- if not request.body:
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1001)"})
- 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.debug("[queryToken] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
- if not all((OperatorID, OperatorSecret)):
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
- try:
- norther = ShanDongNorther.objects.filter(northOperatorID=OperatorID, northOperatorSecret=OperatorSecret).first() # type: ShanDongNorther
- except DoesNotExist:
- return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
- except Exception as e:
- return JsonResponse({"Ret": RESPONSE_CODE.SYS_ERROR, "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 queryStationsInfo(request):
- """
- 查询充电站的信息
- """
- 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()
- pullDataSecret = norther.pullDataSecret
- pullDataSecretIV = norther.pullDataSecretIV
- # 这个平台下的所有对接过的经销商
- dealerIds = [_.dealerId for _ in northers]
- # 验证参数
- logger.debug("[queryStationsInfo] 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)"})
- # 分页以及查询参数
- pageNo = int(data.get('PageNo', 1))
- pageSize = int(data.get('PageSize', 10))
- lastQueryTime = data.get("LastQueryTime")
- # 查找出所有符合条件的地质组的信息
- query = Group.objects.filter(ownerId__in=dealerIds)
- if lastQueryTime:
- dateTime = to_datetime(lastQueryTime)
- query = query.filter(dateTimeAdded__gte=dateTime)
- # 过滤出有设备的地址组
- StationInfos = list()
- groupIds = [str(item.id) for item in query.only("id") if Device.objects.filter(groupId = str(item.id)).count()]
- groupQuery = Group.objects.filter(id__in=groupIds).only("id").paginate(pageNo, pageSize)
- for item in groupQuery:
- # 获取站点信息
- groupId = str(item.id)
- # 我们的GroupID是24位,省平台的是20位,尝试添加映射
- GroupIdMap.add(groupId)
- StationInfos.append(get_stations_info(Group.get_group(item.id), norther))
- result = {
- "PageNo": pageNo,
- "ItemSize": pageSize,
- "PageCount": groupQuery.count(),
- "StationInfos": StationInfos
- }
- logger.debug("[queryStationsInfo] return result = {}".format(result))
- resultData = AES_CBC_PKCS5padding_encrypt(
- json.dumps(result),
- dataSecret=pullDataSecret,
- dataSecretIV=pullDataSecretIV
- )
- sig = norther.get_sig(resultData)
- logger.debug("groupId = {}".format(groupIds[0]))
- return JsonResponse({
- "Ret": 0,
- "Msg": u"请求成功",
- "Data": resultData,
- "Sig": sig
- })
- def queryStationStats(request):
- """
- 取每个充电站在某个周期内的统计信息
- :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 = 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("[queryStationsInfo] 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)"})
- 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")
- res = get_get_station_state(stationID,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):
- 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 = 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("[queryStationsInfo] 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": 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('[queryStationsInfo] , 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("[queryStationsInfo] 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 = 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 "-"
- }
- 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
- })
|