修改维保标准维保项目参数为One2many对象 并与设备,维保计划关联,修改原生维保计划方法 根据保养和检修生成不同的维保计划单

This commit is contained in:
qihao.gong@jikimo.com
2023-07-04 17:30:50 +08:00
parent 4199a86264
commit e6060b9bab
8 changed files with 241 additions and 52 deletions

View File

@@ -24,8 +24,7 @@ class SfEquipmentSaintenanceStandards(models.Model):
created_user_id = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) created_user_id = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user)
maintenance_equipment_category_id = fields.Many2one('maintenance.equipment.category', string='设备类别') maintenance_equipment_category_id = fields.Many2one('maintenance.equipment.category', string='设备类别')
maintenance_equipment_ids = fields.Many2many('maintenance.equipment', 'sf_maintenance_equipment_ids', string='设备') maintenance_equipment_ids = fields.Many2many('maintenance.equipment', 'sf_maintenance_equipment_ids', string='设备')
maintenance_projects = fields.Char('维保项目') maintenance_standards_ids = fields.One2many('maintenance.standards', 'equipment_maintenance_standards_id', string='维保项目')
maintenance_standards = fields.Char('维保标准')
eq_maintenance_ids = fields.One2many('maintenance.equipment', 'eq_maintenance_id', string='保养设备') eq_maintenance_ids = fields.One2many('maintenance.equipment', 'eq_maintenance_id', string='保养设备')
overhaul_ids = fields.One2many('maintenance.equipment', 'overhaul_id', string='检修设备') overhaul_ids = fields.One2many('maintenance.equipment', 'overhaul_id', string='检修设备')
@@ -37,7 +36,14 @@ class SfEquipmentSaintenanceStandards(models.Model):
if record.maintenance_type == '检修': if record.maintenance_type == '检修':
record.write({'overhaul_ids': [(6, 0, record.maintenance_equipment_ids.ids)]}) record.write({'overhaul_ids': [(6, 0, record.maintenance_equipment_ids.ids)]})
class SfSaintenanceStandards(models.Model):
_name = 'maintenance.standards'
_description = '维保项目'
name = fields.Char('维保项目')
maintenance_standards = fields.Char('维保标准')
equipment_maintenance_standards_id = fields.Many2one('equipment.maintenance.standards', string='设备维保标准')
maintenance_request_id = fields.Many2one('maintenance.request', string='设备维保计划')

View File

