From ce5cb17e3172235bd67f36fb3a71328ac1502418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 15 Oct 2024 15:14:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jikimo_workorder_exception/__manifest__.py | 1 - .../controllers/main.py | 23 +------ .../models/mrp_workorder.py | 24 +++++++- jikimo_workorder_exception/tests/__init__.py | 2 + jikimo_workorder_exception/tests/common.py | 48 +++++++++++++++ .../tests/test_jikimo_workorder_exception.py | 53 ++++++++++++++++ .../jikimo_workorder_exception_views.xml | 12 ---- .../views/mrp_workorder_views.xml | 2 +- jikimo_workorder_exception_notify/__init__.py | 4 ++ .../__manifest__.py | 22 +++++++ .../data/bussiness_node.xml | 17 ++++++ .../data/template_data.xml | 38 ++++++++++++ .../models/__init__.py | 3 + .../models/jikimo_message_template.py | 10 +++ .../models/jikimo_workorder_exception.py | 61 +++++++++++++++++++ .../tests/__init__.py | 2 + .../tests/common.py | 18 ++++++ .../tests/test_jikimo_workorder_exception.py | 39 ++++++++++++ sf_message/controllers/main.py | 21 ++++++- sf_message/data/bussiness_node.xml | 4 ++ sf_message/data/template_data.xml | 11 ++++ sf_message/models/__init__.py | 1 + .../models/sf_message_maintenance_logs.py | 22 +++++++ sf_message/models/sf_message_template.py | 1 + 24 files changed, 403 insertions(+), 36 deletions(-) create mode 100644 jikimo_workorder_exception/tests/__init__.py create mode 100644 jikimo_workorder_exception/tests/common.py create mode 100644 jikimo_workorder_exception/tests/test_jikimo_workorder_exception.py delete mode 100644 jikimo_workorder_exception/views/jikimo_workorder_exception_views.xml create mode 100644 jikimo_workorder_exception_notify/__init__.py create mode 100644 jikimo_workorder_exception_notify/__manifest__.py create mode 100644 jikimo_workorder_exception_notify/data/bussiness_node.xml create mode 100644 jikimo_workorder_exception_notify/data/template_data.xml create mode 100644 jikimo_workorder_exception_notify/models/__init__.py create mode 100644 jikimo_workorder_exception_notify/models/jikimo_message_template.py create mode 100644 jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py create mode 100644 jikimo_workorder_exception_notify/tests/__init__.py create mode 100644 jikimo_workorder_exception_notify/tests/common.py create mode 100644 jikimo_workorder_exception_notify/tests/test_jikimo_workorder_exception.py create mode 100644 sf_message/models/sf_message_maintenance_logs.py diff --git a/jikimo_workorder_exception/__manifest__.py b/jikimo_workorder_exception/__manifest__.py index e8f882f6..4c63ed6d 100644 --- a/jikimo_workorder_exception/__manifest__.py +++ b/jikimo_workorder_exception/__manifest__.py @@ -9,7 +9,6 @@ 'website': 'https://www.sf.jikimo.com', 'depends': ['sf_manufacturing', 'sf_mrs_connect'], 'data': [ - # 'views/jikimo_workorder_exception_views.xml', 'views/mrp_workorder_views.xml', 'security/ir.model.access.csv', ], diff --git a/jikimo_workorder_exception/controllers/main.py b/jikimo_workorder_exception/controllers/main.py index 7aa896b1..6a17f958 100644 --- a/jikimo_workorder_exception/controllers/main.py +++ b/jikimo_workorder_exception/controllers/main.py @@ -63,15 +63,8 @@ class SfMrsConnectController(Sf_Mrs_Connect): if res.get('production_ids'): try: productions = request.env['mrp.production'].sudo().search([('id', 'in', res.get('production_ids'))]) - if productions.workorder_ids.exception_ids: - pending_exception = productions.workorder_ids.exception_ids.filtered( - lambda exc: exc.state == 'pending' and exc.exception_code in ['YC0001', 'YC0004'] - ) - if pending_exception: - pending_exception.write({ - 'completion_time': fields.Datetime.now(), - 'state': 'done' - }) + if productions.workorder_ids: + productions.workorder_ids.handle_exception(['YC0001', 'YC0004']) except Exception as e: _logger.info('更新工单异常记录失败:%s' % e) return json.JSONEncoder().encode(res) @@ -90,17 +83,7 @@ class ManufactruingController(Manufacturing_Connect): if res.get('workorder_id'): try: workorder = request.env['mrp.workorder'].sudo().browse(int(res.get('workorder_id'))) - if workorder.exception_ids: - _logger.info('workorder.exception_ids:%s' % workorder.exception_ids) - pending_exception = workorder.exception_ids.filtered( - lambda exc: exc.state == 'pending' and exc.exception_code in ['YC0002', 'YC0003'] - ) - _logger.info('pending_exception:%s' % pending_exception) - if pending_exception: - pending_exception.write({ - 'completion_time': fields.Datetime.now(), - 'state': 'done' - }) + workorder.handle_exception(['YC0002', 'YC0003']) except Exception as e: _logger.info('更新工单异常记录失败:%s' % e) return json.JSONEncoder().encode(res) \ No newline at end of file diff --git a/jikimo_workorder_exception/models/mrp_workorder.py b/jikimo_workorder_exception/models/mrp_workorder.py index 653d3b3a..64f0dd8f 100644 --- a/jikimo_workorder_exception/models/mrp_workorder.py +++ b/jikimo_workorder_exception/models/mrp_workorder.py @@ -1,4 +1,7 @@ from odoo import models, fields +import logging + +_logger = logging.getLogger(__name__) class MrpWorkorder(models.Model): _inherit = 'mrp.workorder' @@ -15,4 +18,23 @@ class MrpWorkorder(models.Model): 'completion_time': fields.Datetime.now(), 'state': 'done' }) - return super(MrpWorkorder, self).write(values) \ No newline at end of file + return super(MrpWorkorder, self).write(values) + + def handle_exception(self, exception_codes): + """ + 处理异常 + :param exception_codes: 需要处理的异常编码列表 + """ + if not isinstance(exception_codes, list): + exception_codes = [exception_codes] + if self.exception_ids: + _logger.info('workorder.exception_ids:%s' % self.exception_ids) + pending_exception = self.exception_ids.filtered( + lambda exc: exc.state == 'pending' and exc.exception_code in exception_codes + ) + _logger.info('pending_exception:%s' % pending_exception) + if pending_exception: + pending_exception.write({ + 'completion_time': fields.Datetime.now(), + 'state': 'done' + }) diff --git a/jikimo_workorder_exception/tests/__init__.py b/jikimo_workorder_exception/tests/__init__.py new file mode 100644 index 00000000..99feb117 --- /dev/null +++ b/jikimo_workorder_exception/tests/__init__.py @@ -0,0 +1,2 @@ +from . import common +from . import test_jikimo_workorder_exception diff --git a/jikimo_workorder_exception/tests/common.py b/jikimo_workorder_exception/tests/common.py new file mode 100644 index 00000000..bbc729db --- /dev/null +++ b/jikimo_workorder_exception/tests/common.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import fields, Command +from odoo.tests.common import TransactionCase, HttpCase, tagged, Form + +import json +import time +import base64 +from lxml import etree + +@tagged('post_install', '-at_install') +class TestJikimoWorkorderExceptionCommon(TransactionCase): + + def setUp(self): + super(TestJikimoWorkorderExceptionCommon, self).setUp() + # 获取名字为“1#自动生产线”的制造中心 + workcenter = self.env['mrp.workcenter'].search([('name', '=', '1#自动生产线')], limit=1) + # 创建一个产品 + product_product = self.env['product.product'].create({ + 'name': '测试产品', + 'type': 'product', + }) + uom_unit = self.env.ref('uom.product_uom_unit') + # 创建一个bom + self.bom = self.env['mrp.bom'].create({ + 'product_id': product_product.id, + 'product_tmpl_id': product_product.product_tmpl_id.id, + 'product_uom_id': uom_unit.id, + 'product_qty': 1.0, + 'type': 'normal', + }) + # 创建一个制造订单 + self.production = self.env['mrp.production'].create({ + 'name': 'Test Production', + 'product_id': product_product.id, + 'bom_id': self.bom.id, + 'company_id': self.env.ref('base.main_company').id, + }) + # 创建一个测试工单 + self.workorder = self.env['mrp.workorder'].create({ + 'name': 'Test order', + 'workcenter_id': workcenter.id, + 'product_uom_id': self.bom.product_uom_id.id, + 'production_id': self.production.id, + 'duration_expected': 1.0, + 'rfid_code': 'test-123456', + 'routing_type': 'CNC加工' + }) \ No newline at end of file diff --git a/jikimo_workorder_exception/tests/test_jikimo_workorder_exception.py b/jikimo_workorder_exception/tests/test_jikimo_workorder_exception.py new file mode 100644 index 00000000..69220947 --- /dev/null +++ b/jikimo_workorder_exception/tests/test_jikimo_workorder_exception.py @@ -0,0 +1,53 @@ +import json +from datetime import datetime +from odoo.addons.jikimo_workorder_exception.tests.common import TestJikimoWorkorderExceptionCommon + +class TestJikimoWorkorderException(TestJikimoWorkorderExceptionCommon): + + def test_create_exception_record(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0001', + 'exception_content': '无CNC编程' + }) + + self.assertTrue(exception_record) + self.assertEqual(exception_record.exception_content, '无CNC编程') + self.assertEqual(exception_record.workorder_id.id, self.workorder.id) + self.assertEqual(exception_record.exception_code, 'YC0001') + + def test_handle_exception(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0001', + 'exception_content': '无CNC编程' + }) + self.workorder.handle_exception('YC0001') + self.assertEqual(exception_record.state, 'done') + # 判断完成时间是否为当前分钟 + self.assertEqual(exception_record.completion_time.minute, datetime.now().minute) + + def test_handle_exception_with_invalid_code(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0001', + 'exception_content': '无CNC编程' + }) + self.workorder.handle_exception(['YC0002', 'YC0004']) + self.assertEqual(exception_record.state, 'pending') + self.assertEqual(exception_record.completion_time, False) + + + def test_handle_exception_with_test_results(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0005', + 'exception_content': '工单加工失败' + }) + self.workorder.write({ + 'test_results': '返工', + 'reason': 'cutter', + 'detailed_reason': '刀坏了', + }) + self.assertEqual(exception_record.state, 'done') + self.assertEqual(exception_record.completion_time.minute, datetime.now().minute) \ No newline at end of file diff --git a/jikimo_workorder_exception/views/jikimo_workorder_exception_views.xml b/jikimo_workorder_exception/views/jikimo_workorder_exception_views.xml deleted file mode 100644 index 8881b3db..00000000 --- a/jikimo_workorder_exception/views/jikimo_workorder_exception_views.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - jikimo.workorder.exception.tree - jikimo.workorder.exception - - - - - - \ No newline at end of file diff --git a/jikimo_workorder_exception/views/mrp_workorder_views.xml b/jikimo_workorder_exception/views/mrp_workorder_views.xml index e70172dd..e589adb4 100644 --- a/jikimo_workorder_exception/views/mrp_workorder_views.xml +++ b/jikimo_workorder_exception/views/mrp_workorder_views.xml @@ -7,7 +7,7 @@ - + diff --git a/jikimo_workorder_exception_notify/__init__.py b/jikimo_workorder_exception_notify/__init__.py new file mode 100644 index 00000000..77bbdbd3 --- /dev/null +++ b/jikimo_workorder_exception_notify/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models + diff --git a/jikimo_workorder_exception_notify/__manifest__.py b/jikimo_workorder_exception_notify/__manifest__.py new file mode 100644 index 00000000..0b8c1013 --- /dev/null +++ b/jikimo_workorder_exception_notify/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': '机企猫 工单异常消息通知', + 'version': '1.0', + 'summary': '当产生工单异常时,发送消息通知', + 'sequence': 1, + 'category': 'sf', + 'website': 'https://www.sf.jikimo.com', + 'depends': ['jikimo_workorder_exception', 'jikimo_message_notify'], + 'data': [ + 'data/bussiness_node.xml', + 'data/template_data.xml', + # 'security/ir.model.access.csv', + ], + 'demo': [ + ], + 'license': 'LGPL-3', + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/jikimo_workorder_exception_notify/data/bussiness_node.xml b/jikimo_workorder_exception_notify/data/bussiness_node.xml new file mode 100644 index 00000000..b772158b --- /dev/null +++ b/jikimo_workorder_exception_notify/data/bussiness_node.xml @@ -0,0 +1,17 @@ + + + + + 无功能刀具 + jikimo.workorder.exception + + + 无定位数据 + jikimo.workorder.exception + + + 加工失败 + jikimo.workorder.exception + + + \ No newline at end of file diff --git a/jikimo_workorder_exception_notify/data/template_data.xml b/jikimo_workorder_exception_notify/data/template_data.xml new file mode 100644 index 00000000..554ef2c2 --- /dev/null +++ b/jikimo_workorder_exception_notify/data/template_data.xml @@ -0,0 +1,38 @@ + + + + + 生产线无功能刀具提醒 + + jikimo.workorder.exception + + markdown + urgent + ### 生产线无功能刀具提醒 +单号:工单[{{workorder_id.production_id.name}}]({{url}}) +原因:生产线无加工程序用的{{function_tool_name}}名称功能刀具 + + + 工单无定位数据提醒 + + jikimo.workorder.exception + + markdown + urgent + ### 生产线无功能刀具提醒 +单号:工单[{{workorder_id.production_id.name}}]({{url}}) +原因:无装夹定位测量数据 + + + 工单加工失败提醒 + + jikimo.workorder.exception + + markdown + urgent + ### 工单加工失败提醒 +单号:工单[{{workorder_id.production_id.name}}]({{url}}) +原因:加工失败,工件下产线处理 + + + \ No newline at end of file diff --git a/jikimo_workorder_exception_notify/models/__init__.py b/jikimo_workorder_exception_notify/models/__init__.py new file mode 100644 index 00000000..76a90c74 --- /dev/null +++ b/jikimo_workorder_exception_notify/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import jikimo_message_template +from . import jikimo_workorder_exception diff --git a/jikimo_workorder_exception_notify/models/jikimo_message_template.py b/jikimo_workorder_exception_notify/models/jikimo_message_template.py new file mode 100644 index 00000000..530cbb99 --- /dev/null +++ b/jikimo_workorder_exception_notify/models/jikimo_message_template.py @@ -0,0 +1,10 @@ +from odoo import models + + +class JikimoMessageTemplate(models.Model): + _inherit = "jikimo.message.template" + + def _get_message_model(self): + res = super(JikimoMessageTemplate, self)._get_message_model() + res.append('jikimo.workorder.exception') + return res \ No newline at end of file diff --git a/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py b/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py new file mode 100644 index 00000000..bbe69ab5 --- /dev/null +++ b/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py @@ -0,0 +1,61 @@ +from odoo import models, api +from odoo.addons.sf_base.commons.common import Common +import requests, logging + +_logger = logging.getLogger(__name__) + + +class JikimoWorkorderException(models.Model): + _name = 'jikimo.workorder.exception' + _inherit = ['jikimo.workorder.exception', 'jikimo.message.dispatch'] + + @api.model_create_multi + def create(self, vals_list): + res = super(JikimoWorkorderException, self).create(vals_list) + # 根据异常编码发送消息提醒 + try: + for rec in res: + if rec.exception_code == 'YC0001': + # 无CNC程序,调用cloud接口 + data = {'name': rec.workorder_id.production_id.programming_no, 'exception_code': 'YC0001'} + configsettings = self.env['res.config.settings'].sudo().get_values() + config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key']) + url = '/api/message/workorder_exception' + config_url = configsettings['sf_url'] + url + data['token'] = configsettings['token'] + ret = requests.post(config_url, json=data, headers=config_header) + ret = ret.json() + _logger.info('无CNC程序异常消息推送接口:%s' % ret) + elif rec.exception_code == 'YC0002': + # 无功能刀具 + rec.add_queue('无功能刀具') + elif rec.exception_code == 'YC0003': + # 无定位数据 + rec.add_queue('无定位数据') + elif rec.exception_code == 'YC0004': + # 无FTP文件,调用cloud接口 + data = {'name': rec.workorder_id.programming_no, 'exception_code': 'YC0004'} + configsettings = self.env['res.config.settings'].sudo().get_values() + config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key']) + url = '/api/message/workorder_exception' + config_url = configsettings['sf_url'] + url + data['token'] = configsettings['token'] + ret = requests.post(config_url, json=data, headers=config_header) + ret = ret.json() + _logger.info('无FTP文件异常消息推送接口:%s' % ret) + elif rec.exception_code == 'YC0005': + # 加工失败 + rec.add_queue('加工失败') + except Exception as e: + _logger.error('异常编码发送消息提醒失败:%s' % e) + return res + + def _get_message(self, message_queue_ids): + contents = super(JikimoWorkorderException, self)._get_message(message_queue_ids) + url = self.env['ir.config_parameter'].get_param('web.base.url') + action_id = self.env.ref('mrp.mrp_production_action').id + for index, content in enumerate(contents): + exception_id = self.env['jikimo.workorder.exception'].browse(message_queue_ids[index].res_id) + url = url + '/web#id=%s&view_type=form&action=%s' % (exception_id.workorder_id.production_id.id, action_id) + contents[index] = content.replace('{{url}}', url) + return contents diff --git a/jikimo_workorder_exception_notify/tests/__init__.py b/jikimo_workorder_exception_notify/tests/__init__.py new file mode 100644 index 00000000..99feb117 --- /dev/null +++ b/jikimo_workorder_exception_notify/tests/__init__.py @@ -0,0 +1,2 @@ +from . import common +from . import test_jikimo_workorder_exception diff --git a/jikimo_workorder_exception_notify/tests/common.py b/jikimo_workorder_exception_notify/tests/common.py new file mode 100644 index 00000000..2106bf0c --- /dev/null +++ b/jikimo_workorder_exception_notify/tests/common.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import fields, Command +from odoo.tests.common import TransactionCase, HttpCase, tagged, Form + +import json +import time +import base64 +from lxml import etree + +@tagged('post_install', '-at_install') +class TestJikimoWorkorderExceptionNotifyCommon(TransactionCase): + + def setUp(self): + super(TestJikimoWorkorderExceptionNotifyCommon, self).setUp() + # 获取最后一个工单 + self.workorder = self.env['mrp.workorder'].search([], order='id desc', limit=1) + \ No newline at end of file diff --git a/jikimo_workorder_exception_notify/tests/test_jikimo_workorder_exception.py b/jikimo_workorder_exception_notify/tests/test_jikimo_workorder_exception.py new file mode 100644 index 00000000..8bd80447 --- /dev/null +++ b/jikimo_workorder_exception_notify/tests/test_jikimo_workorder_exception.py @@ -0,0 +1,39 @@ +import json +from datetime import datetime +from odoo.addons.jikimo_workorder_exception_notify.tests.common import TestJikimoWorkorderExceptionNotifyCommon + +class TestJikimoWorkorderException(TestJikimoWorkorderExceptionNotifyCommon): + + def test_create_exception_record(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0001', + 'exception_content': '无CNC编程' + }) + + self.assertTrue(exception_record) + self.assertEqual(exception_record.exception_content, '无CNC编程') + self.assertEqual(exception_record.workorder_id.id, self.workorder.id) + self.assertEqual(exception_record.exception_code, 'YC0001') + + def test_handle_exception(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0001', + 'exception_content': '无CNC编程' + }) + self.workorder.handle_exception(['YC0001']) + self.assertEqual(exception_record.state, 'done') + # 判断完成时间是否为当前分钟 + self.assertEqual(exception_record.completion_time.minute, datetime.now().minute) + + def test_handle_exception_with_invalid_code(self): + exception_record = self.env['jikimo.workorder.exception'].create({ + 'workorder_id': self.workorder.id, + 'exception_code': 'YC0001', + 'exception_content': '无CNC编程' + }) + self.workorder.handle_exception(['YC0002', 'YC0004']) + self.assertEqual(exception_record.state, 'pending') + self.assertEqual(exception_record.completion_time, False) + diff --git a/sf_message/controllers/main.py b/sf_message/controllers/main.py index ad13ade2..11e776dc 100644 --- a/sf_message/controllers/main.py +++ b/sf_message/controllers/main.py @@ -21,7 +21,7 @@ class MessageSfMrsConnect(Sf_Mrs_Connect): _logger.info('已编程的制造订单:%s' % res.get('production_ids')) productions = request.env['mrp.production'].sudo().search([('id', 'in', res.get('production_ids'))]) # 过滤programming_state为已编程,tool_state为2的制造订单 - tool_state_valid_productions = productions.filtered(lambda x: x.programming_state == '已编程' and x.tool_state == '2') + tool_state_valid_productions = productions.filtered(lambda x: x.tool_state == '2') if tool_state_valid_productions: data = { 'name': tool_state_valid_productions[0].programming_no @@ -39,3 +39,22 @@ class MessageSfMrsConnect(Sf_Mrs_Connect): _logger.info('无效用刀异常消息推送接口:%s' % e) return json.JSONEncoder().encode(res) + @http.route('/api/maintenance_logs/notify', type='json', auth='public', methods=['GET', 'POST'], csrf=False, cors="*") + def maintenance_logs_notify(self, **kw): + res = {'code': 200, 'message': '设备故障日志信息推送成功'} + datas = request.httprequest.data + ret = json.loads(datas) + log_id = ret.get('log_id') + if not log_id: + res = {'code': 400, 'message': '设备故障日志id不能为空'} + return json.JSONEncoder().encode(res) + try: + if not isinstance(log_id, list): + log_id = [log_id] + maintenance_logs = request.env['sf.maintenance.logs'].sudo().search([('id', 'in', [int(id) for id in log_id])]) + if maintenance_logs: + maintenance_logs.add_queue('设备故障') + except Exception as e: + res = {'code': 400, 'message': '设备故障信息推送失败', 'error': str(e)} + return json.JSONEncoder().encode(res) + diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml index 66b24aa7..74a8387c 100644 --- a/sf_message/data/bussiness_node.xml +++ b/sf_message/data/bussiness_node.xml @@ -94,5 +94,9 @@ + + 设备故障 + sf.maintenance.logs + \ No newline at end of file diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index fd5ba389..e75059e0 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -132,5 +132,16 @@ 单号:发料出库单[{{name}}]({{request_url}}) 事项:销售订单{{sale_order_name}}已全部产出并入库,请及时发货 + + 设备故障 + + sf.maintenance.logs + + markdown + urgent + ### 设备故障及异常提醒: +机台号:[{{maintenance_equipment_id.name}}]({{url}}) +事项:{{create_date}}故障报警 + \ No newline at end of file diff --git a/sf_message/models/__init__.py b/sf_message/models/__init__.py index 2ff5461b..09d940df 100644 --- a/sf_message/models/__init__.py +++ b/sf_message/models/__init__.py @@ -8,3 +8,4 @@ from . import sf_message_purchase from . import sf_message_workorder from . import sf_message_functional_tool_dismantle from . import sf_message_mrp_production +from . import sf_message_maintenance_logs diff --git a/sf_message/models/sf_message_maintenance_logs.py b/sf_message/models/sf_message_maintenance_logs.py new file mode 100644 index 00000000..288043ff --- /dev/null +++ b/sf_message/models/sf_message_maintenance_logs.py @@ -0,0 +1,22 @@ +from odoo import models, fields, api + +class SFMessageMaintenanceLogs(models.Model): + _name = 'sf.maintenance.logs' + _inherit = ['sf.maintenance.logs', 'jikimo.message.dispatch'] + + @api._model_create_multi + def create(self, vals_list): + res = super(SFMessageMaintenanceLogs, self).create(vals_list) + for rec in res: + rec.add_queue() + return res + + def _get_message(self, message_queue_ids): + contents = super(SFMessageMaintenanceLogs, self)._get_message(message_queue_ids) + url = self.env['ir.config_parameter'].get_param('web.base.url') + action_id = self.env.ref('sf_maintenance.action_maintenance_logs').id + for index, content in enumerate(contents): + maintenance_logs_id = self.env['sf.maintenance.logs'].browse(message_queue_ids[index].res_id) + url = url + '/web#id=%s&view_type=form&action=%s' % (maintenance_logs_id.id, action_id) + contents[index] = content.replace('{{url}}', url) + return contents \ No newline at end of file diff --git a/sf_message/models/sf_message_template.py b/sf_message/models/sf_message_template.py index 56346c27..5e4d66b0 100644 --- a/sf_message/models/sf_message_template.py +++ b/sf_message/models/sf_message_template.py @@ -14,4 +14,5 @@ class SfMessageTemplate(models.Model): res.append('sf.functional.tool.dismantle') res.append('purchase.order') res.append('mrp.workorder') + res.append('sf.maintenance.logs') return res