# 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 })