From e6060b9bab2f7bbdb6b73e0eb89d04fd4dbde2b6 Mon Sep 17 00:00:00 2001 From: "qihao.gong@jikimo.com" Date: Tue, 4 Jul 2023 17:30:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=B4=E4=BF=9D=E6=A0=87?= =?UTF-8?q?=E5=87=86=E7=BB=B4=E4=BF=9D=E9=A1=B9=E7=9B=AE=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=B8=BAOne2many=E5=AF=B9=E8=B1=A1=20=E5=B9=B6=E4=B8=8E?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=EF=BC=8C=E7=BB=B4=E4=BF=9D=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E5=85=B3=E8=81=94=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=E7=BB=B4=E4=BF=9D=E8=AE=A1=E5=88=92=E6=96=B9=E6=B3=95=20?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BF=9D=E5=85=BB=E5=92=8C=E6=A3=80=E4=BF=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=B8=8D=E5=90=8C=E7=9A=84=E7=BB=B4=E4=BF=9D?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sf_equipment_maintenance_standards.py | 12 +- sf_maintenance/models/sf_maintenance.py | 182 +++++++++++++++++- .../models/sf_maintenance_requests.py | 4 +- sf_maintenance/security/ir.model.access.csv | 1 + .../equipment_maintenance_standards_views.xml | 78 ++++---- .../views/maintenance_request_views.xml | 8 +- sf_manufacturing/__manifest__.py | 2 +- sf_mrs_connect/models/sync_common.py | 6 +- 8 files changed, 241 insertions(+), 52 deletions(-) diff --git a/sf_maintenance/models/sf_equipment_maintenance_standards.py b/sf_maintenance/models/sf_equipment_maintenance_standards.py index 35f25911..2544adb4 100644 --- a/sf_maintenance/models/sf_equipment_maintenance_standards.py +++ b/sf_maintenance/models/sf_equipment_maintenance_standards.py @@ -24,8 +24,7 @@ class SfEquipmentSaintenanceStandards(models.Model): 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_ids = fields.Many2many('maintenance.equipment', 'sf_maintenance_equipment_ids', string='设备') - maintenance_projects = fields.Char('维保项目') - maintenance_standards = fields.Char('维保标准') + maintenance_standards_ids = fields.One2many('maintenance.standards', 'equipment_maintenance_standards_id', string='维保项目') eq_maintenance_ids = fields.One2many('maintenance.equipment', 'eq_maintenance_id', string='保养设备') overhaul_ids = fields.One2many('maintenance.equipment', 'overhaul_id', string='检修设备') @@ -37,7 +36,14 @@ class SfEquipmentSaintenanceStandards(models.Model): if record.maintenance_type == '检修': 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='设备维保计划') diff --git a/sf_maintenance/models/sf_maintenance.py b/sf_maintenance/models/sf_maintenance.py index 6c2f1dcd..594c3bce 100644 --- a/sf_maintenance/models/sf_maintenance.py +++ b/sf_maintenance/models/sf_maintenance.py @@ -4,10 +4,12 @@ import base64 from odoo import api, fields, models, SUPERUSER_ID, _ from odoo.exceptions import UserError import logging +from datetime import date, datetime, timedelta import requests import json from odoo.addons.sf_base.commons.common import Common + class SfMaintenanceEquipmentCategory(models.Model): _inherit = 'maintenance.equipment.category' _description = '设备类别' @@ -20,6 +22,7 @@ class SfMaintenanceEquipment(models.Model): _description = '设备' crea_url = "/api/machine_tool/create" + def get_no(self): partner = self.env['maintenance.equipment'].sudo().search( [('MTcode', '!=', '')], @@ -33,19 +36,23 @@ class SfMaintenanceEquipment(models.Model): num = "%04d" % m return num - equipment_maintenance_standards_ids = fields.Many2many('equipment.maintenance.standards', 'sf_maintenance_equipment_ids', string='设备维保标准') - eq_maintenance_id =fields.Many2one('equipment.maintenance.standards', string='设备保养标准', domain="[('maintenance_type','=','保养')]") + equipment_maintenance_standards_ids = fields.Many2many('equipment.maintenance.standards', + 'sf_maintenance_equipment_ids', string='设备维保标准') + eq_maintenance_id = fields.Many2one('equipment.maintenance.standards', string='设备保养标准', + domain="[('maintenance_type','=','保养')]") overhaul_date = fields.Date(string='下次预防检修') overhaul_period = fields.Integer(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') def _compute_equipment_maintenance_standards_ids(self): for record in self: 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 if record.eq_maintenance_id: record.equipment_maintenance_standards_ids = [(6, 0, [record.eq_maintenance_id.id])] @@ -56,8 +63,6 @@ class SfMaintenanceEquipment(models.Model): else: record.equipment_maintenance_standards_ids = False - - MTcode = fields.Char("编码", default=get_no) created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) equipment_type = fields.Selection([('机床', '机床')], related='category_id.equipment_type') @@ -279,7 +284,6 @@ class SfMaintenanceEquipment(models.Model): 'tool_diameter_max': item.tool_diameter_max, 'machine_tool_category': item.machine_tool_category.code, - } machine_tool_list.append(val) # kw = machine_tool_list @@ -293,4 +297,168 @@ class SfMaintenanceEquipment(models.Model): else: 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) diff --git a/sf_maintenance/models/sf_maintenance_requests.py b/sf_maintenance/models/sf_maintenance_requests.py index 3508abcc..36cf2479 100644 --- a/sf_maintenance/models/sf_maintenance_requests.py +++ b/sf_maintenance/models/sf_maintenance_requests.py @@ -26,8 +26,8 @@ class SfMaintenanceEquipmentCategory(models.Model): 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') def _check_equipment_maintenance_id(self): diff --git a/sf_maintenance/security/ir.model.access.csv b/sf_maintenance/security/ir.model.access.csv index 06e231b9..05ee33a2 100644 --- a/sf_maintenance/security/ir.model.access.csv +++ b/sf_maintenance/security/ir.model.access.csv @@ -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_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_standards,maintenance_standards,model_maintenance_standards,base.group_user,1,1,1,1 diff --git a/sf_maintenance/views/equipment_maintenance_standards_views.xml b/sf_maintenance/views/equipment_maintenance_standards_views.xml index f4b90fa6..7263a135 100644 --- a/sf_maintenance/views/equipment_maintenance_standards_views.xml +++ b/sf_maintenance/views/equipment_maintenance_standards_views.xml @@ -2,31 +2,42 @@ - - equipment.maintenance.standards.form - equipment.maintenance.standards - -
- - - - - - - - - - - - + + equipment.maintenance.standards.form + equipment.maintenance.standards + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + +
+ +
+
+ + equipment.maintenance.standards.tree equipment.maintenance.standards @@ -36,9 +47,7 @@ - - - + @@ -50,7 +59,7 @@ equipment.maintenance.standards - + @@ -58,14 +67,11 @@ - - - 设备维保标准 ir.actions.act_window @@ -79,12 +85,12 @@ - +
\ No newline at end of file diff --git a/sf_maintenance/views/maintenance_request_views.xml b/sf_maintenance/views/maintenance_request_views.xml index d711702d..e1e934d9 100644 --- a/sf_maintenance/views/maintenance_request_views.xml +++ b/sf_maintenance/views/maintenance_request_views.xml @@ -17,8 +17,12 @@ - - + + + + + + diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index b13036ef..5e61bb27 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -16,7 +16,7 @@ 'security/group_security.xml', 'security/ir.model.access.csv', 'report/tray_report.xml', - 'views/mrp_maintenance_views.xml', + # 'views/mrp_maintenance_views.xml', 'views/mrp_routing_workcenter_view.xml', 'views/mrp_workcenter_views.xml', 'views/mrp_workorder_view.xml', diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index f101530b..4926726e 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -787,6 +787,10 @@ class MachineToolType(models.Model): result = json.loads(r['result']) if result['status'] == 1: 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( [("code", '=', item['code'])]) if not brand: @@ -811,7 +815,7 @@ class MachineToolType(models.Model): [('code', '=', item['control_system_id'])]).id, "active": item['active'], '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'], "workpiece_load": item['workpiece_load'], "lead_screw": item['lead_screw'],