1、刀具管理模块下的功能刀具内的刀具物料字段类型从many2many更改为many2one,绑定对象从刀具型号更改为刀具物料;2、对功能刀具组装的组装功能和取消组装功能进行了逻辑优化;3、新增功能刀具组装弹窗对象的刀具物料信息根据所选功能刀具字段计算功能;4、关闭了功能刀具列表、预警、实时分布、出入库记录的创建、修改、删除功能;5、功能刀具列表对象新增刀具能力参数;6、优化了刀具管理模块的权限相关警告;

This commit is contained in:
yuxianghui
2023-09-19 16:14:29 +08:00
parent 0ac82acbad
commit d4180df7e9
7 changed files with 699 additions and 724 deletions

View File

@@ -1,4 +1,5 @@
from odoo import fields, models, api
from odoo.exceptions import ValidationError
class ToolChangeRequirementInformation(models.TransientModel):
@@ -136,54 +137,196 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
# 功能刀具组装信息
# 整体式刀具型号
mrs_cutting_tool_integral_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='整体式刀具', readonly=False, domain=
[('cutting_tool_type', '=', '整体式刀具')])
integral_code = fields.Char('整体式刀具序列号', readonly=True,
compute='_compute_mrs_cutting_tool_integral_model_ids')
integral_name = fields.Char('整体式刀具名称', readonly=True)
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', '整体式刀具品牌', readonly=True)
cutting_tool_integral_model_id = fields.Many2one('sf.tool.material.search', string='整体式刀具型号', readonly=False,
domain=[('cutting_tool_type', '=', '整体式刀具')])
integral_code = fields.Char('整体式刀具序列', readonly=True, compute='_compute_integral_code')
integral_name = fields.Char('整体式刀具名称', readonly=True, compute='_compute_integral_name')
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', '整体式刀具品牌', readonly=True,
compute='_compute_sf_tool_brand_id_1')
@api.depends('cutting_tool_integral_model_id')
def _compute_integral_code(self):
for record in self:
if record.cutting_tool_integral_model_id:
self.integral_code = record.cutting_tool_integral_model_id.code
else:
self.integral_code = None
@api.depends('cutting_tool_integral_model_id')
def _compute_integral_name(self):
for record in self:
if record.cutting_tool_integral_model_id:
self.integral_name = record.cutting_tool_integral_model_id.name
else:
self.integral_name = None
@api.depends('cutting_tool_integral_model_id')
def _compute_sf_tool_brand_id_1(self):
for record in self:
if record.cutting_tool_integral_model_id:
self.sf_tool_brand_id_1 = record.cutting_tool_integral_model_id.mrs_machine_brand_id.id
else:
self.sf_tool_brand_id_1 = None
# 刀片型号
mrs_cutting_tool_blade_model_ids = fields.Many2many('sf.cutting.tool.model', 'sf_functional_tool_assembly_order_id',
string='刀片型号', readonly=False, domain=
[('cutting_tool_type', '=', '刀片')])
blade_code = fields.Char('刀片序列号', readonly=True, compute='_compute_mrs_cutting_tool_blade_model_ids')
blade_name = fields.Char('刀片名称', readonly=True)
sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', readonly=True)
cutting_tool_blade_model_id = fields.Many2one('sf.tool.material.search', string='刀片型号', readonly=False,
domain=[('cutting_tool_type', '=', '刀片')])
blade_code = fields.Char('刀片序列号', readonly=True, compute='_compute_blade_code')
blade_name = fields.Char('刀片名称', readonly=True, compute='_compute_blade_name')
sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', readonly=True,
compute='_compute_sf_tool_brand_id_2')
@api.depends('cutting_tool_blade_model_id')
def _compute_blade_code(self):
for record in self:
if record.cutting_tool_blade_model_id:
self.blade_code = self.cutting_tool_blade_model_id.code
else:
self.blade_code = None
@api.depends('cutting_tool_blade_model_id')
def _compute_blade_name(self):
for record in self:
if record.cutting_tool_blade_model_id:
self.blade_name = self.cutting_tool_blade_model_id.name
else:
self.blade_name = None
@api.depends('cutting_tool_blade_model_id')
def _compute_sf_tool_brand_id_2(self):
for record in self:
if record.cutting_tool_blade_model_id:
self.sf_tool_brand_id_2 = self.cutting_tool_blade_model_id.mrs_machine_brand_id.id
else:
self.sf_tool_brand_id_2 = None
# 刀杆型号
mrs_cutting_tool_cutterbar_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='刀杆', readonly=False, domain=
[('cutting_tool_type', '=', '刀杆')])
bar_code = fields.Char('刀杆序列号', readonly=True, compute='_compute_mrs_cutting_tool_cutterbar_model_ids')
bar_name = fields.Char('刀杆名称', readonly=True)
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True)
cutting_tool_cutterbar_model_id = fields.Many2one('sf.tool.material.search', string='刀杆型号', readonly=False,
domain=[('cutting_tool_type', '=', '刀杆')])
bar_code = fields.Char('刀杆序列', readonly=True, compute='_compute_bar_code')
bar_name = fields.Char('刀杆名称', readonly=True, compute='_compute_bar_name')
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True,
compute='_compute_sf_tool_brand_id_3')
@api.depends('cutting_tool_cutterbar_model_id')
def _compute_bar_code(self):
for record in self:
if record.cutting_tool_cutterbar_model_id:
self.bar_code = self.cutting_tool_cutterbar_model_id.code
else:
self.bar_code = None
@api.depends('cutting_tool_cutterbar_model_id')
def _compute_bar_name(self):
for record in self:
if record.cutting_tool_cutterbar_model_id:
self.bar_name = self.cutting_tool_cutterbar_model_id.name
else:
self.bar_name = None
@api.depends('cutting_tool_cutterbar_model_id')
def _compute_sf_tool_brand_id_3(self):
for record in self:
if record.cutting_tool_cutterbar_model_id:
self.sf_tool_brand_id_3 = self.cutting_tool_cutterbar_model_id.mrs_machine_brand_id.id
else:
self.sf_tool_brand_id_3 = None
# 刀盘型号
mrs_cutting_tool_cutterpad_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='刀盘', readonly=False, domain=
[('cutting_tool_type', '=', '刀盘')])
pad_code = fields.Char('刀盘序列号', readonly=True, compute='_compute_mrs_cutting_tool_cutterpad_model_ids')
pad_name = fields.Char('刀盘名称', readonly=True)
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True)
cutting_tool_cutterpad_model_id = fields.Many2one('sf.tool.material.search', string='刀盘型号', readonly=False,
domain=[('cutting_tool_type', '=', '刀盘')])
pad_code = fields.Char('刀盘序列', readonly=True, compute='_compute_pad_code')
pad_name = fields.Char('刀盘名称', readonly=True, compute='_compute_pad_name')
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True,
compute='_compute_sf_tool_brand_id_4')
@api.depends('cutting_tool_cutterpad_model_id')
def _compute_pad_code(self):
for record in self:
if record.cutting_tool_cutterpad_model_id:
self.pad_code = self.cutting_tool_cutterpad_model_id.code
else:
self.pad_code = None
@api.depends('cutting_tool_cutterpad_model_id')
def _compute_pad_name(self):
for record in self:
if record.cutting_tool_cutterpad_model_id:
self.pad_name = self.cutting_tool_cutterpad_model_id.name
else:
self.pad_name = None
@api.depends('cutting_tool_cutterpad_model_id')
def _compute_sf_tool_brand_id_4(self):
for record in self:
if record.cutting_tool_cutterpad_model_id:
self.sf_tool_brand_id_4 = self.cutting_tool_cutterpad_model_id.mrs_machine_brand_id.id
else:
self.sf_tool_brand_id_4 = None
# 刀柄型号
mrs_cutting_tool_cutterhandle_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='刀柄', readonly=False, domain=
[('cutting_tool_type', '=', '刀柄')])
handle_code = fields.Char('刀柄序列号', readonly=True, compute='_compute_mrs_cutting_tool_cutterhandle_model_ids')
handle_name = fields.Char('刀柄名称', readonly=True)
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True)
cutting_tool_cutterhandle_model_id = fields.Many2one('sf.tool.material.search', string='刀柄型号', readonly=False,
domain=[('cutting_tool_type', '=', '刀柄')])
handle_code = fields.Char('刀柄序列', readonly=True, compute='_compute_handle_code')
handle_name = fields.Char('刀柄名称', readonly=True, compute='_compute_handle_name')
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True,
compute='_compute_sf_tool_brand_id_5')
@api.depends('cutting_tool_cutterhandle_model_id')
def _compute_handle_code(self):
for record in self:
if record.cutting_tool_cutterhandle_model_id:
self.handle_code = self.cutting_tool_cutterhandle_model_id.code
else:
self.handle_code = None
@api.depends('cutting_tool_cutterhandle_model_id')
def _compute_handle_name(self):
for record in self:
if record.cutting_tool_cutterhandle_model_id:
self.handle_name = self.cutting_tool_cutterhandle_model_id.name
else:
self.handle_name = None
@api.depends('cutting_tool_cutterhandle_model_id')
def _compute_sf_tool_brand_id_5(self):
for record in self:
if record.cutting_tool_cutterhandle_model_id:
self.sf_tool_brand_id_5 = self.cutting_tool_cutterhandle_model_id.mrs_machine_brand_id.id
else:
self.sf_tool_brand_id_5 = None
# 夹头型号
mrs_cutting_tool_cutterhead_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='夹头', readonly=False, domain=
[('cutting_tool_type', '=', '夹头')])
chuck_code = fields.Char('夹头序列号', readonly=True, compute='_compute_mrs_cutting_tool_cutterhead_model_ids')
chuck_name = fields.Char('夹头名称', readonly=True)
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True)
cutting_tool_cutterhead_model_id = fields.Many2one('sf.tool.material.search', string='夹头型号', readonly=False,
domain=[('cutting_tool_type', '=', '夹头')])
chuck_code = fields.Char('夹头序列', readonly=True, compute='_compute_chuck_code')
chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_chuck_name')
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True,
compute='_compute_sf_tool_brand_id_6')
@api.depends('cutting_tool_cutterhead_model_id')
def _compute_chuck_code(self):
for record in self:
if record.cutting_tool_cutterhead_model_id:
self.chuck_code = self.cutting_tool_cutterhead_model_id.code
else:
self.chuck_code = None
@api.depends('cutting_tool_cutterhead_model_id')
def _compute_chuck_name(self):
for record in self:
if record.cutting_tool_cutterhead_model_id:
self.chuck_name = self.cutting_tool_cutterhead_model_id.name
else:
self.chuck_name = None
@api.depends('cutting_tool_cutterhead_model_id')
def _compute_sf_tool_brand_id_6(self):
for record in self:
if record.cutting_tool_cutterhead_model_id:
self.sf_tool_brand_id_6 = self.cutting_tool_cutterhead_model_id.mrs_machine_brand_id.id
else:
self.sf_tool_brand_id_6 = None
coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')], string='粗/中/精', default='1')
tool_loading_length = fields.Char(string='装刀长')
@@ -193,93 +336,33 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
cut_length = fields.Char(string='已切削长度')
cut_number = fields.Char(string='已切削次数')
@api.depends('mrs_cutting_tool_integral_model_ids')
def _compute_mrs_cutting_tool_integral_model_ids(self):
if not self.mrs_cutting_tool_integral_model_ids:
self.integral_code = None
for val in self.mrs_cutting_tool_integral_model_ids:
if val:
self.integral_code = val.code
self.integral_name = val.name
self.sf_tool_brand_id_1 = val.brand_id.id
@api.depends('mrs_cutting_tool_blade_model_ids')
def _compute_mrs_cutting_tool_blade_model_ids(self):
if not self.mrs_cutting_tool_blade_model_ids:
self.blade_code = None
for val in self.mrs_cutting_tool_blade_model_ids:
if val:
self.blade_code = val.code
self.blade_name = val.name
self.sf_tool_brand_id_2 = val.brand_id.id
@api.depends('mrs_cutting_tool_cutterbar_model_ids')
def _compute_mrs_cutting_tool_cutterbar_model_ids(self):
if not self.mrs_cutting_tool_cutterbar_model_ids:
self.bar_code = None
for val in self.mrs_cutting_tool_cutterbar_model_ids:
if val:
self.bar_code = val.code
self.bar_name = val.name
self.sf_tool_brand_id_3 = val.brand_id.id
@api.depends('mrs_cutting_tool_cutterpad_model_ids')
def _compute_mrs_cutting_tool_cutterpad_model_ids(self):
if not self.mrs_cutting_tool_cutterpad_model_ids:
self.pad_code = None
for val in self.mrs_cutting_tool_cutterpad_model_ids:
if val:
self.pad_code = val.code
self.pad_name = val.name
self.sf_tool_brand_id_4 = val.brand_id.id
@api.depends('mrs_cutting_tool_cutterhandle_model_ids')
def _compute_mrs_cutting_tool_cutterhandle_model_ids(self):
if not self.mrs_cutting_tool_cutterhandle_model_ids:
self.handle_code = None
for val in self.mrs_cutting_tool_cutterhandle_model_ids:
if val:
self.handle_code = val.code
self.handle_name = val.name
self.sf_tool_brand_id_5 = val.brand_id.id
@api.depends('mrs_cutting_tool_cutterhead_model_ids')
def _compute_mrs_cutting_tool_cutterhead_model_ids(self):
if not self.mrs_cutting_tool_cutterhead_model_ids:
self.chuck_code = None
for val in self.mrs_cutting_tool_cutterhead_model_ids:
if val:
self.chuck_code = val.code
self.chuck_name = val.name
self.sf_tool_brand_id_6 = val.brand_id.id
def functional_tool_assembly(self):
"""
功能刀具组装
:return:
"""
desc_1 = {
'mrs_cutting_tool_integral_model_ids': self.mrs_cutting_tool_integral_model_ids.ids,
'cutting_tool_integral_model_id': self.cutting_tool_integral_model_id.id,
'integral_code': self.integral_code,
'integral_name': self.integral_name,
'sf_tool_brand_id_1': self.sf_tool_brand_id_1,
'mrs_cutting_tool_blade_model_ids': self.mrs_cutting_tool_blade_model_ids.ids,
'cutting_tool_blade_model_id': self.cutting_tool_blade_model_id.id,
'blade_code': self.blade_code,
'blade_name': self.blade_name,
'sf_tool_brand_id_2': self.sf_tool_brand_id_2,
'mrs_cutting_tool_cutterbar_model_ids': self.mrs_cutting_tool_cutterbar_model_ids.ids,
'cutting_tool_cutterbar_model_id': self.cutting_tool_cutterbar_model_id.id,
'bar_code': self.bar_code,
'bar_name': self.bar_name,
'sf_tool_brand_id_3': self.sf_tool_brand_id_3,
'mrs_cutting_tool_cutterpad_model_ids': self.mrs_cutting_tool_cutterpad_model_ids.ids,
'cutting_tool_cutterpad_model_id': self.cutting_tool_cutterpad_model_id.id,
'pad_code': self.pad_code,
'pad_name': self.pad_name,
'sf_tool_brand_id_4': self.sf_tool_brand_id_4,
'mrs_cutting_tool_cutterhandle_model_ids': self.mrs_cutting_tool_cutterhandle_model_ids.ids,
'cutting_tool_cutterhandle_model_id': self.cutting_tool_cutterhandle_model_id.id,
'handle_code': self.handle_code,
'handle_name': self.handle_name,
'sf_tool_brand_id_5': self.sf_tool_brand_id_5,
'mrs_cutting_tool_cutterhead_model_ids': self.mrs_cutting_tool_cutterhead_model_ids.ids,
'cutting_tool_cutterhead_model_id': self.cutting_tool_cutterhead_model_id.id,
'chuck_code': self.chuck_code,
'chuck_name': self.chuck_name,
'sf_tool_brand_id_6': self.sf_tool_brand_id_6,
@@ -300,19 +383,20 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
('assemble_status', '=', '0'),
])
print('功能刀具组装id',functional_tool_assembly.id)
# print('功能刀具组装id', functional_tool_assembly.id)
# print('整体式物料信息:', self.cutting_tool_integral_model_id.id)
# 封装功能刀具数据
desc_2 = {
'code': self.code,
'name': self.functional_tool_name_id.name,
'mrs_cutting_tool_type_id': self.functional_tool_type_id.id,
'mrs_cutting_tool_integral_model_ids': self.mrs_cutting_tool_integral_model_ids.ids,
'mrs_cutting_tool_blade_model_ids': self.mrs_cutting_tool_blade_model_ids.ids,
'mrs_cutting_tool_cutterbar_model_ids': self.mrs_cutting_tool_cutterbar_model_ids.ids,
'mrs_cutting_tool_cutterpad_model_ids': self.mrs_cutting_tool_cutterpad_model_ids.ids,
'mrs_cutting_tool_cutterhandle_model_ids': self.mrs_cutting_tool_cutterhandle_model_ids.ids,
'mrs_cutting_tool_cutterhead_model_ids': self.mrs_cutting_tool_cutterhead_model_ids.ids,
'cutting_tool_integral_model_id': self.cutting_tool_integral_model_id.id,
'cutting_tool_blade_model_id': self.cutting_tool_blade_model_id.id,
'cutting_tool_cutterbar_model_id': self.cutting_tool_cutterbar_model_id.id,
'cutting_tool_cutterpad_model_id': self.cutting_tool_cutterpad_model_id.id,
'cutting_tool_cutterhandle_model_id': self.cutting_tool_cutterhandle_model_id.id,
'cutting_tool_cutterhead_model_id': self.cutting_tool_cutterhead_model_id.id,
'diameter': self.functional_tool_diameter,
'tool_grade': None,
'machining_accuracy': None,
@@ -326,50 +410,59 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
'image': None,
}
if self.new_former == '0':
# 如果是新刀,则创建功能刀具列表、功能刀具预警、功能刀具实时分布
record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2)
self.env['sf.functional.tool.warning'].create({
'functional_cutting_tool_id': record_1.id,
'functional_tool_assembly_id': functional_tool_assembly.id,
'machine_table_name_id': self.machine_tool_name_id.id,
})
self.env['sf.real.time.distribution.of.functional.tools'].create({
'functional_cutting_tool_id': record_1.id
})
self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({
'functional_cutting_tool_id': record_1.id
})
record = self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)])
if record:
raise ValidationError("该编码的功能刀具已存在!")
else:
# 如果是新刀,则创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录
record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2)
self.env['sf.functional.tool.warning'].create({
'functional_cutting_tool_id': record_1.id,
'functional_tool_assembly_id': functional_tool_assembly.id,
'machine_table_name_id': self.machine_tool_name_id.id,
})
self.env['sf.real.time.distribution.of.functional.tools'].create({
'functional_cutting_tool_id': record_1.id
})
self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({
'functional_cutting_tool_id': record_1.id
})
else:
record = self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)])
# 创建功能刀具缓存信息
self.env['sf.functional.cutting.tool.entity.cache'].create({
'code': record.code,
'name': record.name,
'mrs_cutting_tool_type_id': record.mrs_cutting_tool_type_id.id,
'mrs_cutting_tool_model_id': record.mrs_cutting_tool_model_id.id,
'mrs_cutting_tool_integral_model_ids': record.mrs_cutting_tool_integral_model_ids.ids,
'mrs_cutting_tool_blade_model_ids': record.mrs_cutting_tool_blade_model_ids.ids,
'mrs_cutting_tool_cutterbar_model_ids': record.mrs_cutting_tool_cutterbar_model_ids.ids,
'mrs_cutting_tool_cutterpad_model_ids': record.mrs_cutting_tool_cutterpad_model_ids.ids,
'mrs_cutting_tool_cutterhandle_model_ids': record.mrs_cutting_tool_cutterhandle_model_ids.ids,
'mrs_cutting_tool_cutterhead_model_ids': record.mrs_cutting_tool_cutterhead_model_ids.ids,
'diameter': record.diameter,
'tool_grade': record.tool_grade,
'machining_accuracy': record.machining_accuracy,
'tool_length': record.tool_length,
'blade_number': record.blade_number,
'integral_blade_length': record.integral_blade_length,
'effective_blade_length': record.effective_blade_length,
'max_life': record.max_life,
'is_standard': record.is_standard,
'applicable_range': record.applicable_range,
'image': record.image,
})
# 删除功能刀具列表信息
self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)]).unlink()
# 创建功能刀具列表信息
self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)]).create(desc_2)
if not record:
raise ValidationError("该编码的功能刀具不存在!!!")
else:
# 创建功能刀具缓存信息
record1 = self.env['sf.functional.cutting.tool.entity.cache'].create({
'code': record.code,
'name': record.name,
'mrs_cutting_tool_type_id': record.mrs_cutting_tool_type_id.id,
'mrs_cutting_tool_model_id': record.mrs_cutting_tool_model_id.id,
'cutting_tool_integral_model_id': record.cutting_tool_integral_model_id.id,
'cutting_tool_blade_model_id': record.cutting_tool_blade_model_id.id,
'cutting_tool_cutterbar_model_id': record.cutting_tool_cutterbar_model_id.id,
'cutting_tool_cutterpad_model_id': record.cutting_tool_cutterpad_model_id.id,
'cutting_tool_cutterhandle_model_id': record.cutting_tool_cutterhandle_model_id.id,
'cutting_tool_cutterhead_model_id': record.cutting_tool_cutterhead_model_id.id,
'diameter': record.diameter,
'tool_grade': record.tool_grade,
'machining_accuracy': record.machining_accuracy,
'tool_length': record.tool_length,
'blade_number': record.blade_number,
'integral_blade_length': record.integral_blade_length,
'effective_blade_length': record.effective_blade_length,
'max_life': record.max_life,
'is_standard': record.is_standard,
'applicable_range': record.applicable_range,
'image': record.image,
})
# # 删除功能刀具列表信息
# self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)]).unlink()
# # 创建功能刀具列表信息
# self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)]).create(desc_2)
# 修改功能刀具列表信息
self.env['sf.functional.cutting.tool.entity'].search([('code', '=', self.code)]).write(desc_2)
# 修改功能刀具组装信息
functional_tool_assembly.write(desc_1)
# 关闭弹出窗口
return {'type': 'ir.actions.act_window_close'}