notify_order_info_to_north.py 9.7 KB

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