From 11b06752413c92969db93accf955d49a7c5755ae Mon Sep 17 00:00:00 2001 From: gqh Date: Mon, 26 Sep 2022 12:02:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4=EF=BC=8C?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E5=B7=A5=E5=8E=82=E5=9F=BA=E7=A1=80=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/__init__.py | 1 + sf_base/__manifest__.py | 29 +++ sf_base/models/__init__.py | 3 + sf_base/models/sf_base.py | 237 ++++++++++++++++++++ sf_base/models/sf_common.py | 54 +++++ sf_base/security/group_security.xml | 5 + sf_base/security/ir.model.access.csv | 18 ++ sf_base/views/menu_view.xml | 118 ++++++++++ sf_base/views/mrs_base_view.xml | 315 +++++++++++++++++++++++++++ sf_base/views/mrs_common_view.xml | 315 +++++++++++++++++++++++++++ sf_bf_connect/__init__.py | 1 + sf_mrs_sync/__init__.py | 4 + sf_mrs_sync/__manifest__.py | 27 +++ sf_mrs_sync/connect/__init__.py | 1 + sf_mrs_sync/data/sf_cron.xml | 13 ++ sf_mrs_sync/models/__init__.py | 2 + sf_mrs_sync/models/sf_sync_common.py | 73 +++++++ 17 files changed, 1216 insertions(+) create mode 100644 sf_base/__init__.py create mode 100644 sf_base/__manifest__.py create mode 100644 sf_base/models/__init__.py create mode 100644 sf_base/models/sf_base.py create mode 100644 sf_base/models/sf_common.py create mode 100644 sf_base/security/group_security.xml create mode 100644 sf_base/security/ir.model.access.csv create mode 100644 sf_base/views/menu_view.xml create mode 100644 sf_base/views/mrs_base_view.xml create mode 100644 sf_base/views/mrs_common_view.xml create mode 100644 sf_bf_connect/__init__.py create mode 100644 sf_mrs_sync/__init__.py create mode 100644 sf_mrs_sync/__manifest__.py create mode 100644 sf_mrs_sync/connect/__init__.py create mode 100644 sf_mrs_sync/data/sf_cron.xml create mode 100644 sf_mrs_sync/models/__init__.py create mode 100644 sf_mrs_sync/models/sf_sync_common.py diff --git a/sf_base/__init__.py b/sf_base/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/sf_base/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sf_base/__manifest__.py b/sf_base/__manifest__.py new file mode 100644 index 00000000..105cd241 --- /dev/null +++ b/sf_base/__manifest__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': '机企猫藏智能工厂 基础模块', + 'version': '1.0', + 'summary': '智能工厂基础模块', + 'sequence': 1, + 'description': """ +在本模块,定义了主要的角色、菜单、基础业务对象 + """, + 'category': 'YZ', + 'website': 'https://www.sf.jikimo.com', + 'depends': ['account'], + 'data': [ + 'security/group_security.xml', + 'security/ir.model.access.csv', + 'views/mrs_base_view.xml', + 'views/mrs_common_view.xml', + "views/menu_view.xml" + + ], + 'demo': [ + ], + 'qweb': [ + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/sf_base/models/__init__.py b/sf_base/models/__init__.py new file mode 100644 index 00000000..e53038fc --- /dev/null +++ b/sf_base/models/__init__.py @@ -0,0 +1,3 @@ + +from. import sf_base +from. import sf_common diff --git a/sf_base/models/sf_base.py b/sf_base/models/sf_base.py new file mode 100644 index 00000000..431e14d8 --- /dev/null +++ b/sf_base/models/sf_base.py @@ -0,0 +1,237 @@ +# -*- coding: utf-8 -*- +import logging + +from odoo import fields, models, api + + +_logger = logging.getLogger(__name__) + + +class MachineBrandTags(models.Model): + _name = 'mrs.machine.brand.tags' + _description = '标签' + + name = fields.Char('名称', size=50) + color = fields.Integer('颜色', default=0) + + +class MachineControlSystem(models.Model): + _name = 'mrs.machine_tool.type.control_system' + _description = '控制系统' + + name = fields.Char('名称', size=50) + # type_id = fields.Many2one('mrs.machine_tool.type') + + +# 品牌标签 +class MachineBrand(models.Model): + _name = 'mrs.machine.brand' + _description = '品牌' + + name = fields.Char('名称') + tag_ids = fields.Many2many('mrs.machine.brand.tags', 'rel_machine_brand_tags', string='类别') + image_brand = fields.Image("品牌图片") + active = fields.Boolean('有效', default=True) + + code = fields.Char('编码') + + +# 机床 +class MachineTool(models.Model): + _name = 'mrs.machine_tool' + _description = '机床' + + code = fields.Char('编码') + name = fields.Char('名称') + knife_type = fields.Selection( + [("BT40", "BT40"), ("BT30", "BT30")], + default="", string="刀把类型") + number_of_knife_library = fields.Integer('刀库数量') + rotate_speed = fields.Integer('转速') + number_of_axles = fields.Selection( + [("3轴", "3轴"), ("4轴", "4轴"), ("5轴", "5轴")], + default="", string="轴数") + # 加工进程 + x_axis = fields.Integer('X轴') + y_axis = fields.Integer('Y轴') + z_axis = fields.Integer('Z轴') + b_axis = fields.Integer('B轴') + c_axis = fields.Integer('C轴') + remark = fields.Text('备注') + precision = fields.Float('加工精度') + control_system_id = fields.Many2one('mrs.machine_tool.type.control_system', + string="控制系统") + # 多个机床型号对应一个机床 + type_id = fields.Many2one('mrs.machine_tool.type', '型号', + compute='_compute_type_id') + brand_id = fields.Many2one('mrs.machine.brand', string='品牌') + status = fields.Selection( + [("正常", "正常"), ("故障", "故障"), ("不可用", "不可用")], + default="", string="状态") + + # 一个机床对应一個加工工厂,一个加工工厂对应多个机床 + factory_id = fields.Many2one('res.partner', string='所属工厂', + domain="[('is_factory', '=', True)]") + # 一个机床对应一个供应商,一个供应商对应多个机床 + supplier_id = fields.Many2one('res.partner', string='制造商', + domain="[('is_vendor', '=', True)]") + registration_date = fields.Date('注册日期') + + active = fields.Boolean('有效', default=True) + + # @api.depends('type_id') + # def _compute_type_id(self): + # to_reset = self.filtered(lambda e: e.type_id != e.type_id.id) + # to_reset.type_id = False + + # 编码规则:加工工厂编码-品牌编码-注册年月-00001 + # def get_machine_tool_code(self): + # partner = self.env['res.partner'].sudo().search( + # [('is_factory', '=', True)], + # limit=1, + # order="id desc") + # brand = self.env['mrs.machine.brand'].sudo().search( + # [('tag_ids', '=', '机床')], + # limit=1, + # order="id desc") + # if not brand: + # num = item.brand_id.code + "%04d" % 1 + # item.code = num + # else: + # print('--------') + # print(type) + # m = int(type.code[-4:]) + 1 + # num = item.brand_id.code + "%04d" % m + # item.code = num + + # 选择机床型号时,该型号的基本信息带出并赋给机床对应的信息里 + + # @api.onchange('type_id') + # def get_type_info(self): + # for item in self: + # item.knife_type = item.type_id.knife_type + # item.number_of_knife_library = item.type_id.number_of_knife_library + # item.number_of_axles = item.type_id.number_of_axles + # item.rotate_speed = item.type_id.rotate_speed + # item.precision = item.type_id.precision + # item.control_system_id = item.type_id.control_system_id + # item.x_axis = item.type_id.x_axis + # item.y_axis = item.type_id.y_axis + # item.z_axis = item.type_id.z_axis + # item.b_axis = item.type_id.b_axis + # item.c_axis = item.type_id.c_axis + + +class MachineToolType(models.Model): + _name = 'mrs.machine_tool.type' + _description = '机床型号' + # _order = 'priority desc, code, name, id' + + name = fields.Char('名称') + brand_id = fields.Many2one('mrs.machine.brand', string='品牌') + knife_type = fields.Selection( + [("BT40", "BT40"), ("BT30", "BT30")], + default="", string="刀把类型") + number_of_knife_library = fields.Integer('刀库数量') + rotate_speed = fields.Integer('转速') + # 多个型号对应一个机床 + machine_tool_id = fields.Many2one('mrs.machine_tool', '机床') + number_of_axles = fields.Selection( + [("3轴", "3轴"), ("4轴", "4轴"), ("5轴", "5轴")], + default="", string="轴数") + # 加工进程 + x_axis = fields.Integer('X轴') + y_axis = fields.Integer('Y轴') + z_axis = fields.Integer('Z轴') + b_axis = fields.Integer('B轴') + c_axis = fields.Integer('C轴') + remark = fields.Text('备注') + precision = fields.Float('加工精度') + control_system_id = fields.Many2one('mrs.machine_tool.type.control_system', + string="控制系统") + active = fields.Boolean('有效', default=True) + code = fields.Char('编码') + + # @api.onchange('brand_id') + # def get_machine_tool_type_code(self): + # for item in self: + # if not item.brand_id: + # return False + # type = self.env['mrs.machine_tool.type'].sudo().search( + # [('brand_id', '=', item.brand_id.id)], + # limit=1, + # order="id desc" + # ) + # print(item.brand_id.id) + # if not type: + # num = item.brand_id.code + "%04d" % 1 + # item.code = num + # print(item.code) + # else: + # print('----------') + # m = int(type.code[-4:]) + 1 + # num = item.brand_id.code + "%04d" % m + # item.code = num + # print(item.code) + + +# 刀具 +class CuttingTool(models.Model): + _name = 'mrs.cutting_tool.category' + _description = '刀具类别' + + # def get_cutting_tool_category_code(self): + # code = self.env['mrs.cutting_tool.category'].sudo().search( + # [('code', '!=', False)], limit=1, + # order="id desc") + # if not code: + # num = "%03d" % 1 + # else: + # m = int(code.code) + 1 + # num = "%03d" % m + # return num + + code = fields.Char('编码') + name = fields.Char('名称') + # type_ids = fields.One2many('mrs.cutting_tool.type', 'category_id', string='刀具型号') + remark = fields.Text('备注') + active = fields.Boolean('有效', default=True) + + +class CuttingToolType(models.Model): + _name = 'mrs.cutting_tool.type' + _description = '刀具型号' + + code = fields.Char('编码') + name = fields.Char('名称') + diameter = fields.Integer('直径') + long_blade = fields.Integer('避空长/刃长') + cone_angle_pitch = fields.Integer('锥角/节距') + shank_diameter = fields.Integer('柄径') + taper_shank_length = fields.Integer('锥柄长') + tool_length = fields.Integer('刀具总长') + blade_number = fields.Integer('刃数') + category_id = fields.Many2one('mrs.cutting_tool.category', string='刀具类别') + brand_id = fields.Many2one('mrs.machine.brand', string='品牌') + remark = fields.Text('备注') + active = fields.Boolean('有效', default=True) + + # @api.onchange('brand_id', 'category_id') + # def get_cutting_tool_type_code(self): + # for item in self: + # if not item.brand_id: + # return False + # if not item.category_id: + # return False + # type = self.env['mrs.cutting_tool.type'].sudo().search( + # [('brand_id', '=', item.brand_id.id), ('brand_id', '=', item.category_id.id)], + # limit=1, + # order="id desc" + # ) + # if not type: + # num = item.brand_id.code + item.category_id.code + "%03d" % 1 + # item.code = num + # else: + # m = int(type.code[-4:]) + 1 + # num = item.brand_id.code + item.category_id.code + "%03d" % m + # item.code = num diff --git a/sf_base/models/sf_common.py b/sf_base/models/sf_common.py new file mode 100644 index 00000000..e45ce8e8 --- /dev/null +++ b/sf_base/models/sf_common.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +import logging +from odoo import fields, models, api + +_logger = logging.getLogger(__name__) + + +# 材料 +class MrsProductionMaterials(models.Model): + _name = 'mrs.production.materials' + _description = '材料' + remark = fields.Text("备注") + name = fields.Char('名称') + partner_ids = fields.Many2many('res.partner', 'materials_ids', '加工工厂') + materials_model_ids = fields.One2many('mrs.materials.model', 'materials_id', '材料型号') + materials_no = fields.Char("编码") + + +# 材料型号 +class MrsMaterialModel(models.Model): + _name = 'mrs.materials.model' + _description = '材料型号' + remark = fields.Text("备注") + name = fields.Char('型号名') + need_h = fields.Boolean("需要热处理", default="false") + mf_materia_post = fields.Char("热处理后硬度") + density = fields.Float("密度(kg/m³)") + materials_id = fields.Many2one('mrs.production.materials', "材料名") + materials_num = fields.Char("编码号") + material_no = fields.Char("编码") + + +# 工艺 编码,名称,备注 +class MrsProductionProcess(models.Model): + _name = 'mrs.production.process' + _description = '表面工艺' + name = fields.Char('表面工艺') + remark = fields.Text("备注") + processing_technology_ids = fields.Many2many('mrs.processing.technology', 'mrs_associated_processes', + index=True) + partner_process_ids = fields.Many2many('res.partner', 'process_ids', '加工工厂') + process_encode = fields.Char("编码") + + +class MrsProcessingTechnology(models.Model): + _name = 'mrs.processing.technology' + _description = '加工工艺' + remark = fields.Text("备注") + sequence = fields.Integer('Sequence', index=True) + name = fields.Char('加工工艺', index=True) + remark = fields.Text('备注', index=True) + process_encode = fields.Char("编码") + production_process_ids = fields.Many2many('mrs.production.process', 'mrs_associated_processes', + index=True) diff --git a/sf_base/security/group_security.xml b/sf_base/security/group_security.xml new file mode 100644 index 00000000..fdbc3ae5 --- /dev/null +++ b/sf_base/security/group_security.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv new file mode 100644 index 00000000..3a1b5059 --- /dev/null +++ b/sf_base/security/ir.model.access.csv @@ -0,0 +1,18 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_mrs_machine_tool,mrs_machine_tool,model_mrs_machine_tool,base.group_user,1,1,1,1 +access_mrs_cutting_tool_category,mrs_cutting_tool_category,model_mrs_cutting_tool_category,base.group_user,1,1,1,1 +access_mrs_machine_tool_type,mrs_machine_tool_type,model_mrs_machine_tool_type,base.group_user,1,1,1,1 +access_mrs_cutting_tool_type,mrs_cutting_tool_type,model_mrs_cutting_tool_type,base.group_user,1,1,1,1 +access_mrs_machine_brand,mrs_machine_brand,model_mrs_machine_brand,base.group_user,1,1,1,1 +access_mrs_machine_brand_tags,mrs_machine_brand_tags,model_mrs_machine_brand_tags,base.group_user,1,1,1,1 +access_mrs_machine_tool_type_control_system,mrs_machine_tool_type_control_system,model_mrs_machine_tool_type_control_system,base.group_user,1,1,1,1 + + +access_mrs_production_process,mrs_production_process,model_mrs_production_process,base.group_user,1,1,1,1 +access_mrs_production_materials,mrs_production_materials,model_mrs_production_materials,base.group_user,1,1,1,1 +access_mrs_materials_model,mrs_materials_model,model_mrs_materials_model,base.group_user,1,1,1,1 +access_mrs_processing_technology,mrs_processing_technology,model_mrs_processing_technology,base.group_user,1,1,1,1 + + + + diff --git a/sf_base/views/menu_view.xml b/sf_base/views/menu_view.xml new file mode 100644 index 00000000..e1731e63 --- /dev/null +++ b/sf_base/views/menu_view.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sf_base/views/mrs_base_view.xml b/sf_base/views/mrs_base_view.xml new file mode 100644 index 00000000..b5d4797d --- /dev/null +++ b/sf_base/views/mrs_base_view.xml @@ -0,0 +1,315 @@ + + + #------------------品牌------------------ + + search.mrs.machine.brand + mrs.machine.brand + + + + + + + + + + + + + + tree.mrs.machine.brand + mrs.machine.brand + + + + + + + + + + + form.mrs.machine.brand + mrs.machine.brand + +
+ + +
+
+ + + + + + + +
+
+ + + 品牌 + ir.actions.act_window + mrs.machine.brand + tree,form + +

