Commit 9efa2d93 authored by Allvey's avatar Allvey

加入经纬信息距离判断

parent 35032303
...@@ -554,12 +554,10 @@ class GroupDispatcher: ...@@ -554,12 +554,10 @@ class GroupDispatcher:
raise Exception(f'车辆 {truck_name} 任务信息丢失') raise Exception(f'车辆 {truck_name} 任务信息丢失')
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
# truck_dispatch[truck_id] = [None, None]
return return
# 获取车辆位置信息 # 获取车辆位置信息
try: try:
# truck_locate = self.group.truck.get_truck_lane_locate_dict()[truck_id]
truck_locate = self.group.truck.truck_lane_locate_dict[truck_id] truck_locate = self.group.truck.truck_lane_locate_dict[truck_id]
except Exception as es: except Exception as es:
...@@ -578,31 +576,6 @@ class GroupDispatcher: ...@@ -578,31 +576,6 @@ class GroupDispatcher:
if truck_task == 3: if truck_task == 3:
self.logger.info("正常重载行驶, 执行重载周期调度") self.logger.info("正常重载行驶, 执行重载周期调度")
self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip) self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
# if self.group.topo is not None and truck_locate is not None:
# self.logger.info("潜在二次调度车辆状态")
# self.logger.info(f'车辆 {truck_name}')
# self.logger.info(f'车辆位置 {truck_locate}')
# self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
# self.logger.info(f'车辆任务 {truck_task}')
# self.logger.info(f'车辆临时 {truck_is_temp}')
# self.logger.info(self.group.topo.cross_bf_lanes)
# self.logger.info(self.group.truck.truck_current_state)
# # 车辆当前位于交叉路口前,且排队等待
# if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
# self.logger.info("触发二次调度")
# # self.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip)
# try:
# truck_info.redispatch =\
# self.redispatcher.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip, truck_info)
# except Exception as es:
# self.logger.error("二次调度至卸载点失败")
# self.logger.error(es)
# else:
# self.logger.info("未触发二次调度, 执行重载周期调度")
# self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
# else:
# self.logger.info("正常重载行驶, 执行重载周期调度")
# self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
else: else:
self.logger.info("卸载区内, 执行重载周期调度") self.logger.info("卸载区内, 执行重载周期调度")
...@@ -610,40 +583,31 @@ class GroupDispatcher: ...@@ -610,40 +583,31 @@ class GroupDispatcher:
# 车辆位于装载区内, 调度车辆前往卸载区 # 车辆位于装载区内, 调度车辆前往卸载区
elif truck_task in [0, 1, 2]: elif truck_task in [0, 1, 2]:
if truck_task == 0: if truck_task == 0 and self.gothrough_active and truck_locate is not None:
if self.gothrough_active:
self.logger.info("穿越装载区调度开启") self.logger.info("穿越装载区调度开启")
self.gothroghdispatcher.update_lanes_info() self.gothroghdispatcher.update_lanes_info()
try:
excavator_prise_location = get_excavator_prise_location(self.gothroghdispatcher.closer_excavator_id)
truck_prise_location = self.group.truck.truck_current_prise_location[truck_id]
except Exception as es:
self.logger.error("挖机或车辆经纬信息未知")
self.logger.error(es)
excavator_prise_location = [-1, -1]
truck_prise_location = [-1, -1]
self.logger.info(f'挖机经纬度信息 {excavator_prise_location}')
self.logger.info(f'车辆经纬度信息 {truck_prise_location}')
from haversine import haversine
self.logger.info(haversine(excavator_prise_location, truck_prise_location))
if excavator_prise_location[0] != -1 and \
truck_prise_location[0] != -1 and \
haversine(excavator_prise_location, truck_prise_location) > 0.070 and \
truck_locate in self.gothroghdispatcher.closer_area_backtrack_lanes:
self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck, truck_dispatch=truck_dispatch) self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck, truck_dispatch=truck_dispatch)
# if self.group.topo is not None and truck_locate is not None:
# # 穿越装载区判断
# if self.gothrough_active:
# self.logger.info("穿越装载区调度开启")
# self.gothroghdispatcher.update_lanes_info()
# self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck)
# self.logger.info("潜在二次调度车辆状态")
#
# # 车辆当前位于交叉路口前,且排队等待
# self.logger.info(f'车辆 {truck_name}')
# self.logger.info(f'车辆位置 {truck_locate}')
# self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
# self.logger.info(f'车辆临时 {truck_is_temp}')
# self.logger.info(self.group.topo.cross_bf_lanes)
# self.logger.info(self.group.truck.truck_current_state)
# if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
# self.logger.info("触发二次调度")
#
# try:
# truck_info.redispatch =\
# self.redispatcher.redispatch_to_excavator(truck_id, truck_dispatch, truck_locate,
# truck_trip, truck_info)
# except Exception as es:
# self.logger.error("二次调度至装载点失败")
# self.logger.error(es)
# else:
# self.logger.info("未触发二次调度,执行空载周期调度")
# self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
else: else:
self.logger.info("正常空载行驶,执行空载周期调度") self.logger.info("正常空载行驶,执行空载周期调度")
...@@ -1329,7 +1293,7 @@ class GoThroughDispatcher: ...@@ -1329,7 +1293,7 @@ class GoThroughDispatcher:
self.logger.error(es) self.logger.error(es)
if (target_excavator is not None) and (excavator_now != target_excavator): if (target_excavator is not None) and (excavator_now != target_excavator):
self.logger.info(f'更新车辆 {request_truck_name} 派车计划前往 {target_excavator}') self.logger.info(f'近端lanes {request_truck_name} 派车计划前往 {target_excavator}')
# 派车计划写入redis # 派车计划写入redis
truck_dispatch_to_redis(request_truck_id, group_id, target_excavator) truck_dispatch_to_redis(request_truck_id, group_id, target_excavator)
......
...@@ -89,6 +89,8 @@ class TruckInfo(WalkManage): ...@@ -89,6 +89,8 @@ class TruckInfo(WalkManage):
self.truck_lane_locate_dict = {} self.truck_lane_locate_dict = {}
# 车辆临时调度 # 车辆临时调度
self.truck_is_temp = {} self.truck_is_temp = {}
# 矿卡经纬信息
self.truck_current_prise_location = {}
def get_truck_current_trip(self): def get_truck_current_trip(self):
return self.truck_current_trip return self.truck_current_trip
...@@ -173,6 +175,38 @@ class TruckInfo(WalkManage): ...@@ -173,6 +175,38 @@ class TruckInfo(WalkManage):
self.logger.info("矿卡任务信息") self.logger.info("矿卡任务信息")
self.logger.info(self.truck_current_task) self.logger.info(self.truck_current_task)
def update_truck_prise_location(self):
self.truck_current_prise_location = {}
device_name_set = redis2.keys()
truck_name_to_uuid_dict = get_value("truck_name_to_uuid_dict")
for item in device_name_set:
try:
item = item.decode(encoding="utf-8")
key_value_dict = redis2.hgetall(item) # reids str可以自动转为bytes
if str_to_byte("type") in key_value_dict:
device_type = int(key_value_dict[str_to_byte("type")])
else:
continue
if device_type == 1:
if item not in truck_name_to_uuid_dict:
raise CoreException(107, f'车辆{item}不存在于truck_name_to_uuid_dict')
if truck_name_to_uuid_dict[item] in self.dynamic_truck_set:
currentLongitude = float(byte_to_str(key_value_dict[str_to_byte("longitude")]))
currentLatitude = float(byte_to_str(key_value_dict[str_to_byte("latitude")]))
self.truck_current_prise_location[
truck_name_to_uuid_dict[item]
] = (currentLatitude, currentLongitude)
except Exception as es:
self.logger.warning("读取矿卡经纬信息异常-reids读取异常")
self.logger.warning(es)
self.logger.info("矿卡经纬信息")
self.logger.info(self.truck_current_prise_location)
def update_truck_is_temp(self): def update_truck_is_temp(self):
""" """
...@@ -919,3 +953,6 @@ class TruckInfo(WalkManage): ...@@ -919,3 +953,6 @@ class TruckInfo(WalkManage):
# 矿卡位置更新 # 矿卡位置更新
self.update_trucks_lane_locate() self.update_trucks_lane_locate()
# 更新矿卡经纬信息
self.update_truck_prise_location()
...@@ -10,6 +10,7 @@ from data.para_config import * ...@@ -10,6 +10,7 @@ from data.para_config import *
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
import uuid import uuid
def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set, closer_lane_set, def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set, closer_lane_set,
logger, truck, truck_locates_dict, closer_excavator_state, further_excavator_state): logger, truck, truck_locates_dict, closer_excavator_state, further_excavator_state):
""" """
...@@ -50,7 +51,7 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set ...@@ -50,7 +51,7 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
logger.info(arrival_truck_list) logger.info(arrival_truck_list)
logger.info(f"输入的closer_lane_set{closer_lane_set}") logger.info(f"输入的closer_lane_set{closer_lane_set}")
closer_lane_set_nearest = [closer_lane_set[-1]] closer_lane_set_nearest = [closer_lane_set[0]]
# 统计不同状态车辆数量 # 统计不同状态车辆数量
goto_closer_area_num = 0 goto_closer_area_num = 0
goto_further_area_num = 0 goto_further_area_num = 0
...@@ -109,9 +110,8 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set ...@@ -109,9 +110,8 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
# target_excavator = DispatchInfo.load_excavator_dict[closer_area_id] # target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id]) # # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
# 近端挖机空闲 # 近端挖机空闲
if closer_excavator_state == 0 and goto_closer_area_num == 0: if closer_excavator_state == 0:
logger.info("近端挖机空闲, 调度车辆前往近端装载区") logger.info("近端挖机空闲, 调度车辆前往近端装载区")
target_excavator = DispatchInfo.load_excavator_dict[closer_area_id] target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id]) # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
...@@ -140,10 +140,10 @@ def area_analysis(load_area_uuid): ...@@ -140,10 +140,10 @@ def area_analysis(load_area_uuid):
load_area_uuid[0] = excavator_uuid_to_load_area_uuid_dict[load_area_uuid[0]] load_area_uuid[0] = excavator_uuid_to_load_area_uuid_dict[load_area_uuid[0]]
load_area_uuid[1] = excavator_uuid_to_load_area_uuid_dict[load_area_uuid[1]] load_area_uuid[1] = excavator_uuid_to_load_area_uuid_dict[load_area_uuid[1]]
distance_a = session_postgre.query(WalkTimePark)\ distance_a = session_postgre.query(WalkTimePark) \
.filter_by(load_area_id=load_area_uuid[0]).first().park_load_distance .filter_by(load_area_id=load_area_uuid[0]).first().park_load_distance
distance_b = session_postgre.query(WalkTimePark)\ distance_b = session_postgre.query(WalkTimePark) \
.filter_by(load_area_id=load_area_uuid[1]).first().park_load_distance .filter_by(load_area_id=load_area_uuid[1]).first().park_load_distance
if distance_a > distance_b: if distance_a > distance_b:
...@@ -265,9 +265,6 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id): ...@@ -265,9 +265,6 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id):
item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first()) item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first())
logger.error(es) logger.error(es)
logger.info(f"{type(truck_id)}")
logger.info(f"{type(item.truck_id)}")
if str(truck_id) != str(item.truck_id):
logger.info("无重复派车计划,重新生成中") logger.info("无重复派车计划,重新生成中")
# 其余调度信息写入 # 其余调度信息写入
try: try:
...@@ -289,8 +286,6 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id): ...@@ -289,8 +286,6 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id):
logger.error(es) logger.error(es)
finally: finally:
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
else:
logger.info("调度计划相同,无需变更")
def get_lanes_between_entrances(closer_node_id, further_node_id): def get_lanes_between_entrances(closer_node_id, further_node_id):
...@@ -353,3 +348,31 @@ def get_excavator_state(excavator_id): ...@@ -353,3 +348,31 @@ def get_excavator_state(excavator_id):
logger.error("挖机状态读取异常") logger.error("挖机状态读取异常")
logger.error(es) logger.error(es)
return 0 return 0
def get_excavator_prise_location(excavator_id):
"""
get group_excavators prise location.
:param excavator_id:
:return: location
"""
try:
logger.error(excavator_id)
device_name = session_mysql.query(Equipment).filter_by(id=excavator_id, device_type=2).first().device_name
are_entrance_key = str("Area_" + device_name)
key_value_dict = json.loads(byte_to_str(redis0.get(are_entrance_key)))
loc_str = key_value_dict['Entrance'] .split(",")
longitude = float(loc_str[0])
latitude = float(loc_str[1])
location = (latitude, longitude)
return location
except Exception as es:
logger.error("挖机状态读取异常")
logger.error(es)
location = (-1, -1)
return location
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment