77 lines
3.1 KiB
Python
77 lines
3.1 KiB
Python
from odoo import models, fields, api, _
|
|
from odoo.exceptions import UserError
|
|
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class AgvDispatch(models.Model):
|
|
_name = 'sf.agv.dispatch'
|
|
_description = 'agv调度'
|
|
|
|
name = fields.Char('任务单号', index=True, copy=False)
|
|
|
|
def _get_agv_route_type_selection(self):
|
|
return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection']
|
|
|
|
agv_route_type = fields.Selection(selection=_get_agv_route_type_selection, string='任务类型', required=True)
|
|
agv_route_name = fields.Char('任务路线名称')
|
|
start_site_id = fields.Many2one('sf.agv.site', '起点接驳站', required=True)
|
|
end_site_id = fields.Many2one('sf.agv.site', '终点接驳站', tracking=True)
|
|
site_state = fields.Selection([
|
|
('占用', '占用'),
|
|
('空闲', '空闲')], string='终点接驳站状态')
|
|
state = fields.Selection([
|
|
('待下发', '待下发'),
|
|
('配送中', '配送中'),
|
|
('已配送', '已配送'),
|
|
('已取消', '已取消')], string='状态', default='待下发', tracking=True)
|
|
productions = fields.Char('制造订单', compute='_compute_productions')
|
|
workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'agv_dispatch_id', string='工件配送单')
|
|
delivery_workpieces = fields.Char('配送工件', compute='_compute_delivery_workpieces')
|
|
|
|
@api.depends('workpiece_delivery_ids')
|
|
def _compute_delivery_workpieces(self):
|
|
for rec in self:
|
|
rec.delivery_workpieces = '\\'.join(rec.workpiece_delivery_ids.mapped('name'))
|
|
|
|
task_create_time = fields.Datetime('任务创建时间')
|
|
task_delivery_time = fields.Datetime('任务下发时间')
|
|
task_completion_time = fields.Datetime('任务完成时间')
|
|
task_duration = fields.Char('任务时长', compute='_compute_task_duration')
|
|
|
|
@api.depends('task_completion_time', 'task_delivery_time')
|
|
def _compute_task_duration(self):
|
|
for rec in self:
|
|
if rec.task_completion_time and rec.task_delivery_time:
|
|
rec.task_duration = str(rec.task_completion_time - rec.task_delivery_time)
|
|
else:
|
|
rec.task_duration = ''
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
# We generate a standard reference
|
|
for vals in vals_list:
|
|
vals['name'] = self.env['ir.sequence'].next_by_code('sf.agv.dispatch') or _('New')
|
|
return super().create(vals_list)
|
|
|
|
def add_queue(self, agv_start_site_id, agv_route_type, production_ids, delivery_ids):
|
|
"""
|
|
根据参数增加AGV调度任务
|
|
"""
|
|
vals = {
|
|
'start_site_id': agv_start_site_id,
|
|
'agv_route_type': agv_route_type,
|
|
'productions': '、'.join(production_ids.mapped('name')),
|
|
'workpiece_delivery_ids': delivery_ids or [],
|
|
'task_create_time': fields.Datetime.now()
|
|
}
|
|
try:
|
|
dispatch = self.env['sf.agv.dispatch'].sudo().create(vals)
|
|
except Exception as e:
|
|
_logger.error('添加AGV调度任务失败: %s', e)
|
|
raise UserError(e)
|
|
|
|
return dispatch
|