+ [品牌] 还没有哦!点左上角的[创建]按钮,沙发归你了! +

+

+

+
+
+ + #------------------机床型号------------------ + + + search.mrs.machine_tool.type + mrs.machine_tool.type + + + + + + + + + tree.mrs.machine_tool.type + mrs.machine_tool.type + + + + + + + + + + + + form.mrs.machine_tool.type + mrs.machine_tool.type + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + 机床型号 + ir.actions.act_window + mrs.machine_tool.type + tree,form + +

+ [机床型号] 还没有哦!点左上角的[创建]按钮,沙发归你了! +

+

+

+
+
+ + #------------------刀具型号------------------ + + + search.mrs.cutting_tool.type + mrs.cutting_tool.type + + + + + + + + + tree.mrs.cutting_tool.type + mrs.cutting_tool.type + + + + + + + + + + + form.mrs.cutting_tool.type + mrs.cutting_tool.type + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + 刀具型号 + ir.actions.act_window + mrs.cutting_tool.type + tree,form + +

+ [刀具型号] 还没有哦!点左上角的[创建]按钮,沙发归你了! +

+

+

+
+
+ + #------------------刀具类别------------------ + + + search.mrs.cutting_tool.category + mrs.cutting_tool.category + + + + + + + + + tree.mrs.cutting_tool.category + mrs.cutting_tool.category + + + + + + + + + + form.mrs.cutting_tool.category + mrs.cutting_tool.category + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + 刀具类别 + ir.actions.act_window + mrs.cutting_tool.category + tree,form + +