@@ -4,10 +4,12 @@ import base64
from odoo import api, fields, models, SUPERUSER_ID, _ from odoo import api, fields, models, SUPERUSER_ID, _
from odoo.exceptions import UserError from odoo.exceptions import UserError
import logging import logging
from datetime import date, datetime, timedelta
import requests import requests
import json import json
from odoo.addons.sf_base.commons.common import Common from odoo.addons.sf_base.commons.common import Common
class SfMaintenanceEquipmentCategory(models.Model): class SfMaintenanceEquipmentCategory(models.Model):
_inherit = 'maintenance.equipment.category' _inherit = 'maintenance.equipment.category'
_description = '设备类别' _description = '设备类别'
@@ -20,6 +22,7 @@ class SfMaintenanceEquipment(models.Model):
_description = '设备' _description = '设备'
crea_url = "/api/machine_tool/create" crea_url = "/api/machine_tool/create"
def get_no(self): def get_no(self):
partner = self.env['maintenance.equipment'].sudo().search( partner = self.env['maintenance.equipment'].sudo().search(
[('MTcode', '!=', '')], [('MTcode', '!=', '')],
@@ -33,19 +36,23 @@ class SfMaintenanceEquipment(models.Model):
num = "%04d" % m num = "%04d" % m
return num return num
equipment_maintenance_standards_ids = fields.Many2many('equipment.maintenance.standards', 'sf_maintenance_equipment_ids', string='设备维保标准') equipment_maintenance_standards_ids = fields.Many2many('equipment.maintenance.standards',
eq_maintenance_id =fields.Many2one('equipment.maintenance.standards', string='设备保标准', domain="[('maintenance_type','=','保养')]") 'sf_maintenance_equipment_ids', string='设备保标准')
eq_maintenance_id = fields.Many2one('equipment.maintenance.standards', string='设备保养标准',
domain="[('maintenance_type','=','保养')]")
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='检修时长')
overhaul_id = fields.Many2one('equipment.maintenance.standards', string='设备检修标准', domain="[('maintenance_type','=','检修')]") overhaul_id = fields.Many2one('equipment.maintenance.standards', string='设备检修标准',
domain="[('maintenance_type','=','检修')]")
@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:
if record.eq_maintenance_id and record.overhaul_id: if record.eq_maintenance_id and record.overhaul_id:
record.equipment_maintenance_standards_ids = [(6, 0, [record.eq_maintenance_id.id, record.overhaul_id.id])] record.equipment_maintenance_standards_ids = [
(6, 0, [record.eq_maintenance_id.id, record.overhaul_id.id])]
break break
if record.eq_maintenance_id: if record.eq_maintenance_id:
record.equipment_maintenance_standards_ids = [(6, 0, [record.eq_maintenance_id.id])] record.equipment_maintenance_standards_ids = [(6, 0, [record.eq_maintenance_id.id])]
@@ -56,8 +63,6 @@ class SfMaintenanceEquipment(models.Model):
else: else:
record.equipment_maintenance_standards_ids = False record.equipment_maintenance_standards_ids = False
MTcode = fields.Char("编码", default=get_no) MTcode = fields.Char("编码", default=get_no)
created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user)
equipment_type = fields.Selection([('机床', '机床')], related='category_id.equipment_type') equipment_type = fields.Selection([('机床', '机床')], related='category_id.equipment_type')
@@ -279,7 +284,6 @@ class SfMaintenanceEquipment(models.Model):
'tool_diameter_max': item.tool_diameter_max, 'tool_diameter_max': item.tool_diameter_max,
'machine_tool_category': item.machine_tool_category.code, 'machine_tool_category': item.machine_tool_category.code,
} }
machine_tool_list.append(val) machine_tool_list.append(val)
# kw = machine_tool_list # kw = machine_tool_list
@@ -293,4 +297,168 @@ class SfMaintenanceEquipment(models.Model):
else: else:
raise UserError("没有注册机床信息") raise UserError("没有注册机床信息")
# 修改原生方法,生成维保日期
@api.depends('effective_date', 'period', 'maintenance_ids.request_date', 'maintenance_ids.close_date',
'overhaul_period')
def _compute_next_maintenance(self):
date_now = fields.Date.context_today(self)
equipments = self.filtered(lambda x: x.period > 0)
if equipments:
for equipment in equipments:
next_maintenance_todo = self.env['maintenance.request'].search([
('equipment_id', '=', equipment.id),
('sf_maintenance_type', '=', '保养'),
('stage_id.done', '!=', True),
('close_date', '=', False)], order="request_date asc", limit=1)
last_maintenance_done = self.env['maintenance.request'].search([
('equipment_id', '=', equipment.id),
('sf_maintenance_type', '=', '保养'),
('stage_id.done', '=', True),
('close_date', '!=', False)], order="close_date desc", limit=1)
if next_maintenance_todo and last_maintenance_done:
next_date = next_maintenance_todo.request_date
date_gap = next_maintenance_todo.request_date - last_maintenance_done.close_date
# If the gap between the last_maintenance_done and the next_maintenance_todo one is bigger than 2 times the period and next request is in the future
# We use 2 times the period to avoid creation too closed request from a manually one created
if date_gap > timedelta(0) and date_gap > timedelta(
days=equipment.period) * 2 and next_maintenance_todo.request_date > date_now:
# If the new date still in the past, we set it for today
if last_maintenance_done.close_date + timedelta(days=equipment.period) < date_now:
next_date = date_now
else:
next_date = last_maintenance_done.close_date + timedelta(days=equipment.period)
elif next_maintenance_todo:
next_date = next_maintenance_todo.request_date
date_gap = next_maintenance_todo.request_date - date_now
# If next maintenance to do is in the future, and in more than 2 times the period, we insert an new request
# We use 2 times the period to avoid creation too closed request from a manually one created
if date_gap > timedelta(0) and date_gap > timedelta(days=equipment.period) * 2:
next_date = date_now + timedelta(days=equipment.period)
elif last_maintenance_done:
next_date = last_maintenance_done.close_date + timedelta(days=equipment.period)
# If when we add the period to the last maintenance done and we still in past, we plan it for today
if next_date < date_now:
next_date = date_now
else:
next_date = equipment.effective_date + timedelta(days=equipment.period)
equipment.next_action_date = next_date
else:
self.next_action_date = False
overhaul_equipments = self.filtered(lambda x: x.overhaul_period > 0)
if overhaul_equipments:
for equipment in overhaul_equipments:
next_maintenance_todo = self.env['maintenance.request'].search([
('equipment_id', '=', equipment.id),
('sf_maintenance_type', '=', '检修'),
('stage_id.done', '!=', True),
('close_date', '=', False)], order="request_date asc", limit=1)
last_maintenance_done = self.env['maintenance.request'].search([
('equipment_id', '=', equipment.id),
('sf_maintenance_type', '=', '检修'),
('stage_id.done', '=', True),
('close_date', '!=', False)], order="close_date desc", limit=1)
if next_maintenance_todo and last_maintenance_done:
next_date = next_maintenance_todo.request_date
date_gap = next_maintenance_todo.request_date - last_maintenance_done.close_date
# If the gap between the last_maintenance_done and the next_maintenance_todo one is bigger than 2 times the period and next request is in the future
# We use 2 times the period to avoid creation too closed request from a manually one created
if date_gap > timedelta(0) and date_gap > timedelta(
days=equipment.overhaul_period) * 2 and next_maintenance_todo.request_date > date_now:
# If the new date still in the past, we set it for today
if last_maintenance_done.close_date + timedelta(days=equipment.overhaul_period) < date_now:
next_date = date_now
else:
next_date = last_maintenance_done.close_date + timedelta(days=equipment.overhaul_period)
elif next_maintenance_todo:
next_date = next_maintenance_todo.request_date
date_gap = next_maintenance_todo.request_date - date_now
# If next maintenance to do is in the future, and in more than 2 times the period, we insert an new request
# We use 2 times the period to avoid creation too closed request from a manually one created
if date_gap > timedelta(0) and date_gap > timedelta(days=equipment.overhaul_period) * 2:
next_date = date_now + timedelta(days=equipment.overhaul_period)
elif last_maintenance_done:
next_date = last_maintenance_done.close_date + timedelta(days=equipment.overhaul_period)
# If when we add the period to the last maintenance done and we still in past, we plan it for today
if next_date < date_now:
next_date = date_now
else:
next_date = equipment.effective_date + timedelta(days=equipment.overhaul_period)
equipment.overhaul_date = next_date
else:
self.overhaul_date = False
# 拼接维保请求字符串
def _prepare_maintenance_request_vals(self, date):
self.ensure_one()
return {
'name': _('Preventive Maintenance - %s', self.name),
'request_date': date,
'schedule_date': date,
'category_id': self.category_id.id,
'equipment_id': self.id,
'maintenance_type': 'preventive',
'owner_user_id': self.owner_user_id.id,
'user_id': self.technician_user_id.id,
'maintenance_team_id': self.maintenance_team_id.id,
'duration': self.maintenance_duration,
'company_id': self.company_id.id or self.env.company.id,
'equipment_maintenance_id': self.eq_maintenance_id.id,
'sf_maintenance_type': '保养'
}
# 拼接维保请求字符串
def _prepare_maintenance_request_vals1(self, date):
self.ensure_one()
return {
'name': _('Preventive Maintenance - %s', self.name),
'request_date': date,
'schedule_date': date,
'category_id': self.category_id.id,
'equipment_id': self.id,
'maintenance_type': 'preventive',
'owner_user_id': self.owner_user_id.id,
'user_id': self.technician_user_id.id,
'maintenance_team_id': self.maintenance_team_id.id,
'duration': self.maintenance_duration,
'company_id': self.company_id.id or self.env.company.id,
'equipment_maintenance_id': self.overhaul_id.id,
'sf_maintenance_type': '检修'
}
# 创建维保请求
def _create_new_request(self, date):
self.ensure_one()
vals = self._prepare_maintenance_request_vals(date)
maintenance_requests = self.env['maintenance.request'].create(vals)
return maintenance_requests
def _create_new_request1(self, date):
self.ensure_one()
vals = self._prepare_maintenance_request_vals1(date)
maintenance_requests = self.env['maintenance.request'].create(vals)
return maintenance_requests
# 生成维保请求定时器
@api.model
def _cron_generate_requests(self):
"""
Generates maintenance request on the next_action_date or today if none exists
"""
for equipment in self.search([('period', '>', 0)]):
next_requests = self.env['maintenance.request'].search([('stage_id.done', '=', False),
('equipment_id', '=', equipment.id),
('maintenance_type', '=', 'preventive'),
('request_date', '=', equipment.next_action_date),
('sf_maintenance_type', '=', '保养')])
if not next_requests:
equipment._create_new_request(equipment.next_action_date)
for equipment in self.search([('overhaul_period', '>', 0)]):
next_requests = self.env['maintenance.request'].search([('stage_id.done', '=', False),
('equipment_id', '=', equipment.id),
('maintenance_type', '=', 'preventive'),
('request_date', '=', equipment.overhaul_date),
('sf_maintenance_type', '=', '检修')])
if not next_requests:
equipment._create_new_request1(equipment.overhaul_date)

