Commit 14588e42 authored by Allvey's avatar Allvey

Merge branch 'master' of github.com:Allvey/integrated-scheduling

# 绑定关系与物料类型控制
parent 13a2e9cf
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -14,6 +14,8 @@ from settings import * ...@@ -14,6 +14,8 @@ from settings import *
# 卸载设备类 # 卸载设备类
class DumpInfo(WalkManage): class DumpInfo(WalkManage):
def __init__(self): def __init__(self):
# # 卸载设备集合
# self.dynamic_dump_set = set(update_autodisp_dump())
# 卸载设备数量 # 卸载设备数量
self.dynamic_dump_num = len(dynamic_dump_set) self.dynamic_dump_num = len(dynamic_dump_set)
# 目标产量 # 目标产量
...@@ -38,6 +40,12 @@ class DumpInfo(WalkManage): ...@@ -38,6 +40,12 @@ class DumpInfo(WalkManage):
self.entrance_time = np.zeros(self.dynamic_dump_num) self.entrance_time = np.zeros(self.dynamic_dump_num)
# 出场时间 # 出场时间
self.exit_time = np.zeros(self.dynamic_dump_num) self.exit_time = np.zeros(self.dynamic_dump_num)
# 卸载点物料类型
self.dump_material = {}
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
def get_unloading_time(self): def get_unloading_time(self):
return self.unloading_time return self.unloading_time
...@@ -110,7 +118,7 @@ class DumpInfo(WalkManage): ...@@ -110,7 +118,7 @@ class DumpInfo(WalkManage):
self.entrance_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50 self.entrance_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50
self.exit_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50 self.exit_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50
# 读取出入场时间 # 读取卸载任务时间
def get_unloading_task_time(self): def get_unloading_task_time(self):
unloading_time = self.unloading_time unloading_time = self.unloading_time
...@@ -141,9 +149,17 @@ class DumpInfo(WalkManage): ...@@ -141,9 +149,17 @@ class DumpInfo(WalkManage):
+ query.load_weight + query.load_weight
) )
def period_update(self): def update_dump_material(self):
for dump_id in dynamic_dump_set:
unload_area_id = session_mysql.query(Dispatch).filter_by(dump_id=dump_id).first().unload_area_id
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
self.dump_material[dump_id] = dump_material_id
def para_period_update(self):
# print("Dump update!")
print("Dump update!") logger.info("Dump update!")
# 装载周期参数 # 装载周期参数
self.period_map_para_load() self.period_map_para_load()
......
...@@ -14,6 +14,8 @@ from settings import * ...@@ -14,6 +14,8 @@ from settings import *
# 挖机设备类 # 挖机设备类
class ExcavatorInfo(WalkManage): class ExcavatorInfo(WalkManage):
def __init__(self): def __init__(self):
# # 挖机集合
# self.dynamic_excavator_set = set(update_autodisp_excavator())
# 装载设备数量 # 装载设备数量
self.dynamic_excavator_num = len(dynamic_excavator_set) self.dynamic_excavator_num = len(dynamic_excavator_set)
# 目标产量 # 目标产量
...@@ -38,6 +40,12 @@ class ExcavatorInfo(WalkManage): ...@@ -38,6 +40,12 @@ class ExcavatorInfo(WalkManage):
self.entrance_time = np.zeros(self.dynamic_excavator_num) self.entrance_time = np.zeros(self.dynamic_excavator_num)
# 出场时间 # 出场时间
self.exit_time = np.zeros(self.dynamic_excavator_num) self.exit_time = np.zeros(self.dynamic_excavator_num)
# 挖机对应物料类型
self.excavator_material = {}
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
# def period_map_para_load(self): # def period_map_para_load(self):
# # 关系映射 # # 关系映射
...@@ -166,9 +174,17 @@ class ExcavatorInfo(WalkManage): ...@@ -166,9 +174,17 @@ class ExcavatorInfo(WalkManage):
+ query.load_weight + query.load_weight
) )
def period_update(self): def update_excavator_material(self):
for excavator_id in dynamic_excavator_set:
load_area_id = session_mysql.query(Dispatch).filter_by(exactor_id=excavator_id).first().load_area_id
excavator_material_id = session_postgre.query(DiggerArea).filter_by(Id=load_area_id).first().Material
self.excavator_material[excavator_id] = excavator_material_id
def para_period_update(self):
# print("Excavator update!")
print("Excavator update!") logger.info("Excavator update!")
# 装载周期参数 # 装载周期参数
self.period_map_para_load() self.period_map_para_load()
......
...@@ -10,6 +10,9 @@ from traffic_flow.traffic_flow_planner import * ...@@ -10,6 +10,9 @@ from traffic_flow.traffic_flow_planner import *
from static_data_process import * from static_data_process import *
from para_config import * from para_config import *
from settings import * from settings import *
from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo
# 矿卡设备类 # 矿卡设备类
class TruckInfo(WalkManage): class TruckInfo(WalkManage):
...@@ -52,6 +55,18 @@ class TruckInfo(WalkManage): ...@@ -52,6 +55,18 @@ class TruckInfo(WalkManage):
# 排斥关系modify # 排斥关系modify
self.excavator_exclude_modify = None self.excavator_exclude_modify = None
# 矿卡优先级 # 矿卡优先级
self.truck_priority = np.ones(self.dynamic_truck_num)
# 矿卡绑定物料
self.truck_material_bind = {}
# 矿卡绑定物料modify
self.dump_material_bind_modify = None
self.excavator_material_bind_modify = None
# 引入对象
self.dump = DumpInfo()
self.excavator = ExcavatorInfo()
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
# def period_map_para_load(self): # def period_map_para_load(self):
# # 关系映射 # # 关系映射
...@@ -103,6 +118,8 @@ class TruckInfo(WalkManage): ...@@ -103,6 +118,8 @@ class TruckInfo(WalkManage):
def get_payload(self): def get_payload(self):
return self.payload return self.payload
################################################ short term update ################################################
# 更新矿卡当前任务 # 更新矿卡当前任务
def update_truck_current_task(self): def update_truck_current_task(self):
self.truck_current_task = {} self.truck_current_task = {}
...@@ -131,29 +148,6 @@ class TruckInfo(WalkManage): ...@@ -131,29 +148,6 @@ class TruckInfo(WalkManage):
logger.info("矿卡当前任务:") logger.info("矿卡当前任务:")
logger.info(self.truck_current_task) logger.info(self.truck_current_task)
# 更新矿卡实际容量
def update_truck_payload(self):
try:
self.payload = np.zeros(self.dynamic_truck_num)
for truck_id in self.dynamic_truck_set:
trcuk_index = self.truck_uuid_to_index_dict[truck_id]
truck_spec = (
session_mysql.query(Equipment)
.filter_by(id=truck_id)
.first()
.equipment_spec
)
# truck_spec = query.equipment_spec
self.payload[trcuk_index] = (
session_mysql.query(EquipmentSpec)
.filter_by(id=truck_spec)
.first()
.capacity
)
except Exception as es:
logger.error("读取矿卡有效载重异常-矿卡型号信息缺失")
logger.error(es)
# 更新矿卡最后装载/卸载时间 # 更新矿卡最后装载/卸载时间
def update_truck_last_leave_time(self): def update_truck_last_leave_time(self):
self.last_load_time = {} self.last_load_time = {}
...@@ -220,7 +214,6 @@ class TruckInfo(WalkManage): ...@@ -220,7 +214,6 @@ class TruckInfo(WalkManage):
logger.error("读取矿卡可用时间异常-redis读取异常") logger.error("读取矿卡可用时间异常-redis读取异常")
logger.error(es) logger.error(es)
# 更新矿卡行程
def update_truck_trip(self): def update_truck_trip(self):
walk_time_to_load_area = walk_manage.get_walk_time_to_load_area() walk_time_to_load_area = walk_manage.get_walk_time_to_load_area()
...@@ -236,8 +229,8 @@ class TruckInfo(WalkManage): ...@@ -236,8 +229,8 @@ class TruckInfo(WalkManage):
# print("truck_task:", truck_id, task) # print("truck_task:", truck_id, task)
item = ( item = (
session_mysql.query(EquipmentPair) session_mysql.query(EquipmentPair)
.filter_by(truck_id=truck_id, isdeleted=0) .filter_by(truck_id=truck_id, isdeleted=0)
.first() .first()
) )
if task in empty_task_set + heavy_task_set and item is None: if task in empty_task_set + heavy_task_set and item is None:
raise Exception(f"矿卡 {truck_id} 配对关系异常") raise Exception(f"矿卡 {truck_id} 配对关系异常")
...@@ -270,8 +263,8 @@ class TruckInfo(WalkManage): ...@@ -270,8 +263,8 @@ class TruckInfo(WalkManage):
# end_area_index] # end_area_index]
# else: # else:
self.cur_truck_reach_excavator[i] = ( self.cur_truck_reach_excavator[i] = (
last_unload_time last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index] + walk_time_to_load_area[start_area_index][end_area_index]
) )
# 若矿卡状态为重载 # 若矿卡状态为重载
elif task in heavy_task_set: elif task in heavy_task_set:
...@@ -295,8 +288,8 @@ class TruckInfo(WalkManage): ...@@ -295,8 +288,8 @@ class TruckInfo(WalkManage):
self.dump_uuid_to_index_dict[item.dump_id], self.dump_uuid_to_index_dict[item.dump_id],
] ]
self.cur_truck_reach_dump[i] = ( self.cur_truck_reach_dump[i] = (
last_load_time last_load_time
+ walk_time_to_unload_area[end_area_index][start_area_index] + walk_time_to_unload_area[end_area_index][start_area_index]
) )
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡 # 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
else: else:
...@@ -309,6 +302,46 @@ class TruckInfo(WalkManage): ...@@ -309,6 +302,46 @@ class TruckInfo(WalkManage):
# print("当前矿卡行程:") # print("当前矿卡行程:")
# print(self.truck_current_trip) # print(self.truck_current_trip)
################################################ long term update ################################################
# 更新矿卡实际容量
def update_truck_payload(self):
try:
self.payload = np.zeros(self.dynamic_truck_num)
for truck_id in self.dynamic_truck_set:
trcuk_index = self.truck_uuid_to_index_dict[truck_id]
truck_spec = (
session_mysql.query(Equipment)
.filter_by(id=truck_id)
.first()
.equipment_spec
)
# truck_spec = query.equipment_spec
self.payload[trcuk_index] = (
session_mysql.query(EquipmentSpec)
.filter_by(id=truck_spec)
.first()
.capacity
)
except Exception as es:
logger.error("读取矿卡有效载重异常-矿卡型号信息缺失")
logger.error(es)
def update_truck_priority(self):
self.truck_priority = np.zeros(self.dynamic_truck_num)
for truck_id in dynamic_truck_set:
item = session_mysql.query(Equipment).filter_by(id=truck_id).first()
truck_index = self.truck_uuid_to_index_dict[truck_id]
if item.priority == 0:
self.truck_priority[truck_index] = 2
elif item.priority == 1:
self.truck_priority[truck_index] = 1.5
elif item.priority == 2:
self.truck_priority[truck_index] = 1
elif item.priority == 3:
self.truck_priority[truck_index] = 0.5
def update_truck_dump_area_bind(self): def update_truck_dump_area_bind(self):
try: try:
...@@ -319,7 +352,7 @@ class TruckInfo(WalkManage): ...@@ -319,7 +352,7 @@ class TruckInfo(WalkManage):
self.truck_dump_bind[truck_name_to_uuid_dict[truck_name]] = str( self.truck_dump_bind[truck_name_to_uuid_dict[truck_name]] = str(
dump_area.Id dump_area.Id
) )
except ExcavatorInfo as es: except Exception as es:
logger.error("矿卡-卸载区域绑定关系读取异常") logger.error("矿卡-卸载区域绑定关系读取异常")
logger.error(es) logger.error(es)
...@@ -333,7 +366,7 @@ class TruckInfo(WalkManage): ...@@ -333,7 +366,7 @@ class TruckInfo(WalkManage):
self.truck_excavator_bind[ self.truck_excavator_bind[
truck_name_to_uuid_dict[truck_name] truck_name_to_uuid_dict[truck_name]
] = excavator_id ] = excavator_id
except ExcavatorInfo as es: except Exception as es:
logger.error("矿卡-挖机绑定关系读取异常") logger.error("矿卡-挖机绑定关系读取异常")
logger.error(es) logger.error(es)
...@@ -349,8 +382,8 @@ class TruckInfo(WalkManage): ...@@ -349,8 +382,8 @@ class TruckInfo(WalkManage):
for excavator_id in dynamic_excavator_set: for excavator_id in dynamic_excavator_set:
item = ( item = (
session_mysql.query(Equipment) session_mysql.query(Equipment)
.filter_by(id=excavator_id, only_allowed=1) .filter_by(id=excavator_id, only_allowed=1)
.first() .first()
) )
if item is not None: if item is not None:
for truck_id in dynamic_truck_set: for truck_id in dynamic_truck_set:
...@@ -360,8 +393,8 @@ class TruckInfo(WalkManage): ...@@ -360,8 +393,8 @@ class TruckInfo(WalkManage):
self.truck_uuid_to_index_dict[truck_id] self.truck_uuid_to_index_dict[truck_id]
][ ][
self.excavator_uuid_to_index_dict[excavator_id] self.excavator_uuid_to_index_dict[excavator_id]
] = -1000000 ] = 1000000
except ExcavatorInfo as es: except Exception as es:
logger.error("矿卡-挖机禁止关系读取异常") logger.error("矿卡-挖机禁止关系读取异常")
logger.error(es) logger.error(es)
...@@ -369,12 +402,91 @@ class TruckInfo(WalkManage): ...@@ -369,12 +402,91 @@ class TruckInfo(WalkManage):
pass pass
def period_update(self): def update_truck_material(self):
self.excavator.update_excavator_material()
self.dump.update_dump_material()
self.truck_material_bind = {}
self.update_truck_excavator_bind()
self.update_truck_dump_area_bind()
self.excavator_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_excavator_num), 0)
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_excavator_num), 0)
# for truck_id in dynamic_truck_set:
# if truck_id in self.truck_dump_bind:
# unload_area_id = self.truck_dump_bind[truck_id]
# # unload_area_id = session_mysql.query(Dispatch.unload_area_id).filter_by(dump_id=dump_id).first()
# dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
# self.truck_material_bind[truck_id] = dump_material_id
#
# if truck_id in self.truck_excavator_bind:
# excavator_id = self.truck_excavator_bind[truck_id]
# load_area_id = session_mysql.query(Dispatch).filter_by(exactor_id=excavator_id).first().load_area_id
# excavator_material_id = session_postgre.query(DiggerArea).filter_by(Id=load_area_id).first().Material
# self.truck_material_bind[truck_id] = excavator_material_id
for truck_id in dynamic_truck_set:
print("Truck update!") truck_index = self.truck_uuid_to_index_dict[truck_id]
# # 更新行走队形 if truck_id in self.truck_dump_bind:
# self.walker.update_walk_time() unload_area_id = self.truck_dump_bind[truck_id]
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
self.truck_material_bind[truck_id] = dump_material_id
# unload_area_index = unload_area_uuid_to_index_dict[unload_area_id]
# for dump_index in range(dynamic_dump_num):
# if self.dump_index_to_unload_area_index_dict[dump_index] == unload_area_index:
# self.dump_material_bind_modify[truck_index][dump_index] = 1000000
if truck_id in self.truck_excavator_bind:
excavator_id = self.truck_excavator_bind[truck_id]
print(self.excavator.excavator_material)
excavator_material_id = self.excavator.excavator_material[excavator_id]
self.truck_material_bind[truck_id] = excavator_material_id
# excavator_index = self.excavator.excavator_uuid_to_index_dict[excavator_id]
# self.excavator_material_bind_modify[truck_index][excavator_index] = 1000000
for truck_id in dynamic_truck_set:
truck_index = self.truck_uuid_to_index_dict[truck_id]
if truck_id in self.truck_material_bind:
material = self.truck_material_bind[truck_id]
for excavator_id in dynamic_excavator_set:
excavator_material_id = self.excavator.excavator_material[excavator_id]
excavator_index = self.excavator.excavator_uuid_to_index_dict[excavator_id]
if excavator_material_id != material:
self.excavator_material_bind_modify[truck_index][excavator_index] = 1000000
for dump_id in dynamic_dump_set:
dump_material_id = self.dump.dump_material[dump_id]
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
if dump_material_id != material:
self.dump_material_bind_modify[truck_index][dump_index] = 1000000
# print("-------------------------------------------")
# print("truck")
# print(self.truck_uuid_to_index_dict)
# print("truck_material_bind")
# print(self.truck_material_bind)
# print("excavator")
# print(dynamic_excavator_set)
# print(self.excavator_material_bind_modify)
# print("dump")
# print(dynamic_dump_set)
# print(self.dump_material_bind_modify)
def para_period_update(self):
# print("Para truck update!")
logger.info("Para truck update!")
# 装载周期参数 # 装载周期参数
self.period_map_para_load() self.period_map_para_load()
...@@ -393,21 +505,80 @@ class TruckInfo(WalkManage): ...@@ -393,21 +505,80 @@ class TruckInfo(WalkManage):
# 更新矿卡数量 # 更新矿卡数量
self.dynamic_truck_num = len(self.dynamic_truck_set) self.dynamic_truck_num = len(self.dynamic_truck_set)
# 更新卡车当前任务
self.update_truck_current_task()
# 更新有效载重 # 更新有效载重
self.update_truck_payload() self.update_truck_payload()
# 更新绑定关系
self.update_truck_dump_area_bind()
self.update_truck_excavator_bind()
# 更新禁止关系
self.update_truck_excavator_exclude()
# 更新矿卡调度优先级
self.update_truck_priority()
# 更新矿卡物料类型
self.update_truck_material()
def state_period_update(self):
# 更新卡车当前任务
self.update_truck_current_task()
# 更新卡车最后一次装载/卸载时间 # 更新卡车最后一次装载/卸载时间
self.update_truck_last_leave_time() self.update_truck_last_leave_time()
# 更新卡车当前行程 # 更新卡车当前行程
self.update_truck_trip() self.update_truck_trip()
# 更新绑定关系 # def period_update(self):
self.update_truck_dump_area_bind() #
# print("Truck update!")
self.update_truck_excavator_bind() #
# # # 更新行走队形
self.update_truck_excavator_exclude() # # self.walker.update_walk_time()
\ No newline at end of file #
# # 装载周期参数
# self.period_map_para_load()
#
# self.period_walk_para_load()
#
# # 更新全部矿卡设备集合
# truck_set = set(update_total_truck())
#
# # 更新固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 更新动态派车矿卡集合
# self.dynamic_truck_set = truck_set.difference(fixed_truck_set)
#
# # 更新矿卡数量
# self.dynamic_truck_num = len(self.dynamic_truck_set)
#
# # 更新卡车当前任务
# self.update_truck_current_task()
#
# # 更新有效载重
# self.update_truck_payload()
#
# # 更新卡车最后一次装载/卸载时间
# self.update_truck_last_leave_time()
#
# # 更新卡车当前行程
# self.update_truck_trip()
#
# # 更新绑定关系
# self.update_truck_dump_area_bind()
#
# self.update_truck_excavator_bind()
#
# # 更新禁止关系
# self.update_truck_excavator_exclude()
#
# # 更新矿卡调度优先级
# self.update_truck_priority()
#
# # 更新矿卡物料类型
# self.update_truck_material()
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
# @File : realtime_dispatch.py # @File : realtime_dispatch.py
# @Software: PyCharm # @Software: PyCharm
# 实时调度模块 # 实时调度模块
from traffic_flow.traffic_flow_planner import * from traffic_flow.traffic_flow_planner import *
...@@ -15,6 +16,10 @@ from settings import * ...@@ -15,6 +16,10 @@ from settings import *
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
# 调度类 # 调度类
class Dispatcher(WalkManage): class Dispatcher(WalkManage):
...@@ -111,9 +116,9 @@ class Dispatcher(WalkManage): ...@@ -111,9 +116,9 @@ class Dispatcher(WalkManage):
datetime.now() - self.start_time datetime.now() - self.start_time
) / timedelta(hours=0, minutes=1, seconds=0) ) / timedelta(hours=0, minutes=1, seconds=0)
print(self.truck_index_to_uuid_dict) # print(self.truck_index_to_uuid_dict)
print(excavator_ava_ls) # print(excavator_ava_ls)
print(dump_ava_ls) # print(dump_ava_ls)
except Exception as es: except Exception as es:
logger.error("矿卡预计抵达时间计算异常") logger.error("矿卡预计抵达时间计算异常")
logger.error(es) logger.error(es)
...@@ -403,31 +408,79 @@ class Dispatcher(WalkManage): ...@@ -403,31 +408,79 @@ class Dispatcher(WalkManage):
logger.error("挖机/卸载设备预计装载量计算异常") logger.error("挖机/卸载设备预计装载量计算异常")
logger.error(es) logger.error(es)
def period_update(self): # def period_update(self):
#
# logger.info(
# "#####################################周期更新开始#####################################"
# )
#
# # 装载周期参数
# self.period_map_para_load()
#
# self.period_walk_para_load()
#
# # 更新卸载设备对象
# self.dump.period_update()
#
# # 更新挖机对象
# self.excavator.period_update()
#
# # 更新矿卡对象
# self.truck.period_update()
#
# # # 更新距离参量
# # self.walker.update_walk_time()
#
# # # 更新设备距离(不同于工作区距离)
# # self.update_walk_time()
#
# # 更新实时车流
# self.update_actual_traffic_flow()
#
# # 计算理想车流
# (
# self.opt_goto_dump_traffic_flow,
# self.opt_goto_excavator_traffic_flow,
# ) = traffic_flow_plan()
#
# # 矿卡抵达时间
# excavator_reach_list, dump_reach_list = self.update_truck_reach_time()
#
# # 挖机可用时间
# self.update_excavator_ava_time(excavator_reach_list)
#
# # 卸载设备可用时间
# self.update_dump_ava_time(dump_reach_list)
#
# # 挖机预计装载量
# self.update_pre_load_throughout()
#
# # 卸载设备预计卸载量
# self.update_pre_unload_throughout()
def para_period_update(self):
logger.info( logger.info(
"#####################################周期更新开始#####################################" "#####################################周期更新开始#####################################"
) )
# 装载周期参数 # 装载映射参数及
self.period_map_para_load() self.period_map_para_load()
self.period_walk_para_load() self.period_walk_para_load()
# 更新卸载设备对象 # 更新卸载设备对象
self.dump.period_update() self.dump.para_period_update()
# 更新挖机对象 # 更新挖机对象
self.excavator.period_update() self.excavator.para_period_update()
# 更新矿卡对象 # 更新矿卡对象
self.truck.period_update() self.truck.para_period_update()
# # 更新距离参量 def state_period_update(self):
# self.walker.update_walk_time()
# # 更新设备距离(不同于工作区距离) self.truck.state_period_update()
# self.update_walk_time()
# 更新实时车流 # 更新实时车流
self.update_actual_traffic_flow() self.update_actual_traffic_flow()
...@@ -453,6 +506,7 @@ class Dispatcher(WalkManage): ...@@ -453,6 +506,7 @@ class Dispatcher(WalkManage):
# 卸载设备预计卸载量 # 卸载设备预计卸载量
self.update_pre_unload_throughout() self.update_pre_unload_throughout()
def sim_para_reset(self): def sim_para_reset(self):
# 设备可用时间重置 # 设备可用时间重置
...@@ -518,6 +572,9 @@ class Dispatcher(WalkManage): ...@@ -518,6 +572,9 @@ class Dispatcher(WalkManage):
f"行程时间:{(np.maximum(self.sim_excavator_ava_time, now + walk_time_park_to_excavator[0, :]) + loading_time - now)}" f"行程时间:{(np.maximum(self.sim_excavator_ava_time, now + walk_time_park_to_excavator[0, :]) + loading_time - now)}"
) )
logger.info(f"行驶时间:{walk_time_park_to_excavator[0, :] + loading_time}") logger.info(f"行驶时间:{walk_time_park_to_excavator[0, :] + loading_time}")
logger.info("物料类型")
if truck_id in self.truck.truck_material_bind:
logger.info(self.truck.truck_material_bind[truck_id])
except Exception as es: except Exception as es:
logger.error(f"矿卡{truck_id}状态不匹配") logger.error(f"矿卡{truck_id}状态不匹配")
logger.error(es) logger.error(es)
...@@ -540,9 +597,8 @@ class Dispatcher(WalkManage): ...@@ -540,9 +597,8 @@ class Dispatcher(WalkManage):
- now - now
) )
) )
+ self.truck.excavator_exclude_modify[ - self.truck.excavator_exclude_modify[truck_index]
self.truck_uuid_to_index_dict[truck_id] - self.truck.excavator_material_bind_modify[truck_index]
]
) )
# target = np.argmin((walk_time_park_to_excavator[0, :] + loading_time)) # target = np.argmin((walk_time_park_to_excavator[0, :] + loading_time))
...@@ -607,6 +663,9 @@ class Dispatcher(WalkManage): ...@@ -607,6 +663,9 @@ class Dispatcher(WalkManage):
logger.info(self.actual_goto_dump_traffic_flow[int(trip[1]), :]) logger.info(self.actual_goto_dump_traffic_flow[int(trip[1]), :])
logger.info("卸载点理想车流") logger.info("卸载点理想车流")
logger.info(self.opt_goto_dump_traffic_flow[int(trip[1]), :]) logger.info(self.opt_goto_dump_traffic_flow[int(trip[1]), :])
logger.info("物料类型")
if truck_id in self.truck.truck_material_bind:
logger.info(self.truck.truck_material_bind[truck_id])
if truck_id in self.truck.truck_dump_bind: if truck_id in self.truck.truck_dump_bind:
bind_unload_area_id = self.truck.truck_dump_bind[truck_id] bind_unload_area_id = self.truck.truck_dump_bind[truck_id]
...@@ -618,9 +677,8 @@ class Dispatcher(WalkManage): ...@@ -618,9 +677,8 @@ class Dispatcher(WalkManage):
target = np.argmin( target = np.argmin(
(self.actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) (self.actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001)
/ (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) / (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001)
- self.truck.excavator_exclude_modify[ + self.truck.excavator_exclude_modify[truck_index]
self.truck_uuid_to_index_dict[truck_id] + self.truck.excavator_material_bind_modify[truck_index]
]
) )
logger.info("车流比:") logger.info("车流比:")
...@@ -692,6 +750,9 @@ class Dispatcher(WalkManage): ...@@ -692,6 +750,9 @@ class Dispatcher(WalkManage):
logger.info(self.actual_goto_excavator_traffic_flow[trip[1], :]) logger.info(self.actual_goto_excavator_traffic_flow[trip[1], :])
logger.info("挖机理想车流") logger.info("挖机理想车流")
logger.info(self.opt_goto_excavator_traffic_flow[trip[1], :]) logger.info(self.opt_goto_excavator_traffic_flow[trip[1], :])
logger.info("物料类型")
if truck_id in self.truck.truck_material_bind:
logger.info(self.truck.truck_material_bind[truck_id])
if truck_id in self.truck.truck_excavator_bind: if truck_id in self.truck.truck_excavator_bind:
target = self.excavator_uuid_to_index_dict[ target = self.excavator_uuid_to_index_dict[
...@@ -701,9 +762,8 @@ class Dispatcher(WalkManage): ...@@ -701,9 +762,8 @@ class Dispatcher(WalkManage):
target = np.argmin( target = np.argmin(
(self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001) (self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001)
/ (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001) / (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001)
- self.truck.excavator_exclude_modify[ + self.truck.excavator_exclude_modify[truck_index]
self.truck_uuid_to_index_dict[truck_id] + self.truck.excavator_material_bind_modify[truck_index]
]
) )
logger.info("车流比:") logger.info("车流比:")
...@@ -718,199 +778,199 @@ class Dispatcher(WalkManage): ...@@ -718,199 +778,199 @@ class Dispatcher(WalkManage):
def schedule_construct(self): def schedule_construct(self):
# try: try:
# 读取所需信息 # 读取所需信息
trucks = self.truck.get_truck_num() trucks = self.truck.get_truck_num()
truck_current_trip = self.truck.get_truck_current_trip() truck_current_trip = self.truck.get_truck_current_trip()
truck_current_task = self.truck.get_truck_current_task() truck_current_task = self.truck.get_truck_current_task()
payload = self.truck.get_payload() payload = self.truck.get_payload()
unloading_time = self.dump.get_unloading_time() unloading_time = self.dump.get_unloading_time()
loading_time = self.excavator.get_loading_time() loading_time = self.excavator.get_loading_time()
# 出入场时间 # 出入场时间
loading_task_time = self.excavator.get_loading_task_time() loading_task_time = self.excavator.get_loading_task_time()
unloading_task_time = self.dump.get_unloading_task_time() unloading_task_time = self.dump.get_unloading_task_time()
walk_time_to_unload_area = walk_manage.get_walk_time_to_unload_area() walk_time_to_unload_area = walk_manage.get_walk_time_to_unload_area()
walk_time_to_load_area = walk_manage.get_walk_time_to_load_area() walk_time_to_load_area = walk_manage.get_walk_time_to_load_area()
# Seq初始化 # Seq初始化
Seq = [[truck_current_trip[i][1], -1] for i in range(trucks)] Seq = [[truck_current_trip[i][1], -1] for i in range(trucks)]
# 根据矿卡最早可用时间顺序进行规划 # 根据矿卡最早可用时间顺序进行规划
temp = copy.deepcopy(self.cur_truck_ava_time) temp = copy.deepcopy(self.cur_truck_ava_time) * self.truck.truck_priority
# 没有启动的矿卡加上一个很大的值,降低其优先级 # 没有启动的矿卡加上一个很大的值,降低其优先级
for i in range(trucks): for i in range(trucks):
task = truck_current_task[self.truck_index_to_uuid_dict[i]] task = truck_current_task[self.truck_index_to_uuid_dict[i]]
if task == -2: if task == -2:
temp[i] = temp[i] + M temp[i] = temp[i] + M
index = np.argsort(temp.reshape(1, -1)) index = np.argsort(temp.reshape(1, -1))
index = index.flatten() index = index.flatten()
# 对于在线矿卡已经赋予新的派车计划,更新其最早可用时间,及相关设备时间参数 # 对于在线矿卡已经赋予新的派车计划,更新其最早可用时间,及相关设备时间参数
for truck in index: for truck in index:
if len(Seq[truck]) > 0: if len(Seq[truck]) > 0:
# try: # try:
task = truck_current_task[self.truck_index_to_uuid_dict[truck]] task = truck_current_task[self.truck_index_to_uuid_dict[truck]]
# 矿卡结束当前派车计划后的目的地 # 矿卡结束当前派车计划后的目的地
end_eq_index = truck_current_trip[truck][1] end_eq_index = truck_current_trip[truck][1]
# 调用调度函数,得到最优目的地序号 # 调用调度函数,得到最优目的地序号
target_eq_index = self.truck_schedule( target_eq_index = self.truck_schedule(
self.truck_index_to_uuid_dict[truck] self.truck_index_to_uuid_dict[truck]
) )
# 写入Seq序列 # 写入Seq序列
Seq[truck][1] = target_eq_index Seq[truck][1] = target_eq_index
# except Exception as es: # except Exception as es:
# logger.error(f'矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 派车计划计算异常') # logger.error(f'矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 派车计划计算异常')
# logger.error(es) # logger.error(es)
try:
if task in empty_task_set:
target_area_index = self.dump_index_to_unload_area_index_dict[
target_eq_index
]
end_area_index = self.excavator_index_to_load_area_index_dict[
end_eq_index
]
# 更新变量,预计产量更新
self.sim_dump_real_mass[target_eq_index] = (
self.sim_dump_real_mass[target_eq_index] + payload[truck]
)
# 预计卸载设备可用时间更新
self.sim_dump_ava_time[target_eq_index] = (
max(
self.sim_dump_ava_time[target_eq_index],
self.sim_truck_ava_time[truck]
+ walk_time_to_unload_area[target_area_index][
end_area_index
],
)
+ unloading_task_time[target_eq_index]
)
elif task in heavy_task_set:
target_area_index = (
self.excavator_index_to_load_area_index_dict[
target_eq_index
]
)
end_area_index = self.dump_index_to_unload_area_index_dict[
end_eq_index
]
# 更新变量,预计产量更新
self.sim_excavator_real_mass[target_eq_index] = (
self.sim_excavator_real_mass[target_eq_index]
+ payload[truck]
)
# 预计装载点可用时间更新
self.sim_excavator_ava_time[target_eq_index] = (
max(
self.sim_excavator_ava_time[target_eq_index],
self.sim_truck_ava_time[truck]
+ walk_time_to_unload_area[end_area_index][
target_area_index
],
)
+ loading_task_time[target_eq_index]
)
else:
pass
except Exception as es:
logger.error(
f"矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 调度状态更新异常"
)
logger.error(es)
for i in range(len(Seq)):
try: try:
record = {"truckId": self.truck_index_to_uuid_dict[i]}
task = self.truck.get_truck_current_task()[
self.truck_index_to_uuid_dict[i]
]
if task in empty_task_set: if task in empty_task_set:
target_area_index = self.dump_index_to_unload_area_index_dict[ item = (
target_eq_index session_mysql.query(Dispatch)
] .filter_by(
end_area_index = self.excavator_index_to_load_area_index_dict[ dump_id=self.dump_index_to_uuid_dict[Seq[i][1]],
end_eq_index isauto=1,
] isdeleted=0,
# 更新变量,预计产量更新
self.sim_dump_real_mass[target_eq_index] = (
self.sim_dump_real_mass[target_eq_index] + payload[truck]
)
# 预计卸载设备可用时间更新
self.sim_dump_ava_time[target_eq_index] = (
max(
self.sim_dump_ava_time[target_eq_index],
self.sim_truck_ava_time[truck]
+ walk_time_to_unload_area[target_area_index][
end_area_index
],
) )
+ unloading_task_time[target_eq_index] .first()
)
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p"
) )
elif task in heavy_task_set: elif task in heavy_task_set:
target_area_index = ( item = (
self.excavator_index_to_load_area_index_dict[ session_mysql.query(Dispatch)
target_eq_index .filter_by(
] exactor_id=self.excavator_index_to_uuid_dict[Seq[i][1]],
isauto=1,
isdeleted=0,
)
.first()
) )
end_area_index = self.dump_index_to_unload_area_index_dict[ record["exactorId"] = self.excavator_index_to_uuid_dict[Seq[i][1]]
end_eq_index record["dumpId"] = item.dump_id
] record["loadAreaId"] = item.load_area_id
# 更新变量,预计产量更新 record["unloadAreaId"] = item.unload_area_id
self.sim_excavator_real_mass[target_eq_index] = ( record["dispatchId"] = item.id
self.sim_excavator_real_mass[target_eq_index] record["isdeleted"] = False
+ payload[truck] record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p"
) )
# 预计装载点可用时间更新 elif task == -2:
self.sim_excavator_ava_time[target_eq_index] = ( item = (
max( session_mysql.query(Dispatch)
self.sim_excavator_ava_time[target_eq_index], .filter_by(
self.sim_truck_ava_time[truck] exactor_id=self.excavator_index_to_uuid_dict[Seq[i][1]],
+ walk_time_to_unload_area[end_area_index][ isauto=1,
target_area_index isdeleted=0,
],
) )
+ loading_task_time[target_eq_index] .first()
)
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p"
) )
else: else:
pass pass
redis5.set(self.truck_index_to_uuid_dict[i], str(json.dumps(record)))
except Exception as es: except Exception as es:
logger.error( logger.error("调度结果写入异常-redis写入异常")
f"矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 调度状态更新异常" logger.error(f"调度结果:{Seq}")
)
logger.error(es) logger.error(es)
for i in range(len(Seq)): for i in range(trucks):
try: print("dispatch_setting:")
print(redis5.get(self.truck_index_to_uuid_dict[i]))
record = {"truckId": self.truck_index_to_uuid_dict[i]} except Exception as es:
task = self.truck.get_truck_current_task()[ logger.error("更新不及时")
self.truck_index_to_uuid_dict[i] logger.error(es)
]
if task in empty_task_set:
item = (
session_mysql.query(Dispatch)
.filter_by(
dump_id=self.dump_index_to_uuid_dict[Seq[i][1]],
isauto=1,
isdeleted=0,
)
.first()
)
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p"
)
elif task in heavy_task_set:
item = (
session_mysql.query(Dispatch)
.filter_by(
exactor_id=self.excavator_index_to_uuid_dict[Seq[i][1]],
isauto=1,
isdeleted=0,
)
.first()
)
record["exactorId"] = self.excavator_index_to_uuid_dict[Seq[i][1]]
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p"
)
elif task == -2:
item = (
session_mysql.query(Dispatch)
.filter_by(
exactor_id=self.excavator_index_to_uuid_dict[Seq[i][1]],
isauto=1,
isdeleted=0,
)
.first()
)
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p"
)
else:
pass
redis5.set(self.truck_index_to_uuid_dict[i], str(json.dumps(record)))
except Exception as es:
logger.error("调度结果写入异常-redis写入异常")
logger.error(f"调度结果:{Seq}")
logger.error(es)
for i in range(trucks):
print("dispatch_setting:")
print(redis5.get(self.truck_index_to_uuid_dict[i]))
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
logger.info( logger.info(
"#####################################周期更新结束#####################################" "#####################################周期更新结束#####################################"
...@@ -919,18 +979,59 @@ class Dispatcher(WalkManage): ...@@ -919,18 +979,59 @@ class Dispatcher(WalkManage):
return Seq return Seq
# 下面三个函数保证程序定期执行,不用管他 def para_process(dispatcher):
def process(dispatcher):
logger.info("papa_process!")
# 清空数据库缓存
session_mysql.commit()
session_mysql.flush()
# 清空数据库缓存
session_postgre.commit()
session_postgre.flush()
# 更新周期参数 # 更新周期参数
period_para_update() period_para_update()
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 清空数据库缓存
# session_postgre.commit()
# session_postgre.flush()
# 周期更新
dispatcher.para_period_update()
# # 参数重置
# dispatcher.sim_para_reset()
# try:
# 调度计算
# dispatcher.schedule_construct()
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
def state_process(dispatcher):
# print("state_process!")
# 清空数据库缓存 # 清空数据库缓存
session_mysql.commit() session_mysql.commit()
session_mysql.flush() session_mysql.flush()
# 清空数据库缓存
session_postgre.commit()
session_postgre.flush()
# 周期更新 # 周期更新
dispatcher.period_update() dispatcher.state_period_update()
# 参数重置 # 参数重置
dispatcher.sim_para_reset() dispatcher.sim_para_reset()
...@@ -945,6 +1046,17 @@ def process(dispatcher): ...@@ -945,6 +1046,17 @@ def process(dispatcher):
# logger.error(es) # logger.error(es)
# 下面三个函数保证程序定期执行,不用管他
def process(dispatcher):
para_process(dispatcher)
state_process(dispatcher)
scheduler = sched.scheduler(time.time, time.sleep) scheduler = sched.scheduler(time.time, time.sleep)
...@@ -965,3 +1077,68 @@ if __name__ == "__main__": ...@@ -965,3 +1077,68 @@ if __name__ == "__main__":
dispatcher = Dispatcher() dispatcher = Dispatcher()
main(10, dispatcher) main(10, dispatcher)
# # 下面三个函数保证程序定期执行,不用管他
# def process(dispatcher):
#
# # 更新周期参数
# period_para_update()
#
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 清空数据库缓存
# session_postgre.commit()
# session_postgre.flush()
#
# # 周期更新
# dispatcher.period_update()
#
# # 参数重置
# dispatcher.sim_para_reset()
#
# # try:
#
# # 调度计算
# dispatcher.schedule_construct()
#
# # except Exception as es:
# # logger.error("更新不及时")
# # logger.error(es)
#
#
# dispatcher = Dispatcher()
#
# para_process(dispatcher)
#
# state_process(dispatcher)
#
#
# jobstores = {'default': MemoryJobStore()}
#
# executors = {'default': ThreadPoolExecutor(10)}
#
# job_defaults = {'coalesce': False, 'max_instances': 10}
#
# scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
#
# # scheduler = BlockingScheduler()
#
# scheduler.add_job(para_process, args=[dispatcher], id='ins1', trigger='interval', seconds=60)
#
# scheduler.add_job(state_process, args=[dispatcher], id='ins2', trigger='interval', seconds=10)
#
# if __name__ == '__main__':
# try:
# scheduler.start()
# except SystemExit:
# print('exit')
# exit()
\ No newline at end of file
...@@ -81,12 +81,20 @@ try: ...@@ -81,12 +81,20 @@ try:
# 创建DBsession_mysql类型: # 创建DBsession_mysql类型:
DBsession_mysql = sessionmaker(bind=engine_mysql) DBsession_mysql = sessionmaker(bind=engine_mysql)
DBsession_mysql = scoped_session(DBsession_mysql)
DBsession_postgre = sessionmaker(bind=engine_postgre) DBsession_postgre = sessionmaker(bind=engine_postgre)
DBsession_postgre = scoped_session(DBsession_postgre)
# 创建session_mysql对象: # 创建session_mysql对象:
session_mysql = DBsession_mysql() session_mysql = DBsession_mysql()
session_mysql.expire_on_commit = False
session_postgre = DBsession_postgre() session_postgre = DBsession_postgre()
session_postgre.expire_on_commit = False
except Exception as es: except Exception as es:
logger.error("数据库连接失败") logger.error("数据库连接失败")
logger.error(es) logger.error(es)
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
from sqlalchemy import Column, create_engine from sqlalchemy import Column, create_engine
from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
# import numpy as np # import numpy as np
# from redis import StrictRedis, ConnectionPool # from redis import StrictRedis, ConnectionPool
...@@ -35,8 +35,12 @@ engine_postgre = create_engine('postgresql://postgres:Huituo@123@192.168.28.111: ...@@ -35,8 +35,12 @@ engine_postgre = create_engine('postgresql://postgres:Huituo@123@192.168.28.111:
# 创建DBsession_mysql类型: # 创建DBsession_mysql类型:
DBsession_mysql = sessionmaker(bind=engine_mysql) DBsession_mysql = sessionmaker(bind=engine_mysql)
DBsession_mysql = scoped_session(DBsession_mysql)
DBsession_postgre = sessionmaker(bind=engine_postgre) DBsession_postgre = sessionmaker(bind=engine_postgre)
DBsession_postgre = scoped_session(DBsession_postgre)
# 创建session_mysql对象: # 创建session_mysql对象:
session_mysql = DBsession_mysql() session_mysql = DBsession_mysql()
...@@ -298,8 +302,10 @@ class Equipment(Base): ...@@ -298,8 +302,10 @@ class Equipment(Base):
disabled = Column(Integer) disabled = Column(Integer)
bind_list = Column(VARCHAR(1000)) bind_list = Column(VARCHAR(1000))
only_allowed = Column(Integer) only_allowed = Column(Integer)
priority = Column(Integer)
def __init__(self, id, equipment_id, device_name, device_type, equipment_spec, equipment_state, isdeleted, disabled, bind_list, only_allowed): def __init__(self, id, equipment_id, device_name, device_type, equipment_spec, equipment_state, isdeleted, \
disabled, bind_list, only_allowed, priority):
self.id = id self.id = id
self.equipment_id = equipment_id self.equipment_id = equipment_id
self.device_name = device_name self.device_name = device_name
...@@ -310,6 +316,7 @@ class Equipment(Base): ...@@ -310,6 +316,7 @@ class Equipment(Base):
self.disabled = disabled self.disabled = disabled
self.bind_list = bind_list self.bind_list = bind_list
self.only_allowed = only_allowed self.only_allowed = only_allowed
self.priority = priority
class EquipmentSpec(Base): class EquipmentSpec(Base):
__tablename__ = 'sys_equipment_spec' __tablename__ = 'sys_equipment_spec'
...@@ -377,9 +384,21 @@ class DumpArea(Base): ...@@ -377,9 +384,21 @@ class DumpArea(Base):
BindList = Column(VARCHAR(1000)) BindList = Column(VARCHAR(1000))
UnloadAbililty = Column(Float) UnloadAbililty = Column(Float)
Disabled = Column(Integer) Disabled = Column(Integer)
Material = Column(VARCHAR(36))
def __init__(self, Id, BindList, UnloadAbililty, Disabled): def __init__(self, Id, BindList, UnloadAbililty, Disabled, Material):
self.Id = Id self.Id = Id
self.BindList = BindList self.BindList = BindList
self.UnloadAbililty = UnloadAbililty self.UnloadAbililty = UnloadAbililty
self.Disabled = Disabled self.Disabled = Disabled
\ No newline at end of file self.Material = Material
class DiggerArea(Base):
__tablename__ = 'Geo_DiggingWorkArea'
Id = Column(VARCHAR(50), primary_key=True)
Material = Column(VARCHAR(36))
def __init__(self, Id, Material):
self.Id = Id
self.Material = Material
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