Files
jikimo_sf/sf_tool_management/wizard/wizard.py

422 lines
23 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from odoo import fields, models, api
class ToolChangeRequirementInformation(models.TransientModel):
_name = 'sf.tool.change.requirement.information'
_description = '换刀需求信息'
# tool_change_to_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', string='机床换刀申请')
name = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True)
machine_tool_code = fields.Char(string='机台号', readonly=True)
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
functional_tool_code = fields.Char(string='功能刀具编码', readonly=True)
functional_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称', readonly=True)
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True)
replacement_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='待换功能刀具名称')
replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型',
readonly=True)
replacement_tool_coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')],
string='粗/中/精')
new_former = fields.Selection([('0', ''), ('1', '')], string='新/旧')
applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True)
used_tool_time = fields.Datetime(string='用刀时间')
reason_for_applying = fields.Char(string='申请原因')
remark = fields.Char(string='备注说明')
@api.onchange('replacement_tool_name_id')
def _onchange_replacement_tool_name_id(self):
for record in self:
if record:
record.replacement_tool_code = record.replacement_tool_name_id.code
record.replacement_tool_type_id = record.replacement_tool_name_id.mrs_cutting_tool_type_id.id
def tool_changing_apply(self):
"""
确认换刀申请(按键)
:return:
"""
# 将数据更新到机台换刀申请界面
record = self.env['sf.machine.table.tool.changing.apply'].search(
[('name', '=', self.name.id),
('machine_tool_code', '=', self.machine_tool_code),
('cutter_spacing_code', '=', self.cutter_spacing_code),
])
# 功能刀具组装创建新任务(new_assembly_task)
record_1 = self.env['sf.functional.tool.assembly'].sudo().create({
'functional_tool_code': self.replacement_tool_code,
'name': self.replacement_tool_name_id.id,
'functional_tool_type_id': self.replacement_tool_type_id.id,
'loading_task_source': '1',
'applicant': self.applicant,
'reason_for_applying': self.reason_for_applying,
'use_tool_time': self.used_tool_time,
'machine_tool_name_id': self.name.id,
'machine_tool_code': self.machine_tool_code,
'cutter_spacing_code': self.cutter_spacing_code,
'sf_machine_table_tool_changing_apply_id': record.id,
})
# 封装数据
desc = {
'name': self.name.id,
'machine_tool_code': self.machine_tool_code,
'cutter_spacing_code': self.cutter_spacing_code,
'replacement_tool_code': self.replacement_tool_code,
'replacement_tool_name_id': self.replacement_tool_name_id.id,
'replacement_tool_type_id': self.replacement_tool_type_id.id,
'replacement_tool_coarse_middle_thin': self.replacement_tool_coarse_middle_thin,
'new_former': self.new_former,
'applicant': self.applicant,
'used_tool_time': self.used_tool_time,
'reason_for_applying': self.reason_for_applying,
'remark': self.new_former,
'status': '1',
'sf_functional_tool_assembly_id': record_1.id,
}
record.write(desc)
# 关闭弹出窗口
return {'type': 'ir.actions.act_window_close'}
class ToolTransferRequestInformation(models.TransientModel):
_name = 'sf.tool.transfer.request.information'
_description = '刀具转移申请信息'
CNC_machine_table_id = fields.Many2one('sf.machine_tool', string='CNC机床', readonly=True)
machine_tool_code = fields.Char(string='机台号', readonly=True)
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
functional_tool_code = fields.Char(string='功能刀具编码', readonly=True)
functional_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称', readonly=True)
# todo 功能刀具类型为 Many2one
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
transfer_target = fields.Selection([('机台', '机台'),
('线边刀库', '线边刀库'),
('刀具房', '刀具房')], string='转移到:', default='线边刀库')
new_cnc_machine_table_id = fields.Many2one('sf.machine_tool', string='机床名称')
new_machine_tool_code = fields.Char(string='机床号')
new_cutter_spacing_code = fields.Char(string='刀位号')
magazine_tool_warehouse_district = fields.Char(string='库区')
magazine_tool_warehouse_position = fields.Char(string='库位')
tool_room_warehouse_district = fields.Char(string='库区')
tool_room_warehouse_position = fields.Char(string='库位')
def tool_transfer_apply(self):
"""
todo 刀具转移申请信息确定按钮
:return:
"""
self.env['sf.machine.table.tool.changing.apply'].search(
[('name', '=', self.CNC_machine_table_id.id)]).write({'status': '2'})
class FunctionalToolAssemblyOrder(models.TransientModel):
_name = 'sf.functional.tool.assembly.order'
_description = '功能刀具组装单'
# 功能刀具申请信息
machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True)
machine_tool_code = fields.Char(string='机台号', readonly=True)
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
code = fields.Char(string='功能刀具编码', readonly=True)
functional_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称', readonly=True)
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
functional_tool_length = fields.Char(string='功能刀具伸出长', readonly=True)
effective_length = fields.Char(string='有效长', readonly=True)
functional_tool_diameter = fields.Char(string='功能刀具直径', readonly=True)
tool_included_angle = fields.Char(string='刀尖角R角', readonly=True)
functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=True)
required_cutting_time = fields.Char(string='需切削时长', readonly=True)
whether_standard_tool = fields.Boolean(string='是否标准刀', readonly=True)
# 功能刀具组装信息
# 整体式刀具型号
mrs_cutting_tool_integral_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='整体式刀具型号', readonly=False, domain=
[('mrs_cutting_tool_material_name', '=', '整体式刀具')])
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)
# 刀片型号
mrs_cutting_tool_blade_model_ids = fields.Many2many('sf.cutting.tool.model', 'sf_functional_tool_assembly_order_id',
string='刀片型号', readonly=False, domain=
[('mrs_cutting_tool_material_name', '=', '刀片')])
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)
# 刀杆型号
mrs_cutting_tool_cutterbar_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='刀杆型号', readonly=False, domain=
[('mrs_cutting_tool_material_name', '=', '刀杆')])
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)
# 刀盘型号
mrs_cutting_tool_cutterpad_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='刀盘型号', readonly=False, domain=
[('mrs_cutting_tool_material_name', '=', '刀盘')])
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)
# 刀柄型号
mrs_cutting_tool_cutterhandle_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='刀柄型号', readonly=False, domain=
[('mrs_cutting_tool_material_name', '=', '刀柄')])
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)
# 夹头型号
mrs_cutting_tool_cutterhead_model_ids = fields.Many2many('sf.cutting.tool.model',
'sf_functional_tool_assembly_order_id',
string='夹头型号', readonly=False, domain=
[('mrs_cutting_tool_material_name', '=', '夹头')])
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)
coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')], string='粗/中/精', default='1')
tool_loading_length = fields.Char(string='装刀长')
new_former = fields.Selection([('0', ''), ('1', '')], string='新/旧', required=True, default='1')
reference_length = fields.Char(string='参考伸出长')
cut_time = fields.Char(string='已切削时间')
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.mrs_machine_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.mrs_machine_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.mrs_machine_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.mrs_machine_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.mrs_machine_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.mrs_machine_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,
'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,
'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,
'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,
'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,
'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,
'chuck_code': self.chuck_code,
'chuck_name': self.chuck_name,
'sf_tool_brand_id_6': self.sf_tool_brand_id_6,
'coarse_middle_thin': self.coarse_middle_thin,
'tool_loading_length': self.tool_loading_length,
'new_former': self.new_former,
'reference_length': self.reference_length,
'cut_time': self.cut_time,
'cut_length': self.cut_length,
'cut_number': self.cut_number,
'assemble_status': '1',
'tool_loading_person': self.env.user.name,
'tool_loading_time': fields.Datetime.now()
}
functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([
('machine_tool_name_id', '=', self.machine_tool_name_id.id),
('cutter_spacing_code', '=', self.cutter_spacing_code),
('assemble_status', '=', '0'),
])
print('功能刀具组装id',functional_tool_assembly.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,
'diameter': self.functional_tool_diameter,
'tool_grade': None,
'machining_accuracy': None,
'tool_length': self.tool_loading_length,
'blade_number': None,
'integral_blade_length': None,
'effective_blade_length': self.effective_length,
'max_life': None,
'is_standard': self.whether_standard_tool,
'applicable_range': None,
'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
})
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)
functional_tool_assembly.write(desc_1)
# 关闭弹出窗口
return {'type': 'ir.actions.act_window_close'}
class DeliveryOfCargoFromStorage(models.TransientModel):
_name = 'sf.delivery.of.cargo.from.storage'
_description = '出库'
order = fields.Integer(string='')
functional_tool_code = fields.Char(string='功能刀具编码')
name = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称')
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
production_line_name_id = fields.Many2one('sf.production.line', string='产线名称')
machine_tool_code = fields.Char(string='机台号')
receive_person = fields.Char(string='领用人')
receive_time = fields.Datetime(string='领用出库时间')
def stock_removal(self):
"""
出库
:return:
"""
vals = self.env['sf.delivery.of.cargo.from.storage'].search([])
if vals:
for val in vals:
# 删除功能刀具列表缓存的数据
self.env['sf.functional.cutting.tool.entity.cache'].search([
('code', '=', self.functional_tool_code)]).unlink()
record = self.env['sf.functional.tool.assembly'].search([
('functional_tool_code', '=', val.functional_tool_code),
('assemble_status', '=', '1')
])
# 判断装刀任务来源如果来源于CAM装刀则修改CAM装刀的计划执行状态
if record.loading_task_source == '0':
self.env['sf.cam.work.order.program.knife.plan'].search([
('functional_tool_code', '=', val.functional_tool_code),
('functional_tool_name_id', '=', val.name.id)
]).write({
'plan_execute_status': '2'
})
record.write({
'assemble_status': '2',
'receive_person': self.env.user.name,
'receive_time': fields.Datetime.now()
})