notify_order_info_to_north.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import hashlib
  5. import hmac
  6. import json
  7. import logging
  8. import os
  9. import random
  10. import requests
  11. from base import init_env
  12. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "configs.testing")
  13. init_env(interactive = False)
  14. from apps.web.user.models import RechargeRecord
  15. from apps.web.south_intf.swap_carcharger import SwapContract
  16. from apps.web.api.utils import AES_CBC_PKCS5padding_encrypt, AES_CBC_PKCS5padding_decrypt
  17. logger = logging.getLogger(__name__)
  18. # newObj = SwapContract(
  19. # source = u'快电',
  20. # swapLabel = 'wfl_kd',
  21. # operatorType = 'agent',
  22. # operatorInnerId = '5b5d87ebaa4fca310e25c5b1',
  23. # OperatorID = 'MA4KWBHB5',
  24. # OperatorName = u'微付乐',
  25. # OperatorTell = '18963981712',
  26. # OperatorTel2 = '19063981712',
  27. # OperatorRegAddress = u'光谷物联港',
  28. # OperatorNote = u'oooo',
  29. # northToken = 'waerasasfwr322',
  30. # northPort = 'localhost:1883',
  31. #
  32. # secretFromUs = 'UePNOXPHzb4Jz6cD',
  33. # sigSecretFromUs = 'y6J5Qneg7e9tZ2XI',
  34. # dataSecretFromUs = 'G6WRJDkZUFW3XSmP',
  35. # dataSecretIVFromUs = 'vN2yZWX54Z9zaIZQ',
  36. #
  37. # operatorId2Us = 'MA005DBW1',
  38. # secret2Us = 'UePNOXPHzb4Jz6cD',
  39. # sigSecret2Us = 'y6J5Qneg7e9tZ2XI',
  40. # dataSecret2Us = 'G6WRJDkZUFW3XSmP',
  41. # dataSecretIV2Us = 'vN2yZWX54Z9zaIZQ',
  42. # )
  43. #
  44. # newObj.save()
  45. # dev = Device.get_dev_by_l('32010600110308')
  46. # box = ActionDeviceBuilder.create_action_device(dev)
  47. # box.get_port_status_from_dev()
  48. kdOperId = 'MA005DBW1'
  49. kdSecret = 'UePNOXPHzb4Jz6cD'
  50. sigSecret2Us = 'y6J5Qneg7e9tZ2XI'
  51. dataSecret2Us = 'G6WRJDkZUFW3XSmP'
  52. dataSecretIV2Us = 'vN2yZWX54Z9zaIZQ'
  53. testUrl = 'http://211.159.224.10' #'http://localhost:8011' #
  54. def get_sig( data):
  55. sigSecret = sigSecret2Us
  56. return hmac.new(sigSecret, data, hashlib.md5).hexdigest().upper()
  57. def get_token():
  58. url = '%s/api/swap/wfl_kd/query_token' % testUrl
  59. data = {
  60. "OperatorID": kdOperId,
  61. "OperatorSecret": kdSecret
  62. }
  63. result = send_request(url, **data)
  64. ret = result.get("Ret")
  65. print 'ret is ',ret
  66. if ret != 0:
  67. return
  68. responseJson = result.get("Data")
  69. print 'get token data :',responseJson
  70. responseData = json.loads(
  71. AES_CBC_PKCS5padding_decrypt(s=responseJson, dataSecret=dataSecret2Us, dataSecretIV=dataSecretIV2Us) or "{}"
  72. )
  73. # 防止解析出错
  74. token = responseData.get("AccessToken", "")
  75. print 'token is :',token
  76. return token
  77. def send_request( url, **kwargs):
  78. """
  79. 主动发送HTTP请求获取数据 秘钥以及签名
  80. :param url:
  81. :param kwargs:
  82. :return:
  83. """
  84. headers = {"Content-Type": "application/json;charset=utf-8"}
  85. token = kwargs.pop("token", None)
  86. if token: headers.update({"Authorization": "Bearer {}".format(token)})
  87. timeout = kwargs.pop("timeout", 60)
  88. # 主动推送 加密以及向量为 dataSecret 和 dataSecretIV
  89. data = AES_CBC_PKCS5padding_encrypt(
  90. json.dumps(kwargs), dataSecret=dataSecret2Us, dataSecretIV=dataSecretIV2Us
  91. )
  92. data = {
  93. "OperatorID": kdOperId,
  94. "TimeStamp": datetime.datetime.now().strftime("%Y%m%d%H%M%S"),
  95. "Seq": "{:0>4}".format(random.randint(1, 1)),
  96. "Data": data
  97. }
  98. sig = get_sig(data.get("OperatorID") + data.get("Data") + data.get("TimeStamp") + data.get("Seq"))
  99. data.update({"Sig": sig})
  100. try:
  101. response = requests.post(url = url, json = data, headers = headers, timeout = timeout)
  102. except requests.Timeout:
  103. return dict()
  104. except Exception as e:
  105. return dict()
  106. if response.status_code != 200:
  107. return dict()
  108. return response.json()
  109. # 测试query stations info
  110. token = get_token()
  111. # LastQueryTime = '2022-02-01 00:00:00'
  112. # pageNo = 1
  113. # pageSize = 10
  114. # result = send_request('%s/api/swap/wfl_kd/query_stations_info' % testUrl,token=token,LastQueryTime=LastQueryTime,pageNo=pageNo,pageSize=pageSize)
  115. # LastQueryTime = '2022-02-01 00:00:00'
  116. # pageNo = 1
  117. # pageSize = 10
  118. # result = send_request('%s/api/swap/wfl_kd/query_stations_info' % testUrl,token=token,LastQueryTime=LastQueryTime,pageNo=pageNo,pageSize=pageSize)
  119. # from apps.web.constant import Const
  120. # dev = Device.get_dev_by_l('11112203240001')
  121. # SwapContract.notify_2_all_northers_port_status(dev, 1, Const.DEV_WORK_STATUS_FAULT)
  122. # StationIDs = ['d6d5e1621d073a0f']
  123. # result = send_request('%s/api/swap/wfl_kd/query_station_status'% testUrl,token=token,StationIDs=StationIDs)
  124. # StationID = 'd6d5e1621d073a0f'
  125. # StartTime = '2000-02-01'
  126. # EndTime = '2023-02-01'
  127. # result = send_request('%s/api/swap/wfl_kd/query_station_stats'% testUrl,token=token,StationID=StationID,StartTime=StartTime,EndTime = EndTime)
  128. # EquipAuthSeq = 'd6d5e1621d073a0f'
  129. # ConnectorID = '62c3d8e5b7c98916a00bf0be'
  130. # result = send_request('%s/api/swap/wfl_kd/query_equip_auth'% testUrl,token=token,EquipAuthSeq=EquipAuthSeq,ConnectorID=ConnectorID)
  131. # EquipBizSeq = 'd6d5e1621d073a0f'
  132. # ConnectorID = '623c3d54b7c98903d90b4e8e'
  133. # result = send_request('%s/api/swap/wfl_kd/query_equip_business_policy'% testUrl,token=token,EquipBizSeq=EquipBizSeq,ConnectorID=ConnectorID)
  134. # StartChargeSeq = 'd6d5e1621d073a0f2222'
  135. # ConnectorID = '62c3d8e5b7c98916a00bf0be'
  136. # QRCode = ''
  137. # result = send_request('%s/api/swap/wfl_kd/query_start_charge'% testUrl,token=token,StartChargeSeq=StartChargeSeq,ConnectorID=ConnectorID,QRCode=QRCode)
  138. # StartChargeSeq = 'd6d5e1621d073a0f2222'
  139. # result = send_request('%s/api/swap/wfl_kd/query_equip_charge_status'% testUrl,token=token,StartChargeSeq=StartChargeSeq)
  140. # StartChargeSeq = 'd6d5e1621d073a0f2222'
  141. # ConnectorID = '623c3d54b7c98903d90b4e8e'
  142. # result = send_request('%s/api/swap/wfl_kd/query_stop_charge'% testUrl,token=token,StartChargeSeq=StartChargeSeq,ConnectorID=ConnectorID)
  143. # dev = Device.get_dev_by_l('11112203240001')
  144. # SwapContract.notify_2_all_northers_port_network_status(dev,DeviceOnlineStatus.DEV_STATUS_OFFLINE)
  145. # SwapContract.notify_2_all_northers_port_status(dev,1,1)
  146. # orderStatus ={
  147. # 'StartChargeSeq':'123412341234',
  148. # 'StartChargeSeqStat':4 ,
  149. # 'ConnectorID':'2323423',
  150. # 'ConnectorStatus':2,
  151. # 'CurrentA':2,
  152. # 'VoltageA':220.0,
  153. # 'Soc':0,
  154. # 'StartTime':'2022-02-23 00:00:23',
  155. # 'EndTime':'2022-02-23 00:00:23',
  156. # 'TotalPower':3,
  157. # 'TotalMoney':4,
  158. # 'ConnectorId':'223232323',
  159. # }
  160. #
  161. # SwapContract.notify_2_all_northers_order_status(dev,orderStatus)
  162. # result = {
  163. # 'StartChargeSeq':'123412341234',
  164. # 'StartChargeSeqStat':4 ,
  165. # 'ConnectorID':'2323423',
  166. # 'ConnectorStatus':2,
  167. # 'StartTime':'2022-02-23 00:00:23',
  168. # 'EndTime':'2022-02-23 00:00:23',
  169. # 'TotalPower':3,
  170. # 'TotalElecMoney':4,
  171. # 'TotalSeviceMoney':3,
  172. # 'TotalMoney':4,
  173. # 'StopReason':2
  174. # }
  175. # SwapContract.notify_2_all_northers_order_info(dev,result)
  176. from apps.web.device.models import Device,Part
  177. def notify_order(orderNo):
  178. rechargeRcd = RechargeRecord.objects(wxOrderNo = orderNo).first()
  179. if rechargeRcd is None:
  180. return
  181. devNo = rechargeRcd.devNo
  182. part = Part.objects(logicalCode = rechargeRcd.logicalCode,partNo = str(rechargeRcd.extraInfo['portNo'])).first()
  183. if part is None:
  184. return
  185. devObj = Device.objects(devNo = devNo).first()
  186. if devObj is None:
  187. return
  188. feeMode= devObj.otherConf.get('feeMode')
  189. serveMoney = feeMode['jianServe'] * consumeDict['jianElec'] + feeMode['fengServe'] * consumeDict['fengElec'] \
  190. + feeMode['pingServe'] * consumeDict['pingElec'] + feeMode['guServe'] * consumeDict['guElec']
  191. reasonAdapter = {'40':1,'41':2,'42':1,'43':1,'44':1,'45':0,'00':1}
  192. result = {
  193. 'StartChargeSeq':rechargeRcd.wxOrderNo,
  194. 'ConnectorID':str(part.id),
  195. 'StartTime':rechargeRcd.time,
  196. 'EndTime':consumeDict['finishTime'],
  197. 'TotalPower':consumeDict['elec'],
  198. 'TotalElecMoney':consumeDict['spendMoney'] - serveMoney,
  199. 'TotalSeviceMoney':serveMoney,
  200. 'TotalMoney':consumeDict['spendMoney'],
  201. 'StopReason':reasonAdapter.get(data[312:328],0) if int(data[312:328]) <= 45 else int(data[312:328]) - 65
  202. }
  203. consumeRcd.servicedInfo.update(result)
  204. consumeRcd.save()
  205. SwapContract.notify_2_all_northers_order_info(self.device,result)
  206. print 'OK'