views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. # coding=utf-8
  2. import json
  3. import logging
  4. import datetime
  5. from mongoengine import DoesNotExist
  6. from django.views.decorators.http import require_POST
  7. from apilib.utils_datetime import to_datetime
  8. from apilib.utils_json import JsonResponse
  9. from apps.web.api.jn_north.constant import RESPONSE_CODE
  10. from apps.web.api.jn_north.utils import get_stations_info,get_station_status,get_get_station_state,get_policy_info
  11. from apps.web.api.utils import AES_CBC_PKCS5padding_encrypt, AES_CBC_PKCS5padding_decrypt, generate_json_token, parse_json_token
  12. from apps.web.device.models import Group, Device
  13. from apps.web.south_intf.shangdong_platform import ShanDongNorther, GroupIdMap
  14. logger = logging.getLogger(__name__)
  15. @require_POST
  16. def queryToken(request):
  17. """
  18. 通过账号密码获取token
  19. """
  20. logger.debug("[queryToken] request body = {}".format(request.body))
  21. if not request.body:
  22. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1001)"})
  23. try:
  24. Data = json.loads(request.body).get("Data")
  25. data = json.loads(AES_CBC_PKCS5padding_decrypt(Data))
  26. except Exception as e:
  27. logger.exception(e)
  28. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1002)"})
  29. OperatorID = data.get("OperatorID")
  30. OperatorSecret = data.get("OperatorSecret")
  31. logger.debug("[queryToken] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
  32. if not all((OperatorID, OperatorSecret)):
  33. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  34. try:
  35. norther = ShanDongNorther.objects.filter(northOperatorID=OperatorID, northOperatorSecret=OperatorSecret).first() # type: ShanDongNorther
  36. except DoesNotExist:
  37. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  38. except Exception as e:
  39. return JsonResponse({"Ret": RESPONSE_CODE.SYS_ERROR, "Msg": u"系统错误"})
  40. expire = 60 * 60 * 24 * 7
  41. result = {
  42. "OperatorID": norther.agentOperatorID,
  43. "SuccStat": 0,
  44. "AccessToken": generate_json_token(data=norther.get_token_data(), expire=expire),
  45. "TokenAvailableTime": expire,
  46. "FailReason": None
  47. }
  48. logger.debug("[queryToken] return result = {}".format(result))
  49. # 拉取的时候加密 显式指明加密秘钥为 pull
  50. resultData = AES_CBC_PKCS5padding_encrypt(
  51. json.dumps(result),
  52. dataSecret=norther.pullDataSecret,
  53. dataSecretIV=norther.pullDataSecretIV
  54. )
  55. sig = norther.get_sig(resultData)
  56. return JsonResponse({
  57. "Ret": RESPONSE_CODE.SUCCESS,
  58. "Msg": u"请求成功",
  59. "Data": resultData,
  60. "Sig": sig
  61. })
  62. def queryStationsInfo(request):
  63. """
  64. 查询充电站的信息
  65. """
  66. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  67. logger.info('[queryStationsInfo] , token = {}'.format(token))
  68. # 验证身份
  69. tokenData = parse_json_token(token)
  70. if not tokenData:
  71. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  72. # 获取这个平台下面的所有的northers记录
  73. northers = ShanDongNorther.get_norther(**tokenData)
  74. if not northers:
  75. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  76. # 准备token所获取的参数信息
  77. norther = northers.first()
  78. pullDataSecret = norther.pullDataSecret
  79. pullDataSecretIV = norther.pullDataSecretIV
  80. # 这个平台下的所有对接过的经销商
  81. dealerIds = [_.dealerId for _ in northers]
  82. # 验证参数
  83. logger.debug("[queryStationsInfo] request body = {}".format(request.body))
  84. if not request.body:
  85. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  86. try:
  87. Data = json.loads(request.body).get("Data")
  88. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  89. Data,
  90. dataSecret=pullDataSecret,
  91. dataSecretIV=pullDataSecretIV
  92. ))
  93. except Exception as e:
  94. logger.exception(e)
  95. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  96. # 分页以及查询参数
  97. pageNo = int(data.get('PageNo', 1))
  98. pageSize = int(data.get('PageSize', 10))
  99. lastQueryTime = data.get("LastQueryTime")
  100. # 查找出所有符合条件的地质组的信息
  101. query = Group.objects.filter(ownerId__in=dealerIds)
  102. if lastQueryTime:
  103. dateTime = to_datetime(lastQueryTime)
  104. query = query.filter(dateTimeAdded__gte=dateTime)
  105. # 过滤出有设备的地址组
  106. StationInfos = list()
  107. groupIds = [str(item.id) for item in query.only("id") if Device.objects.filter(groupId = str(item.id)).count()]
  108. groupQuery = Group.objects.filter(id__in=groupIds).only("id").paginate(pageNo, pageSize)
  109. for item in groupQuery:
  110. # 获取站点信息
  111. groupId = str(item.id)
  112. # 我们的GroupID是24位,省平台的是20位,尝试添加映射
  113. GroupIdMap.add(groupId)
  114. StationInfos.append(get_stations_info(Group.get_group(item.id), norther))
  115. result = {
  116. "PageNo": pageNo,
  117. "ItemSize": pageSize,
  118. "PageCount": groupQuery.count(),
  119. "StationInfos": StationInfos
  120. }
  121. logger.debug("[queryStationsInfo] return result = {}".format(result))
  122. resultData = AES_CBC_PKCS5padding_encrypt(
  123. json.dumps(result),
  124. dataSecret=pullDataSecret,
  125. dataSecretIV=pullDataSecretIV
  126. )
  127. sig = norther.get_sig(resultData)
  128. logger.debug("groupId = {}".format(groupIds[0]))
  129. return JsonResponse({
  130. "Ret": 0,
  131. "Msg": u"请求成功",
  132. "Data": resultData,
  133. "Sig": sig
  134. })
  135. def queryStationStats(request):
  136. """
  137. 取每个充电站在某个周期内的统计信息
  138. :param request:
  139. :return:
  140. """
  141. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  142. logger.info('[queryStationsInfo] , token = {}'.format(token))
  143. # 验证身份
  144. tokenData = parse_json_token(token)
  145. if not tokenData:
  146. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  147. northers = ShanDongNorther.get_norther(**tokenData)
  148. if not northers:
  149. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  150. # 准备token所获取的参数信息
  151. norther = northers.first()
  152. pullDataSecret = norther.pullDataSecret
  153. pullDataSecretIV = norther.pullDataSecretIV
  154. # 验证参数
  155. logger.debug("[queryStationsInfo] request body = {}".format(request.body))
  156. if not request.body:
  157. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  158. try:
  159. Data = json.loads(request.body).get("Data")
  160. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  161. Data,
  162. dataSecret=pullDataSecret,
  163. dataSecretIV=pullDataSecretIV
  164. ))
  165. except Exception as e:
  166. logger.exception(e)
  167. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  168. stationID = data.get("StationID")
  169. startTime = data.get("StartTime")
  170. endTime = data.get("EndTime")
  171. startTimeObj = datetime.datetime.strptime(startTime, "%Y-%m-%d")
  172. endTimeObj = datetime.datetime.strptime(endTime, "%Y-%m-%d")
  173. res = get_get_station_state(stationID,startTimeObj, endTimeObj)
  174. res.update({
  175. "StationID": stationID,
  176. "StartTime": startTime,
  177. "EndTime": endTime
  178. })
  179. result = {"StationStats": res}
  180. resultData = AES_CBC_PKCS5padding_encrypt(
  181. json.dumps(result),
  182. dataSecret=pullDataSecret,
  183. dataSecretIV=pullDataSecretIV
  184. )
  185. sig = norther.get_sig(resultData)
  186. logger.debug("[queryStationStats] return result = {}".format(result))
  187. return JsonResponse({
  188. "Ret": 0,
  189. "Msg": u"请求成功",
  190. "Data": resultData,
  191. "Sig": sig
  192. })
  193. def queryStationStatus(request):
  194. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  195. logger.info('[queryStationsInfo] , token = {}'.format(token))
  196. # 验证身份
  197. tokenData = parse_json_token(token)
  198. if not tokenData:
  199. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  200. northers = ShanDongNorther.get_norther(**tokenData)
  201. if not northers:
  202. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  203. # 准备token所获取的参数信息
  204. norther = northers.first()
  205. pullDataSecret = norther.pullDataSecret
  206. pullDataSecretIV = norther.pullDataSecretIV
  207. # 验证参数
  208. logger.debug("[queryStationsInfo] request body = {}".format(request.body))
  209. if not request.body:
  210. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  211. try:
  212. Data = json.loads(request.body).get("Data")
  213. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  214. Data,
  215. dataSecret=pullDataSecret,
  216. dataSecretIV=pullDataSecretIV
  217. ))
  218. except Exception as e:
  219. logger.exception(e)
  220. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  221. stationIDs = data.get("StationIDs")
  222. if not isinstance(stationIDs, list):
  223. return JsonResponse({"Ret": 4004, "Msg": u"系统错误"})
  224. StationStatusInfos = list()
  225. for stationID in stationIDs:
  226. groupId = GroupIdMap.get_groupId(stationID)
  227. StationStatusInfos.append(
  228. {
  229. "StationID": stationID,
  230. "ConnectorStatusInfos": get_station_status(groupId)
  231. }
  232. )
  233. result = {
  234. "StationStatusInfos": StationStatusInfos
  235. }
  236. resultData = AES_CBC_PKCS5padding_encrypt(
  237. json.dumps(result),
  238. dataSecret=pullDataSecret,
  239. dataSecretIV=pullDataSecretIV
  240. )
  241. sig = norther.get_sig(resultData)
  242. logger.debug("[queryStationStatus] return result = {}".format(result))
  243. return JsonResponse({
  244. "Ret": 0,
  245. "Msg": u"请求成功",
  246. "Data": resultData,
  247. "Sig": sig
  248. })
  249. def queryEquipBusinessPolicy(request):
  250. """
  251. 用于查询运营商的充电设备接口计费模型信息
  252. :param request:
  253. :return:
  254. """
  255. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  256. logger.info('[queryStationsInfo] , token = {}'.format(token))
  257. # 验证身份
  258. tokenData = parse_json_token(token)
  259. if not tokenData:
  260. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  261. northers = ShanDongNorther.get_norther(**tokenData)
  262. if not northers:
  263. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  264. # 准备token所获取的参数信息
  265. norther = northers.first()
  266. pullDataSecret = norther.pullDataSecret
  267. pullDataSecretIV = norther.pullDataSecretIV
  268. # 验证参数
  269. logger.debug("[queryStationsInfo] request body = {}".format(request.body))
  270. if not request.body:
  271. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  272. try:
  273. Data = json.loads(request.body).get("Data")
  274. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  275. Data,
  276. dataSecret=pullDataSecret,
  277. dataSecretIV=pullDataSecretIV
  278. ))
  279. except Exception as e:
  280. logger.exception(e)
  281. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  282. equipBizSeq = data.get("EquipBizSeq")
  283. connectorID = data.get("ConnectorID")
  284. policyInfo = get_policy_info(connectorID)
  285. result = {
  286. "EquipBizSeq": equipBizSeq,
  287. "ConnectorID": connectorID,
  288. "SuccStat": 0 if policyInfo else 1,
  289. "FailReason": 0 if policyInfo else 1,
  290. "SumPeriod": 1,
  291. "PolicyInfos": [policyInfo] if policyInfo else "-"
  292. }
  293. resultData = AES_CBC_PKCS5padding_encrypt(
  294. json.dumps(result),
  295. dataSecret=pullDataSecret,
  296. dataSecretIV=pullDataSecretIV
  297. )
  298. sig = norther.get_sig(resultData)
  299. logger.debug("[queryEquipBusinessPolicy] return result = {}".format(result))
  300. return JsonResponse({
  301. "Ret": 0,
  302. "Msg": u"请求成功",
  303. "Data": resultData,
  304. 'Sig':sig
  305. })