Commit b4797ca0 authored by 张晓彤's avatar 张晓彤

分流配比现场测试版本

parent e509f495
......@@ -331,12 +331,13 @@ class DistributionRatio(object):
@desc:计算分流配比模式下,卡车与卸载区的对应关系
"""
def __init__(self, exactor_id):
def __init__(self, exactor_id, truck):
self.truck = truck
self.exactor_id = exactor_id
self.exactor_truck_num = DispatchInfo.get_exactor_truck_nums(exactor_id) # 获取该电铲下的卡车数量
self.exactor_unload_match = DispatchInfo.get_exactor_unload_match(exactor_id) # 获取电铲对应的所有卸载区id
self.unload_ratio = {}
self.logger = get_logger("mqc.DistributionRatio")
self.logger = get_logger("zxt.DistributionRatio")
def get_unload_ratio(self):
"""
......@@ -344,11 +345,38 @@ class DistributionRatio(object):
@author:maqc
@desc:初始化卸载区的比值
"""
ratio = 0
for value in self.exactor_unload_match:
ratio += DispatchInfo.unload_rate_dict[value]
for item in self.exactor_unload_match:
self.unload_ratio[item] = DispatchInfo.unload_rate_dict[item] / ratio
try:
ratio = 0
for value in self.exactor_unload_match:
ratio += DispatchInfo.unload_rate_dict[value]
for item in self.exactor_unload_match:
self.unload_ratio[item] = DispatchInfo.unload_rate_dict[item] / ratio
except Exception as es:
self.logger.error("初始化卸载区的比值异常")
self.logger.error(es)
def get_unload_truck_total_num(self, exactor_id):
"""
@date:2022/7/19 16:12
@author:maqc
@desc:计算正在驶往全部卸载区的卡车数量
"""
unload_area_truck_num = 0
for item in session_mysql.query(EquipmentPair).filter_by(exactor_id=exactor_id, isdeleted=0).all():
try:
truck_id = item.truck_id
task = self.truck.get_truck_current_task()[truck_id]
if task in [3, 4]:
unload_area_truck_num = unload_area_truck_num + 1
except Exception as es:
self.logger.error("获取驶往卸载点全部车辆数量异常")
self.logger.error(es)
# item = session_mysql.query(EquipmentPair).filter_by(unload_area_id=unload_area_id, isdeleted=0).all()
return unload_area_truck_num
def get_unload_truck_num(self, unload_area_id):
"""
......@@ -356,8 +384,21 @@ class DistributionRatio(object):
@author:maqc
@desc:计算正在派往当前卸载区的卡车数量
"""
item = session_mysql.query(EquipmentPair).filter_by(unload_area_id=unload_area_id, isdeleted=0).all()
return len(item)
unload_area_truck_num = 0
for item in session_mysql.query(EquipmentPair).filter_by(unload_area_id=unload_area_id, isdeleted=0).all():
try:
truck_id = item.truck_id
task = self.truck.get_truck_current_task()[truck_id]
if task in [3, 4]:
unload_area_truck_num = unload_area_truck_num + 1
except Exception as es:
self.logger.error(f'获取驶往卸载点 {item.unload_area_id} 车辆异常')
self.logger.error(es)
# item = session_mysql.query(EquipmentPair).filter_by(unload_area_id=unload_area_id, isdeleted=0).all()
return unload_area_truck_num
def get_next_unload_id(self):
"""
......@@ -365,18 +406,49 @@ class DistributionRatio(object):
@author:maqc
@desc:计算卡车与下一个卸载区的对应关系
"""
# 无论当前卡车是否在备停区,下一个卸载区选择比值最大值对应的区域
next_unload_id = None
try:
self.logger.info("卸载设置分流配比")
self.logger.info(self.unload_ratio)
# 无论当前卡车是否在备停区,下一个卸载区选择比值最大值对应的区域
for dump_id in self.unload_ratio.keys():
self.unload_ratio[dump_id] -= ((self.get_unload_truck_num(dump_id) + 0.001) /
(self.get_unload_truck_total_num(self.exactor_id) + 0.001))
self.logger.info(dump_id)
self.logger.info(
f'unload_truck_total_num {self.get_unload_truck_total_num(self.exactor_id)}')
self.logger.info(f'unload_truck_num {self.get_unload_truck_num(dump_id)}')
self.logger.info("卸载实时分流配比")
self.logger.info(self.unload_ratio)
temp = list(self.unload_ratio.values())
next_unload_id = list(self.unload_ratio.keys())[temp.index(max(temp))]
# 更新卸载区对应的比例值
self.logger.info(f"下一个卸载区对应的id:{next_unload_id}")
self.unload_ratio[next_unload_id] -= self.get_unload_truck_num(
next_unload_id) / self.exactor_truck_num
self.logger.info(f"当前卸载区对应的比值:{self.unload_ratio[next_unload_id]}")
self.logger.info(self.unload_ratio.keys())
self.logger.info(temp)
self.logger.info(f'下一个卸载区对应的id {next_unload_id}')
except Exception as es:
self.logger.error("卡车与下一个卸载区的配对关系异常")
self.logger.error(es)
# try:
# temp = list(self.unload_ratio.values())
# next_unload_id = list(self.unload_ratio.keys())[temp.index(max(temp))]
# # 更新卸载区对应的比例值
# self.logger.info(f"下一个卸载区对应的id:{next_unload_id}")
# self.unload_ratio[next_unload_id] -= self.get_unload_truck_num(
# next_unload_id) / self.exactor_truck_num
# self.logger.info(f"当前卸载区对应的比值:{self.unload_ratio[next_unload_id]}")
# except Exception as es:
# self.logger.error("卡车与下一个卸载区的配对关系异常")
# self.logger.error(es)
return next_unload_id
def ratio_main(self):
......@@ -387,6 +459,8 @@ class DistributionRatio(object):
"""
try:
self.get_unload_ratio()
self.logger.info("卸载区分流比例")
self.logger.info(self.unload_ratio)
next_unload_area_id = self.get_next_unload_id()
self.logger.info(f'当前卡车对应的卸载区:{next_unload_area_id}')
except Exception as es:
......
......@@ -63,7 +63,7 @@ class Group:
""" Generate a group obj.
:param group_id: (uuid) group_id
"""
self.logger = get_logger("ga.Group")
self.logger = get_logger("zxt.Group")
# basic info.
self.group_id = group_id
self.group_mode = 1
......@@ -283,7 +283,7 @@ class Group:
try:
next_unload_area_id = DistributionRatio(next_exactor_id).ratio_main()
next_unload_area_id = DistributionRatio(next_exactor_id, self.truck).ratio_main()
except Exception as es:
......
......@@ -156,38 +156,38 @@ class DispatchInfo:
session_postgre.rollback()
session_mysql.rollback()
# update exactor_id <-> truck_id
try:
for item in session_mysql.query(DispatchSetting).all():
if item.exactor_id not in cls.exactor_truck_dict.keys():
cls.exactor_truck_dict[item.exactor_id] = [item.truck_id]
else:
if item.truck_id not in cls.exactor_truck_dict[item.exactor_id]:
cls.exactor_truck_dict[item.exactor_id].append(item.truck_id)
cls.truck_exactor_dict[item.truck_id] = item.exactor_id
except Exception as es:
logger.error("电铲和卡车的映射关系更新异常")
logger.error(es)
# update exactor_id <-> unload_area_id
try:
for item in session_mysql.query(DispatchSetting).all():
if item.exactor_id not in cls.exactor_unload_dict.keys():
cls.exactor_unload_dict[item.exactor_id] = [item.unload_area_id]
else:
if item.unload_area_id not in cls.exactor_unload_dict[item.exactor_id]:
cls.exactor_unload_dict[item.exactor_id].append(item.unload_area_id)
except Exception as es:
logger.error("电铲和卸载区的映射关系更新异常")
logger.error(es)
# update exactor_id <-> truck_id
try:
for item in session_mysql.query(DispatchSetting).all():
if item.exactor_id not in cls.exactor_truck_dict.keys():
cls.exactor_truck_dict[item.exactor_id] = [item.truck_id]
else:
if item.truck_id not in cls.exactor_truck_dict[item.exactor_id]:
cls.exactor_truck_dict[item.exactor_id].append(item.truck_id)
cls.truck_exactor_dict[item.truck_id] = item.exactor_id
except Exception as es:
logger.error("电铲和卡车的映射关系更新异常")
logger.error(es)
# update unload_area_id -> rate
try:
for item in session_mysql.query(DispatchSetting).all():
cls.unload_rate_dict[item.unload_area_id] = item.rate
except Exception as es:
logger.error("卸载区和比例值关系更新异常")
logger.error(es)
# update exactor_id <-> unload_area_id
try:
for item in session_mysql.query(DispatchSetting).all():
if item.exactor_id not in cls.exactor_unload_dict.keys():
cls.exactor_unload_dict[item.exactor_id] = [item.unload_area_id]
else:
if item.unload_area_id not in cls.exactor_unload_dict[item.exactor_id]:
cls.exactor_unload_dict[item.exactor_id].append(item.unload_area_id)
except Exception as es:
logger.error("电铲和卸载区的映射关系更新异常")
logger.error(es)
# update unload_area_id -> rate
try:
for item in session_mysql.query(DispatchSetting).all():
cls.unload_rate_dict[item.unload_area_id] = item.rate
except Exception as es:
logger.error("卸载区和比例值关系更新异常")
logger.error(es)
# update excavator_id <-> group_id && unload_area_id <-> group_id && truck_id <-> group_id
try:
......
......@@ -288,107 +288,107 @@ class TruckInfo(WalkManage):
session_mysql.rollback()
continue
# try:
load_area_uuid_to_index_dict = get_value("load_area_uuid_to_index_dict")
unload_area_uuid_to_index_dict = get_value("unload_area_uuid_to_index_dict")
aa = task
tt = truck_id
# 若矿卡状态为空运
if task in [0, 1, 2]: # 矿卡空载或仍未出装载区
# last_unload_time = self.relative_last_unload_time[
# self.truck_index_to_uuid_dict[i]
# ]
bb = self.relative_last_unload_time
last_unload_time = self.relative_last_unload_time[
truck_id
]
if item.dump_id in DeviceMap.dump_uuid_to_unload_area_uuid_dict:
start_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
start_area_index = unload_area_uuid_to_index_dict[start_area_id]
start_eq_index = self.dump_uuid_to_index_dict[item.dump_id]
else:
start_area_index = -1
start_eq_index = -1
if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
end_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
end_area_index = load_area_uuid_to_index_dict[end_area_id]
end_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
end_area_index = -1
end_eq_index = -1
self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.cur_truck_reach_excavator[i] = (
last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index]
)
self.logger.info(f'update_truck_trip-{truck_id}-last_unload_time')
self.logger.info(last_unload_time)
self.logger.info(f'update_truck_trip-walk_time_to_load_area')
self.logger.info(walk_time_to_load_area[start_area_index][end_area_index])
# # 目的地矿卡数加一
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
# 若矿卡状态为重载
elif task in [3, 4, 5]: # 矿卡重载或仍未出卸载区
# print("读取重载行程")
# print(item.exactor_id, item.dump_id)
last_load_time = self.relative_last_load_time[
self.truck_index_to_uuid_dict[i]
]
if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
start_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
start_area_index = load_area_uuid_to_index_dict[start_area_id]
start_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
start_area_index = -1
start_eq_index = -1
try:
load_area_uuid_to_index_dict = get_value("load_area_uuid_to_index_dict")
unload_area_uuid_to_index_dict = get_value("unload_area_uuid_to_index_dict")
aa = task
tt = truck_id
# 若矿卡状态为空运
if task in [0, 1, 2]: # 矿卡空载或仍未出装载区
# last_unload_time = self.relative_last_unload_time[
# self.truck_index_to_uuid_dict[i]
# ]
bb = self.relative_last_unload_time
last_unload_time = self.relative_last_unload_time[
truck_id
]
if item.dump_id in DeviceMap.dump_uuid_to_unload_area_uuid_dict:
start_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
start_area_index = unload_area_uuid_to_index_dict[start_area_id]
start_eq_index = self.dump_uuid_to_index_dict[item.dump_id]
else:
start_area_index = -1
start_eq_index = -1
if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
end_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
end_area_index = load_area_uuid_to_index_dict[end_area_id]
end_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
end_area_index = -1
end_eq_index = -1
self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.cur_truck_reach_excavator[i] = (
last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index]
)
self.logger.info(f'update_truck_trip-{truck_id}-last_unload_time')
self.logger.info(last_unload_time)
self.logger.info(f'update_truck_trip-walk_time_to_load_area')
self.logger.info(walk_time_to_load_area[start_area_index][end_area_index])
# # 目的地矿卡数加一
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
# 若矿卡状态为重载
elif task in [3, 4, 5]: # 矿卡重载或仍未出卸载区
# print("读取重载行程")
# print(item.exactor_id, item.dump_id)
last_load_time = self.relative_last_load_time[
self.truck_index_to_uuid_dict[i]
]
if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
start_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
start_area_index = load_area_uuid_to_index_dict[start_area_id]
start_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
start_area_index = -1
start_eq_index = -1
if item.dump_id in DeviceMap.dump_uuid_to_index_dict:
end_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
end_area_index = unload_area_uuid_to_index_dict[end_area_id]
end_eq_index = self.dump_uuid_to_index_dict[item.dump_id]
else:
end_area_index = -1
end_eq_index = -1
# # 结束设备index
# end_eqp_index = self.dump_uuid_to_index_dict[item.dump_id]
self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.logger.info("walk_time_to_unload_area")
self.logger.info(walk_time_to_unload_area)
self.logger.info("end_area_index")
self.logger.info(end_area_index)
self.logger.info("start_area_index")
self.logger.info(start_area_index)
self.cur_truck_reach_dump[i] = (
last_load_time
+ walk_time_to_unload_area[end_area_index][start_area_index]
)
self.logger.info(f'update_truck_trip-{truck_id}-last_load_time')
self.logger.info(last_load_time)
self.logger.info(f'update_truck_trip-walk_time_to_unload_area')
self.logger.info(walk_time_to_unload_area[end_area_index][start_area_index])
if item.dump_id in DeviceMap.dump_uuid_to_index_dict:
end_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
end_area_index = unload_area_uuid_to_index_dict[end_area_id]
end_eq_index = self.dump_uuid_to_index_dict[item.dump_id]
# 目的地矿卡数加一
# self.dump_hold_truck_num[end_eqp_index] = self.dump_hold_truck_num[end_eqp_index] + 1
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
else:
end_area_index = -1
end_eq_index = -1
# # 结束设备index
# end_eqp_index = self.dump_uuid_to_index_dict[item.dump_id]
self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.logger.info("walk_time_to_unload_area")
self.logger.info(walk_time_to_unload_area)
self.logger.info("end_area_index")
self.logger.info(end_area_index)
self.logger.info("start_area_index")
self.logger.info(start_area_index)
self.cur_truck_reach_dump[i] = (
last_load_time
+ walk_time_to_unload_area[end_area_index][start_area_index]
)
self.logger.info(f'update_truck_trip-{truck_id}-last_load_time')
self.logger.info(last_load_time)
self.logger.info(f'update_truck_trip-walk_time_to_unload_area')
self.logger.info(walk_time_to_unload_area[end_area_index][start_area_index])
# 目的地矿卡数加一
# self.dump_hold_truck_num[end_eqp_index] = self.dump_hold_truck_num[end_eqp_index] + 1
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
else:
# end_eqp_index = excavator.excavator_uuid_to_index_dict[item.exactor_id]
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
pass
# except Exception as es:
# self.logger.error("矿卡行程读取异常")
# self.logger.error(es)
# end_eqp_index = excavator.excavator_uuid_to_index_dict[item.exactor_id]
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
pass
except Exception as es:
self.logger.error("矿卡行程读取异常")
self.logger.error(es)
# print("self.dump_hold_truck_num")
# print(self.dump_hold_truck_num)
......
......@@ -38,7 +38,7 @@ def direct2redis():
for item in session_mysql.query(DispatchSetting).all():
if item.truck_id not in truck_disp:
record = {"truckId": item.truck_id}
record["id"] = item.id
record["dispatchId"] = item.id
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
......@@ -47,7 +47,7 @@ def direct2redis():
record["isdeleted"] = False
record["isTemp"] = False
record["haulFlag"] = -1
record["groupName"] = item.group_id
record["groupName"] = DispatchInfo.group_name[item.group_id]
logger.info("调度结果")
logger.info(record)
......
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