View File

@@ -26,8 +26,8 @@ class SfMaintenanceEquipmentCategory(models.Model):
record.equipment_maintenance_id = False record.equipment_maintenance_id = False
maintenance_projects = fields.Char(string='维保项目', related='equipment_maintenance_id.maintenance_projects')
maintenance_standards = fields.Char(string='维保标准', related='equipment_maintenance_id.maintenance_standards') maintenance_standards = fields.One2many('maintenance.standards','maintenance_request_id', string='维保标准', related='equipment_maintenance_id.maintenance_standards_ids')
@api.constrains('equipment_maintenance_id') @api.constrains('equipment_maintenance_id')
def _check_equipment_maintenance_id(self): def _check_equipment_maintenance_id(self):

View File

@@ -2,5 +2,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_equipment_maintenance_standards,equipment_maintenance_standards,model_equipment_maintenance_standards,base.group_user,1,1,1,1 access_equipment_maintenance_standards,equipment_maintenance_standards,model_equipment_maintenance_standards,base.group_user,1,1,1,1
access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.group_user,1,1,1,1 access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.group_user,1,1,1,1
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,base.group_user,1,1,1,1 access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,base.group_user,1,1,1,1
access_maintenance_standards,maintenance_standards,model_maintenance_standards,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_equipment_maintenance_standards equipment_maintenance_standards model_equipment_maintenance_standards base.group_user 1 1 1 1
3 access_sf_maintenance_logs sf_maintenance_logs model_sf_maintenance_logs base.group_user 1 1 1 1
4 access_maintenance_equipment maintenance_equipment model_maintenance_equipment base.group_user 1 1 1 1
5 access_maintenance_standards maintenance_standards model_maintenance_standards base.group_user 1 1 1 1
6
7

