123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- import asyncio
- import datetime
- import hashlib
- import json
- import sys
- import time
- from concurrent.futures import ThreadPoolExecutor
- import requests
- sys.path.append("..")
- import uuid
- import chardet
- import message_pb2 as message
- import google.protobuf.text_format as tf
- import http_client
- class CommandChecker:
- def __init__(self,db):
- self._db = db
- self._dispatch_statu = {}
- self._in_url = 'http://110.80.15.100:9030/Api/CarInEntry'
- self._query_url = 'http://110.80.15.100:9030/Api/GetBill'
- self._out_url = 'http://110.80.15.100:9030/Api/CarOutEntry'
- self._secret_key = 'anzs74aph8ac8dy6tj48t05js6zpkgx5'
- self._parking_id = '2302221444266172014'
- self._app_id = 'blbc5zkpyymaicd3'
- self._plate_color = {'蓝色':'1','黑色':'2','黄色':'3','白色':'4','绿色':'5','其他':'6'}
- def push_http_request(self,url,request):
- results = ''
- statu = message.eError
- # with open('./test.txt', 'w', encoding='utf-8') as f:
- # # 将dic dumps json 格式进行写入
- # f.write(json.dumps(request))
- # return statu, results
- tm = time.time()
- # 若推送失败就重试最多2s
- while time.time() - tm < 2:
- try:
- resp = requests.post(url, json=request).json()
- if ('Tag' in resp.keys()) and resp['Tag'] == 1:
- statu = message.eNormal
- results = resp
- break
- else:
- statu = message.eError
- results = '收费系统反馈错误!message:%s' %resp
- except Exception as e:
- statu = message.eError
- results = '向收费系统推送请求失败! ERROR:%s' % (str(e.args))
- time.sleep(0.2)
- print(resp)
- return statu,results
- def exit_isOK(self, pick_body):
- pick_table = message.pick_table()
- try:
- tf.Parse(pick_body, pick_table)
- except Exception as e:
- pick_table.statu.execute_statu = message.eError
- pick_table.statu.statu_description = "设备故障,请联系管理员!" + "(取车表单错误)" + str(e.args)
- return pick_table
- if pick_table.primary_key is None or pick_table.primary_key == '':
- pick_table.statu.execute_statu = message.eWarning
- pick_table.statu.statu_description = " 唯一码不能为空!"
- else:
- # 查询车位表和指令表是否有该车
- space_res = self._db.query_space_in_primary_key(pick_table.primary_key)
- command_res = self._db.query_command_in_primary_key(pick_table.primary_key)
- if len(command_res) > 0:
- pick_table.statu.execute_statu = message.eWarning
- pick_table.statu.statu_description = "指令正在执行中!请稍等!"
- elif len(space_res) <= 0:
- pick_table.statu.execute_statu = message.eWarning
- pick_table.statu.statu_description = "车辆信息不存在!"
- else:
- # 向收费系统查询缴费情况
- request = self.get_request_data(pick_table, 'query')
- statu,response = self.push_http_request(self._query_url,request)
- if statu == message.eNormal:
- if ('Data' in response.keys()) and ('UnpaidMoney' in response['Data'].keys()):
- if response['Data']['UnpaidMoney'] == 0:
- # 完善表单信息
- try:
- pick_table.car_number = space_res[0]['car_number']
- pick_table.unit_id = space_res[0]['unit']
- pick_table.car_number_info.plate_color = space_res[0]['plate_color']
- pick_table.car_number_info.plate_type = space_res[0]['plate_type']
- pick_table.car_number_info.plate_confidence = space_res[0]['plate_confidence']
- pick_table.car_number_info.recognition_time = space_res[0]['recognition_time']
- pick_table.car_number_info.plate_full_image = ''
- pick_table.car_number_info.plate_clip_image = ''
- except Exception as e:
- pick_table.statu.execute_statu = message.eError
- pick_table.statu.statu_description = "设备故障,请联系管理员!" + "(数据库信息有误)" + str(e.args)
- # 向收费系统推送车辆离场
- request = self.get_request_data(pick_table, 'out')
- statu,response = self.push_http_request(self._out_url,request)
- if statu != message.eNormal:
- pick_table.statu.execute_statu = statu
- pick_table.statu.statu_description = response
- else:
- pick_table.statu.execute_statu = message.eWarning
- pick_table.statu.statu_description = "未缴费!请先缴费%d元再取车!"%response['Data']['UnpaidMoney']
- else:
- pick_table.statu.execute_statu = message.eError
- pick_table.statu.statu_description = "收费系统答复错误!请联系管理员!"
- else:
- pick_table.statu.execute_statu = statu
- pick_table.statu.statu_description = response
- return pick_table
- def receive_dispatch_statu(self, statu, ex, key):
- self._dispatch_statu[key] = statu
- def entrance_isOK(self, park_body):
- # 停车表单
- park_table = message.park_table()
- try:
- tf.Parse(park_body, park_table)
- except Exception as e:
- park_table.statu.execute_statu = message.eError
- park_table.statu.statu_description = "设备故障,请联系管理员!" + "(停车表单错误)" + str(e.args)
- return park_table
- # 检查调度状态
- key = "dispatch_%d_statu_port" % park_table.unit_id
- if (key in self._dispatch_statu) is False or self._dispatch_statu[key].timeout():
- park_table.statu.execute_statu = message.eError
- park_table.statu.statu_description = "设备故障,请联系管理员!" + "(调度)"
- return park_table
- # 获取车高信息
- dispatch_node_statu = message.dispatch_node_statu()
- try:
- tf.Parse(self._dispatch_statu[key].statu, dispatch_node_statu)
- except Exception:
- park_table.statu.execute_statu = message.eError
- park_table.statu.statu_description = "设备故障,请联系管理员!" + "(调度状态消息错误)"
- return park_table
- if dispatch_node_statu.plc_carrier_status == 0:
- park_table.statu.execute_statu = message.eError
- park_table.statu.statu_description = "设备故障,请联系管理员!" + "(搬运器)"
- return park_table
- elif dispatch_node_statu.plc_carrier_status == 4:
- park_table.statu.execute_statu = message.eWarning
- park_table.statu.statu_description = "该单元设备维护中!请前往其他入口!"
- return park_table
- car_height = dispatch_node_statu.dispatch_plc_passway_status_vector[park_table.import_id - 1].car_height
- if car_height == 0:
- park_table.statu.execute_statu = message.eWarning
- park_table.statu.statu_description = "未检测到车辆!"
- return park_table
- elif car_height == 4:
- park_table.statu.execute_statu = message.eWarning
- park_table.statu.statu_description = "车辆超高,请退出车库!"
- return park_table
- # 填写车高信息
- measure_info = message.measure_info()
- measure_info.height = car_height
- park_table.entrance_measure_info.CopyFrom(measure_info)
- # 赋值唯一码
- uid = str(uuid.uuid1())
- park_table.primary_key = uid
- # 查询车位表和指令表是否有该车
- space_res = self._db.query_space_in_car_number(park_table.car_number)
- command_res = self._db.query_command_in_car_number(park_table.car_number)
- if len(command_res) > 0:
- park_table.statu.execute_statu = message.eWarning
- park_table.statu.statu_description = "指令正在执行中!请稍等!"
- elif len(space_res) > 0:
- park_table.statu.execute_statu = message.eWarning
- park_table.statu.statu_description = "车辆 :%s 已在库内!" % park_table.car_number
- else:
- # 车辆不在库内 查询是否有对应大小空车位
- space_res = self._db.query_space_in_height_unit_and_empty(measure_info.height, park_table.unit_id)
- command_res = self._db.query_command_in_height_unit_and_statu(measure_info.height, park_table.unit_id)
- if len(space_res) - len(command_res) <= 0:
- park_table.statu.execute_statu = message.eWarning
- park_table.statu.statu_description = "没有空余车位,车牌号:%s 高度:%.3fm!" % (park_table.car_number, measure_info.height)
- else:
- # 向收费系统推送入场信息
- request = self.get_request_data(park_table,'in')
- statu,response = self.push_http_request(self._in_url,request)
- if statu != message.eNormal:
- park_table.statu.execute_statu = statu
- park_table.statu.statu_description = response
- else:
- if ('Data' in response.keys()) and ('InPicUrl' in response['Data'].keys()):
- park_table.car_number_info.plate_full_image = response['Data']['InPicUrl']
- park_table.car_number_info.plate_clip_image = response['Data']['InPlateUrl']
- else:
- park_table.statu.execute_statu = message.eError
- park_table.statu.statu_description = "收费系统答复错误!请联系管理员!"
- return park_table
- # 创建车辆入场请求
- def get_request_data(self, table,param):
- # 创建请求
- msgId = str(uuid.uuid1())+'@'+table.car_number
- AppId = self._app_id
- time = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
- sign = msgId+AppId+time+self._secret_key
- hl = hashlib.md5()
- hl.update(sign.encode(encoding='utf-8'))
- sign = hl.hexdigest()
- 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['其他']
- if param == 'in':
- data = http_client.HttpRequest.InDate(self._parking_id,table.car_number,
- str(datetime.datetime.now().strftime('%Y-%m-%d')),
- '2302221446265822050',#str(table.unit_id*100+table.import_id)#,
- table.car_number_info.plate_type,color,
- table.car_number_info.plate_full_image,
- table.car_number_info.plate_clip_image,table.primary_key)
- elif param == 'query':
- data = http_client.HttpRequest.QueryData(table.primary_key,self._parking_id)
- elif param == 'out':
- data = http_client.HttpRequest.OutDate(self._parking_id, table.car_number,
- table.primary_key,
- str(datetime.datetime.now().strftime('%Y-%m-%d')),
- '2302221729013462154',#str(table.unit_id*100)#,
- table.car_number_info.plate_type,color,
- table.car_number_info.plate_full_image,
- table.car_number_info.plate_clip_image)
- request = http_client.HttpRequest(msgId,AppId,time,sign,data)
- return request.__dict__
|