diff --git a/sf_base/__manifest__.py b/sf_base/__manifest__.py index 0aa2daa0..60077453 100644 --- a/sf_base/__manifest__.py +++ b/sf_base/__manifest__.py @@ -10,7 +10,7 @@ """, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['account', 'base', 'mrp_workorder', 'sale', 'sf_maintenance'], + 'depends': ['account', 'base', 'mrp_workorder', 'sale'], 'data': [ 'security/group_security.xml', 'security/ir.model.access.csv', diff --git a/sf_base/models/__init__.py b/sf_base/models/__init__.py index 483787eb..93961162 100644 --- a/sf_base/models/__init__.py +++ b/sf_base/models/__init__.py @@ -3,6 +3,7 @@ from . import common from . import tool_base_new from . import fixture from . import functional_fixture +from . import tool_other_features diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py index 5ed37a94..c0f84ed9 100644 --- a/sf_base/models/tool_base_new.py +++ b/sf_base/models/tool_base_new.py @@ -148,10 +148,10 @@ class CuttingToolModel(models.Model): '适合冷却液', domain=[('type', '=', '冷却液')]) compaction_way_ids = fields.Many2many('maintenance.equipment.image', 'compaction_way_library_rel', '压紧方式', domain=[('type', '=', '压紧方式')]) - # tool_materials_basic_parameters_ids = fields.One2many('mrs.tool.materials.basic.parameters', - # 'cutting_tool_model_id', string='基本参数') - # cutting_speed_ids = fields.One2many('mrs.cutting.speed', 'cutting_tool_model_id', string='切削速度Vc') - # feed_per_tooth_ids = fields.One2many('mrs.feed.per.tooth', 'cutting_tool_model_id', '每齿走刀量fz') + basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', + 'standard_library_id', string='基本参数') + cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc') + feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz') material_model_id = fields.Many2one('sf.materials.model', '材料型号') nut = fields.Float('配对螺母(mm)') @@ -204,3 +204,48 @@ class CuttingToolModel(models.Model): def get_cutter_bar_ids(self): return self.cutter_bar_ids + + +class MaintenanceStandardImage(models.Model): + _name = 'maintenance.equipment.image' + _description = '能力特征库' + + active = fields.Boolean('有效', default=True) + name = fields.Char('名称') + image = fields.Binary(string='图文') + type = fields.Selection( + [('加工能力', '加工能力'), ('刀尖特征', '刀尖特征'), ('柄部类型', '柄部类型'), ('走刀方向', '走刀方向'), + ('冷却液', '冷却液'), ('压紧方式', '压紧方式'), ('刀片形状', '刀片形状')], + string='特征') + equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备') + + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res diff --git a/sf_base/models/tool_other_features.py b/sf_base/models/tool_other_features.py new file mode 100644 index 00000000..97bb0645 --- /dev/null +++ b/sf_base/models/tool_other_features.py @@ -0,0 +1,282 @@ +from odoo import fields, models, api + + +class ToolMaterialsBasicParameters(models.Model): + _name = 'sf.tool.materials.basic.parameters' + _description = '刀具物料基本参数' + + standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库') + cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型', + store=True) + # cutting_tool_type_1 = fields.Char(related='cutting_tool_type', string='类型', store=True) + + # 整体式刀具参数 + code = fields.Char('物料号', size=50) + total_length = fields.Char('总长度(mm)', size=20) + blade_number = fields.Selection( + [('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')], + string='刃数(个)') + neck_diameter = fields.Char('颈部直径(mm)', size=20) + neck_length = fields.Char('颈部长度(mm)', size=20) + handle_diameter = fields.Char('柄部直径(mm)', size=20) + handle_length = fields.Char('柄部长度(mm)', size=20) + blade_tip_diameter = fields.Char('刀尖直径(mm)', size=20) + blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20) + blade_tip_taper = fields.Integer('刀尖锥度(°)') + blade_diameter = fields.Char('刃部直径(mm)', size=20) + blade_length = fields.Char('刃部长度(mm)', size=20) + blade_helix_angle = fields.Integer('刃部螺旋角(°)') + blade_width = fields.Char('刃部宽度(mm)', size=20) + blade_depth = fields.Char('刃部深度(mm)', size=20) + pitch = fields.Char('牙距(mm)', size=20) + cutting_depth = fields.Char('切削深度(mm)', size=20) + # 刀片参数 + length = fields.Char('长度(mm)', size=20) + thickness = fields.Char('厚度(mm)', size=20) + width = fields.Char('宽度(mm)', size=20) + cutting_blade_length = fields.Char('切削刃长(mm)', size=20) + relief_angle = fields.Integer('后角(°)') + blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20) + inscribed_circle_diameter = fields.Char('内接圆直径(mm)', size=20) + install_aperture_diameter = fields.Char('安装孔直径(mm)', size=20) + chip_breaker_groove = fields.Selection([('无', '无'), ('单面', '单面'), ('双面', '双面')], + string='有无断屑槽') + blade_teeth_model = fields.Selection( + [('V牙型', 'V牙型'), ('米制全牙型', '米制全牙型'), ('美制全牙型', '美制全牙型'), + ('惠氏全牙型', '惠氏全牙型'), ('BSPT全牙型', 'BSPT全牙型'), ('NPT全牙型', 'NPT全牙型'), + ('UNJ全牙型', 'UNJ全牙型'), ('DIN405圆牙型', 'DIN405圆牙型'), ('ACME梯形', 'ACME梯形'), + ('石油管螺纹刀片', '石油管螺纹刀片'), ('矮牙ACME梯形', '矮牙ACME梯形'), + ('Trapeze30° 103', 'Trapeze30° 103')], string='刀片牙型') + blade_blade_number = fields.Selection([('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), + ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10')], + string='刀片的刃数(个)') + main_included_angle = fields.Integer('主偏角(°)') + top_angle = fields.Integer('顶角(°)') + blade_tip_dip_angle = fields.Integer('刀尖倾角(°)') + side_cutting_edge_angle = fields.Integer('侧切削角(°)') + thread_model = fields.Selection([('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型') + thread_num = fields.Char('每英寸螺纹数(TPI)', size=20) + blade_tip_height_tolerance = fields.Char('刀尖高度公差(mm)', size=20) + inscribed_circle_tolerance = fields.Char('内接圆公差(mm)', size=20) + thickness_tolerance = fields.Char('厚度公差(mm)', size=20) + # 刀杆参数 + height = fields.Char('高度(mm)', size=20) + blade_height = fields.Char('刃部高度(mm)', size=20) + cutter_arbor_diameter = fields.Char('刀杆直径(mm)', size=20) + min_machining_aperture = fields.Char('最小加工孔径(mm)', size=20) + install_blade_tip_num = fields.Char('可装刀片数/齿数(个)', size=20) + cutting_blade_model = fields.Char('切削类型', size=20) + cooling_hole = fields.Selection([('有', '有'), ('无', '无')], string='有无冷却孔') + locating_slot_code = fields.Char('定位槽代号', size=20) + installing_structure = fields.Char('安装结构', size=20) + blade_ids = fields.Many2many( + 'sf.cutting.tool.type', + relation='basic_param_pad_blade_rel', + column1='model_id_1', + column2='model_id_2', + domain="[('cutting_tool_material_id.name', '=', '刀片')]", + string='适配刀片型号' # 使用空列表作为默认值 + ) + tool_shim = fields.Char('适配刀垫型号', size=50) + cotter_pin = fields.Char('适配销钉型号', size=50) + pressing_plate = fields.Char('适配压板型号', size=50) + screw = fields.Char('适配螺钉型号', size=50) + spanner = fields.Char('适配扳手型号', size=50) + # 刀盘参数 + cutter_head_diameter = fields.Char('刀盘直径(mm)', size=20) + interface_diameter = fields.Char('接口直径(mm)', size=20) + # 刀柄参数 + flange_shank_length = fields.Char('法兰柄长(mm)', size=20) + handle_external_diameter = fields.Char('柄部外径(mm)', size=20) + handle_inside_diameter = fields.Char('柄部内径(mm)', size=20) + min_clamping_diameter = fields.Char('最小夹持直径(mm)', size=20) + max_clamping_diameter = fields.Char('最大夹持直径(mm)', size=20) + clamping_mode = fields.Char('夹持方式', size=20) + max_load_capacity = fields.Char('最大负载能力(kg)', size=20) + taper = fields.Integer('锥度(°)') + tool_changing_time = fields.Integer('换刀时间(s)') + standard_rotate_speed = fields.Char('标准转速(n/min)', size=20) + max_rotate_speed = fields.Char('最大转速(n/min)', size=20) + diameter_slip_accuracy = fields.Char('径跳精度(mm)', size=20) + cooling_model = fields.Char('冷却类型', size=20) + is_rough_machining = fields.Selection([('是', '是'), ('否', '否')], string='是否可粗加工') + is_finish_machining = fields.Selection([('是', '是'), ('否', '否')], string='是否可精加工') + is_quick_cutting = fields.Selection([('是', '是'), ('否', '否')], string='是否可高速切削') + is_drill_hole = fields.Selection([('是', '是'), ('否', '否')], string='是否可钻孔') + is_safe_lock = fields.Selection([('是', '是'), ('否', '否')], string='有无安全锁') + # 夹头参数 + er_size_model = fields.Char('ER尺寸型号', size=20) + outer_diameter = fields.Char('外径(mm)', size=20) + inner_diameter = fields.Char('内径(mm)', size=20) + run_out_accuracy = fields.Char('跳动精度(mm)', size=20) + top_diameter = fields.Char('顶部直径(mm)', size=20) + weight = fields.Char('重量(kg)', size=20) + clamping_length = fields.Char('夹持长度(mm)', size=20) + clamping_tolerance = fields.Char('夹持公差(mm)', size=20) + handle_ids = fields.Many2many( + 'sf.cutting.tool.type', + relation='basic_param_chuck_handle_rel', + column1='model_id_1', + column2='model_id_2', + domain="[('cutting_tool_material_id.name', '=', '刀柄')]", + string='适用刀柄型号' + ) + + def _json_basic_param(self, obj): + basic_param_str = [0, '', { + 'code': obj['code'], + 'total_length': obj['total_length'], + 'blade_number': obj['blade_number'], + 'neck_diameter': obj['neck_diameter'], + 'neck_length': obj['neck_length'], + 'handle_diameter': obj['handle_diameter'], + 'handle_length': obj['handle_length'], + 'blade_tip_diameter': obj['blade_tip_diameter'], + 'blade_tip_working_size': obj['blade_tip_working_size'], + 'blade_tip_taper': obj['blade_tip_taper'], + 'blade_diameter': obj['blade_diameter'], + 'blade_length': obj['blade_length'], + 'blade_helix_angle': obj['blade_helix_angle'], + 'blade_width': obj['blade_width'], + 'blade_depth': obj['blade_depth'], + 'pitch': obj['pitch'], + 'cutting_depth': obj['cutting_depth'], + 'length': obj['length'], + 'thickness': obj['thickness'], + 'width': obj['width'], + 'cutting_blade_length': obj['cutting_blade_length'], + 'relief_angle': obj['relief_angle'], + 'blade_tip_circular_arc_radius': obj['blade_tip_circular_arc_radius'], + 'inscribed_circle_diameter': obj['inscribed_circle_diameter'], + 'install_aperture_diameter': obj['install_aperture_diameter'], + 'chip_breaker_groove': obj['chip_breaker_groove'], + 'blade_teeth_model': obj['bladed_teeth_model'], + 'blade_blade_number': obj['blade_blade_number'], + 'main_included_angle': obj['main_included_angle'], + 'top_angle': obj['top_angle'], + 'blade_tip_dip_angle': obj['blade_tip_dip_angle'], + 'side_cutting_edge_angle': obj['side_cutting_edge_angle'], + 'thread_model': obj['thread_model'], + 'thread_num': obj['thread_num'], + 'blade_tip_height_tolerance': obj['blade_tip_height_tolerance'], + 'inscribed_circle_tolerance': obj['inscribed_circle_tolerance'], + 'thickness_tolerance': obj['thickness_tolerance'], + 'height': obj['height'], + 'blade_height': obj['blade_height'], + 'cutter_arbor_diameter': obj['cutter_arbor_diameter'], + 'min_machining_aperture': obj['min_machining_aperture'], + 'install_blade_tip_num': obj['install_blade_tip_num'], + 'cutting_blade_model': obj['cutting_blade_model'], + 'cooling_hole': obj['cooling_hole'], + 'locating_slot_code': obj['locating_slot_code'], + 'installing_structure': obj['installing_structure'], + 'tool_shim': obj['tool_shim'], + 'cotter_pin': obj['cotter_pin'], + 'pressing_plate': obj['pressing_plate'], + 'screw': obj['screw'], + 'spanner': obj['spanner'], + 'cutter_head_diameter': obj['cutter_head_diameter'], + 'interface_diameter': obj['interface_diameter'], + 'flange_shank_length': obj['flange_shank_length'], + 'handle_external_diameter': obj['handle_external_diameter'], + 'handle_inside_diameter': obj['handle_inside_diameter'], + 'min_clamping_diameter': obj['min_clamping_diameter'], + 'max_clamping_diameter': obj['max_clamping_diameter'], + 'clamping_mode': obj['clamping_mode'], + 'max_load_capacity': obj['max_load_capacity'], + 'taper': obj['taper'], + 'tool_changing_time': obj['tool_changing_time'], + 'standard_rotate_speed': obj['standard_rotate_speed'], + 'max_rotate_speed': obj['max_rotate_speed'], + 'diameter_slip_accuracy': obj['diameter_slip_accuracy'], + 'cooling_model': obj['cooling_model'], + 'is_rough_machining': obj['is_rough_machining'], + 'is_finish_machining': obj['is_finish_machining'], + 'is_quick_cutting': obj['is_quick_cutting'], + 'is_drill_hole': obj['is_drill_hole'], + 'is_safe_lock': obj['is_safe_lock'], + 'er_size_model': obj['er_size_model'], + 'outer_diameter': obj['outer_diameter'], + 'inner_diameter': obj['inner_diameter'], + 'run_out_accuracy': obj['run_out_accuracy'], + 'top_diameter': obj['top_diameter'], + 'weight': obj['weight'], + 'clamping_length': obj['clamping_length'], + 'clamping_tolerance': obj['clamping_tolerance'], + 'handle_ids': obj['weight'], + 'blade_ids': obj['clamping_length'], + }] + return basic_param_str + + +class CuttingSpeed(models.Model): + _name = 'sf.cutting.speed' + _description = '切削速度Vc' + + # product_template_id = fields.Many2one('product.template', string='产品') + standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') + execution_standard_id = fields.Char('执行标准') + material_code = fields.Char('材料代号') + material_name = fields.Char('材料名称') + material_grade = fields.Char('材料牌号') + tensile_strength = fields.Float('拉伸强度 (N/mm²)') + hardness = fields.Float('硬度(HRC)') + cutting_speed_n1 = fields.Char('径向切宽 ae=100%D1 ap=1*D1 切削速度Vc') + cutting_speed_n2 = fields.Char('径向切宽 ae=50%D1 ap=1.5*D1 切削速度Vc') + cutting_speed_n3 = fields.Char('径向切宽 ae=25%D1 ap=L1max 切削速度Vc') + cutting_speed_n4 = fields.Char('径向切宽 ae=15%D1 ap=L1max 切削速度Vc') + cutting_speed_n5 = fields.Char('径向切宽 ae=5%D1 ap=L1max 切削速度Vc') + rough_machining = fields.Char('粗加工 Vc(m/min)') + precision_machining = fields.Char('精加工 Vc(m/min)') + application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用') + + def _json_cutting_speed(self, obj): + cutting_speed_str = [0, '', { + 'execution_standard_id': obj['execution_standard_id'], + 'material_code': obj['material_code'], + 'material_name': obj['material_name'], + 'material_grade': obj['material_grade'], + 'tensile_strength': obj['tensile_strength'], + 'hardness': obj['hardness'], + 'cutting_speed_n1': obj['cutting_speed_n1'], + 'cutting_speed_n2': obj['cutting_speed_n2'], + 'cutting_speed_n3': obj['cutting_speed_n3'], + 'cutting_speed_n4': obj['cutting_speed_n4'], + 'cutting_speed_n5': obj['cutting_speed_n5'], + 'rough_machining': obj['rough_machining'], + 'precision_machining': obj['precision_machining'], + 'application': obj['application'], + }] + return cutting_speed_str + + +class FeedPerTooth(models.Model): + _name = 'sf.feed.per.tooth' + _description = '每齿走刀量fz' + + # product_template_id = fields.Many2one('product.template', string='产品') + standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') + + cutting_speed = fields.Char('径向切宽 ae(mm)') + machining_method = fields.Selection([('直铣', '直铣'), ('坡铣', '坡铣')], string='加工方式') + materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') + # blade_diameter = fields.Float('刃部直径D1(mm)', readonly=True, + # related='product_template_id.cutting_tool_blade_diameter') + feed_per_tooth = fields.Char('每齿走刀量 (mm/z)') + unit = fields.Char('单位', default='fz') + + def _json_feed_per_tooth(self, obj): + feed_per_tooth_str = [0, '', { + 'cutting_speed': obj['cutting_speed'], + 'machining_method': obj['machining_method'], + 'materials_type_id': obj['materials_type_id'], + # 'blade_diameter': obj['blade_diameter'], + 'feed_per_tooth': obj['feed_per_tooth'], + 'unit': obj['unit'], + }] + return feed_per_tooth_str + + # @api.depends('product_template_id') + # def _compute_product_template_id(self): + # if self.product_template_id is not None: + # self.blade_diameter = self.product_template_id.cutting_tool_blade_diameter diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index 39ee21cf..37daa2b3 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -15,7 +15,6 @@ access_sf_production_process_category,sf_production_process_category,model_sf_pr access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,1 access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,base.group_user,1,1,1,1 access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,1 -access_sf_cutting_tool_model,sf_cutting_tool_model,model_sf_cutting_tool_model,base.group_user,1,1,1,1 access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,1 access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,1 access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,1 @@ -27,6 +26,11 @@ access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1, access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,1 access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,1 access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,1 +access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,1 +access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1 +access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1 +access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1 + diff --git a/sf_base/views/tool_menu.xml b/sf_base/views/tool_menu.xml index 378277e5..cddb7d90 100644 --- a/sf_base/views/tool_menu.xml +++ b/sf_base/views/tool_menu.xml @@ -85,5 +85,12 @@ action="action_sf_functional_cutting_tool_model_type" /> + + diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index 8d837dc7..ed561325 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -359,4 +359,43 @@ + + + + maintenance.equipment.image.tree + maintenance.equipment.image + + + + + + + + + + + + + + maintenance.equipment.image.search + maintenance.equipment.image + + + + + + + + + + 能力特征库 + maintenance.equipment.image + tree + [] + + + + diff --git a/sf_dlm/__manifest__.py b/sf_dlm/__manifest__.py index ed717647..42c4598a 100644 --- a/sf_dlm/__manifest__.py +++ b/sf_dlm/__manifest__.py @@ -10,12 +10,13 @@ """, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['mrp', 'base', 'sale', 'sf_manufacturing', 'web_widget_model_viewer', 'mrp_subcontracting', 'purchase_stock', - 'uom','jikimo_frontend'], + 'depends': ['mrp', 'base', 'sale', 'sf_manufacturing', 'web_widget_model_viewer', 'mrp_subcontracting', + 'purchase_stock', + 'uom', 'jikimo_frontend', 'product'], 'data': [ 'data/product_data.xml', 'data/uom_data.xml', - 'views/product_template_view.xml', + # 'views/product_template_view.xml', 'views/product_workorder.xml' ], 'demo': [ diff --git a/sf_dlm/views/product_template_view.xml b/sf_dlm/views/product_template_view.xml index ce888b90..055898f5 100644 --- a/sf_dlm/views/product_template_view.xml +++ b/sf_dlm/views/product_template_view.xml @@ -296,9 +296,9 @@ attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/> - + + + diff --git a/sf_maintenance/models/sf_maintenance.py b/sf_maintenance/models/sf_maintenance.py index 156ab83f..e47c8097 100644 --- a/sf_maintenance/models/sf_maintenance.py +++ b/sf_maintenance/models/sf_maintenance.py @@ -567,50 +567,6 @@ class SfMaintenanceEquipment(models.Model): image_id = fields.Many2many('maintenance.equipment.image', 'equipment_id', string='设备图文') -class MaintenanceStandardImage(models.Model): - _name = 'maintenance.equipment.image' - _description = '能力特征库' - - active = fields.Boolean('有效', default=True) - name = fields.Char('名称') - image = fields.Binary(string='图文') - type = fields.Selection( - [('加工能力', '加工能力'), ('刀尖特征', '刀尖特征'), ('柄部类型', '柄部类型'), ('走刀方向', '走刀方向'), - ('冷却液', '冷却液'), ('压紧方式', '压紧方式'), ('刀片形状', '刀片形状')], - string='特征') - equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备') - - @api.model - def name_search(self, name='', args=None, operator='ilike', limit=100): - # 调用父类的name_search方法,获取原始的结果列表 - res = super().name_search(name, args, operator, limit) - # 定义一个空字典用来存储id和name的映射关系 - name_dict = {} - # 遍历结果列表,将id和name存入字典中 - for item in res: - id = item[0] - name = item[1] - name_dict[id] = name - # 根据id列表搜索符合条件的记录 - records = self.browse(name_dict.keys()) - # 定义一个新的结果列表用来存储修改后的结果 - new_res = [] - # 遍历每条记录 - for record in records: - # 获取记录的id,name和image属性 - id = record.id - name = name_dict[id] - image = record.image - # 如果image不为空,将其转换为data URI scheme - if image: - data_uri = f"data:image/png;base64,{image.decode('utf-8')}" - else: - data_uri = "" - # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result - new_res.append([id, name, data_uri]) - # 返回新的结果列表 - return new_res - class SfRobotAxisNum(models.Model): _name = 'sf.robot.axis.num' _description = '机器人轴参数' diff --git a/sf_maintenance/security/ir.model.access.csv b/sf_maintenance/security/ir.model.access.csv index 65e93d7a..5a022f14 100644 --- a/sf_maintenance/security/ir.model.access.csv +++ b/sf_maintenance/security/ir.model.access.csv @@ -4,7 +4,6 @@ access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.gr 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 access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,base.group_user,1,1,1,1 -access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1 access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,base.group_user,1,1,1,1 diff --git a/sf_maintenance/views/maintenance_views.xml b/sf_maintenance/views/maintenance_views.xml index 45955147..be106b33 100644 --- a/sf_maintenance/views/maintenance_views.xml +++ b/sf_maintenance/views/maintenance_views.xml @@ -949,48 +949,6 @@ - - maintenance.equipment.image.tree - maintenance.equipment.image - - - - - - - - - - - - - - maintenance.equipment.image.search - maintenance.equipment.image - - - - - - - - - - 能力特征库 - maintenance.equipment.image - tree - [] - - - \ No newline at end of file diff --git a/sf_manufacturing/models/__init__.py b/sf_manufacturing/models/__init__.py index 25b91f15..cb14176c 100644 --- a/sf_manufacturing/models/__init__.py +++ b/sf_manufacturing/models/__init__.py @@ -8,7 +8,6 @@ from . import mrp_routing_workcenter from . import stock from . import res_user from . import production_line_base -from . import tool_other_features diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 493da9fd..61b92c81 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -178,8 +178,8 @@ class ResProductMo(models.Model): # if self.integral_run_out_accuracy_min <= 0 and self.cutting_tool_type == '整体式刀具': # raise ValidationError("端跳精度最小(min)不能为0") - cutting_speed_ids = fields.One2many('sf.cutting.speed', 'product_template_id', string='切削速度Vc') - feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'product_template_id', string='每齿走刀量fz') + # cutting_speed_ids = fields.One2many('sf.cutting.speed', 'product_template_id', string='切削速度Vc') + # feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'product_template_id', string='每齿走刀量fz') # @api.constrains('suitable_machining_method_ids') # def _check_suitable_machining_method_ids(self): @@ -272,14 +272,14 @@ class ResProductMo(models.Model): cooling_suit_type_ids = fields.Char('适用冷却套型号') # cooling_suit_type_ids = fields.Many2many('冷却类型') cutting_tool_er_size_model = fields.Char('ER尺寸型号') - cutting_tool_handle_ids = fields.Many2many( - 'sf.cutting.tool.model', - relation='product_cutting_tool_model_chuck_handle_rel', - column1='model_id_1', - column2='model_id_2', - domain="[('cutting_tool_type', '=', '刀柄')]", - string='适用刀柄型号' - ) + # cutting_tool_handle_ids = fields.Many2many( + # 'sf.cutting.tool.model', + # relation='product_cutting_tool_model_chuck_handle_rel', + # column1='model_id_1', + # column2='model_id_2', + # domain="[('cutting_tool_type', '=', '刀柄')]", + # string='适用刀柄型号' + # ) # 夹具参数 fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料") fixture_model_id = fields.Many2one('sf.fixture.model', string="夹具型号") diff --git a/sf_manufacturing/models/tool_other_features.py b/sf_manufacturing/models/tool_other_features.py index 03a954f9..569b7f9f 100644 --- a/sf_manufacturing/models/tool_other_features.py +++ b/sf_manufacturing/models/tool_other_features.py @@ -1,225 +1,226 @@ from odoo import fields, models, api -class SuitableMachiningMethod(models.Model): - _name = 'sf.suitable.machining.method' - _description = '适合加工方式' +class ToolMaterialsBasicParameters(models.Model): + _name = 'sf.tool.materials.basic.parameters' + _description = '刀具物料基本参数' - name = fields.Char('名称') - image = fields.Image('图片') + standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库') + cutting_tool_type = fields.Char(related='cutting_tool_model_id.cutting_tool_type', string='刀具物料类型', + store=True) + # cutting_tool_type_1 = fields.Char(related='cutting_tool_type', string='类型', store=True) - @api.model - def name_search(self, name='', args=None, operator='ilike', limit=100): - # 调用父类的name_search方法,获取原始的结果列表 - res = super().name_search(name, args, operator, limit) - # 定义一个空字典用来存储id和name的映射关系 - name_dict = {} - # 遍历结果列表,将id和name存入字典中 - for item in res: - id = item[0] - name = item[1] - name_dict[id] = name - # 根据id列表搜索符合条件的记录 - records = self.browse(name_dict.keys()) - # 定义一个新的结果列表用来存储修改后的结果 - new_res = [] - # 遍历每条记录 - for record in records: - # 获取记录的id,name和image属性 - id = record.id - name = name_dict[id] - image = record.image - # 如果image不为空,将其转换为data URI scheme - if image: - data_uri = f"data:image/png;base64,{image.decode('utf-8')}" - else: - data_uri = "" - # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result - new_res.append([id, name, data_uri]) - # 返回新的结果列表 - return new_res + # 整体式刀具参数 + code = fields.Char('物料号', size=50) + total_length = fields.Char('总长度(mm)', size=20) + blade_number = fields.Selection( + [('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')], + string='刃数(个)') + neck_diameter = fields.Char('颈部直径(mm)', size=20) + neck_length = fields.Char('颈部长度(mm)', size=20) + handle_diameter = fields.Char('柄部直径(mm)', size=20) + handle_length = fields.Char('柄部长度(mm)', size=20) + blade_tip_diameter = fields.Char('刀尖直径(mm)', size=20) + blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20) + blade_tip_taper = fields.Integer('刀尖锥度(°)') + blade_diameter = fields.Char('刃部直径(mm)', size=20) + blade_length = fields.Char('刃部长度(mm)', size=20) + blade_helix_angle = fields.Integer('刃部螺旋角(°)') + blade_width = fields.Char('刃部宽度(mm)', size=20) + blade_depth = fields.Char('刃部深度(mm)', size=20) + pitch = fields.Char('牙距(mm)', size=20) + cutting_depth = fields.Char('切削深度(mm)', size=20) + # 刀片参数 + length = fields.Char('长度(mm)', size=20) + thickness = fields.Char('厚度(mm)', size=20) + width = fields.Char('宽度(mm)', size=20) + cutting_blade_length = fields.Char('切削刃长(mm)', size=20) + relief_angle = fields.Integer('后角(°)') + blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20) + inscribed_circle_diameter = fields.Char('内接圆直径(mm)', size=20) + install_aperture_diameter = fields.Char('安装孔直径(mm)', size=20) + chip_breaker_groove = fields.Selection([('无', '无'), ('单面', '单面'), ('双面', '双面')], + string='有无断屑槽') + blade_teeth_model = fields.Selection( + [('V牙型', 'V牙型'), ('米制全牙型', '米制全牙型'), ('美制全牙型', '美制全牙型'), + ('惠氏全牙型', '惠氏全牙型'), ('BSPT全牙型', 'BSPT全牙型'), ('NPT全牙型', 'NPT全牙型'), + ('UNJ全牙型', 'UNJ全牙型'), ('DIN405圆牙型', 'DIN405圆牙型'), ('ACME梯形', 'ACME梯形'), + ('石油管螺纹刀片', '石油管螺纹刀片'), ('矮牙ACME梯形', '矮牙ACME梯形'), + ('Trapeze30° 103', 'Trapeze30° 103')], string='刀片牙型') + blade_blade_number = fields.Selection([('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), + ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10')], + string='刀片的刃数(个)') + main_included_angle = fields.Integer('主偏角(°)') + top_angle = fields.Integer('顶角(°)') + blade_tip_dip_angle = fields.Integer('刀尖倾角(°)') + side_cutting_edge_angle = fields.Integer('侧切削角(°)') + thread_model = fields.Selection([('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型') + thread_num = fields.Char('每英寸螺纹数(TPI)', size=20) + blade_tip_height_tolerance = fields.Char('刀尖高度公差(mm)', size=20) + inscribed_circle_tolerance = fields.Char('内接圆公差(mm)', size=20) + thickness_tolerance = fields.Char('厚度公差(mm)', size=20) + # 刀杆参数 + height = fields.Char('高度(mm)', size=20) + blade_height = fields.Char('刃部高度(mm)', size=20) + cutter_arbor_diameter = fields.Char('刀杆直径(mm)', size=20) + min_machining_aperture = fields.Char('最小加工孔径(mm)', size=20) + install_blade_tip_num = fields.Char('可装刀片数/齿数(个)', size=20) + cutting_blade_model = fields.Char('切削类型', size=20) + cooling_hole = fields.Selection([('有', '有'), ('无', '无')], string='有无冷却孔') + locating_slot_code = fields.Char('定位槽代号', size=20) + installing_structure = fields.Char('安装结构', size=20) + blade_ids = fields.Many2many( + 'sf.cutting.tool.type', + relation='cutting_tool_type_library_pad_blade_rel', + column1='model_id_1', + column2='model_id_2', + domain="[('cutting_tool_material_id.name', '=', '刀片')]", + string='适配刀片型号' # 使用空列表作为默认值 + ) + tool_shim = fields.Char('适配刀垫型号', size=50) + cotter_pin = fields.Char('适配销钉型号', size=50) + pressing_plate = fields.Char('适配压板型号', size=50) + screw = fields.Char('适配螺钉型号', size=50) + spanner = fields.Char('适配扳手型号', size=50) + # 刀盘参数 + cutter_head_diameter = fields.Char('刀盘直径(mm)', size=20) + interface_diameter = fields.Char('接口直径(mm)', size=20) + # 刀柄参数 + flange_shank_length = fields.Char('法兰柄长(mm)', size=20) + handle_external_diameter = fields.Char('柄部外径(mm)', size=20) + handle_inside_diameter = fields.Char('柄部内径(mm)', size=20) + min_clamping_diameter = fields.Char('最小夹持直径(mm)', size=20) + max_clamping_diameter = fields.Char('最大夹持直径(mm)', size=20) + clamping_mode = fields.Char('夹持方式', size=20) + max_load_capacity = fields.Char('最大负载能力(kg)', size=20) + taper = fields.Integer('锥度(°)') + tool_changing_time = fields.Integer('换刀时间(s)') + standard_rotate_speed = fields.Char('标准转速(n/min)', size=20) + max_rotate_speed = fields.Char('最大转速(n/min)', size=20) + diameter_slip_accuracy = fields.Char('径跳精度(mm)', size=20) + cooling_model = fields.Char('冷却类型', size=20) + is_rough_machining = fields.Selection([('是', '是'), ('否', '否')], string='是否可粗加工') + is_finish_machining = fields.Selection([('是', '是'), ('否', '否')], string='是否可精加工') + is_quick_cutting = fields.Selection([('是', '是'), ('否', '否')], string='是否可高速切削') + is_drill_hole = fields.Selection([('是', '是'), ('否', '否')], string='是否可钻孔') + is_safe_lock = fields.Selection([('是', '是'), ('否', '否')], string='有无安全锁') + # 夹头参数 + er_size_model = fields.Char('ER尺寸型号', size=20) + outer_diameter = fields.Char('外径(mm)', size=20) + inner_diameter = fields.Char('内径(mm)', size=20) + run_out_accuracy = fields.Char('跳动精度(mm)', size=20) + top_diameter = fields.Char('顶部直径(mm)', size=20) + weight = fields.Char('重量(kg)', size=20) + clamping_length = fields.Char('夹持长度(mm)', size=20) + clamping_tolerance = fields.Char('夹持公差(mm)', size=20) + handle_ids = fields.Many2many( + 'sf.cutting.tool.type', + relation='cutting_tool_type_library_chuck_handle_rel', + column1='model_id_1', + column2='model_id_2', + domain="[('cutting_tool_material_id.name', '=', '刀柄')]", + string='适用刀柄型号' + ) - -class BladeTipCharacteristics(models.Model): - _name = 'sf.blade.tip.characteristics' - _description = '刀尖特征' - - name = fields.Char('名称') - image = fields.Image('图片') - - @api.model - def name_search(self, name='', args=None, operator='ilike', limit=100): - # 调用父类的name_search方法,获取原始的结果列表 - res = super().name_search(name, args, operator, limit) - # 定义一个空字典用来存储id和name的映射关系 - name_dict = {} - # 遍历结果列表,将id和name存入字典中 - for item in res: - id = item[0] - name = item[1] - name_dict[id] = name - # 根据id列表搜索符合条件的记录 - records = self.browse(name_dict.keys()) - # 定义一个新的结果列表用来存储修改后的结果 - new_res = [] - # 遍历每条记录 - for record in records: - # 获取记录的id,name和image属性 - id = record.id - name = name_dict[id] - image = record.image - # 如果image不为空,将其转换为data URI scheme - if image: - data_uri = f"data:image/png;base64,{image.decode('utf-8')}" - else: - data_uri = "" - # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result - new_res.append([id, name, data_uri]) - # 返回新的结果列表 - return new_res - - -class HandleType(models.Model): - _name = 'sf.handle.type' - _description = '柄部类型' - - name = fields.Char('名称') - image = fields.Image('图片') - - @api.model - def name_search(self, name='', args=None, operator='ilike', limit=100): - # 调用父类的name_search方法,获取原始的结果列表 - res = super().name_search(name, args, operator, limit) - # 定义一个空字典用来存储id和name的映射关系 - name_dict = {} - # 遍历结果列表,将id和name存入字典中 - for item in res: - id = item[0] - name = item[1] - name_dict[id] = name - # 根据id列表搜索符合条件的记录 - records = self.browse(name_dict.keys()) - # 定义一个新的结果列表用来存储修改后的结果 - new_res = [] - # 遍历每条记录 - for record in records: - # 获取记录的id,name和image属性 - id = record.id - name = name_dict[id] - image = record.image - # 如果image不为空,将其转换为data URI scheme - if image: - data_uri = f"data:image/png;base64,{image.decode('utf-8')}" - else: - data_uri = "" - # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result - new_res.append([id, name, data_uri]) - # 返回新的结果列表 - return new_res - - -class CuttingDirection(models.Model): - _name = 'sf.cutting.direction' - _description = '走刀方向' - - name = fields.Char('名称') - image = fields.Image('图片') - - @api.model - def name_search(self, name='', args=None, operator='ilike', limit=100): - # 调用父类的name_search方法,获取原始的结果列表 - res = super().name_search(name, args, operator, limit) - # 定义一个空字典用来存储id和name的映射关系 - name_dict = {} - # 遍历结果列表,将id和name存入字典中 - for item in res: - id = item[0] - name = item[1] - name_dict[id] = name - # 根据id列表搜索符合条件的记录 - records = self.browse(name_dict.keys()) - # 定义一个新的结果列表用来存储修改后的结果 - new_res = [] - # 遍历每条记录 - for record in records: - # 获取记录的id,name和image属性 - id = record.id - name = name_dict[id] - image = record.image - # 如果image不为空,将其转换为data URI scheme - if image: - data_uri = f"data:image/png;base64,{image.decode('utf-8')}" - else: - data_uri = "" - # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result - new_res.append([id, name, data_uri]) - # 返回新的结果列表 - return new_res - - -class SuitableCoolant(models.Model): - _name = 'sf.suitable.coolant' - _description = '适合冷却液' - - name = fields.Char('名称') - image = fields.Image('图片') - - @api.model - def name_search(self, name='', args=None, operator='ilike', limit=100): - # 调用父类的name_search方法,获取原始的结果列表 - res = super().name_search(name, args, operator, limit) - # 定义一个空字典用来存储id和name的映射关系 - name_dict = {} - # 遍历结果列表,将id和name存入字典中 - for item in res: - id = item[0] - name = item[1] - name_dict[id] = name - # 根据id列表搜索符合条件的记录 - records = self.browse(name_dict.keys()) - # 定义一个新的结果列表用来存储修改后的结果 - new_res = [] - # 遍历每条记录 - for record in records: - # 获取记录的id,name和image属性 - id = record.id - name = name_dict[id] - image = record.image - # 如果image不为空,将其转换为data URI scheme - if image: - data_uri = f"data:image/png;base64,{image.decode('utf-8')}" - else: - data_uri = "" - # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result - new_res.append([id, name, data_uri]) - # 返回新的结果列表 - return new_res + def _json_basic_param(self, obj): + basic_param_str = [0, '', { + 'code': obj['code'], + 'total_length': obj['total_length'], + 'blade_number': obj['blade_number'], + 'neck_diameter': obj['neck_diameter'], + 'neck_length': obj['neck_length'], + 'handle_diameter': obj['handle_diameter'], + 'handle_length': obj['handle_length'], + 'blade_tip_diameter': obj['blade_tip_diameter'], + 'blade_tip_working_size': obj['blade_tip_working_size'], + 'blade_tip_taper': obj['blade_tip_taper'], + 'blade_diameter': obj['blade_diameter'], + 'blade_length': obj['blade_length'], + 'blade_helix_angle': obj['blade_helix_angle'], + 'blade_width': obj['blade_width'], + 'blade_depth': obj['blade_depth'], + 'pitch': obj['pitch'], + 'cutting_depth': obj['cutting_depth'], + 'length': obj['length'], + 'thickness': obj['thickness'], + 'width': obj['width'], + 'cutting_blade_length': obj['cutting_blade_length'], + 'relief_angle': obj['relief_angle'], + 'blade_tip_circular_arc_radius': obj['blade_tip_circular_arc_radius'], + 'inscribed_circle_diameter': obj['inscribed_circle_diameter'], + 'install_aperture_diameter': obj['install_aperture_diameter'], + 'chip_breaker_groove': obj['chip_breaker_groove'], + 'blade_teeth_model': obj['bladed_teeth_model'], + 'blade_blade_number': obj['blade_blade_number'], + 'main_included_angle': obj['main_included_angle'], + 'top_angle': obj['top_angle'], + 'blade_tip_dip_angle': obj['blade_tip_dip_angle'], + 'side_cutting_edge_angle': obj['side_cutting_edge_angle'], + 'thread_model': obj['thread_model'], + 'thread_num': obj['thread_num'], + 'blade_tip_height_tolerance': obj['blade_tip_height_tolerance'], + 'inscribed_circle_tolerance': obj['inscribed_circle_tolerance'], + 'thickness_tolerance': obj['thickness_tolerance'], + 'height': obj['height'], + 'blade_height': obj['blade_height'], + 'cutter_arbor_diameter': obj['cutter_arbor_diameter'], + 'min_machining_aperture': obj['min_machining_aperture'], + 'install_blade_tip_num': obj['install_blade_tip_num'], + 'cutting_blade_model': obj['cutting_blade_model'], + 'cooling_hole': obj['cooling_hole'], + 'locating_slot_code': obj['locating_slot_code'], + 'installing_structure': obj['installing_structure'], + 'tool_shim': obj['tool_shim'], + 'cotter_pin': obj['cotter_pin'], + 'pressing_plate': obj['pressing_plate'], + 'screw': obj['screw'], + 'spanner': obj['spanner'], + 'cutter_head_diameter': obj['cutter_head_diameter'], + 'interface_diameter': obj['interface_diameter'], + 'flange_shank_length': obj['flange_shank_length'], + 'handle_external_diameter': obj['handle_external_diameter'], + 'handle_inside_diameter': obj['handle_inside_diameter'], + 'min_clamping_diameter': obj['min_clamping_diameter'], + 'max_clamping_diameter': obj['max_clamping_diameter'], + 'clamping_mode': obj['clamping_mode'], + 'max_load_capacity': obj['max_load_capacity'], + 'taper': obj['taper'], + 'tool_changing_time': obj['tool_changing_time'], + 'standard_rotate_speed': obj['standard_rotate_speed'], + 'max_rotate_speed': obj['max_rotate_speed'], + 'diameter_slip_accuracy': obj['diameter_slip_accuracy'], + 'cooling_model': obj['cooling_model'], + 'is_rough_machining': obj['is_rough_machining'], + 'is_finish_machining': obj['is_finish_machining'], + 'is_quick_cutting': obj['is_quick_cutting'], + 'is_drill_hole': obj['is_drill_hole'], + 'is_safe_lock': obj['is_safe_lock'], + 'er_size_model': obj['er_size_model'], + 'outer_diameter': obj['outer_diameter'], + 'inner_diameter': obj['inner_diameter'], + 'run_out_accuracy': obj['run_out_accuracy'], + 'top_diameter': obj['top_diameter'], + 'weight': obj['weight'], + 'clamping_length': obj['clamping_length'], + 'clamping_tolerance': obj['clamping_tolerance'], + 'handle_ids': obj['weight'], + 'blade_ids': obj['clamping_length'], + }] + return basic_param_str class CuttingSpeed(models.Model): _name = 'sf.cutting.speed' _description = '切削速度Vc' - # def _get_order(self): - # last_tool = self.search([], order='id desc', limit=1) - # if last_tool: - # last_order = int(last_tool.order) - # new_order = last_order + 1 - # else: - # new_order = '1' - # return new_order - # - # order = fields.Char('序', default=_get_order, readonly=True) - product_template_id = fields.Many2one('product.template', string='产品') - + standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') execution_standard_id = fields.Char('执行标准') material_code = fields.Char('材料代号') material_name = fields.Char('材料名称') material_grade = fields.Char('材料牌号') tensile_strength = fields.Float('拉伸强度 (N/mm²)') hardness = fields.Float('硬度(HRC)') - cutting_speed_n1 = fields.Char('径向切宽 ae=100%D1 ap=1*D1 切削速度Vc') cutting_speed_n2 = fields.Char('径向切宽 ae=50%D1 ap=1.5*D1 切削速度Vc') cutting_speed_n3 = fields.Char('径向切宽 ae=25%D1 ap=L1max 切削速度Vc') @@ -229,20 +230,52 @@ class CuttingSpeed(models.Model): precision_machining = fields.Char('精加工 Vc(m/min)') application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用') + def _json_cutting_speed(self, obj): + cutting_speed_str = [0, '', { + 'execution_standard_id': obj['execution_standard_id'], + 'material_code': obj['material_code'], + 'material_name': obj['material_name'], + 'material_grade': obj['material_grade'], + 'tensile_strength': obj['tensile_strength'], + 'hardness': obj['hardness'], + 'cutting_speed_n1': obj['cutting_speed_n1'], + 'cutting_speed_n2': obj['cutting_speed_n2'], + 'cutting_speed_n3': obj['cutting_speed_n3'], + 'cutting_speed_n4': obj['cutting_speed_n4'], + 'cutting_speed_n5': obj['cutting_speed_n5'], + 'rough_machining': obj['rough_machining'], + 'precision_machining': obj['precision_machining'], + 'application': obj['application'], + }] + return cutting_speed_str + class FeedPerTooth(models.Model): _name = 'sf.feed.per.tooth' _description = '每齿走刀量fz' product_template_id = fields.Many2one('product.template', string='产品') + standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') cutting_speed = fields.Char('径向切宽 ae(mm)') machining_method = fields.Selection([('直铣', '直铣'), ('坡铣', '坡铣')], string='加工方式') materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') - blade_diameter = fields.Float('刃部直径D1(mm)', readonly=True, related='product_template_id.cutting_tool_blade_diameter') + blade_diameter = fields.Float('刃部直径D1(mm)', readonly=True, + related='product_template_id.cutting_tool_blade_diameter') feed_per_tooth = fields.Char('每齿走刀量 (mm/z)') unit = fields.Char('单位', default='fz') + def _json_feed_per_tooth(self, obj): + feed_per_tooth_str = [0, '', { + 'cutting_speed': obj['cutting_speed'], + 'machining_method': obj['machining_method'], + 'materials_type_id': obj['materials_type_id'], + 'blade_diameter': obj['blade_diameter'], + 'feed_per_tooth': obj['feed_per_tooth'], + 'unit': obj['unit'], + }] + return feed_per_tooth_str + # @api.depends('product_template_id') # def _compute_product_template_id(self): # if self.product_template_id is not None: diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index 66de9496..dd7077d7 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -4,16 +4,7 @@ access_sf_model_type,sf_model_type,model_sf_model_type,base.group_user,1,1,1,1 access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,base.group_user,1,1,1,1 access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,base.group_user,1,1,1,1 access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,base.group_user,1,1,1,1 - access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1 - -access_sf_suitable_machining_method,sf_suitable_machining_method,model_sf_suitable_machining_method,base.group_user,1,1,1,1 -access_sf_blade_tip_characteristics,sf_blade_tip_characteristics,model_sf_blade_tip_characteristics,base.group_user,1,1,1,1 -access_sf_handle_type,sf_handle_type,model_sf_handle_type,base.group_user,1,1,1,1 -access_sf_cutting_direction,sf_cutting_direction,model_sf_cutting_direction,base.group_user,1,1,1,1 -access_sf_suitable_coolant,sf_suitable_coolant,model_sf_suitable_coolant,base.group_user,1,1,1,1 -access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1 -access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1 access_maintenance_equipment_tool,maintenance_equipment_tool,model_maintenance_equipment_tool,base.group_user,1,1,1,1 diff --git a/sf_manufacturing/views/tool_other_features_view.xml b/sf_manufacturing/views/tool_other_features_view.xml index 952f7bc8..63eafb44 100644 --- a/sf_manufacturing/views/tool_other_features_view.xml +++ b/sf_manufacturing/views/tool_other_features_view.xml @@ -1,178 +1,5 @@ - - - 适合加工方式 - sf.suitable.machining.method - - - - - - - - - - 适合加工方式 - sf.suitable.machining.method - -
- - - - - - -
-
-
- - - 适合加工方式 - ir.actions.act_window - sf.suitable.machining.method - tree,form - - - - - - 刀尖特征 - sf.blade.tip.characteristics - - - - - - - - - - 刀尖特征 - sf.blade.tip.characteristics - -
- - - - - - -
-
-
- - - 刀尖特征 - ir.actions.act_window - sf.blade.tip.characteristics - tree,form - - - - - - 柄部类型 - sf.handle.type - - - - - - - - - - 柄部类型 - sf.handle.type - -
- - - - - - -
-
-
- - - 柄部类型 - ir.actions.act_window - sf.handle.type - tree,form - - - - - - 走刀方向 - sf.cutting.direction - - - - - - - - - - 走刀方向 - sf.cutting.direction - -
- - - - - - -
-
-
- - - 走刀方向 - ir.actions.act_window - sf.cutting.direction - tree,form - - - - - - 适合冷却液 - sf.suitable.coolant - - - - - - - - - - 适合冷却液 - sf.suitable.coolant - -
- - - - -
-
-
- - - 适合冷却液 - ir.actions.act_window - sf.suitable.coolant - tree,form - - - 切削速度Vc @@ -215,7 +42,7 @@ - + diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index 14b3d9be..8aaefa83 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -1868,16 +1868,30 @@ class Cutting_tool_standard_library(models.Model): result = json.loads(r['result']) if result['status'] == 1: for item in result['cutting_tool_standard_library_all_list']: - cutting_tool_standard_library = self.search([("code", '=', item['code'])]) + cutting_tool_standard_library = self.search( + [("code", '=', item['code'].replace("JKM", result['factory_short_name']))]) cutting_tool_type = self.env['sf.cutting.tool.type'].search( [("code", '=', item['cutting_tool_type_code'])]) cutting_tool_material = self.env['sf.cutting.tool.material'].search( [("code", '=', item['cutting_tool_material_code'])]) materials_model = self.env['sf.materials.model'].search( - [("code", '=', item['materials_model_code'])]) + [("materials_no", '=', item['material_model_code'])]) brand = self.env['sf.machine.brand'].search([("code", '=', item['brand_code'])]) + basic_param_list = [] + for basic_param_item in item['basic_parameter']: + basic_param_list.append( + self.env['sf.tool.materials.basic.parameters']._json_basic_param(basic_param_item)) + cutting_speed_list = [] + for cutting_speed_item in item['cutting_speed']: + cutting_speed_list.append( + self.env['sf.cutting.speed']._json_cutting_speed(cutting_speed_item)) + feed_per_tooth_list = [] + for feed_per_tooth_item in item['basic_parameter']: + feed_per_tooth_list.append( + self.env['sf.feed.per.tooth']._json_feed_per_tooth(feed_per_tooth_item)) if not cutting_tool_standard_library: self.create({ + "code": item['code'].replace("JKM", result['factory_short_name']), "name": item['name'], "cutting_tool_material_id": cutting_tool_material.id, "cutting_tool_type_id": cutting_tool_type.id, @@ -1891,6 +1905,9 @@ class Cutting_tool_standard_library(models.Model): "integral_coarse_medium_fine": item['integral_coarse_medium_fine'], "integral_run_out_accuracy_max": item['integral_run_out_accuracy_max'], "integral_run_out_accuracy_min": item['integral_run_out_accuracy_min'], + "basic_parameters_ids": basic_param_list, + "cutting_speed_ids": cutting_speed_list, + "feed_per_tooth_ids": feed_per_tooth_list, "active": item['active'], }) else: @@ -1908,6 +1925,9 @@ class Cutting_tool_standard_library(models.Model): "integral_coarse_medium_fine": item['integral_coarse_medium_fine'], "integral_run_out_accuracy_max": item['integral_run_out_accuracy_max'], "integral_run_out_accuracy_min": item['integral_run_out_accuracy_min'], + "basic_parameters_ids": basic_param_list, + "cutting_speed_ids": cutting_speed_list, + "feed_per_tooth_ids": feed_per_tooth_list, "active": item['active'], } ) else: