diff --git a/sf_base/__manifest__.py b/sf_base/__manifest__.py
index 2daf3ec0..045692f4 100644
--- a/sf_base/__manifest__.py
+++ b/sf_base/__manifest__.py
@@ -16,7 +16,9 @@
'security/ir.model.access.csv',
'views/base_view.xml',
'views/common_view.xml',
- "views/menu_view.xml"
+ "views/menu_view.xml",
+ "views/tool_base_views.xml",
+ "views/tool_base_menu.xml",
],
'demo': [
diff --git a/sf_base/models/__init__.py b/sf_base/models/__init__.py
index 4714c995..f6e247d2 100644
--- a/sf_base/models/__init__.py
+++ b/sf_base/models/__init__.py
@@ -1,4 +1,5 @@
from . import base
from . import common
+from . import tool_base
diff --git a/sf_base/models/tool_base.py b/sf_base/models/tool_base.py
new file mode 100644
index 00000000..c1a90a92
--- /dev/null
+++ b/sf_base/models/tool_base.py
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+import logging
+
+from odoo import fields, models, api
+from odoo.exceptions import UserError
+# from odoo.addons import mrs_base, mrs_common
+from datetime import datetime
+
+
+# 功能刀具
+class FunctionalCuttingTool(models.Model):
+ _name = 'mrs.functional.cutting.tool'
+ _description = '功能刀具'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称')
+ # 增加功能刀具类型、整体式刀具型号、刀片型号、刀杆型号、刀盘型号、刀柄型号、夹头型号、直径(mm)、刀具等级、加工精度(mm)、装刀长、刃数、整体刃长(mm)、有效刃长(mm)、最大寿命值、是否标准刀、适用范围
+ functional_model_number = fields.Many2one('mrs.functional.cutting.tool.model', string='功能刀具类型', required=True)
+ integral_model_number = fields.Many2one('mrs.integral.cutting.tool', string='整体式刀具型号')
+ blade_model_number = fields.Many2one('mrs.blade', string='刀片型号')
+ cutterbar_model_number = fields.Many2one('mrs.cutter.bar', string='刀杆型号')
+ cutterpad_model_number = fields.Many2one('mrs.cutter.pad', string='刀盘型号')
+ handle_model_number = fields.Many2one('mrs.handle', string='刀柄型号', required=True)
+ chuck_model_number = fields.Many2one('mrs.chuck', string='夹头型号', required=True)
+ diameter = fields.Float('直径(mm)')
+ tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
+ string='刀具等级')
+ machining_accuracy = fields.Float('加工精度(mm)')
+ tool_length = fields.Float('装刀长')
+ blade_number = fields.Integer('刃数')
+ integral_blade_length = fields.Float('整体刃长(mm)')
+ effective_blade_length = fields.Float('有效刃长(mm)')
+ max_life = fields.Float('最大寿命值')
+ is_standard = fields.Boolean('是否标准刀')
+ applicable_range = fields.Char('适用范围')
+ image = fields.Binary('图片')
+
+
+# 功能刀具类型
+class FunctionalCuttingToolModel(models.Model):
+ _name = 'mrs.functional.cutting.tool.model'
+ _description = '功能刀具类型'
+
+ name = fields.Char('名称', required=True)
+ code = fields.Char('编码', required=True)
+ remark = fields.Text('备注')
+
+
+# 整体式刀具
+class IntegralCuttingTool(models.Model):
+ _name = 'mrs.integral.cutting.tool'
+ _description = '整体式刀具'
+
+ code = fields.Char('编码')
+ name = fields.Char('型号名称', required=True)
+ # 整体式刀具类型字段,关联整体式刀具类型对象
+ integral_model_number = fields.Many2one('mrs.integral.cutting.tool.model', '整体式刀具类型', required=True)
+ # 增加品牌、总长度(mm)、柄部长度(mm)、刃部长度(mm)、直径(mm)、刃数、前角(°)、后角(°)、主偏角(°)、材料型号、配对螺母(mm)、适用夹头型号、适用范围、图片、创建人、创建时间等字段
+ brand = fields.Many2one('mrs.machine.brand', '品牌', required=True)
+ total_length = fields.Float('总长度(mm)', required=True)
+ shank_length = fields.Float('柄部长度(mm)', required=True)
+ blade_length = fields.Float('刃部长度(mm)', required=True)
+ diameter = fields.Float('直径(mm)', required=True)
+ blade_number = fields.Integer('刃数', required=True)
+ front_angle = fields.Float('前角(°)', required=True)
+ rear_angle = fields.Float('后角(°)', required=True)
+ main_included_angle = fields.Float('主偏角(°)', required=True)
+ material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True)
+ nut = fields.Float('配对螺母(mm)', required=True)
+ # 适用夹头型号可以多选
+ chuck_model = fields.Many2many('mrs.chuck', string='适用夹头型号', required=True)
+ scope = fields.Char('适用范围', required=True)
+ image = fields.Binary('图片')
+
+
+# 整体式刀具类型
+class IntegralCuttingToolModel(models.Model):
+ _name = 'mrs.integral.cutting.tool.model'
+ _description = '整体式刀具类型'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称', required=True)
+ remark = fields.Text('备注')
+
+
+# 刀片
+class Blade(models.Model):
+ _name = 'mrs.blade'
+ _description = '刀片'
+
+ code = fields.Char('编码')
+ name = fields.Char('型号名称', required=True)
+ # 刀片类型字段,关联刀片类型对象
+ blade_model_number = fields.Many2one('mrs.blade.model', '刀片类型', required=True)
+ # 编码、型号名称、刀片类型、品牌、长度L(mm)、宽度D(mm)、高度T(mm)、顶角(°)、前角(°)、后角(°)、主偏角(°)、R角(°)、材料型号、加工硬度、配对螺母(mm)、适用刀杆/刀盘型号、刀尖半径(mm)、图片、创建人、创建时间字段
+ brand = fields.Many2one('mrs.machine.brand', '品牌', required=True)
+ length = fields.Float('长度L(mm)', required=True)
+ width = fields.Float('宽度D(mm)', required=True)
+ height = fields.Float('高度T(mm)', required=True)
+ top_angle = fields.Float('顶角(°)', required=True)
+ front_angle = fields.Float('前角(°)', required=True)
+ rear_angle = fields.Float('后角(°)', required=True)
+ main_included_angle = fields.Float('主偏角(°)', required=True)
+ r_angle = fields.Float('R角(°)', required=True)
+ material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True)
+ hardness = fields.Char('加工硬度', required=True)
+ nut = fields.Float('配对螺母(mm)', required=True)
+ # 适用刀杆型号可以多选
+ cutter_bar = fields.Many2many('mrs.cutter.bar', string='适用刀杆型号')
+ # 适用刀盘型号可以多选
+ cutter_pad = fields.Many2many('mrs.cutter.pad', string='适用刀盘型号')
+ radius = fields.Float('刀尖半径(mm)', required=True)
+ image = fields.Binary('图片')
+
+
+# 刀片类型
+class BladeModel(models.Model):
+ _name = 'mrs.blade.model'
+ _description = '刀片类型'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称', required=True)
+ # 刀片类型字段,关联刀片对象
+ blade_ids = fields.One2many('mrs.blade', 'blade_model_number', '刀片类型')
+ remark = fields.Text('备注')
+
+
+# 刀杆
+class CutterBar(models.Model):
+ _name = 'mrs.cutter.bar'
+ _description = '刀杆'
+
+ code = fields.Char('编码')
+ name = fields.Char('型号名称', required=True)
+ # 刀杆类型字段,关联刀杆类型对象
+ cutter_bar_model_number = fields.Many2one('mrs.cutter.bar.model', '刀杆类型', required=True)
+ # 品牌、C柄径(mm)、L总长(mm)、材料型号、刃数、D刃径(mm)、适用刀片型号、配对扳手(mm)、配备螺丝(mm)、刀尖圆角半径、精度等级、硬度(°)、适用范围、图片、创建人、创建时间
+ brand = fields.Many2one('mrs.machine.brand', '品牌', required=True)
+ c_diameter = fields.Float('C柄径(mm)', required=True)
+ total_length = fields.Float('L总长(mm)', required=True)
+ material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True)
+ blade_number = fields.Integer('刃数', required=True)
+ d_diameter = fields.Float('D刃径(mm)', required=True)
+ blade = fields.Many2many('mrs.blade', string='适用刀片型号')
+ wrench = fields.Float('配对扳手(mm)', required=True)
+ screw = fields.Float('配备螺丝(mm)', required=True)
+ radius = fields.Float('刀尖圆角半径', required=True)
+ accuracy = fields.Char('精度等级', required=True)
+ hardness = fields.Char('硬度(°)', required=True)
+ scope = fields.Char('适用范围', required=True)
+ image = fields.Binary('图片')
+
+
+# 刀杆类型
+class CutterBarModel(models.Model):
+ _name = 'mrs.cutter.bar.model'
+ _description = '刀杆类型'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称', required=True)
+ remark = fields.Text('备注')
+
+
+# 刀盘
+class CutterPad(models.Model):
+ _name = 'mrs.cutter.pad'
+ _description = '刀盘'
+
+ code = fields.Char('编码')
+ name = fields.Char('型号名称', required=True)
+ # 刀盘类型字段,关联刀盘类型对象
+ cutter_pad_model_number = fields.Many2one('mrs.cutter.pad.model', '刀盘类型', required=True)
+ # 增加品牌、C柄径(mm)、L总长(mm)、材料型号、刃数、D刃径(mm)、适用刀片型号、配对扳手(mm)、配备螺丝(mm)、刀尖圆角半径、精度等级、硬度(°)、适用范围、图片、创建人、创建时间
+ brand = fields.Many2one('mrs.machine.brand', '品牌', required=True)
+ c_diameter = fields.Float('C柄径(mm)', required=True)
+ total_length = fields.Float('L总长(mm)', required=True)
+ material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True)
+ blade_number = fields.Integer('刃数', required=True)
+ d_diameter = fields.Float('D刃径(mm)', required=True)
+ blade = fields.Many2many('mrs.blade', string='适用刀片型号')
+ wrench = fields.Float('配对扳手(mm)', required=True)
+ screw = fields.Float('配备螺丝(mm)', required=True)
+ radius = fields.Float('刀尖圆角半径', required=True)
+ accuracy = fields.Char('精度等级', required=True)
+ hardness = fields.Char('硬度(°)', required=True)
+ scope = fields.Char('适用范围', required=True)
+ image = fields.Binary('图片')
+
+
+# 刀盘类型
+class CutterPadModel(models.Model):
+ _name = 'mrs.cutter.pad.model'
+ _description = '刀盘类型'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称', required=True)
+ remark = fields.Text('备注')
+
+
+# 刀柄
+class Handle(models.Model):
+ _name = 'mrs.handle'
+ _description = '刀柄'
+
+ code = fields.Char('编码')
+ name = fields.Char('型号名称', required=True)
+ # 刀柄类型字段,关联刀柄类型对象
+ handle_model_number = fields.Many2one('mrs.handle.model', '刀柄类型', required=True)
+ # 增加、刀柄类型、品牌、L(mm)、L1(mm)、D1(mm)、重量(kg)、材料型号、本体精度(mm)、配对螺母(mm)、适用夹头型号、夹持范围(mm)、检测精度、检测硬度、标准转速、图片、创建人、创建时间
+ brand = fields.Many2one('mrs.machine.brand', '品牌', required=True)
+ length = fields.Float('L(mm)', required=True)
+ length1 = fields.Float('L1(mm)', required=True)
+ diameter1 = fields.Float('D1(mm)', required=True)
+ weight = fields.Float('重量(kg)', required=True)
+ material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True)
+ body_accuracy = fields.Float('本体精度(mm)', required=True)
+ nut = fields.Float('配对螺母(mm)', required=True)
+ chuck_model = fields.Many2many('mrs.chuck.model', string='适用夹头型号', required=True)
+ clamping_range = fields.Float('夹持范围(mm)', required=True)
+ detection_accuracy = fields.Float('检测精度', required=True)
+ detection_hardness = fields.Char('检测硬度', required=True)
+ standard_speed = fields.Float('标准转速', required=True)
+ image = fields.Binary('图片')
+
+
+# 刀柄类型
+class HandleModel(models.Model):
+ _name = 'mrs.handle.model'
+ _description = '刀柄类型'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称', required=True)
+ remark = fields.Text('备注')
+
+
+# 夹头对象(夹头型号对象)
+class Chuck(models.Model):
+ _name = 'mrs.chuck'
+ _description = '夹头'
+
+ code = fields.Char('编码')
+ name = fields.Char('型号名称', required=True)
+ # 夹头类型字段,关联夹头类型对象
+ chuck_model_number = fields.Many2one('mrs.chuck.model', '夹头类型', required=True)
+ # 增加品牌、精度(mm)、外径(mm)、内径(mm)、高度(mm)、材料型号、配对螺母(mm)、适用刀柄型号、夹持范围(mm)、特性、图片、创建人、创建时间
+ brand = fields.Many2one('mrs.machine.brand', '品牌', required=True)
+ accuracy = fields.Float('精度(mm)', required=True)
+ diameter = fields.Float('外径(mm)', required=True)
+ inner_diameter = fields.Float('内径(mm)', required=True)
+ height = fields.Float('高度(mm)', required=True)
+ material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True)
+ nut = fields.Float('配对螺母(mm)', required=True)
+ handle_model = fields.Many2many('mrs.handle.model', string='适用刀柄型号', required=True)
+ clamping_range = fields.Float('夹持范围(mm)', required=True)
+ feature = fields.Char('特性', required=True)
+ image = fields.Binary('图片')
+
+
+# 夹头类型
+class ChuckModel(models.Model):
+ _name = 'mrs.chuck.model'
+ _description = '夹头类型'
+
+ code = fields.Char('编码')
+ name = fields.Char('名称', required=True)
+ remark = fields.Text('备注')
+
diff --git a/sf_base/views/tool_base_menu.xml b/sf_base/views/tool_base_menu.xml
new file mode 100644
index 00000000..6f44729a
--- /dev/null
+++ b/sf_base/views/tool_base_menu.xml
@@ -0,0 +1,244 @@
+
+
+
+
+
+ 整体式刀具型号
+ ir.actions.act_window
+ mrs.integral.cutting.tool
+
+ tree,form
+
+
+
+ 功能刀具型号
+ ir.actions.act_window
+ mrs.functional.cutting.tool
+ tree,form
+
+
+
+ 刀片型号
+ ir.actions.act_window
+ mrs.blade
+ tree,form
+
+
+
+ 刀杆型号
+ ir.actions.act_window
+ mrs.cutter.bar
+ tree,form
+
+
+
+ 刀盘型号
+ ir.actions.act_window
+ mrs.cutter.pad
+ tree,form
+
+
+
+ 刀柄型号
+ ir.actions.act_window
+ mrs.handle
+ tree,form
+
+
+
+ 夹头型号
+ ir.actions.act_window
+ mrs.chuck
+ tree,form
+
+
+
+ 功能刀具类型
+ ir.actions.act_window
+ mrs.functional.cutting.tool.model
+ tree,form
+
+
+
+ 整体式刀具类型
+ ir.actions.act_window
+ mrs.integral.cutting.tool.model
+ tree,form
+
+
+
+ 刀片类型
+ ir.actions.act_window
+ mrs.blade.model
+ tree,form
+
+
+
+ 刀杆类型
+ ir.actions.act_window
+ mrs.cutter.bar.model
+ tree,form
+
+
+
+ 刀盘类型
+ ir.actions.act_window
+ mrs.cutter.pad.model
+ tree,form
+
+
+
+ 刀柄类型
+ ir.actions.act_window
+ mrs.handle.model
+ tree,form
+
+
+
+ 夹头类型
+ ir.actions.act_window
+ mrs.chuck.model
+ tree,form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sf_base/views/tool_base_views.xml b/sf_base/views/tool_base_views.xml
new file mode 100644
index 00000000..ea091428
--- /dev/null
+++ b/sf_base/views/tool_base_views.xml
@@ -0,0 +1,695 @@
+
+
+
+
+
+ mrs.functional.cutting.tool.tree
+ mrs.functional.cutting.tool
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.functional.cutting.tool.form
+ mrs.functional.cutting.tool
+
+
+
+
+
+
+
+ mrs.integral.cutting.tool.tree
+ mrs.integral.cutting.tool
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.integral.cutting.tool.form
+ mrs.integral.cutting.tool
+
+
+
+
+
+
+ mrs.blade.tree
+ mrs.blade
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.blade.form
+ mrs.blade
+
+
+
+
+
+
+ mrs.cutter.bar.tree
+ mrs.cutter.bar
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.bar.form
+ mrs.cutter.bar
+
+
+
+
+
+
+
+ mrs.cutter.pad.tree
+ mrs.cutter.pad
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.pad.form
+ mrs.cutter.pad
+
+
+
+
+
+
+
+ mrs.cutter.handle.tree
+ mrs.handle
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.handle.form
+ mrs.handle
+
+
+
+
+
+
+
+ mrs.cutter.chuck.tree
+ mrs.chuck
+
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.chuck.form
+ mrs.chuck
+
+
+
+
+
+
+
+ mrs.cutter.function.tree
+ mrs.functional.cutting.tool.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.function.form
+ mrs.functional.cutting.tool.model
+
+
+
+
+
+
+ mrs.integral.cutting.tool.model.tree
+ mrs.integral.cutting.tool.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.integral.cutting.tool.model.form
+ mrs.integral.cutting.tool.model
+
+
+
+
+
+
+ mrs.blade.model.tree
+ mrs.blade.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.blade.model.form
+ mrs.blade.model
+
+
+
+
+
+
+ mrs.cutter.bar.model.tree
+ mrs.cutter.bar.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.bar.model.form
+ mrs.cutter.bar.model
+
+
+
+
+
+
+ mrs.cutter.pad.model.tree
+ mrs.cutter.pad.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.cutter.pad.model.form
+ mrs.cutter.pad.model
+
+
+
+
+
+
+
+ mrs.handle.model.tree
+ mrs.handle.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.handle.model.form
+ mrs.handle.model
+
+
+
+
+
+
+ mrs.chuck.model.tree
+ mrs.chuck.model
+
+
+
+
+
+
+
+
+
+
+
+ mrs.chuck.model.form
+ mrs.chuck.model
+
+
+
+
+
+
+
+