views.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import datetime
  5. import simplejson as json
  6. from mongoengine import DoesNotExist
  7. from typing import TYPE_CHECKING
  8. from apilib.utils_datetime import timestamp_to_dt
  9. from apilib.utils_json import JsonResponse
  10. from apps.web.api.exceptions import ApiAuthDeviceException, ApiNoDeviceException, ApiDeviceModeException
  11. from apps.web.api.jn_north.constant import RESPONSE_CODE
  12. from apps.web.api.utils import AES_CBC_PKCS5padding_decrypt, generate_json_token, AES_CBC_PKCS5padding_encrypt, parse_json_token
  13. from apps.web.common.models import District, TempValues
  14. from apps.web.constant import Const, ErrorCode
  15. from apps.web.core.exceptions import ServiceException
  16. from apps.web.core.models import SystemSettings
  17. from apps.web.device.models import Device, Group, Part
  18. from apps.web.south_intf.shangdong_platform import GroupIdMap, ShanDongNorther
  19. from apps.web.south_intf.zhejiang_fire import ZhejiangRSA, ZhejiangAddressType, ZhejiangZone, ZhejiangNorther, Company
  20. from apps.web.api.models import APIStartDeviceRecord
  21. logger = logging.getLogger(__name__)
  22. if TYPE_CHECKING:
  23. from apps.web.device.models import DeviceDict
  24. # 智慧消防智能管控平台向各平台采集数据
  25. # 获取公钥,此公钥用来加密密码
  26. def getPublicKey(request):
  27. logger.info('norther some one getPublicKey')
  28. publicKey = ZhejiangRSA.publicKeyHear.replace('-----BEGIN PUBLIC KEY-----\n', '').replace(
  29. '\n-----END PUBLIC KEY-----', '')
  30. publicKey = publicKey.replace('\n', '')
  31. # publicKey = base64.b64encode(publicKey)
  32. return JsonResponse({'code': 0, 'message': u'获取成功', 'data': {'publicKey': publicKey}})
  33. def loginFromNorth(request):
  34. logger.info('norther some one loginFromNorth')
  35. username = request.POST.get('username')
  36. enPassword = request.POST.get('password')
  37. password = ZhejiangRSA.decrypt(enPassword)
  38. if password is None:
  39. return JsonResponse({'code': '1', 'msg': u'用户名或者密码错误', 'data': None})
  40. try:
  41. obj = ZhejiangNorther.objects.get(usernameFromHear = username, passwordFromHear = password)
  42. except Exception, e:
  43. return JsonResponse({'code': '1', 'msg': u'用户名或者密码错误', 'data': None})
  44. return JsonResponse({'code': 0, 'message': u'获取成功', 'data': {'tokenId': obj.tokenId}})
  45. def getBuilding(request):
  46. def get_coordinates_and_nums(groupId):
  47. devs = Device.objects.filter(groupId = groupId)
  48. count = devs.count()
  49. if count == 0:
  50. return 0.0, 0.0, count
  51. for dev in devs:
  52. if dev.location is not None and dev.location.has_key('coordinates'):
  53. coord = dev.location['coordinates']
  54. return coord[0], coord[1], count
  55. return 0.0, 0.0, count
  56. agentId = request.META.get('HTTP_TOKENID', None)
  57. logger.info('norther getBuilding data ,token is %s' % agentId)
  58. if agentId is None:
  59. return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
  60. try:
  61. norther = ZhejiangNorther.objects.get(tokenId = agentId)
  62. except Exception, e:
  63. return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
  64. serviceCode = norther.serviceCodeFromNorth
  65. pageNo = int(request.POST.get('pageNo'))
  66. pageSize = int(request.POST.get('pageSize'))
  67. if request.POST.has_key('createDateB'):
  68. createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
  69. createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
  70. postId = request.POST.get('postId', None)
  71. if postId is None:
  72. dealerIds = [obj.ownerId for obj in Company.objects.filter(agentId = agentId)]
  73. if request.POST.has_key('updateDateE'):
  74. updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
  75. updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
  76. groups = Group.objects.filter(ownerId__in = dealerIds,
  77. dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
  78. else:
  79. groups = Group.objects.filter(ownerId__in = dealerIds,
  80. dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
  81. else:
  82. groups = Group.objects.filter(id = postId)
  83. total = groups.count()
  84. pageCount = total / pageSize + 1
  85. dataList = []
  86. for group in groups.paginate(pageNo, pageSize):
  87. lng, lnt, count = get_coordinates_and_nums(str(group.id))
  88. data = {
  89. 'buildingId': str(group.id),
  90. 'buildingName': group.groupName,
  91. 'companyId': group.ownerId,
  92. 'address': group.address,
  93. 'buildingType': ZhejiangAddressType.get_typeId(group.addressType),
  94. 'lat': lnt,
  95. 'lng': lng,
  96. 'regionCode': ZhejiangZone.get_distinct_id(District.get_area(group.districtId), group.address),
  97. 'deviceNum': count,
  98. 'producerCode': serviceCode
  99. }
  100. dataList.append(data)
  101. return JsonResponse({'code': 0, 'message': u'获取成功',
  102. 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
  103. 'list': dataList}})
  104. def getCompany(request):
  105. agentId = request.META.get('HTTP_TOKENID', None)
  106. if agentId is None:
  107. return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
  108. logger.info('norther getCompany,token is %s' % agentId)
  109. try:
  110. norther = ZhejiangNorther.objects.get(tokenId = agentId)
  111. except Exception, e:
  112. return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
  113. pageNo = int(request.POST.get('pageNo'))
  114. pageSize = int(request.POST.get('pageSize'))
  115. if request.POST.has_key('createDateB'):
  116. createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
  117. createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
  118. postId = request.POST.get('postId', None)
  119. if postId is None:
  120. if request.POST.has_key('updateDateE'):
  121. updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
  122. updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
  123. companys = Company.objects.filter(agentId = agentId,
  124. dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
  125. else:
  126. companys = Company.objects.filter(agentId = agentId, dateTimeAdded__gte = createDateB,
  127. dateTimeAdded__lte = createDateE)
  128. else:
  129. companys = Company.objects.filter(ownerId = postId)
  130. total = companys.count()
  131. pageCount = total / pageSize + 1
  132. dataList = []
  133. for com in companys.paginate(pageNo, pageSize):
  134. data = {
  135. 'companyId': str(com.ownerId),
  136. 'companyName': com.name,
  137. 'companyCode': com.unifiedSocialCreditCode,
  138. 'address': com.address,
  139. 'contactName': com.contactName,
  140. 'contactTel': com.telephone,
  141. }
  142. dataList.append(data)
  143. return JsonResponse({'code': 0, 'message': u'获取成功',
  144. 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
  145. 'list': dataList}})
  146. def getEquipment(request):
  147. agentId = request.META.get('HTTP_TOKENID', None)
  148. if agentId is None:
  149. return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
  150. logger.info('norther getEquipment,token is %s' % agentId)
  151. try:
  152. norther = ZhejiangNorther.objects.get(tokenId = agentId)
  153. except Exception, e:
  154. return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
  155. serviceCode = norther.serviceCodeFromNorth
  156. pageNo = int(request.POST.get('pageNo'))
  157. pageSize = int(request.POST.get('pageSize'))
  158. if request.POST.has_key('createDateB'):
  159. createDateB = timestamp_to_dt(int(request.POST.get('createDateB'))).strftime('%Y-%m-%d %H:%M:%S')
  160. createDateE = timestamp_to_dt(int(request.POST.get('createDateE'))).strftime('%Y-%m-%d %H:%M:%S')
  161. postId = request.POST.get('postId', None)
  162. companyDict = {}
  163. if postId is None:
  164. dealerIds = []
  165. for obj in Company.objects.filter(agentId = agentId):
  166. companyDict[obj.ownerId] = obj.manufacturer
  167. dealerIds.append(obj.ownerId)
  168. if request.POST.has_key('updateDateE'):
  169. updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
  170. updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
  171. devs = Device.objects.filter(ownerId__in = dealerIds,
  172. dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
  173. else:
  174. devs = Device.objects.filter(ownerId__in = dealerIds,
  175. dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
  176. else:
  177. company = Company.objects.get(ownerId = postId)
  178. companyDict[company.ownerId] = company.manufacturer
  179. devs = Device.objects.filter(ownerId = postId)
  180. total = devs.count()
  181. pageCount = total / pageSize + 1
  182. dataList = []
  183. for devObj in devs.paginate(pageNo, pageSize):
  184. group = Group.get_group(devObj.groupId)
  185. dev = Device.get_dev(devObj.devNo) # type: DeviceDict
  186. status = dev.status
  187. online = dev.online
  188. if status == Const.DEV_WORK_STATUS_FORBIDDEN:
  189. strStatus = '2' # 禁用
  190. elif not online:
  191. strStatus = '3' # 离线
  192. else:
  193. strStatus = '1' # 在线
  194. partNum = Part.objects.filter(logcicalCode = devObj.logicalCode).count()
  195. data = {
  196. 'deviceId': str(devObj.logicalCode),
  197. 'deviceName': u'充电桩',
  198. 'deviceType': '5', # 智能充电桩
  199. 'address': group.get('address', "") if group is not None else '',
  200. 'lat': devObj.location['coordinates'][1] if devObj.location is not None and devObj.location.has_key(
  201. 'coordinates') else 0.0,
  202. 'lng': devObj.location['coordinates'][0] if devObj.location is not None and devObj.location.has_key(
  203. 'coordinates') else 0.0,
  204. 'companyId': devObj.ownerId,
  205. 'buildingId': devObj.groupId,
  206. 'producerCode': serviceCode,
  207. 'installDate': devObj.dateTimeAdded,
  208. 'deviceStatus': strStatus,
  209. 'deviceManufactory': companyDict.get(devObj.ownerId, u'充电桩生产厂家'),
  210. 'partsNum': partNum
  211. }
  212. dataList.append(data)
  213. return JsonResponse({'code': 0, 'message': u'获取成功',
  214. 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
  215. 'list': dataList}})
  216. def getParts(request):
  217. agentId = request.META.get('HTTP_TOKENID', None)
  218. if agentId is None:
  219. return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
  220. logger.info('norther getParts,token is %s' % agentId)
  221. pageNo = int(request.POST.get('pageNo'))
  222. pageSize = int(request.POST.get('pageSize'))
  223. if request.POST.has_key('createDateB'):
  224. createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
  225. createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
  226. postId = request.POST.get('postId', None)
  227. companyDict = {}
  228. if postId is None:
  229. dealerIds = []
  230. for obj in Company.objects.filter(agentId = agentId):
  231. companyDict[obj.ownerId] = obj.manufacturer
  232. dealerIds.append(obj.ownerId)
  233. lcList = []
  234. for dealerId in dealerIds:
  235. groupIds = Group.get_group_ids_of_dealer(dealerId)
  236. devNoList = Device.get_devNos_by_group(groupIds)
  237. for devNo in devNoList:
  238. lcList.append(Device.get_logicalCode_by_devNo(devNo))
  239. if request.POST.has_key('updateDateE'):
  240. updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
  241. updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
  242. parts = Part.objects.filter(logicalCode__in = lcList,
  243. dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
  244. else:
  245. parts = Part.objects.filter(logicalCode__in = lcList,
  246. dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
  247. else:
  248. company = Company.objects.get(ownerId = postId)
  249. companyDict[company.ownerId] = company.manufacturer
  250. lcList = []
  251. groupIds = Group.get_group_ids_of_dealer(postId)
  252. devNoList = Device.get_devNos_by_group(groupIds)
  253. for devNo in devNoList:
  254. lcList.append(Device.get_logicalCode_by_devNo(devNo))
  255. parts = Part.objects.filter(logicalCode__in = lcList)
  256. total = parts.count()
  257. pageCount = total / pageSize + 1
  258. dataList = []
  259. logicalCodes = set([obj.logicalCode for obj in parts.paginate(pageNo, pageSize)])
  260. devDict = {}
  261. for lc in logicalCodes:
  262. dev = Device.get_dev_by_logicalCode(lc)
  263. group = Group.get_group(dev['groupId'])
  264. devDict[lc] = group['address']
  265. for obj in parts.paginate(pageNo, pageSize):
  266. data = {
  267. 'partsId': str(obj.id),
  268. 'partsName': u'标准充电口',
  269. 'address': devDict.get(obj.logicalCode),
  270. 'deviceId': obj.logicalCode,
  271. 'partsManufactory': companyDict.get(obj.ownerId, u'充电桩生产厂家'),
  272. 'installDate': obj.dateTimeAdded,
  273. 'partsStatus': '1',
  274. 'partsType': Part.objects(id = obj.id)[0].partType,
  275. }
  276. dataList.append(data)
  277. return JsonResponse({'code': 0, 'message': u'获取成功',
  278. 'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
  279. 'list': dataList}})
  280. # ---- 以下为山东省能源局平台接口
  281. def queryToken(request):
  282. """
  283. 省平台 获取token接口
  284. OperatorID 组织机构代码
  285. OperatorSecret 组织机构的密钥
  286. :param request:
  287. :return:
  288. """
  289. payload = json.loads(request.body)
  290. logger.info("[query token] payload = {}".format(payload))
  291. try:
  292. Data = json.loads(request.body).get("Data")
  293. data = json.loads(AES_CBC_PKCS5padding_decrypt(Data))
  294. except Exception as e:
  295. logger.exception(e)
  296. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1002)"})
  297. OperatorID = data.get("OperatorID")
  298. OperatorSecret = data.get("OperatorSecret")
  299. logger.info("[query token] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
  300. if not all((OperatorID, OperatorSecret)):
  301. return JsonResponse({"Ret": 4003, "Msg": u"请求参数错误"})
  302. try:
  303. norther = ShanDongNorther.objects.filter(northOperatorID = OperatorID, northOperatorSecret = OperatorSecret).first()
  304. except DoesNotExist:
  305. return JsonResponse({"Ret": 4004, "Msg": u"请求参数错误"})
  306. except Exception as e:
  307. return JsonResponse({"Ret": 500, "Msg": u"系统错误"})
  308. expire = 60 * 60 * 24 * 7
  309. result = {
  310. "OperatorID": norther.agentOperatorID,
  311. "SuccStat": 0,
  312. "AccessToken": generate_json_token(data=norther.get_token_data(), expire=expire),
  313. "TokenAvailableTime": expire,
  314. "FailReason": None
  315. }
  316. logger.debug("[queryToken] return result = {}".format(result))
  317. # 拉取的时候加密 显式指明加密秘钥为 pull
  318. resultData = AES_CBC_PKCS5padding_encrypt(
  319. json.dumps(result),
  320. dataSecret=norther.pullDataSecret,
  321. dataSecretIV=norther.pullDataSecretIV
  322. )
  323. sig = norther.get_sig(resultData)
  324. return JsonResponse({
  325. "Ret": RESPONSE_CODE.SUCCESS,
  326. "Msg": u"请求成功",
  327. "Data": resultData,
  328. "Sig": sig
  329. })
  330. def queryStationInfo(request):
  331. """
  332. 省平台拉去数据接口
  333. LastQueryTime 上次查询时间 格式 yyyy-MM-dd HH:mm:ss ,可以为空,如果不 填写,则查询所有的充电站信息
  334. PageNo
  335. PageSize
  336. :param request:
  337. :return:
  338. """
  339. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  340. logger.info('[queryStationsInfo] , token = {}'.format(token))
  341. # 验证身份
  342. tokenData = parse_json_token(token)
  343. if not tokenData:
  344. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  345. # 获取这个平台下面的所有的northers记录
  346. northers = ShanDongNorther.get_norther(**tokenData)
  347. if not northers:
  348. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  349. # 准备token所获取的参数信息
  350. norther = northers.first()
  351. northerMap = {norther.dealerId: norther for norther in northers}
  352. pullDataSecret = norther.pullDataSecret
  353. pullDataSecretIV = norther.pullDataSecretIV
  354. # 这个平台下的所有对接过的经销商
  355. dealerIds = [_.dealerId for _ in northers]
  356. try:
  357. Data = json.loads(request.body).get("Data")
  358. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  359. Data,
  360. dataSecret=pullDataSecret,
  361. dataSecretIV=pullDataSecretIV
  362. ))
  363. except Exception as e:
  364. logger.exception(e)
  365. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  366. logger.info('[queryStationsInfo] , data = {}'.format(data))
  367. pageNo = int(data.get('PageNo', 1))
  368. pageSize = int(data.get('PageSize', 10))
  369. filters = {
  370. "ownerId__in": dealerIds
  371. }
  372. # 查询充电站信息 (Group)
  373. query = Group.objects.filter(**filters).only("id")
  374. StationInfos = list()
  375. # 修改一下 只允许上传的是 汽车装的
  376. groupIds = [str(item.id) for item in query if Device.objects.filter(groupId = str(item.id), devType__code__in=[
  377. Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY_V2, Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY,
  378. Const.DEVICE_TYPE_CODE_CHARGING_HONGZHUO
  379. ]).count()]
  380. groupQuery = Group.objects.filter(id__in = groupIds).only("id", "ownerId")
  381. pageCount = groupQuery.count() / pageSize + 1
  382. for item in groupQuery.paginate(pageNo, pageSize):
  383. # 获取站点信息
  384. groupId = str(item.id)
  385. _norther = northerMap[item.ownerId]
  386. dev = Device.objects.filter(groupId = groupId)
  387. if not dev:
  388. continue
  389. # 我们的GroupID是24位,省平台的是20位,这个地方做个映射表
  390. GroupIdMap.add(groupId)
  391. StationInfos.append(ShanDongNorther.get_station(groupId, _norther))
  392. result = {
  393. "PageNo": pageNo,
  394. "ItemSize": pageSize,
  395. "PageCount": pageCount,
  396. "StationInfos": StationInfos
  397. }
  398. resultData = AES_CBC_PKCS5padding_encrypt(
  399. json.dumps(result),
  400. dataSecret=pullDataSecret,
  401. dataSecretIV=pullDataSecretIV
  402. )
  403. sig = norther.get_sig(resultData)
  404. logger.info("[queryStationsInfo], result = {}".format(resultData))
  405. return JsonResponse({
  406. "Ret": 0,
  407. "Msg": u"请求成功",
  408. "Data": resultData,
  409. "Sig": sig
  410. })
  411. def queryStationStats(request):
  412. """
  413. 省平台 省级平台定期获取每个充电站在某个周期内的统计信息
  414. StationID
  415. StartTime
  416. EndTime
  417. :param request:
  418. :return:
  419. """
  420. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  421. logger.info('[queryStationStats] , token = {}'.format(token))
  422. # 验证身份
  423. tokenData = parse_json_token(token)
  424. if not tokenData:
  425. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  426. northers = ShanDongNorther.get_norther(**tokenData)
  427. if not northers:
  428. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  429. # 准备token所获取的参数信息
  430. norther = northers.first()
  431. pullDataSecret = norther.pullDataSecret
  432. pullDataSecretIV = norther.pullDataSecretIV
  433. logger.debug("[queryStationStats] request body = {}".format(request.body))
  434. if not request.body:
  435. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  436. try:
  437. Data = json.loads(request.body).get("Data")
  438. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  439. Data,
  440. dataSecret=pullDataSecret,
  441. dataSecretIV=pullDataSecretIV
  442. ))
  443. except Exception as e:
  444. logger.exception(e)
  445. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  446. logger.info('[queryStationStats], data = {}'.format(data))
  447. stationID = data.get("StationID")
  448. startTime = data.get("StartTime")
  449. endTime = data.get("EndTime")
  450. startTimeObj = datetime.datetime.strptime(startTime, "%Y-%m-%d")
  451. endTimeObj = datetime.datetime.strptime(endTime, "%Y-%m-%d")
  452. groupId = GroupIdMap.get_groupId(stationID)
  453. res = ShanDongNorther.get_station_state(groupId, startTimeObj, endTimeObj)
  454. res.update({
  455. "StationID": stationID,
  456. "StartTime": startTime,
  457. "EndTime": endTime
  458. })
  459. result = {"StationStats": res}
  460. resultData = AES_CBC_PKCS5padding_encrypt(
  461. json.dumps(result),
  462. dataSecret=pullDataSecret,
  463. dataSecretIV=pullDataSecretIV
  464. )
  465. sig = norther.get_sig(resultData)
  466. logger.debug("[queryStationStats] return result = {}".format(result))
  467. return JsonResponse({
  468. "Ret": 0,
  469. "Msg": u"请求成功",
  470. "Data": resultData,
  471. "Sig": sig
  472. })
  473. def queryStationStatus(request):
  474. """
  475. 省平台 用于批量查询设备实时状态
  476. :param request:
  477. :return:
  478. """
  479. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  480. logger.info('[queryStationStatus] , token = {}'.format(token))
  481. # 验证身份
  482. tokenData = parse_json_token(token)
  483. if not tokenData:
  484. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  485. northers = ShanDongNorther.get_norther(**tokenData)
  486. if not northers:
  487. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  488. # 准备token所获取的参数信息
  489. norther = northers.first()
  490. pullDataSecret = norther.pullDataSecret
  491. pullDataSecretIV = norther.pullDataSecretIV
  492. logger.debug("[queryStationStatus] request body = {}".format(request.body))
  493. if not request.body:
  494. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  495. try:
  496. Data = json.loads(request.body).get("Data")
  497. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  498. Data,
  499. dataSecret=pullDataSecret,
  500. dataSecretIV=pullDataSecretIV
  501. ))
  502. except Exception as e:
  503. logger.exception(e)
  504. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  505. stationIDs = data.get("StationIDs")
  506. if not isinstance(stationIDs, list):
  507. return JsonResponse({"Ret": 4004, "Msg": u"系统错误"})
  508. StationStatusInfos = list()
  509. for stationID in stationIDs:
  510. groupId = GroupIdMap.get_groupId(stationID)
  511. StationStatusInfos.append(
  512. {
  513. "StationID": stationID,
  514. "ConnectorStatusInfos": ShanDongNorther.get_station_status(groupId)
  515. }
  516. )
  517. result = {
  518. "StationStatusInfos": StationStatusInfos
  519. }
  520. resultData = AES_CBC_PKCS5padding_encrypt(
  521. json.dumps(result),
  522. dataSecret=pullDataSecret,
  523. dataSecretIV=pullDataSecretIV
  524. )
  525. sig = norther.get_sig(resultData)
  526. logger.debug("[queryStationStatus] return result = {}".format(result))
  527. return JsonResponse({
  528. "Ret": 0,
  529. "Msg": u"请求成功",
  530. "Data": resultData,
  531. "Sig": sig
  532. })
  533. def queryEquipBusinessPolicy(request):
  534. """
  535. 省平台 用于查询运营商的充电设备接口计费模型信息
  536. :param request:
  537. :return:
  538. """
  539. # 验证身份
  540. token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
  541. logger.info('[queryEquipBusinessPolicy] , token = {}'.format(token))
  542. tokenData = parse_json_token(token)
  543. if not tokenData:
  544. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
  545. northers = ShanDongNorther.get_norther(**tokenData)
  546. if not northers:
  547. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
  548. # 准备token所获取的参数信息
  549. norther = northers.first()
  550. pullDataSecret = norther.pullDataSecret
  551. pullDataSecretIV = norther.pullDataSecretIV
  552. # 验证参数
  553. logger.debug("[queryEquipBusinessPolicy] request body = {}".format(request.body))
  554. if not request.body:
  555. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
  556. try:
  557. Data = json.loads(request.body).get("Data")
  558. data = json.loads(AES_CBC_PKCS5padding_decrypt(
  559. Data,
  560. dataSecret=pullDataSecret,
  561. dataSecretIV=pullDataSecretIV
  562. ))
  563. except Exception as e:
  564. logger.exception(e)
  565. return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
  566. equipBizSeq = data.get("EquipBizSeq")
  567. connectorID = data.get("ConnectorID")
  568. policyInfo = ShanDongNorther.get_policy_info(connectorID)
  569. result = {
  570. "EquipBizSeq": equipBizSeq,
  571. "ConnectorID": connectorID,
  572. "SuccStat": 0 if policyInfo else 1,
  573. "FailReason": 0 if policyInfo else 1,
  574. "SumPeriod": 1,
  575. "PolicyInfos": [policyInfo] if policyInfo else None
  576. }
  577. resultData = AES_CBC_PKCS5padding_encrypt(
  578. json.dumps(result),
  579. dataSecret=pullDataSecret,
  580. dataSecretIV=pullDataSecretIV
  581. )
  582. sig = norther.get_sig(resultData)
  583. logger.debug("[queryEquipBusinessPolicy] return result = {}".format(result))
  584. return JsonResponse({
  585. "Ret": 0,
  586. "Msg": u"请求成功",
  587. "Data": resultData,
  588. "Sig": sig
  589. })
  590. #####################
  591. #### 通用接口 ####
  592. #####################
  593. def send_api_order(payload, dealer, func):
  594. device = Device.get_dev_by_logicalCode(payload['deviceCode']) # type: DeviceDict
  595. if not device:
  596. raise ApiNoDeviceException()
  597. if not device.is_authorized_to_dealer(str(dealer.id)):
  598. raise ApiAuthDeviceException()
  599. if device.isApi == False:
  600. raise ApiDeviceModeException()
  601. record = APIStartDeviceRecord(orderNo = payload.get('orderNo', ''),
  602. deviceCode = payload.get('deviceCode', ''),
  603. createTime = payload.get('createTime', ''),
  604. notifyUrl = payload.get('payload', ''),
  605. apiConf = getattr(dealer, 'api_conf'),
  606. channel = payload.get('channel', ''),
  607. devNo = device['devNo'],
  608. ownerId = device['ownerId'],
  609. attachParas = payload.get('attachParas', {}))
  610. record.save()
  611. err_code = ErrorCode.EXCEPTION
  612. err_msg = u'系统错误'
  613. result = {}
  614. try:
  615. smartBox = device.deviceAdapter
  616. result = eval('smartBox.{}(record=payload)'.format(func))
  617. err_code = result.get('rst')
  618. err_msg = str(result.get('desc', ''))
  619. except ServiceException as e:
  620. logger.error('start device({}) failed error(code={},msg={})'.format(device['devNo'], e.result.get('result'),
  621. e.result.get('description')))
  622. err_code = e.result.get('result')
  623. err_msg = str(e.result.get('description'))
  624. except Exception as e:
  625. logger.exception('start device({}) failed error={}'.format(device['devNo'], e))
  626. err_code = ErrorCode.EXCEPTION
  627. err_msg = str(e)
  628. finally:
  629. try:
  630. record.errCode = err_code
  631. record.errMsg = err_msg
  632. record.servicedInfo = result
  633. record.servicedInfo.update({'function': func})
  634. record.save()
  635. except Exception as e:
  636. logger.exception(e)
  637. return {'status': err_code, 'desc': err_msg, 'result': result}