agv调度开发

This commit is contained in:
胡尧
2024-08-15 17:41:25 +08:00
parent 1532184008
commit aecf2121a1
7 changed files with 68 additions and 24 deletions

View File

@@ -82,7 +82,7 @@ class AgvScheduling(models.Model):
# 计算agv_scheduling.workorder_ids与workorders的交集
repetitive_workorders = agv_scheduling.workorder_ids & workorders
raise RepeatTaskException(
'制造订单号【%s】已存在%s】AGV调度任务请勿重复下发' %
'制造订单号【%s】已存在%s】AGV调度任务请勿重复下发' %
(','.join(repetitive_workorders.mapped('production_id.name')), agv_scheduling.name)
)
@@ -98,20 +98,23 @@ class AgvScheduling(models.Model):
('route_type', '=', agv_route_type),
('start_site_id', '=', agv_start_site_id)
])
idle_route = None
if len(agv_routes) == 1:
vals.update({'end_site_id': agv_routes[0].end_site_id.id, 'agv_route_name': agv_routes[0].name})
idle_route = agv_routes[0]
vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_name': idle_route.name})
else:
# 判断终点接驳站是否为空闲
idle_routes = agv_routes.filtered(lambda r: r.end_site_id.state == '空闲')
if idle_routes:
# 将空闲的路线按照终点接驳站名称排序
idle_routes = sorted(idle_routes, key=lambda r: r.end_site_id.name)
vals.update({'end_site_id': idle_routes[0].end_site_id.id, 'agv_route_name': idle_routes[0].name})
idle_route = idle_routes[0]
vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_name': idle_route.name})
try:
scheduling = self.env['sf.agv.scheduling'].sudo().create(vals)
# 触发空闲接驳站状态更新,触发新任务下发
if scheduling.end_site_id.state == '空闲':
scheduling.dispatch_scheduling(scheduling.end_site_id.id, scheduling.end_site_id.state)
if idle_route and idle_route.end_site_id.state == '空闲':
scheduling.dispatch_scheduling(idle_route)
except Exception as e:
_logger.error('添加AGV调度任务失败: %s', e)
@@ -134,8 +137,11 @@ class AgvScheduling(models.Model):
order='id asc',
limit=1
)
task_route = task_routes.filtered(
lambda r: r.start_site_id == agv_scheduling.start_site_id and r.start_site_id == agv_scheduling.start_site_id
)
# 下发AGV调度任务并修改接驳站状态为占用
agv_scheduling.dispatch_scheduling(agv_site_id, agv_site_state)
agv_scheduling.dispatch_scheduling(task_route)
else:
# 如果终点接驳站变为占用,则认为任务完成
agv_scheduling = self.env['sf.agv.scheduling'].sudo().search(
@@ -230,21 +236,33 @@ class AgvScheduling(models.Model):
rec.state = '已配送'
rec.task_completion_time = fields.Datetime.now()
def dispatch_scheduling(self, agv_end_site_id, agv_site_state):
def dispatch_scheduling(self, agv_task_route):
"""
下发调度任务
params:
agv_route sf.agv.task.route对象
"""
for rec in self:
if rec.state != '待下发':
return False
# rec._delivery_avg()
# 获取agv任务路线名称
rec.state = '配送中'
rec.task_delivery_time = fields.Datetime.now()
rec.site_state = agv_site_state
rec.end_site_id = agv_end_site_id
rec.site_state = '空闲'
rec.end_site_id = agv_task_route.end_site_id.id
rec.agv_route_name = agv_task_route.name
# 更新接驳站状态
rec.env['sf.agv.site'].update_site_state({rec.end_site_id.name: '占用'}, False)
def write(self, vals):
if vals.get('state', False):
if vals['state'] == '已取消':
self.env['sf.workpiece.delivery'].search([('agv_scheduling_id', '=', self.id)]).write({'status': '待下发'})
elif vals['state'] == '已配送':
self.env['sf.workpiece.delivery'].search([('agv_scheduling_id', '=', self.id)]).write({'status': '已配送'})
return super().write(vals)
class ResMrpWorkOrder(models.Model):
_inherit = 'mrp.workorder'