View File

@@ -2,31 +2,42 @@
<odoo> <odoo>
<record id="view_equipment_maintenance_standards_form" model="ir.ui.view"> <record id="view_equipment_maintenance_standards_form" model="ir.ui.view">
<field name="name">equipment.maintenance.standards.form</field> <field name="name">equipment.maintenance.standards.form</field>
<field name="model">equipment.maintenance.standards</field> <field name="model">equipment.maintenance.standards</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="设备维保标准"> <form string="设备维保标准">
<sheet> <sheet>
<group> <group>
<field name="code" readonly="1" force_save="1"/> <field name="code" readonly="1" force_save="1"/>
<field name="maintenance_type" required="1"/> <field name="maintenance_type" required="1"/>
<field name="name" required="1"/> <field name="name" required="1"/>
<field name="created_user_id"/> <field name="eq_maintenance_ids" invisible='1'/>
<field name="maintenance_equipment_category_id" required="1"/> <field name="overhaul_ids" invisible='1'/>
<field name="maintenance_equipment_ids" widget="many2many_tags"/>
<field name="maintenance_projects" required="1"/>
<field name="maintenance_standards" required="1"/>
<field name="eq_maintenance_ids"/>
<field name="overhaul_ids" />
</group>
</sheet>
</form>
</field>
</record>
<record id="view_equipment_maintenance_standards_tree" model="ir.ui.view"> </group>
<group>
<field name="created_user_id"/>
<field name="maintenance_equipment_category_id" required="1"/>
<field name="maintenance_equipment_ids" widget="many2many_tags"/>
</group>
<notebook>
<page string="维保项目">
<field name="maintenance_standards_ids" widget="ony2many">
<tree editable="top" create="true" string="维保项目">
<field name="name"/>
<field name="maintenance_standards"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_equipment_maintenance_standards_tree" model="ir.ui.view">
<field name="name">equipment.maintenance.standards.tree</field> <field name="name">equipment.maintenance.standards.tree</field>
<field name="model">equipment.maintenance.standards</field> <field name="model">equipment.maintenance.standards</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
@@ -36,9 +47,7 @@
<field name="name" required="1"/> <field name="name" required="1"/>
<field name="maintenance_equipment_category_id" required="1"/> <field name="maintenance_equipment_category_id" required="1"/>
<field name="maintenance_equipment_ids"/> <field name="maintenance_equipment_ids"/>
<field name="maintenance_projects" required="1"/> <field name="created_user_id"/>
<field name="maintenance_standards" required="1"/>
<field name="created_user_id"/>
<field name="create_date" string="创建时间"/> <field name="create_date" string="创建时间"/>
</tree> </tree>
@@ -50,7 +59,7 @@
<field name="model">equipment.maintenance.standards</field> <field name="model">equipment.maintenance.standards</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<search> <search>
<searchpanel> <searchpanel>
<field name="maintenance_type" icon="fa-building" enable_counters="1"/> <field name="maintenance_type" icon="fa-building" enable_counters="1"/>
</searchpanel> </searchpanel>
<field name="code" string="编码"/> <field name="code" string="编码"/>
@@ -58,14 +67,11 @@
<field name="name" string="日常机床保养"/> <field name="name" string="日常机床保养"/>
<field name="created_user_id" string="创建人"/> <field name="created_user_id" string="创建人"/>
<field name="maintenance_equipment_category_id" string="设备类别"/> <field name="maintenance_equipment_category_id" string="设备类别"/>
<field name="maintenance_projects" string="维保项目"/>
<field name="maintenance_standards" string="维保标准"/>
</search> </search>
</field> </field>
</record> </record>
<record id="action_equipment_maintenance_standards" model="ir.actions.act_window"> <record id="action_equipment_maintenance_standards" model="ir.actions.act_window">
<field name="name">设备维保标准</field> <field name="name">设备维保标准</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
@@ -79,12 +85,12 @@
</field> </field>
</record> </record>
<menuitem <menuitem
id="menu_equipment_maintenance_standards" id="menu_equipment_maintenance_standards"
name="设备维保标准" name="设备维保标准"
parent="maintenance.menu_maintenance_configuration" parent="maintenance.menu_maintenance_configuration"
action="action_equipment_maintenance_standards" action="action_equipment_maintenance_standards"
sequence="4"/> sequence="4"/>
</odoo> </odoo>