+ [刀具类别] 还没有哦!点左上角的[创建]按钮,沙发归你了! +

+

+

+
+
+
\ No newline at end of file diff --git a/sf_base/views/mrs_common_view.xml b/sf_base/views/mrs_common_view.xml new file mode 100644 index 00000000..0c1128f5 --- /dev/null +++ b/sf_base/views/mrs_common_view.xml @@ -0,0 +1,315 @@ + + + + + + + mrs.processing.technology + +
+ + + + + + + + + + + + + + + + + +
+
+
+ + mrs.processing.technology + + + + + + + + + + + search.mrs.processing.technology.type + mrs.processing.technology + + + + + + + + + + mrs.production.process + + + + + + + + + + + mrs.production.process + +
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ + search.mrs.production.process.type + mrs.production.process + + + + + + + + + + mrs.materials.model + +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + mrs.materials.model + + + + + + + + + + + + search.mrs.materials.model.type + mrs.materials.model + + + + + + + + + + + + mrs.production.materials + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + mrs.production.materials + + + + + + + + + + search.mrs.production.materials.type + mrs.production.materials + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 材料 + ir.actions.act_window + mrs.production.materials + tree,form + +

+ 材料! +

+
+
+ + 表面工艺 + ir.actions.act_window + mrs.production.process + tree,form + +

