增加不同工作中心配置相同接驳站的功能
This commit is contained in:
@@ -87,11 +87,12 @@ class AgvScheduling(models.Model):
|
|||||||
agv_route_type: AGV任务类型
|
agv_route_type: AGV任务类型
|
||||||
workorders: 工单
|
workorders: 工单
|
||||||
"""
|
"""
|
||||||
|
scheduling = None
|
||||||
_logger.info('创建AGV调度任务\r\n起点为【%s】,任务类型为【%s】,工单为【%s】' % (agv_start_site_name, agv_route_type, workorders))
|
_logger.info('创建AGV调度任务\r\n起点为【%s】,任务类型为【%s】,工单为【%s】' % (agv_start_site_name, agv_route_type, workorders))
|
||||||
if not workorders:
|
if not workorders:
|
||||||
raise UserError(_('工单不能为空'))
|
raise UserError(_('工单不能为空'))
|
||||||
agv_start_site = self.env['sf.agv.site'].sudo().search([('name', '=', agv_start_site_name)], limit=1)
|
agv_start_sites = self.env['sf.agv.site'].sudo().search([('name', '=', agv_start_site_name)])
|
||||||
if not agv_start_site:
|
if not agv_start_sites:
|
||||||
raise UserError(_('不存在名称为【%s】的接驳站,请先创建!' % agv_start_site_name))
|
raise UserError(_('不存在名称为【%s】的接驳站,请先创建!' % agv_start_site_name))
|
||||||
# 如果存在相同任务类型工单的AGV调度任务,则提示错误
|
# 如果存在相同任务类型工单的AGV调度任务,则提示错误
|
||||||
agv_scheduling = self.sudo().search([
|
agv_scheduling = self.sudo().search([
|
||||||
@@ -107,24 +108,32 @@ class AgvScheduling(models.Model):
|
|||||||
(','.join(repetitive_workorders.mapped('production_id.name')), agv_scheduling.name)
|
(','.join(repetitive_workorders.mapped('production_id.name')), agv_scheduling.name)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 如果只有唯一任务路线,则自动赋予终点接驳站跟任务名称
|
||||||
|
agv_routes = self.env['sf.agv.task.route'].sudo().search([
|
||||||
|
('route_type', '=', agv_route_type),
|
||||||
|
('start_site_id', 'in', agv_start_sites.ids)
|
||||||
|
])
|
||||||
vals = {
|
vals = {
|
||||||
'start_site_id': agv_start_site.id,
|
|
||||||
'agv_route_type': agv_route_type,
|
'agv_route_type': agv_route_type,
|
||||||
'workorder_ids': workorders.ids,
|
'workorder_ids': workorders.ids,
|
||||||
# 'workpiece_delivery_ids': deliveries.mapped('id') if deliveries else [],
|
# 'workpiece_delivery_ids': deliveries.mapped('id') if deliveries else [],
|
||||||
'task_create_time': fields.Datetime.now()
|
'task_create_time': fields.Datetime.now()
|
||||||
}
|
}
|
||||||
# 如果只有唯一任务路线,则自动赋予终点接驳站跟任务名称
|
|
||||||
agv_routes = self.env['sf.agv.task.route'].sudo().search([
|
|
||||||
('route_type', '=', agv_route_type),
|
|
||||||
('start_site_id', '=', agv_start_site.id)
|
|
||||||
])
|
|
||||||
if not agv_routes:
|
if not agv_routes:
|
||||||
raise UserError(_('不存在起点为【%s】的【%s】任务路线,请先创建!' % (agv_start_site_name, agv_route_type)))
|
raise UserError(_('不存在起点为【%s】的【%s】任务路线,请先创建!' % (agv_start_site_name, agv_route_type)))
|
||||||
|
# 如果路线中包含起点与终点相同的接驳站,则不创建AGV调度任务
|
||||||
|
if agv_routes.filtered(lambda r: r.start_site_id.name == r.end_site_id.name):
|
||||||
|
return True
|
||||||
|
# 配送类型相同的接驳站为同一个,取第一个即可
|
||||||
|
vals.update({
|
||||||
|
'start_site_id': agv_routes[0].start_site_id.id,
|
||||||
|
})
|
||||||
idle_route = None
|
idle_route = None
|
||||||
if len(agv_routes) == 1:
|
if len(agv_routes) == 1:
|
||||||
idle_route = agv_routes[0]
|
idle_route = agv_routes[0]
|
||||||
vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id})
|
vals.update({
|
||||||
|
'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id
|
||||||
|
})
|
||||||
else:
|
else:
|
||||||
# 判断终点接驳站是否为空闲
|
# 判断终点接驳站是否为空闲
|
||||||
idle_routes = agv_routes.filtered(lambda r: r.end_site_id.state == '空闲')
|
idle_routes = agv_routes.filtered(lambda r: r.end_site_id.state == '空闲')
|
||||||
@@ -132,7 +141,10 @@ class AgvScheduling(models.Model):
|
|||||||
# 将空闲的路线按照终点接驳站名称排序
|
# 将空闲的路线按照终点接驳站名称排序
|
||||||
idle_routes = sorted(idle_routes, key=lambda r: r.end_site_id.name)
|
idle_routes = sorted(idle_routes, key=lambda r: r.end_site_id.name)
|
||||||
idle_route = idle_routes[0]
|
idle_route = idle_routes[0]
|
||||||
vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id})
|
vals.update({
|
||||||
|
'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id
|
||||||
|
})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
scheduling = self.env['sf.agv.scheduling'].sudo().create(vals)
|
scheduling = self.env['sf.agv.scheduling'].sudo().create(vals)
|
||||||
# 触发空闲接驳站状态更新,触发新任务下发
|
# 触发空闲接驳站状态更新,触发新任务下发
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class AgvSetting(models.Model):
|
|||||||
|
|
||||||
# name必须唯一
|
# name必须唯一
|
||||||
_sql_constraints = [
|
_sql_constraints = [
|
||||||
('name_uniq', 'unique (name)', '站点编号必须唯一!'),
|
('name_uniq', 'unique (name, workcenter_id)', '同一工作中心的站点编号必须唯一!'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# def update_site_state(self):
|
# def update_site_state(self):
|
||||||
@@ -68,11 +68,12 @@ class AgvSetting(models.Model):
|
|||||||
"""
|
"""
|
||||||
if isinstance(agv_site_state_arr, dict):
|
if isinstance(agv_site_state_arr, dict):
|
||||||
for agv_site_name, is_occupy in agv_site_state_arr.items():
|
for agv_site_name, is_occupy in agv_site_state_arr.items():
|
||||||
agv_site = self.env['sf.agv.site'].sudo().search([('name', '=', agv_site_name)])
|
agv_sites = self.env['sf.agv.site'].sudo().search([('name', '=', agv_site_name)])
|
||||||
if agv_site:
|
if agv_sites:
|
||||||
agv_site.state = is_occupy
|
agv_sites.state = is_occupy
|
||||||
if notify:
|
if notify:
|
||||||
self.env['sf.agv.scheduling'].on_site_state_change(agv_site.id, agv_site.state)
|
for agv_site in agv_sites:
|
||||||
|
self.env['sf.agv.scheduling'].on_site_state_change(agv_site.id, agv_site.state)
|
||||||
else:
|
else:
|
||||||
_logger.error("更新失败:接驳站站点错误!%s" % agv_site_name)
|
_logger.error("更新失败:接驳站站点错误!%s" % agv_site_name)
|
||||||
raise UserError("更新失败:接驳站站点错误!")
|
raise UserError("更新失败:接驳站站点错误!")
|
||||||
|
|||||||
@@ -117,17 +117,30 @@ class WorkpieceDeliveryWizard(models.TransientModel):
|
|||||||
item.button_finish()
|
item.button_finish()
|
||||||
|
|
||||||
# return scheduling.read()[0]
|
# return scheduling.read()[0]
|
||||||
return {
|
if isinstance(scheduling, bool) and scheduling is True:
|
||||||
'type': 'ir.actions.client',
|
return{
|
||||||
'tag': 'display_notification',
|
'type': 'ir.actions.client',
|
||||||
'target': 'new',
|
'tag': 'display_notification',
|
||||||
'params': {
|
'target': 'new',
|
||||||
'message': f'任务下发成功!AGV任务调度编号为【{scheduling.name}】',
|
'params': {
|
||||||
'type': 'success',
|
'message': f'解除装夹成功',
|
||||||
'sticky': False,
|
'type': 'success',
|
||||||
'next': {'type': 'ir.actions.act_window_close'},
|
'sticky': False,
|
||||||
|
'next': {'type': 'ir.actions.act_window_close'},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.client',
|
||||||
|
'tag': 'display_notification',
|
||||||
|
'target': 'new',
|
||||||
|
'params': {
|
||||||
|
'message': f'任务下发成功!AGV任务调度编号为【{scheduling.name}】',
|
||||||
|
'type': 'success',
|
||||||
|
'sticky': False,
|
||||||
|
'next': {'type': 'ir.actions.act_window_close'},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.info('%s任务下发失败:%s', self.delivery_type, e)
|
logging.info('%s任务下发失败:%s', self.delivery_type, e)
|
||||||
raise UserError(f'{self.delivery_type}任务下发失败:{e}') from e
|
raise UserError(f'{self.delivery_type}任务下发失败:{e}') from e
|
||||||
|
|||||||
Reference in New Issue
Block a user