View File

@@ -17,8 +17,12 @@
<notebook> <notebook>
<page string="维保标准" attrs="{'invisible': [('equipment_maintenance_id', '=', False)]}"> <page string="维保标准" attrs="{'invisible': [('equipment_maintenance_id', '=', False)]}">
<group> <group>
<field name="maintenance_projects"/> <field name="maintenance_standards" widget="ony2many">
<field name="maintenance_standards"/> <tree create="False" string="维保项目">
<field name="name"/>
<field name="maintenance_standards"/>
</tree>
</field>
</group> </group>
</page> </page>

View File

@@ -16,7 +16,7 @@
'security/group_security.xml', 'security/group_security.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'report/tray_report.xml', 'report/tray_report.xml',
'views/mrp_maintenance_views.xml', # 'views/mrp_maintenance_views.xml',
'views/mrp_routing_workcenter_view.xml', 'views/mrp_routing_workcenter_view.xml',
'views/mrp_workcenter_views.xml', 'views/mrp_workcenter_views.xml',
'views/mrp_workorder_view.xml', 'views/mrp_workorder_view.xml',

View File

@@ -787,6 +787,10 @@ class MachineToolType(models.Model):
result = json.loads(r['result']) result = json.loads(r['result'])
if result['status'] == 1: if result['status'] == 1:
for item in result['machine_tool_type_all_list']: for item in result['machine_tool_type_all_list']:
if item.get('machine_tool_picture'):
image = base64.b64decode(item['machine_tool_picture'])
else:
image = ''
brand = self.env['sf.machine_tool.type'].search( brand = self.env['sf.machine_tool.type'].search(
[("code", '=', item['code'])]) [("code", '=', item['code'])])
if not brand: if not brand:
@@ -811,7 +815,7 @@ class MachineToolType(models.Model):
[('code', '=', item['control_system_id'])]).id, [('code', '=', item['control_system_id'])]).id,
"active": item['active'], "active": item['active'],
'brand_id': self.env['sf.machine.brand'].search([('code', '=', item['brand_id'])]).id, 'brand_id': self.env['sf.machine.brand'].search([('code', '=', item['brand_id'])]).id,
'machine_tool_picture': base64.b64decode(item['machine_tool_picture']), 'machine_tool_picture':image,
"heightened_way": item['heightened_way'], "heightened_way": item['heightened_way'],
"workpiece_load": item['workpiece_load'], "workpiece_load": item['workpiece_load'],
"lead_screw": item['lead_screw'], "lead_screw": item['lead_screw'],