1、设备维保优化

This commit is contained in:
yuxianghui
2024-10-22 17:52:20 +08:00
parent f2482b5128
commit 98923c1797
4 changed files with 130 additions and 50 deletions

View File

@@ -1,11 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import base64 import base64
import logging
from datetime import timedelta from datetime import timedelta
import requests import requests
from odoo.addons.sf_base.commons.common import Common from odoo.addons.sf_base.commons.common import Common
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo.exceptions import UserError from odoo.exceptions import UserError, ValidationError
class SfMaintenanceEquipmentCategory(models.Model): class SfMaintenanceEquipmentCategory(models.Model):
@@ -122,6 +123,10 @@ class SfMaintenanceEquipment(models.Model):
'sf_maintenance_equipment_ids', string='设备维保标准') 'sf_maintenance_equipment_ids', string='设备维保标准')
eq_maintenance_id = fields.Many2one('equipment.maintenance.standards', string='设备保养标准', eq_maintenance_id = fields.Many2one('equipment.maintenance.standards', string='设备保养标准',
domain="[('maintenance_type','=','保养')]") domain="[('maintenance_type','=','保养')]")
initial_action_date = fields.Date(string='初始保养日期')
next_action_date = fields.Date(string='下次预防保养')
initial_overhaul_date = fields.Date(string='初始维修日期')
overhaul_date = fields.Date(string='下次预防检修') overhaul_date = fields.Date(string='下次预防检修')
overhaul_period = fields.Integer(string='预防检修频次') overhaul_period = fields.Integer(string='预防检修频次')
overhaul_duration = fields.Float(string='检修时长') overhaul_duration = fields.Float(string='检修时长')
@@ -129,6 +134,52 @@ class SfMaintenanceEquipment(models.Model):
overhaul_id = fields.Many2one('equipment.maintenance.standards', string='设备检修标准', overhaul_id = fields.Many2one('equipment.maintenance.standards', string='设备检修标准',
domain="[('maintenance_type','=','检修')]") domain="[('maintenance_type','=','检修')]")
def confirm_maintenance(self):
"""
确认保养/检修
"""
context = self.env.context
initial_date = None
next_date = None
if context['type'] == '保养':
if not self.initial_action_date:
raise ValidationError('初始保养日期不能为空!!')
elif self.initial_action_date < fields.Date.today():
raise ValidationError('初始保养日期不能小于当前日期!!')
else:
initial_date = self.initial_action_date
next_date = self.next_action_date
elif context['type'] == '检修':
if not self.initial_overhaul_date:
raise ValidationError('初始检修日期不能为空!!')
elif self.initial_overhaul_date < fields.Date.today():
raise ValidationError('初始检修日期不能小于当前日期!!')
else:
initial_date = self.initial_overhaul_date
next_date = self.overhaul_date
request_id = self.env['maintenance.request'].search([('stage_id.done', '=', False),
('equipment_id', '=', self.id),
('maintenance_type', '=', 'preventive'),
('request_date', '=', next_date),
('sf_maintenance_type', '=', context['type'])])
if not request_id:
if context['type'] == '保养':
self._create_new_request(initial_date)
elif context['type'] == '检修':
self._create_new_request1(initial_date)
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': f'创建{context["type"]}计划',
'message': f'{context["type"]}维保计划创建成功',
'type': 'success'
}
}
else:
pass
@api.onchange('eq_maintenance_id', 'overhaul_id') @api.onchange('eq_maintenance_id', 'overhaul_id')
def _compute_equipment_maintenance_standards_ids(self): def _compute_equipment_maintenance_standards_ids(self):
for record in self: for record in self:
@@ -624,7 +675,7 @@ class SfMaintenanceEquipment(models.Model):
if next_date < date_now: if next_date < date_now:
next_date = date_now next_date = date_now
else: else:
next_date = equipment.effective_date + timedelta(days=equipment.period) next_date = equipment.initial_action_date + timedelta(days=equipment.period)
equipment.next_action_date = next_date equipment.next_action_date = next_date
else: else:
self.next_action_date = False self.next_action_date = False
@@ -668,7 +719,7 @@ class SfMaintenanceEquipment(models.Model):
if next_date < date_now: if next_date < date_now:
next_date = date_now next_date = date_now
else: else:
next_date = equipment.effective_date + timedelta(days=equipment.overhaul_period) next_date = equipment.initial_overhaul_date + timedelta(days=equipment.overhaul_period)
equipment.overhaul_date = next_date equipment.overhaul_date = next_date
else: else:
self.overhaul_date = False self.overhaul_date = False
@@ -678,7 +729,7 @@ class SfMaintenanceEquipment(models.Model):
self.ensure_one() self.ensure_one()
return { return {
'name': _('Preventive Maintenance - %s', self.name), 'name': _('Preventive Maintenance - %s', self.name),
'request_date': date, 'request_date': fields.Date.today(),
'schedule_date': date, 'schedule_date': date,
'category_id': self.category_id.id, 'category_id': self.category_id.id,
'equipment_id': self.id, 'equipment_id': self.id,
@@ -698,7 +749,7 @@ class SfMaintenanceEquipment(models.Model):
self.ensure_one() self.ensure_one()
return { return {
'name': _('Preventive Maintenance - %s', self.name), 'name': _('Preventive Maintenance - %s', self.name),
'request_date': date, 'request_date': fields.Date.today(),
'schedule_date': date, 'schedule_date': date,
'category_id': self.category_id.id, 'category_id': self.category_id.id,
'equipment_id': self.id, 'equipment_id': self.id,

View File

@@ -14,6 +14,8 @@ class SfMaintenanceEquipmentCategory(models.Model):
equipment_maintenance_id = fields.Many2one('equipment.maintenance.standards', string='设备维保标准', equipment_maintenance_id = fields.Many2one('equipment.maintenance.standards', string='设备维保标准',
domain="[('maintenance_type','=',sf_maintenance_type)]") domain="[('maintenance_type','=',sf_maintenance_type)]")
active = fields.Boolean('有效', default=True)
@api.onchange('sf_maintenance_type') @api.onchange('sf_maintenance_type')
def _compute_equipment_maintenance_request_id(self): def _compute_equipment_maintenance_request_id(self):
for record in self: for record in self:

View File

@@ -20,7 +20,7 @@ access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_mainten
access_maintenance_system_user,equipment.request system user,maintenance.model_maintenance_request,base.group_user,1,0,0,0 access_maintenance_system_user,equipment.request system user,maintenance.model_maintenance_request,base.group_user,1,1,1,0
access_maintenance_equipment_group_plan_dispatch,maintenance.equipment,maintenance.model_maintenance_equipment,sf_base.group_plan_dispatch,1,0,0,0 access_maintenance_equipment_group_plan_dispatch,maintenance.equipment,maintenance.model_maintenance_equipment,sf_base.group_plan_dispatch,1,0,0,0
access_maintenance_equipment_oee_group_plan_dispatch,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_base.group_plan_dispatch,1,0,0,0 access_maintenance_equipment_oee_group_plan_dispatch,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
20 access_maintenance_system_user equipment.request system user maintenance.model_maintenance_request base.group_user 1 0 1 0 1 0
21 access_maintenance_equipment_group_plan_dispatch maintenance.equipment maintenance.model_maintenance_equipment sf_base.group_plan_dispatch 1 0 0 0
22 access_maintenance_equipment_oee_group_plan_dispatch maintenance_equipment_oee model_maintenance_equipment_oee sf_base.group_plan_dispatch 1 0 0 0
23 access_sf_maintenance_logs_group_plan_dispatch sf_maintenance_logs model_sf_maintenance_logs sf_base.group_plan_dispatch 1 0 0 0
24 access_maintenance_standard_image_group_plan_dispatch maintenance_standard_image model_maintenance_standard_image sf_base.group_plan_dispatch 1 0 0 0
25 access_equipment_maintenance_standards_group_plan_dispatch equipment_maintenance_standards model_equipment_maintenance_standards sf_base.group_plan_dispatch 1 0 0 0
26 access_maintenance_standards_group_plan_dispatch maintenance_standards model_maintenance_standards sf_base.group_plan_dispatch 1 0 0 0

View File

@@ -60,9 +60,9 @@
<field name="function_type"/> <field name="function_type"/>
<field name="code" readonly="1"/> <field name="code" readonly="1"/>
<field name="equipment_type" invisible="1"/> <field name="equipment_type" invisible="1"/>
<field name="brand_id" force_save="1" /> <field name="brand_id" force_save="1"/>
<field name="type_id" attrs="{'required': [('equipment_type', '=', '机床')]}" <field name="type_id" attrs="{'required': [('equipment_type', '=', '机床')]}"
domain="[('brand_id', '=', brand_id)]" /> domain="[('brand_id', '=', brand_id)]"/>
<field name="machine_tool_category" readonly="1" attrs="{'invisible': [('type_id', '=', False)]}" <field name="machine_tool_category" readonly="1" attrs="{'invisible': [('type_id', '=', False)]}"
force_save="1"/> force_save="1"/>
<field name="run_time" force_save="1"/> <field name="run_time" force_save="1"/>
@@ -73,7 +73,7 @@
<group> <group>
<group string="基础参数"> <group string="基础参数">
<field name="control_system_id" attrs="{'required': [('equipment_type', '=', '机床')]}" <field name="control_system_id" attrs="{'required': [('equipment_type', '=', '机床')]}"
options="{'no_create': True}" /> options="{'no_create': True}"/>
<label for="workbench_L" string="工作台尺寸(mm)"/> <label for="workbench_L" string="工作台尺寸(mm)"/>
<div class="test_model"> <div class="test_model">
<label for="workbench_L" string="长"/> <label for="workbench_L" string="长"/>
@@ -134,7 +134,7 @@
<!-- <field name="guide_rail" required="1"/>--> <!-- <field name="guide_rail" required="1"/>-->
<field name="number_of_axles" attrs="{'required': [('equipment_type', '=', '机床')]}" <field name="number_of_axles" attrs="{'required': [('equipment_type', '=', '机床')]}"
widget="radio" widget="radio"
options="{'horizontal': true}" /> options="{'horizontal': true}"/>
<label for="x_axis" string="加工行程(mm)" <label for="x_axis" string="加工行程(mm)"
attrs="{'invisible': [('number_of_axles', '=', False)]}"/> attrs="{'invisible': [('number_of_axles', '=', False)]}"/>
<div class="test_model" <div class="test_model"
@@ -197,7 +197,7 @@
<field name="C_tool_time"/> <field name="C_tool_time"/>
</group> </group>
<group string="主轴"> <group string="主轴">
<field name="taper_type_id" attrs="{'required': [('equipment_type', '=', '机床')]}" /> <field name="taper_type_id" attrs="{'required': [('equipment_type', '=', '机床')]}"/>
<label for="distance_min" string="主轴端面-工作台距离(mm)"/> <label for="distance_min" string="主轴端面-工作台距离(mm)"/>
<div class="test_model"> <div class="test_model">
<label for="distance_min" string="最小(min)"/> <label for="distance_min" string="最小(min)"/>
@@ -256,14 +256,14 @@
attrs="{'invisible': [('equipment_type', '!=', 'AGV小车')]}"> attrs="{'invisible': [('equipment_type', '!=', 'AGV小车')]}">
<field name="agv_logs"> <field name="agv_logs">
<tree create="1" edit="1" delete="1" editable="bottom"> <tree create="1" edit="1" delete="1" editable="bottom">
<field name = 'run_type'/> <field name='run_type'/>
<field name = 'run_code'/> <field name='run_code'/>
<field name = 'run_first'/> <field name='run_first'/>
<field name = 'run_last'/> <field name='run_last'/>
<field name = 'production_line'/> <field name='production_line'/>
<field name = 'workorder'/> <field name='workorder'/>
<field name = 'time'/> <field name='time'/>
<field name = 'state'/> <field name='state'/>
</tree> </tree>
</field> </field>
</page> </page>
@@ -979,16 +979,32 @@
</group> </group>
</xpath> </xpath>
<xpath expr="//field[@name='next_action_date']" position="before">
<xpath expr="//page[@name='maintenance']" position="replace">
<page string="维保" name="maintenance">
<group>
<group string="保养">
<field name='eq_maintenance_id' force_save="1" widget="many2one"/> <field name='eq_maintenance_id' force_save="1" widget="many2one"/>
<field name="initial_action_date"/>
</xpath> <field name="next_action_date" string="下次预防保养"/>
<label for="period" string="预防保养频次"/>
<xpath expr="//div[hasclass('o_row')][field[@name='maintenance_duration']]" position="after"> <div class="o_row">
<field name="period"/>
days
<field name='overhaul_id' options="{'no_create':True}"/> </div>
<label for="maintenance_duration" string="保养时长"/>
<div class="o_row">
<field name="maintenance_duration"/>
hours
</div>
<div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">
<button name="confirm_maintenance" string="确认保养" type="object"
class="oe_highlight" context="{'type': '保养'}"/>
</div>
</group>
<group string="检修">
<field name='overhaul_id'/>
<field name="initial_overhaul_date"/>
<field name="overhaul_date" string="下次预防检修"/> <field name="overhaul_date" string="下次预防检修"/>
<label for="overhaul_period" string="预防检修频次"/> <label for="overhaul_period" string="预防检修频次"/>
<div class="o_row"> <div class="o_row">
@@ -1001,9 +1017,20 @@
<field name="overhaul_duration"/> <field name="overhaul_duration"/>
hours hours
</div> </div>
<field name='equipment_maintenance_standards_ids' widget="many2many_tags" invisible="1"/> <field name='equipment_maintenance_standards_ids' widget="many2many_tags"
invisible="1"/>
<div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">
<button name="confirm_maintenance" string="确认检修" type="object"
class="oe_highlight" context="{'type': '检修'}"/>
</div>
</group>
</group>
</page>
</xpath> </xpath>
<xpath expr="//page[@name='description']" position="attributes"> <xpath expr="//page[@name='description']" position="attributes">
<attribute name="invisible">1</attribute> <attribute name="invisible">1</attribute>
</xpath> </xpath>
@@ -1189,7 +1216,7 @@
<field name="name" readonly="1"/> <field name="name" readonly="1"/>
<field name="type" readonly="1"/> <field name="type" readonly="1"/>
<field name="image" widget="image" readonly="1"/> <field name="image" widget="image" readonly="1"/>
<!-- <field name="equipment_id"/>--> <!-- <field name="equipment_id"/>-->
<field name="active" invisible="1"/> <field name="active" invisible="1"/>
</tree> </tree>
</field> </field>