from odoo import models, fields, api class ResProductMo(models.Model): _inherit = 'product.template' model_file = fields.Binary('模型文件') categ_type = fields.Selection( [("成品", "成品"), ("坯料", "坯料"), ("原材料", "原材料"), ("表面工艺", "表面工艺"), ("刀具", "刀具"), ("夹具", "夹具")], string='产品的类别', related='categ_id.type', store=True) model_name = fields.Char('模型名称') model_long = fields.Float('模型长(mm)', digits=(16, 3)) model_width = fields.Float('模型宽(mm)', digits=(16, 3)) model_height = fields.Float('模型高(mm)', digits=(16, 3)) model_volume = fields.Float('模型体积(m³)') model_machining_precision = fields.Selection([ ('0.10', '±0.10mm'), ('0.05', '±0.05mm'), ('0.03', '±0.03mm'), ('0.02', '±0.02mm'), ('0.01', '±0.01mm')], string='加工精度') model_processing_panel = fields.Char('模型加工面板') model_remark = fields.Char('模型备注说明') length = fields.Float('长(mm)', digits=(16, 3)) width = fields.Float('宽(mm)', digits=(16, 3)) height = fields.Float('高(mm)', digits=(16, 3)) single_manufacturing = fields.Boolean(string="单个制造") model_code = fields.Char('模型编码') is_bfm = fields.Boolean('业务平台是否自动创建', default=False) upload_model_file = fields.Many2many('ir.attachment', 'upload_model_file_attachment_ref', string='上传模型文件') product_model_type_id = fields.Many2one('sf.model.type', string='产品模型类型') embryo_model_type_id = fields.Many2one('sf.model.type', string='坯料模型类型') materials_id = fields.Many2one('sf.production.materials', string='材料') materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') server_product_process_parameters_id = fields.Many2one('sf.production.process.parameter', string='表面工艺参数(服务产品)') model_process_parameters_ids = fields.Many2many('sf.production.process.parameter', 'process_parameter_rel', string='表面工艺参数') cutting_tool_material_id = fields.Many2one('sf.cutting.tool.material', string='刀具物料') cutting_tool_type = fields.Char(string="刀具物料类型", related='cutting_tool_material_id.name', store=True) cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', string='型号', ) brand_id = fields.Many2one('sf.machine.brand', '品牌') manufacturer_model_number = fields.Char('厂家型号') tool_length = fields.Integer('长度L(mm)', size=6) tool_width = fields.Integer('宽度D(mm)', size=6) tool_height = fields.Integer('高度T(mm)', size=6) tool_weight = fields.Float('重量(kg)', size=4) # 整体式刀具参数 cutting_tool_total_length = fields.Float('总长度(mm)') cutting_tool_shank_length = fields.Float('柄部长度(mm)') cutting_tool_blade_length = fields.Float('刃部长度(mm)') cutting_tool_diameter = fields.Float('直径(mm)') cutting_tool_blade_number = fields.Integer('刃数') cutting_tool_front_angle = fields.Float('前角(°)') cutting_tool_rear_angle = fields.Float('后角(°)') cutting_tool_main_included_angle = fields.Float('主偏角(°)') cutting_tool_material_model_id = fields.Many2one('sf.materials.model', '材料型号') cutting_tool_nut = fields.Float('配对螺母(mm)') # 适用夹头型号可以多选 cutting_tool_chuck_model_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_handle_chuck_rel', column1='model_id_1', column2='model_id_2', domain="[('mrs_cutting_tool_material_id.name', '=', '夹头')]", string='适用夹头型号') cutting_tool_scope = fields.Char('适用范围') # 刀片参数 cutting_tool_top_angle = fields.Float('顶角(°)') cutting_tool_r_angle = fields.Float('R角(°)') cutting_tool_working_hardness = fields.Char('加工硬度') cutting_tool_cutter_bar_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_blade_cutter_bar_rel', column1='model_id_1', column2='model_id_2', domain="[('mrs_cutting_tool_material_id.name', '=', '刀杆')]", string='适用刀杆型号' ) cutting_tool_cutter_pad_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_blade_cutter_pad_rel', column1='model_id_1', column2='model_id_2', domain="[('mrs_cutting_tool_material_id.name', '=', '刀盘')]", string='适用刀盘型号' # 使用空列表作为默认值 ) cutting_tool_radius = fields.Float('刀尖半径(mm)') # 刀杆/刀盘参数 cutting_tool_c_diameter = fields.Float('C柄径(mm)') cutting_tool_l_total_length = fields.Float('L总长(mm)') cutting_tool_d_diameter = fields.Float('D刃径(mm)') cutting_tool_blade_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_pad_blade_rel', column1='model_id_1', column2='model_id_2', domain="[('mrs_cutting_tool_material_id.name', '=', '刀片')]", string='适用刀片型号' # 使用空列表作为默认值 ) cutting_tool_wrench = fields.Float('配对扳手(mm)') cutting_tool_screw = fields.Float('配备螺丝(mm)') cutting_tool_accuracy_level = fields.Char('精度等级') cutting_tool_rounded_corner = fields.Float('刀尖圆角半径(mm)') cutting_tool_hardness = fields.Char('硬度(°)') # 刀柄参数 cutting_tool_handle_length = fields.Float('L(mm)') cutting_tool_length1 = fields.Float('L1(mm)') cutting_tool_diameter1 = fields.Float('D1(mm)') cutting_tool_body_accuracy = fields.Float('本体精度(mm)') cutting_tool_clamping_range = fields.Float('夹持范围(mm)') cutting_tool_detection_accuracy = fields.Float('检测精度') cutting_tool_detection_hardness = fields.Float('检测硬度') cutting_tool_standard_speed = fields.Float('标准转速') # 夹头参数 cutting_tool_accuracy = fields.Float('精度(mm)') cutting_tool_outer_diameter = fields.Float('外径(mm)') cutting_tool_inner_diameter = fields.Float('内径(mm)') cutting_tool_handle_model_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_chuck_handle_rel', column1='model_id_1', column2='model_id_2', domain="[('mrs_cutting_tool_material_id.name', '=', '刀柄')]", string='适用刀柄型号' ) cutting_tool_feature = fields.Char('特性') # 夹具参数 fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料") fixture_model_id = fields.Many2one('sf.fixture.model', string="夹具型号") fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name') fixture_multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型") fixture_clamping_way = fields.Char(string="装夹方式") fixture_port_type = fields.Char(string="接口类型") fixture_model_file = fields.Binary(string="3D模型图") fixture_clamp_workpiece_length_max = fields.Integer(string="夹持工件长度MAX(mm)", size=6) fixture_clamp_workpiece_width_max = fields.Integer(string="夹持工件宽度MAX(mm)", size=6) fixture_clamp_workpiece_height_max = fields.Integer(string="夹持工件高度MAX(mm)", size=6) fixture_clamp_workpiece_diameter_max = fields.Float(string="夹持工件直径MAX(mm)", digits=(16, 6)) fixture_maximum_carrying_weight = fields.Float(string="最大承载重量(kg)", digits=(16, 4)) fixture_maximum_clamping_force = fields.Integer(string="最大夹持力(n)", size=8) fixture_driving_way = fields.Char(string="驱动方式") fixture_apply_machine_tool_type_ids = fields.Many2many('sf.machine_tool.type', 'rel_product_machine_tool_type', string="适用机床型号") fixture_through_hole_size = fields.Integer(string="过孔大小(mm)", size=6) fixture_screw_size = fields.Integer(string="螺牙大小(mm)", size=6) # 注册状态 register_state = fields.Selection([('未注册', '未注册'), ('已注册', '已注册'),('注册失败','注册失败')], string='注册状态', default='未注册') industry_code = fields.Char('行业编码', readonly=True) @api.onchange('brand_id') def _onchange_brand_id(self): if self.brand_id: self.manufacturer_model_number = self.brand_id.manufacturer_model_number def _json_apply_machine_tool_type_item_code(self, item): code_arr = [] for i in item.product_id.fixture_apply_machine_tool_type_ids: code_arr.append(i.code) return code_arr def _get_ids(self, param): type_ids = [] if not param: return [] for item in param: type_ids.append(item.id) return [(6, 0, type_ids)] @api.onchange('categ_id') def _onchange_categ_id(self): if self.categ_type in ('刀具', '夹具'): self.invoice_policy = 'delivery' self.detailed_type = 'product' self.sale_ok = False @api.onchange('cutting_tool_material_id') def _onchange_cutting_tool_material_id(self): for item in self: if item.cutting_tool_material_id.id != item.cutting_tool_model_id.mrs_cutting_tool_material_id.id: item.cutting_tool_model_id = False @api.onchange('fixture_material_id') def _onchange_fixture_material_id(self): for item in self: if item.fixture_material_id.id != item.fixture_model_id.fixture_material_id.id: item.fixture_model_id = False @api.onchange('fixture_model_id') def _onchange_fixture_model_id(self): for item in self: if self.fixture_material_type in ['气动托盘', '转接板(锁板)托盘', '磁吸托盘', '虎钳托盘', '零点卡盘']: item.brand_id = item.fixture_model_id.brand_id.id item.fixture_multi_mounting_type_id = item.fixture_model_id.multi_mounting_type_id.id item.fixture_model_file = item.fixture_model_id.model_file item.tool_length = item.fixture_model_id.length item.tool_width = item.fixture_model_id.width item.tool_height = item.fixture_model_id.height item.tool_weight = item.fixture_model_id.weight item.materials_type_id = item.fixture_model_id.materials_model_id.id item.fixture_maximum_carrying_weight = item.fixture_model_id.maximum_carrying_weight item.fixture_maximum_clamping_force = item.fixture_model_id.maximum_clamping_force if self.fixture_material_type in ['零点卡盘', '转接板(锁板)托盘']: item.fixture_clamping_way = item.fixture_model_id.clamping_way item.fixture_port_type = item.fixture_model_id.port_type if self.fixture_material_type in ['气动托盘', '转接板(锁板)托盘', '磁吸托盘']: item.fixture_driving_way = item.fixture_model_id.driving_way if self.fixture_material_type in ['气动托盘', '磁吸托盘', '虎钳托盘', '零点卡盘']: item.fixture_through_hole_size = item.fixture_model_id.through_hole_size item.fixture_screw_size = item.fixture_model_id.screw_size if self.fixture_material_type in ['气动托盘', '转接板(锁板)托盘', '磁吸托盘', '虎钳托盘']: item.fixture_clamp_workpiece_length_max = item.fixture_model_id.clamp_workpiece_length_max item.fixture_clamp_workpiece_width_max = item.fixture_model_id.clamp_workpiece_width_max item.fixture_clamp_workpiece_height_max = item.fixture_model_id.clamp_workpiece_height_max item.fixture_clamp_workpiece_diameter_max = item.fixture_model_id.clamp_workpiece_diameter_max item.fixture_apply_machine_tool_type_ids = self._get_ids(item.fixture_model_id.apply_machine_tool_type_ids) @api.onchange('cutting_tool_model_id') def _onchange_cutting_tool_model_id(self): for item in self: if self.cutting_tool_type == '整体式刀具': item.brand_id = item.cutting_tool_model_id.mrs_machine_brand_id.id item.cutting_tool_total_length = item.cutting_tool_model_id.integral_total_length item.cutting_tool_shank_length = item.cutting_tool_model_id.integral_shank_length item.cutting_tool_blade_length = item.cutting_tool_model_id.integral_blade_length item.cutting_tool_diameter = item.cutting_tool_model_id.integral_diameter item.cutting_tool_nut = item.cutting_tool_model_id.integral_nut item.cutting_tool_blade_number = item.cutting_tool_model_id.integral_blade_number item.cutting_tool_material_model_id = item.cutting_tool_model_id.mrs_materials_model_id.id item.cutting_tool_front_angle = item.cutting_tool_model_id.integral_front_angle item.cutting_tool_rear_angle = item.cutting_tool_model_id.integral_rear_angle item.cutting_tool_main_included_angle = item.cutting_tool_model_id.integral_main_included_angle item.cutting_tool_chuck_model_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_handle_chuck_model_ids) item.cutting_tool_scope = item.cutting_tool_model_id.integral_scope item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image elif self.cutting_tool_type == '刀片': item.brand_id = item.cutting_tool_model_id.mrs_machine_brand_id.id item.cutting_tool_top_angle = item.cutting_tool_model_id.blade_top_angle item.cutting_tool_front_angle = item.cutting_tool_model_id.blade_front_angle item.cutting_tool_rear_angle = item.cutting_tool_model_id.blade_rear_angle item.cutting_tool_main_included_angle = item.cutting_tool_model_id.blade_main_included_angle item.cutting_tool_r_angle = item.cutting_tool_model_id.blade_r_angle item.cutting_tool_working_hardness = item.cutting_tool_model_id.blade_hardness item.cutting_tool_material_model_id = item.cutting_tool_model_id.mrs_materials_model_id.id item.tool_length = item.cutting_tool_model_id.blade_length item.tool_width = item.cutting_tool_model_id.blade_width item.tool_height = item.cutting_tool_model_id.blade_height item.cutting_tool_radius = item.cutting_tool_model_id.blade_radius item.cutting_tool_nut = item.cutting_tool_model_id.blade_nut item.cutting_tool_cutter_bar_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_blade_cutter_bar_ids) item.cutting_tool_cutter_pad_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_blade_cutter_pad_ids) item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image elif self.cutting_tool_type == '刀杆': item.brand_id = item.cutting_tool_model_id.mrs_machine_brand_id.id item.cutting_tool_c_diameter = item.cutting_tool_model_id.bar_c_diameter item.cutting_tool_d_diameter = item.cutting_tool_model_id.bar_d_diameter item.cutting_tool_l_total_length = item.cutting_tool_model_id.bar_total_length item.cutting_tool_wrench = item.cutting_tool_model_id.bar_wrench item.cutting_tool_screw = item.cutting_tool_model_id.bar_screw item.cutting_tool_blade_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_pad_blade_ids) item.cutting_tool_scope = item.cutting_tool_model_id.bar_scope item.cutting_tool_material_model_id = item.cutting_tool_model_id.mrs_materials_model_id.id item.cutting_tool_rounded_corner = item.cutting_tool_model_id.bar_radius item.cutting_tool_accuracy_level = item.cutting_tool_model_id.bar_accuracy item.cutting_tool_blade_number = item.cutting_tool_model_id.bar_blade_number item.cutting_tool_hardness = item.cutting_tool_model_id.bar_hardness item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image elif self.cutting_tool_type == '刀盘': item.brand_id = item.cutting_tool_model_id.mrs_machine_brand_id.id item.cutting_tool_c_diameter = item.cutting_tool_model_id.pad_c_diameter item.cutting_tool_d_diameter = item.cutting_tool_model_id.pad_d_diameter item.cutting_tool_l_total_length = item.cutting_tool_model_id.pad_total_length item.cutting_tool_wrench = item.cutting_tool_model_id.pad_wrench item.cutting_tool_screw = item.cutting_tool_model_id.pad_screw item.cutting_tool_blade_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_pad_blade_ids) item.cutting_tool_scope = item.cutting_tool_model_id.pad_scope item.cutting_tool_material_model_id = item.cutting_tool_model_id.mrs_materials_model_id.id item.cutting_tool_rounded_corner = item.cutting_tool_model_id.pad_radius item.cutting_tool_accuracy_level = item.cutting_tool_model_id.pad_accuracy item.cutting_tool_blade_number = item.cutting_tool_model_id.pad_blade_number item.cutting_tool_hardness = item.cutting_tool_model_id.pad_hardness item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image elif self.cutting_tool_type == '刀柄': item.brand_id = item.cutting_tool_model_id.mrs_machine_brand_id.id item.cutting_tool_handle_length = item.cutting_tool_model_id.handle_length item.cutting_tool_length1 = item.cutting_tool_model_id.handle_length item.cutting_tool_diameter1 = item.cutting_tool_model_id.handle_diameter item.cutting_tool_body_accuracy = item.cutting_tool_model_id.handle_body_accuracy item.cutting_tool_nut = item.cutting_tool_model_id.handle_nut item.cutting_tool_clamping_range = item.cutting_tool_model_id.handle_clamping_range item.tool_weight = item.cutting_tool_model_id.handle_weight item.cutting_tool_material_model_id = item.cutting_tool_model_id.mrs_materials_model_id.id item.cutting_tool_chuck_model_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_handle_chuck_model_ids) item.cutting_tool_detection_accuracy = item.cutting_tool_model_id.handle_detection_accuracy item.cutting_tool_detection_hardness = item.cutting_tool_model_id.handle_detection_hardness item.cutting_tool_standard_speed = item.cutting_tool_model_id.handle_standard_speed item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image elif self.cutting_tool_type == '夹头': item.brand_id = item.cutting_tool_model_id.mrs_machine_brand_id.id item.cutting_tool_outer_diameter = item.cutting_tool_model_id.chuck_diameter item.cutting_tool_inner_diameter = item.cutting_tool_model_id.chuck_inner_diameter item.cutting_tool_accuracy = item.cutting_tool_model_id.chuck_accuracy item.cutting_tool_nut = item.cutting_tool_model_id.chuck_nut item.cutting_tool_clamping_range = item.cutting_tool_model_id.chuck_clamping_range item.cutting_tool_handle_model_ids = self._get_ids( item.cutting_tool_model_id.mrs_cutting_tool_model_chuck_handle_model_ids) item.cutting_tool_material_model_id = item.cutting_tool_model_id.mrs_materials_model_id.id item.tool_height = item.cutting_tool_model_id.chuck_height item.cutting_tool_feature = item.cutting_tool_model_id.chuck_feature item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image else: item.brand_id = False item.cutting_tool_total_length = False item.cutting_tool_shank_length = False item.cutting_tool_blade_length = False item.cutting_tool_diameter = False item.cutting_tool_nut = False item.cutting_tool_blade_number = False item.cutting_tool_material_model_id = False item.cutting_tool_front_angle = False item.cutting_tool_rear_angle = False item.cutting_tool_main_included_angle = False item.cutting_tool_chuck_model_ids = False item.cutting_tool_scope = False item.cutting_tool_top_angle = False item.cutting_tool_r_angle = False item.cutting_tool_working_hardness = False item.tool_length = False item.tool_width = False item.tool_height = False item.cutting_tool_radius = False item.cutting_tool_cutter_bar_ids = False item.cutting_tool_cutter_pad_ids = False item.cutting_tool_c_diameter = False item.cutting_tool_d_diameter = False item.cutting_tool_l_total_length = False item.cutting_tool_wrench = False item.cutting_tool_screw = False item.cutting_tool_blade_ids = False item.cutting_tool_rounded_corner = False item.cutting_tool_accuracy_level = False item.cutting_tool_hardness = False item.cutting_tool_handle_length = False item.cutting_tool_length1 = False item.cutting_tool_diameter1 = False item.cutting_tool_body_accuracy = False item.cutting_tool_clamping_range = False item.tool_weight = False item.cutting_tool_detection_accuracy = False item.cutting_tool_detection_hardness = False item.cutting_tool_standard_speed = False item.image_1920 = False class ResMrpBomMo(models.Model): _inherit = 'mrp.bom' subcontractor_id = fields.Many2one('res.partner', string='外包商')