1、删除功能刀具缓存对象,删除出库弹窗对像,删除功能刀具组装、机台换刀申请和CAM换刀的界面跳转按钮,并在form界面添加管理界面字段;2、优化组装单编码的生成;3、将刀具管理下所以功能刀具相关的模型中的功能刀具名称字段改为绑定功能刀具产品对象,编码改为序列号并绑定产品序列号对象,4、优化刀具管理下的功能刀具界面,5、优化从组装申请到组装完成所以流程功能

This commit is contained in:
JIKIMO-YXH\xianghui
2023-10-31 17:45:45 +08:00
parent deccb6e3cd
commit d429a8b4b8
6 changed files with 202 additions and 368 deletions

View File

@@ -12,8 +12,10 @@ class FunctionalCuttingToolEntity(models.Model):
_name = 'sf.functional.cutting.tool.entity'
_description = '功能刀具列表'
code = fields.Char('编码')
name = fields.Char('名称', required=True, size=20)
# code = fields.Char('序列号')
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
name = fields.Char('名称', size=20)
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
mrs_cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', string='刀具型号')
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型',
group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True)
@@ -93,53 +95,6 @@ class FunctionalCuttingToolEntity(models.Model):
return [(6, 0, functional_tool_model_ids)]
class FunctionalCuttingToolEntityCache(models.Model):
_name = 'sf.functional.cutting.tool.entity.cache'
_description = '功能刀具列表缓存'
code = fields.Char('编码')
name = fields.Char('名称')
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
mrs_cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', string='刀具型号')
# 整体式刀具型号
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
domain=[('cutting_tool_material_id', '=', '整体式刀具')])
# 刀片型号
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
domain=[('cutting_tool_material_id', '=', '刀片')])
# 刀杆型号
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
domain=[('cutting_tool_material_id', '=', '刀杆')])
# 刀盘型号
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
domain=[('cutting_tool_material_id', '=', '刀盘')])
# 刀柄型号
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
domain=[('cutting_tool_material_id', '=', '刀柄')])
# 夹头型号
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
domain=[('cutting_tool_material_id', '=', '夹头')])
diameter = fields.Float('直径(mm)')
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
string='刀具等级')
machining_accuracy = fields.Float('加工精度(mm)')
tool_length = fields.Float('装刀长(mm)')
blade_number = fields.Integer('刃数')
integral_blade_length = fields.Float('整体刃长(mm)')
effective_blade_length = fields.Float('有效刃长(mm)')
max_life = fields.Float('最大寿命值')
is_standard = fields.Selection([('1', ''), ('0', '')], '是否标准刀')
applicable_range = fields.Char('适用范围')
image = fields.Binary('图片')
class FunctionalToolWarning(models.Model):
_name = 'sf.functional.tool.warning'
_description = '功能刀具预警'
@@ -147,8 +102,12 @@ class FunctionalToolWarning(models.Model):
functional_cutting_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', readonly=True)
functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True,
related='functional_cutting_tool_id.barcode_id')
name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name')
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True,
related='functional_cutting_tool_id.functional_tool_name_id')
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
related='functional_cutting_tool_id.mrs_cutting_tool_type_id')
@@ -261,8 +220,12 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
if record:
record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id
code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True,
related='functional_cutting_tool_id.barcode_id')
name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name')
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True,
related='functional_cutting_tool_id.functional_tool_name_id')
# mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
# related='functional_cutting_tool_id.mrs_cutting_tool_type_id')
@@ -371,8 +334,12 @@ class InboundAndOutboundRecordsOfFunctionalTools(models.Model):
if record:
record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id
code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True,
related='functional_cutting_tool_id.barcode_id')
name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name')
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True,
related='functional_cutting_tool_id.functional_tool_name_id')
# 整体式刀具型号
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
@@ -470,35 +437,28 @@ class MachineTableToolChangingApply(models.Model):
_name = 'sf.machine.table.tool.changing.apply'
_description = '机床换刀申请'
# apply_to_tool_change_ids = fields.One2many(
# 'sf.tool.change.requirement.information',
# 'tool_change_to_apply_id',
# string='换刀需求信息',
# attrs="{'invisible': 1}")
name = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False,
group_expand='_read_group_names')
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True,
compute='_compute_machine_table_type_id')
machine_tool_code = fields.Char(string='机台号', invisible=True, readonly=True, compute='_compute_machine_tool_code')
machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True)
cutter_spacing_code = fields.Char(string='刀位号', readonly=False, required=True)
@api.depends('name')
def _compute_machine_table_type_id(self):
for record in self:
if record:
record.machine_table_type_id = record.name.category_id.id
@api.depends('name')
def _compute_machine_tool_code(self):
for record in self:
if record:
record.machine_tool_code = record.name.code
else:
record.machine_table_type_id = None
record.machine_tool_code = None
cutter_spacing_code = fields.Char(string='刀位', readonly=False)
functional_tool_code = fields.Char(string='功能刀具编码', readonly=True, compute='_compute_functional_tool_name_id')
functional_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称', readonly=False)
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
compute='_compute_functional_tool_name_id')
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列',
domain=[('product_id.name', '=', '功能刀具')])
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称',
domain=[('name', '=', '功能刀具')])
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
diameter = fields.Char(string='直径(mm)', readonly=False)
coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')], string='粗/中/精', readonly=False)
@@ -510,8 +470,9 @@ class MachineTableToolChangingApply(models.Model):
functional_tool_status = fields.Selection([('正常', '正常'), ('异常', '异常')], string='功能刀具状态',
default='正常', readonly=False)
replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True)
replacement_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='待换功能刀具名称', readonly=True)
# replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True)
assembly_order_code = fields.Char(string='组装单编码', readonly=True)
replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称', readonly=True)
replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型',
readonly=True)
replacement_tool_coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')],
@@ -522,22 +483,15 @@ class MachineTableToolChangingApply(models.Model):
reason_for_applying = fields.Char(string='申请原因', readonly=True)
remark = fields.Char(string='备注说明', readonly=False)
status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移')], string='操作状态', default='0')
status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')], string='操作状态', default='0')
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装')
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
@api.model
def _read_group_names(self, categories, domain, order):
names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
return categories.browse(names)
@api.depends('functional_tool_name_id')
def _compute_functional_tool_name_id(self):
for record in self:
if record:
record.functional_tool_code = record.functional_tool_name_id.code
record.functional_tool_type_id = record.functional_tool_name_id.mrs_cutting_tool_type_id.id
@api.onchange('functional_tool_status')
def automation_apply_for_tool_change(self):
"""
@@ -549,7 +503,6 @@ class MachineTableToolChangingApply(models.Model):
if self.functional_tool_status == '异常':
self.env['sf.machine.table.tool.changing.apply'].search([
('name', '=', self.name.id)]).write({
'replacement_tool_code': self.functional_tool_code,
'replacement_tool_name_id': self.functional_tool_name_id.id,
'replacement_tool_type_id': self.functional_tool_type_id.id,
'replacement_tool_coarse_middle_thin': self.coarse_middle_thin,
@@ -563,7 +516,6 @@ class MachineTableToolChangingApply(models.Model):
# 新建组装任务
self.env['sf.functional.tool.assembly'].create({
'functional_tool_code': self.functional_tool_code,
'name': self.functional_tool_name_id,
'functional_tool_type_id': self.functional_tool_type_id.id,
'functional_tool_diameter': self.diameter,
@@ -596,12 +548,11 @@ class MachineTableToolChangingApply(models.Model):
"""
# 撤回功能刀具组装创建的任务
self.env['sf.functional.tool.assembly'].search(
[('functional_tool_code', '=', self.replacement_tool_code),
[('assembly_order_code', '=', self.assembly_order_code),
('loading_task_source', '=', '1')]).unlink()
# 撤回数据更新
self.env['sf.machine.table.tool.changing.apply'].search([('name', '=', self.name.id)]).write({
'replacement_tool_code': None,
'replacement_tool_name_id': None,
'replacement_tool_type_id': None,
'replacement_tool_coarse_middle_thin': None,
@@ -624,16 +575,6 @@ class MachineTableToolChangingApply(models.Model):
'status': '0'
})
def open_sf_functional_tool_assembly(self):
"""
跳转到功能刀具组装界面按键功能
:return:
"""
action = self.env.ref('sf_tool_management.sf_functional_tool_assembly_view_act')
result = action.read()[0]
result['domain'] = [('sf_machine_table_tool_changing_apply_id', '=', self.id)]
return result
class CAMWorkOrderProgramKnifePlan(models.Model):
_name = 'sf.cam.work.order.program.knife.plan'
@@ -642,8 +583,10 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
name = fields.Char(string='工单任务编号', readonly=False)
cam_procedure_code = fields.Char(string='CAM程序编号', readonly=False)
cam_cutter_spacing_code = fields.Char(string='CAM刀位号', readonly=False)
functional_tool_code = fields.Char(string='功能刀具编码', readonly=False)
functional_tool_name_id = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称', readonly=False)
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号',
domain=[('product_id.name', '=', '功能刀具')])
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称',
domain=[('name', '=', '功能刀具')])
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=False)
machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=False,
group_expand='_read_group_machine_table_name_ids')
@@ -671,7 +614,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
reason_for_applying = fields.Char(string='申请原因', readonly=False)
remark = fields.Char(string='备注说明', readonly=False)
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装')
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
def apply_for_tooling(self):
"""
@@ -679,7 +622,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
:return:
"""
record = self.env['sf.functional.tool.assembly'].create({
'functional_tool_code': self.functional_tool_code,
'barcode_id': self.barcode_id.id,
'name': self.functional_tool_name_id.id,
'functional_tool_type_id': self.functional_tool_type_id.id,
'functional_tool_diameter': self.diameter,
@@ -699,7 +642,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
# 将计划执行状态改为执行中
self.env['sf.cam.work.order.program.knife.plan'].search(
[('functional_tool_code', '=', self.functional_tool_code)]).write({
[('barcode_id', '=', self.barcode_id.id)]).write({
'plan_execute_status': '1',
'applicant': self.env.user.name})
@@ -709,26 +652,17 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
:return:
"""
self.env['sf.functional.tool.assembly'].search(
[('functional_tool_code', '=', self.functional_tool_code),
[('barcode_id', '=', self.barcode_id.id),
('loading_task_source', '=', '0')]).unlink()
# 将计划执行状态改为待执行,同时清除申请人、功能刀具组装字段数据
self.env['sf.cam.work.order.program.knife.plan'].search(
[('functional_tool_code', '=', self.functional_tool_code)]).write({
[('barcode_id', '=', self.barcode_id.id)]).write({
'plan_execute_status': '0',
'applicant': None,
'sf_functional_tool_assembly_id': None,
})
def open_sf_functional_tool_assembly(self):
"""
跳转到功能刀具组装界面按键功能
:return:
"""
action = self.env.ref('sf_tool_management.sf_functional_tool_assembly_view_act')
result = action.read()[0]
result['domain'] = [('sf_cam_work_order_program_knife_plan_id', '=', self.id)]
return result
class FunctionalToolAssembly(models.Model):
@@ -736,10 +670,10 @@ class FunctionalToolAssembly(models.Model):
_description = '功能刀具组装单'
_order = 'use_tool_time asc'
assembly_order_code = fields.Char(string='编码', compute='_get_code', readonly=True)
functional_tool_code = fields.Char(string='功能刀具编码', invisible=True)
assembly_order_code = fields.Char(string='编码', readonly=True)
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
name = fields.Many2one('sf.functional.cutting.tool', string='功能刀具名称', readonly=True)
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
name = fields.Char( string='功能刀具名称', readonly=True)
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
group_expand='_read_group_functional_tool_type_ids')
@@ -869,33 +803,33 @@ class FunctionalToolAssembly(models.Model):
remark = fields.Char(string='备注说明', readonly=True)
check_box_1 = fields.Boolean(string='复选框', default=False, readonly=False)
sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请')
sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请', readonly=True)
sf_cam_work_order_program_knife_plan_id = fields.Many2one('sf.cam.work.order.program.knife.plan',
'CAM工单程序用刀计划')
'CAM工单程序用刀计划', readonly=True, )
@api.depends('loading_task_source')
def _get_code(self):
def _get_code(self, loading_task_source):
"""
自动生成组装单编码
"""
for record in self:
new_time = str(fields.Date.today())
datetime = new_time[2:4] + new_time[5:7] + new_time[-2:]
functional_tool_assembly = record.env['sf.functional.tool.assembly'].sudo().search(
[('loading_task_source', '=', record.loading_task_source),
('assembly_order_code', 'like', new_time)], limit=1, order="id desc")
print(functional_tool_assembly)
if not functional_tool_assembly:
num = "%03d" % 1
else:
m = int(functional_tool_assembly.name[-3:]) + 1
num = "%03d" % m
if record.loading_task_source == '0':
record.assembly_order_code = 'CAMZZD' + datetime + str(num)
if record.loading_task_source == '1':
record.assembly_order_code = 'JTZZD' + datetime + str(num)
if record.loading_task_source == '2':
record.assembly_order_code = 'MTSZZD' + datetime + str(num)
new_time = str(fields.Date.today())
datetime = new_time[2:4] + new_time[5:7] + new_time[-2:]
functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().search(
[('loading_task_source', '=', loading_task_source),
('assembly_order_code', 'ilike', datetime)], limit=1, order="id desc")
if not functional_tool_assembly:
num = "%03d" % 1
else:
m = int(functional_tool_assembly.assembly_order_code[-3:]) + 1
num = "%03d" % m
if loading_task_source == '0':
code = 'CAMZZD' + datetime + str(num)
elif loading_task_source == '1':
code = 'JTZZD' + datetime + str(num)
elif loading_task_source == '2':
code = 'MTSZZD' + datetime + str(num)
else:
code = False
return code
def automated_assembly(self):
"""
@@ -914,3 +848,12 @@ class FunctionalToolAssembly(models.Model):
todo 组装单打印
:return:
"""
@api.model_create_multi
def create(self, vals):
obj = super(FunctionalToolAssembly, self).create(vals)
if obj.loading_task_source:
code = self._get_code(obj.loading_task_source)
obj.assembly_order_code = code
obj.name = code
return obj