72 lines
3.6 KiB
Python
72 lines
3.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from dateutil.relativedelta import relativedelta
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class MaintenanceEquipment(models.Model):
|
|
_inherit = "maintenance.equipment"
|
|
|
|
production_line_id = fields.Many2one('sf.production.line', string='生产线')
|
|
expected_mtbf = fields.Integer(string='Expected MTBF', help='Expected Mean Time Between Failure')
|
|
mtbf = fields.Integer(compute='_compute_maintenance_request', string='MTBF',
|
|
help='Mean Time Between Failure, computed based on done corrective maintenances.')
|
|
mttr = fields.Integer(compute='_compute_maintenance_request', string='MTTR', help='Mean Time To Repair')
|
|
estimated_next_failure = fields.Date(compute='_compute_maintenance_request',
|
|
string='Estimated time before next failure (in days)',
|
|
help='Computed as Latest Failure Date + MTBF')
|
|
latest_failure_date = fields.Date(compute='_compute_maintenance_request', string='Latest Failure Date')
|
|
|
|
@api.depends('effective_date', 'maintenance_ids.stage_id', 'maintenance_ids.close_date',
|
|
'maintenance_ids.request_date')
|
|
def _compute_maintenance_request(self):
|
|
for equipment in self:
|
|
maintenance_requests = equipment.maintenance_ids.filtered(
|
|
lambda x: x.maintenance_type == 'corrective' and x.stage_id.done)
|
|
mttr_days = 0
|
|
for maintenance in maintenance_requests:
|
|
if maintenance.stage_id.done and maintenance.close_date:
|
|
mttr_days += (maintenance.close_date - maintenance.request_date).days
|
|
equipment.mttr = len(maintenance_requests) and (mttr_days / len(maintenance_requests)) or 0
|
|
maintenance = maintenance_requests.sorted(lambda x: x.request_date)
|
|
if len(maintenance) >= 1:
|
|
equipment.mtbf = (maintenance[-1].request_date - equipment.effective_date).days / len(maintenance)
|
|
equipment.latest_failure_date = maintenance and maintenance[-1].request_date or False
|
|
if equipment.mtbf:
|
|
equipment.estimated_next_failure = equipment.latest_failure_date + relativedelta(days=equipment.mtbf)
|
|
else:
|
|
equipment.estimated_next_failure = False
|
|
|
|
def button_mrp_workcenter(self):
|
|
self.ensure_one()
|
|
return {
|
|
'name': _('work centers'),
|
|
'view_mode': 'form',
|
|
'res_model': 'mrp.workcenter',
|
|
'view_id': self.env.ref('mrp.mrp_workcenter_view').id,
|
|
'type': 'ir.actions.act_window',
|
|
'res_id': self.workcenter_id.id,
|
|
'context': {
|
|
'default_company_id': self.company_id.id
|
|
}
|
|
}
|
|
|
|
|
|
class MaintenanceRequest(models.Model):
|
|
_inherit = "maintenance.request"
|
|
_check_company_auto = True
|
|
|
|
production_id = fields.Many2one(
|
|
'mrp.production', string='Manufacturing Order', check_company=True)
|
|
workorder_id = fields.Many2one(
|
|
'mrp.workorder', string='Work Order', check_company=True)
|
|
production_company_id = fields.Many2one(string='Production Company', related='production_id.company_id')
|
|
company_id = fields.Many2one(domain="[('id', '=?', production_company_id)]")
|
|
|
|
|
|
class SfMaintenanceLogs(models.Model):
|
|
_inherit = 'sf.maintenance.logs'
|
|
|
|
production_line_id = fields.Many2one('sf.production.line', string='生产线',
|
|
related='maintenance_equipment_id.production_line_id', store=True)
|