check_command_XmSgj.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import asyncio
  2. import datetime
  3. import hashlib
  4. import json
  5. import sys
  6. import time
  7. from concurrent.futures import ThreadPoolExecutor
  8. import requests
  9. sys.path.append("..")
  10. import uuid
  11. import chardet
  12. import message_pb2 as message
  13. import google.protobuf.text_format as tf
  14. import http_client
  15. class CommandChecker:
  16. def __init__(self,db):
  17. self._db = db
  18. self._dispatch_statu = {}
  19. self._in_url = 'http://110.80.15.100:9030/Api/CarInEntry'
  20. self._query_url = 'http://110.80.15.100:9030/Api/GetBill'
  21. self._out_url = 'http://110.80.15.100:9030/Api/CarOutEntry'
  22. self._secret_key = 'anzs74aph8ac8dy6tj48t05js6zpkgx5'
  23. self._parking_id = '2302221444266172014'
  24. self._app_id = 'blbc5zkpyymaicd3'
  25. self._plate_color = {'蓝色':'1','黑色':'2','黄色':'3','白色':'4','绿色':'5','其他':'6'}
  26. def push_http_request(self,url,request):
  27. results = ''
  28. statu = message.eError
  29. # with open('./test.txt', 'w', encoding='utf-8') as f:
  30. # # 将dic dumps json 格式进行写入
  31. # f.write(json.dumps(request))
  32. # return statu, results
  33. tm = time.time()
  34. # 若推送失败就重试最多2s
  35. while time.time() - tm < 2:
  36. try:
  37. resp = requests.post(url, json=request).json()
  38. if ('Tag' in resp.keys()) and resp['Tag'] == 1:
  39. statu = message.eNormal
  40. results = resp
  41. break
  42. else:
  43. statu = message.eError
  44. results = '收费系统反馈错误!message:%s' %resp
  45. except Exception as e:
  46. statu = message.eError
  47. results = '向收费系统推送请求失败! ERROR:%s' % (str(e.args))
  48. time.sleep(0.2)
  49. print(resp)
  50. return statu,results
  51. def exit_isOK(self, pick_body):
  52. pick_table = message.pick_table()
  53. try:
  54. tf.Parse(pick_body, pick_table)
  55. except Exception as e:
  56. pick_table.statu.execute_statu = message.eError
  57. pick_table.statu.statu_description = "设备故障,请联系管理员!" + "(取车表单错误)" + str(e.args)
  58. return pick_table
  59. if pick_table.primary_key is None or pick_table.primary_key == '':
  60. pick_table.statu.execute_statu = message.eWarning
  61. pick_table.statu.statu_description = " 唯一码不能为空!"
  62. else:
  63. # 查询车位表和指令表是否有该车
  64. space_res = self._db.query_space_in_primary_key(pick_table.primary_key)
  65. command_res = self._db.query_command_in_primary_key(pick_table.primary_key)
  66. if len(command_res) > 0:
  67. pick_table.statu.execute_statu = message.eWarning
  68. pick_table.statu.statu_description = "指令正在执行中!请稍等!"
  69. elif len(space_res) <= 0:
  70. pick_table.statu.execute_statu = message.eWarning
  71. pick_table.statu.statu_description = "车辆信息不存在!"
  72. else:
  73. # 向收费系统查询缴费情况
  74. request = self.get_request_data(pick_table, 'query')
  75. statu,response = self.push_http_request(self._query_url,request)
  76. if statu == message.eNormal:
  77. if ('Data' in response.keys()) and ('UnpaidMoney' in response['Data'].keys()):
  78. if response['Data']['UnpaidMoney'] == 0:
  79. # 完善表单信息
  80. try:
  81. pick_table.car_number = space_res[0]['car_number']
  82. pick_table.unit_id = space_res[0]['unit']
  83. pick_table.car_number_info.plate_color = space_res[0]['plate_color']
  84. pick_table.car_number_info.plate_type = space_res[0]['plate_type']
  85. pick_table.car_number_info.plate_confidence = space_res[0]['plate_confidence']
  86. pick_table.car_number_info.recognition_time = space_res[0]['recognition_time']
  87. pick_table.car_number_info.plate_full_image = ''
  88. pick_table.car_number_info.plate_clip_image = ''
  89. except Exception as e:
  90. pick_table.statu.execute_statu = message.eError
  91. pick_table.statu.statu_description = "设备故障,请联系管理员!" + "(数据库信息有误)" + str(e.args)
  92. # 向收费系统推送车辆离场
  93. request = self.get_request_data(pick_table, 'out')
  94. statu,response = self.push_http_request(self._out_url,request)
  95. if statu != message.eNormal:
  96. pick_table.statu.execute_statu = statu
  97. pick_table.statu.statu_description = response
  98. else:
  99. pick_table.statu.execute_statu = message.eWarning
  100. pick_table.statu.statu_description = "未缴费!请先缴费%d元再取车!"%response['Data']['UnpaidMoney']
  101. else:
  102. pick_table.statu.execute_statu = message.eError
  103. pick_table.statu.statu_description = "收费系统答复错误!请联系管理员!"
  104. else:
  105. pick_table.statu.execute_statu = statu
  106. pick_table.statu.statu_description = response
  107. return pick_table
  108. def receive_dispatch_statu(self, statu, ex, key):
  109. self._dispatch_statu[key] = statu
  110. def entrance_isOK(self, park_body):
  111. # 停车表单
  112. park_table = message.park_table()
  113. try:
  114. tf.Parse(park_body, park_table)
  115. except Exception as e:
  116. park_table.statu.execute_statu = message.eError
  117. park_table.statu.statu_description = "设备故障,请联系管理员!" + "(停车表单错误)" + str(e.args)
  118. return park_table
  119. # 检查调度状态
  120. key = "dispatch_%d_statu_port" % park_table.unit_id
  121. if (key in self._dispatch_statu) is False or self._dispatch_statu[key].timeout():
  122. park_table.statu.execute_statu = message.eError
  123. park_table.statu.statu_description = "设备故障,请联系管理员!" + "(调度)"
  124. return park_table
  125. # 获取车高信息
  126. dispatch_node_statu = message.dispatch_node_statu()
  127. try:
  128. tf.Parse(self._dispatch_statu[key].statu, dispatch_node_statu)
  129. except Exception:
  130. park_table.statu.execute_statu = message.eError
  131. park_table.statu.statu_description = "设备故障,请联系管理员!" + "(调度状态消息错误)"
  132. return park_table
  133. if dispatch_node_statu.plc_carrier_status == 0:
  134. park_table.statu.execute_statu = message.eError
  135. park_table.statu.statu_description = "设备故障,请联系管理员!" + "(搬运器)"
  136. return park_table
  137. elif dispatch_node_statu.plc_carrier_status == 4:
  138. park_table.statu.execute_statu = message.eWarning
  139. park_table.statu.statu_description = "该单元设备维护中!请前往其他入口!"
  140. return park_table
  141. car_height = dispatch_node_statu.dispatch_plc_passway_status_vector[park_table.import_id - 1].car_height
  142. if car_height == 0:
  143. park_table.statu.execute_statu = message.eWarning
  144. park_table.statu.statu_description = "未检测到车辆!"
  145. return park_table
  146. elif car_height == 4:
  147. park_table.statu.execute_statu = message.eWarning
  148. park_table.statu.statu_description = "车辆超高,请退出车库!"
  149. return park_table
  150. # 填写车高信息
  151. measure_info = message.measure_info()
  152. measure_info.height = car_height
  153. park_table.entrance_measure_info.CopyFrom(measure_info)
  154. # 赋值唯一码
  155. uid = str(uuid.uuid1())
  156. park_table.primary_key = uid
  157. # 查询车位表和指令表是否有该车
  158. space_res = self._db.query_space_in_car_number(park_table.car_number)
  159. command_res = self._db.query_command_in_car_number(park_table.car_number)
  160. if len(command_res) > 0:
  161. park_table.statu.execute_statu = message.eWarning
  162. park_table.statu.statu_description = "指令正在执行中!请稍等!"
  163. elif len(space_res) > 0:
  164. park_table.statu.execute_statu = message.eWarning
  165. park_table.statu.statu_description = "车辆 :%s 已在库内!" % park_table.car_number
  166. else:
  167. # 车辆不在库内 查询是否有对应大小空车位
  168. space_res = self._db.query_space_in_height_unit_and_empty(measure_info.height, park_table.unit_id)
  169. command_res = self._db.query_command_in_height_unit_and_statu(measure_info.height, park_table.unit_id)
  170. if len(space_res) - len(command_res) <= 0:
  171. park_table.statu.execute_statu = message.eWarning
  172. park_table.statu.statu_description = "没有空余车位,车牌号:%s 高度:%.3fm!" % (park_table.car_number, measure_info.height)
  173. else:
  174. # 向收费系统推送入场信息
  175. request = self.get_request_data(park_table,'in')
  176. statu,response = self.push_http_request(self._in_url,request)
  177. if statu != message.eNormal:
  178. park_table.statu.execute_statu = statu
  179. park_table.statu.statu_description = response
  180. else:
  181. if ('Data' in response.keys()) and ('InPicUrl' in response['Data'].keys()):
  182. park_table.car_number_info.plate_full_image = response['Data']['InPicUrl']
  183. park_table.car_number_info.plate_clip_image = response['Data']['InPlateUrl']
  184. else:
  185. park_table.statu.execute_statu = message.eError
  186. park_table.statu.statu_description = "收费系统答复错误!请联系管理员!"
  187. return park_table
  188. # 创建车辆入场请求
  189. def get_request_data(self, table,param):
  190. # 创建请求
  191. msgId = str(uuid.uuid1())+'@'+table.car_number
  192. AppId = self._app_id
  193. time = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
  194. sign = msgId+AppId+time+self._secret_key
  195. hl = hashlib.md5()
  196. hl.update(sign.encode(encoding='utf-8'))
  197. sign = hl.hexdigest()
  198. color = self._plate_color[table.car_number_info.plate_color] if table.car_number_info.plate_color in self._plate_color.keys() else self._plate_color['其他']
  199. if param == 'in':
  200. data = http_client.HttpRequest.InDate(self._parking_id,table.car_number,
  201. str(datetime.datetime.now().strftime('%Y-%m-%d')),
  202. '2302221446265822050',#str(table.unit_id*100+table.import_id)#,
  203. table.car_number_info.plate_type,color,
  204. table.car_number_info.plate_full_image,
  205. table.car_number_info.plate_clip_image,table.primary_key)
  206. elif param == 'query':
  207. data = http_client.HttpRequest.QueryData(table.primary_key,self._parking_id)
  208. elif param == 'out':
  209. data = http_client.HttpRequest.OutDate(self._parking_id, table.car_number,
  210. table.primary_key,
  211. str(datetime.datetime.now().strftime('%Y-%m-%d')),
  212. '2302221729013462154',#str(table.unit_id*100)#,
  213. table.car_number_info.plate_type,color,
  214. table.car_number_info.plate_full_image,
  215. table.car_number_info.plate_clip_image)
  216. request = http_client.HttpRequest(msgId,AppId,time,sign,data)
  217. return request.__dict__