2.夹具型号注册到cloud:夹具型号的Tree和form视图去掉不可增删改操作,页面新增时编码根据夹具物料回显不同的编码;新增注册按钮及对应的注册接口 3.功能夹具注册到cloud:.功能夹具的Tree和form视图去掉不可增删改操作,页面新增时编码和名称根据功能夹具类型和对应的托盘型号所进行回显
358 lines
22 KiB
Python
358 lines
22 KiB
Python
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', '品牌')
|
|
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)
|
|
|
|
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_id = 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='外包商')
|