+ 表面工艺! +

+
+
+ + 材料型号 + ir.actions.act_window + mrs.materials.model + tree,form + +

+ 材料型号! +

+
+
+ + 加工工艺 + ir.actions.act_window + mrs.processing.technology + tree,form + + +

+ 加工工艺! +

+
+
+ + + 产品 + ir.actions.act_window + [('materials_model_ids', '!=', False)] + product.template + tree,form + + +

+ 创建产品吧 +

+
+ +
+ + product.template.materials + product.template + + + + + + + + + + + + product.template.materials.search + product.template + + + + + + + + + +
+
\ No newline at end of file diff --git a/sf_bf_connect/__init__.py b/sf_bf_connect/__init__.py new file mode 100644 index 00000000..50ed18aa --- /dev/null +++ b/sf_bf_connect/__init__.py @@ -0,0 +1 @@ +# -*-coding:utf-8-*- diff --git a/sf_mrs_sync/__init__.py b/sf_mrs_sync/__init__.py new file mode 100644 index 00000000..95db9a94 --- /dev/null +++ b/sf_mrs_sync/__init__.py @@ -0,0 +1,4 @@ +# -*-coding:utf-8-*- +from . import models + +pengge \ No newline at end of file diff --git a/sf_mrs_sync/__manifest__.py b/sf_mrs_sync/__manifest__.py new file mode 100644 index 00000000..c735f567 --- /dev/null +++ b/sf_mrs_sync/__manifest__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': '机企猫藏智能工厂 同步模块', + 'version': '1.0', + 'summary': '智能工厂同步模块', + 'sequence': 1, + 'description': """ +在本模块,同步资源库 + """, + 'category': 'YZ', + 'website': 'https://www.sf.cs.jikimo.com', + 'depends': ['account', 'sf_base'], + 'data': [ + + 'data/sf_cron.xml' + + + ], + 'demo': [ + ], + 'qweb': [ + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/sf_mrs_sync/connect/__init__.py b/sf_mrs_sync/connect/__init__.py new file mode 100644 index 00000000..50ed18aa --- /dev/null +++ b/sf_mrs_sync/connect/__init__.py @@ -0,0 +1 @@ +# -*-coding:utf-8-*- diff --git a/sf_mrs_sync/data/sf_cron.xml b/sf_mrs_sync/data/sf_cron.xml new file mode 100644 index 00000000..1f01df0d --- /dev/null +++ b/sf_mrs_sync/data/sf_cron.xml @@ -0,0 +1,13 @@ + + + + 同步资源库材料 + + code + model.sync_production_materials() + 1 + minutes + -1 + + + \ No newline at end of file diff --git a/sf_mrs_sync/models/__init__.py b/sf_mrs_sync/models/__init__.py new file mode 100644 index 00000000..12d77b52 --- /dev/null +++ b/sf_mrs_sync/models/__init__.py @@ -0,0 +1,2 @@ +# -*-coding:utf-8-*- +from. import sf_sync_common \ No newline at end of file diff --git a/sf_mrs_sync/models/sf_sync_common.py b/sf_mrs_sync/models/sf_sync_common.py new file mode 100644 index 00000000..795f9847 --- /dev/null +++ b/sf_mrs_sync/models/sf_sync_common.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +import logging +import math +import requests +from dateutil.relativedelta import relativedelta +from datetime import timedelta, datetime + +from odoo import models, fields, api +from odoo.exceptions import ValidationError +import logging + +_logger = logging.getLogger(__name__) + + +class MrsProductionMaterials(models.Model): + _inherit = "mrs.production.materials" + _description = "材料" + url = '/api/production_materials/list' + + def sync_production_materials(self): + str = '定时同步材料资源库' + print(str) + return str + + +class MrsMaterialModel(models.Model): + _inherit = 'mrs.materials.model' + _description = '材料型号' + + +class MrsProductionProcess(models.Model): + _inherit = 'mrs.production.process' + _description = '表面工艺' + + +class MrsProcessingTechnology(models.Model): + _inherit = 'mrs.processing.technology' + _description = '加工工艺' + + +class MachineBrandTags(models.Model): + _inherit = 'mrs.machine.brand.tags' + _description = '标签' + + +class MachineControlSystem(models.Model): + _inherit = 'mrs.machine_tool.type.control_system' + _description = '控制系统' + + +class MachineBrand(models.Model): + _inherit = 'mrs.machine.brand' + _description = '品牌' + + +class MachineTool(models.Model): + _inherit = 'mrs.machine_tool' + _description = '机床' + + +class MachineToolType(models.Model): + _inherit = 'mrs.machine_tool.type' + _description = '机床型号' + + +class CuttingTool(models.Model): + _inherit = 'mrs.cutting_tool.category' + _description = '刀具类别' + + +class CuttingToolType(models.Model): + _inherit = 'mrs.cutting_tool.type' + _description = '刀具型号'