Commit 94b4364e authored by Allvey's avatar Allvey

空车智能增加穿越装载区功能 & 增加挖机禁止功能(仅限穿越装载区及二次调度)

parent 81aa8aa4
......@@ -27,11 +27,11 @@
"password": "Huituo@123"
},
"gothrough": {
"closer_area_name": "哈装测试",
"further_area_name": "哈装2",
"closer_area_name": "7#装载",
"further_area_name": "6#装载区",
"factor" : 0.6
},
"geom": {
"redispatch_minimal_distance": 40
"redispatch_minimal_distance": 20
}
}
......@@ -568,7 +568,7 @@ class GroupDispatcher:
truck_prise_location = self.group.truck.truck_current_prise_location[truck_id]
if not is_close_to_cross(cross_lane, truck_prise_location):
self.logger.info(f'距离过近无法触发穿越装载区调度')
# self.logger.info(f'距离过近无法触发穿越装载区调度')
try:
# 获取近端装载区入场点经纬度信息
......@@ -589,11 +589,16 @@ class GroupDispatcher:
truck_to_entrance_point_dis = haversine(excavator_prise_location, truck_prise_location)
self.logger.info(f'车辆到近端装载区入场点距离 {truck_to_entrance_point_dis}')
self.logger.info("穿越装载区触发路段")
self.logger.info(truck_locate)
self.logger.info(self.gothroghdispatcher.closer_area_backtrack_lanes[1:3])
self.logger.info(self.gothroghdispatcher.closer_area_backtrack_lanes)
# 若车辆到入场点距离大于指定阈值
if excavator_prise_location[0] != -1 and \
truck_prise_location[0] != -1 and \
haversine(excavator_prise_location, truck_prise_location) > 0.001 and \
truck_locate in self.gothroghdispatcher.closer_area_backtrack_lanes[0:2]:
truck_locate in self.gothroghdispatcher.closer_area_backtrack_lanes[1:3]:
try:
self.logger.info("触发穿越装载区调度")
planned = self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id,
......@@ -602,6 +607,8 @@ class GroupDispatcher:
except Exception as es:
self.logger.error("穿越调度失败")
self.logger.error(es)
else:
self.logger.info(f'距离过近无法触发穿越装载区调度')
# 未触发穿越装载区调度, 判断是否开启二次调度
if not planned and self.group.topo is not None and truck_locate is not None:
......@@ -627,7 +634,9 @@ class GroupDispatcher:
if not planned or truck_task != 0:
self.logger.info("穿越调度和二次调度均不触发,调度前往卸载区执行固定派车")
try:
truck_dispatch[truck_id] = DispatchInfo.get_truck_match(truck_id)
current_excavator = truck_info.get_combined_excavator()
truck_dispatch[truck_id] = [current_excavator, DispatchInfo.get_excavator_match(current_excavator)]
# DispatchInfo.get_truck_match(truck_id)
except Exception as es:
self.logger.error("空载车辆空车智能模式-计算异常")
self.logger.error(es)
......@@ -993,6 +1002,14 @@ class ReDispatcher:
next_lane_load_area_dict = get_lane_reach_load_areas(load_area_lane_dict, next_lane_list)
self.logger.info("交叉口下一路段可达的装载区")
self.logger.info(next_lane_load_area_dict)
# 排除异常掉线挖机
delete_disabled_load_area(load_area_dict)
self.logger.info("排除异常掉线挖机")
self.logger.info(load_area_dict)
# 排除不连通的装载区
delete_unconnected_load_area(truck_info.get_combined_unload_area(), load_area_dict)
self.logger.info("排除不连通的装载区")
self.logger.info(load_area_dict)
# 排除下一个路段阻塞的装载区
delete_congestion_load_area(congestion_lane_dict, load_area_dict,
next_lane_load_area_dict)
......@@ -1003,7 +1020,7 @@ class ReDispatcher:
self.logger.info("获取车辆经纬度信息")
self.logger.info(truck_prise_location)
if is_close_to_cross(truck_locate, truck_prise_location):
if not is_close_to_cross(truck_locate, truck_prise_location):
self.logger.info(f'距离过近无法触发二次调度')
return False
......@@ -1025,6 +1042,7 @@ class ReDispatcher:
return True
else:
truck_dispatch[truck_id] = [current_excavator_id, current_unload_area_id]
self.logger.info(f'二次调度未变更')
return False
......@@ -1249,6 +1267,9 @@ class GoThroughDispatcher:
# 读取挖机状态
self.closer_excavator_state, self.further_excavator_state = get_excavator_state(self.closer_excavator_id), \
get_excavator_state(self.further_excavator_id)
# 读取挖机禁止
self.closer_excavator_disabled, self.further_excavator_disabled = get_excavator_disabled(self.closer_excavator_id), \
get_excavator_disabled(self.further_excavator_id)
# 读取两个装载区入场点ids
closer_entrance_node_id = session_postgre.query(DiggingWorkArea).filter_by(
......@@ -1415,7 +1436,7 @@ class GoThroughDispatcher:
logger.info(f"近端lanes{self.closer_area_backtrack_lanes}")
if request_truck_lane_id in self.closer_area_backtrack_lanes[0:2]:
if request_truck_lane_id in self.closer_area_backtrack_lanes[1:3]:
# 选择合适装载区
target_excavator = None
closer_distance = self.group.to_excavator_distance[self.group.unload_area_uuid_index_dict[
......@@ -1436,7 +1457,8 @@ class GoThroughDispatcher:
self.logger,
truck, truck_locates_dict, self.closer_excavator_state,
self.further_excavator_state, self.group.truck.start_time,
self.group.excavator_info.get_loading_task_time()[0])
self.group.excavator_info.get_loading_task_time()[0],
self.closer_excavator_disabled, self.further_excavator_disabled)
except Exception as es:
logger.error("寻找最优装载区异常")
logger.error(es)
......
......@@ -103,6 +103,32 @@ def delete_congestion_load_area(congestion_lane_dict, load_area_dict, next_lane_
del load_area_dict[load_area]
def delete_unconnected_load_area(unload_area_id, load_area_dict):
"""
:param congestion_lane_dict: 拥堵路段
:param load_area_dict: 拓扑图规划得到的可达装载区
:param next_lane_load_area_dict: 路段可达的装载区
:return:
"""
for load_area in list(load_area_dict.keys()):
item = session_postgre.query(WalkTime).filter_by(load_area_id=load_area, unload_area_id=unload_area_id).first()
if item is None:
del load_area_dict[load_area]
def delete_disabled_load_area(load_area_dict):
"""
:param load_area_dict: 拓扑图规划得到的可达装载区
:return:
"""
for load_area in list(load_area_dict.keys()):
excavator_id = session_mysql.query(DispatchSetting).filter_by(load_area_id=load_area).first().exactor_id
excavator_info = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
if excavator_info is None or excavator_info.disabled == 1:
del load_area_dict[load_area]
def get_lane_reach_load_areas(load_area_lane_dict, next_lane_list):
next_lane_load_area_dict = {}
for lane_id in next_lane_list:
......
......@@ -54,6 +54,9 @@ class DispatchInfo:
# truck -> match(excavator_id, unload_area_id)
truck_match_dict = {}
# excavator_id -> dump_id
excavator_dump_match_dict = {}
# group_unload_areas <-> group_dumps id
dump_unload_area_dict = {}
unload_area_dump_dict = {}
......@@ -194,7 +197,7 @@ class DispatchInfo:
for item in session_mysql.query(DispatchSetting).filter_by(isdeleted=0).all():
# add group_excavators
excavator_state = session_mysql.query(Equipment).filter_by(id=item.exactor_id).first()
# if excavator_state is not None and excavator_state.disabled == 1:
# if excavator_state is not None and excavator_state.disabled == 0:
if item.group_id not in cls.group_excavator_dict.keys():
cls.group_excavator_dict[item.group_id] = [item.exactor_id]
else:
......@@ -263,6 +266,16 @@ class DispatchInfo:
session_postgre.rollback()
session_mysql.rollback()
# update excavator_id -> dump_id
try:
for item in session_mysql.query(DispatchMatch).all():
match_unload_area = session_mysql.query(DispatchMatch).filter_by(exactor_id=item.exactor_id).first().unload_area_id
cls.excavator_dump_match_dict[str(item.exactor_id)] = match_unload_area
except Exception as es:
logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
@classmethod
def update_group_mode(cls):
"""
......@@ -486,6 +499,10 @@ class DispatchInfo:
return cls.truck_match_dict[truck_id]
@classmethod
def get_excavator_match(cls, excavator_id):
return cls.excavator_dump_match_dict[excavator_id]
@classmethod
def get_park_to_excavator_distance(cls, group_id):
excavators = cls.group_excavator_dict[group_id]
park_area_set = get_value("park_uuid_to_index_dict").keys()
......
......@@ -15,7 +15,7 @@ import random
def area_choose(request_truck_id, 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, sys_start_time,
loading_time):
loading_time, closer_excavator_disabled, further_excavator_disabled):
"""
装载区选择
:param sys_start_time:
......@@ -130,6 +130,12 @@ def area_choose(request_truck_id, excavators_id, closer_area_id, further_area_id
logger.info(f"穿越调度:近端挖机满载, 调度车辆前往远端装载区,远端派车数量{goto_further_area_num},空载车总数{arrival_truck_num}")
target_excavator = DispatchInfo.load_excavator_dict[further_area_id]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id])
if further_excavator_disabled == 1:
target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
elif closer_excavator_disabled == 1:
target_excavator = DispatchInfo.load_excavator_dict[further_area_id]
except Exception as es:
logger.error("找寻最空闲挖机异常")
logger.error(es)
......@@ -369,6 +375,25 @@ def get_excavator_state(excavator_id):
return 0
def get_excavator_disabled(excavator_id):
"""
get group_excavators disabled.
:param excavator_id:
:return: disabled
"""
try:
logger.info(excavator_id)
disabled = session_mysql.query(Equipment).filter_by(id=excavator_id, device_type=2).first().disabled
return int(disabled)
except Exception as es:
logger.error("挖机状态读取异常")
logger.error(es)
return 0
def get_excavator_prise_location(excavator_id):
"""
get group_excavators prise 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