From 894d3b9ea30777b8bba85f83a079eb3fc95c3d79 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Mon, 12 Aug 2024 17:25:56 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7?=
=?UTF-8?q?=E6=8B=86=E8=A7=A3=E5=8D=95=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E5=88=80=E5=85=B7=E5=94=AF=E4=B8=80=E6=A0=A1=E9=AA=8C=EF=BC=9B?=
=?UTF-8?q?2=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E6=A8=A1?=
=?UTF-8?q?=E5=9E=8Btree=E8=A7=86=E5=9B=BE=E7=9A=84=E7=8A=B6=E6=80=81?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=A0=B9=E6=8D=AE=E4=B8=8D=E5=90=8C=E7=8A=B6?=
=?UTF-8?q?=E6=80=81=E6=B7=BB=E5=8A=A0=E4=B8=8D=E5=90=8C=E9=A2=9C=E8=89=B2?=
=?UTF-8?q?=EF=BC=9B=E5=BD=93=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E7=8A=B6?=
=?UTF-8?q?=E6=80=81=E4=B8=BA=E6=8A=A5=E8=AD=A6=E6=97=B6=EF=BC=8C=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E5=88=9B=E5=BB=BA=E6=8B=86=E8=A7=A3=E5=8D=95=E5=92=8C?=
=?UTF-8?q?=E9=A2=84=E8=AD=A6=E8=AE=B0=E5=BD=95=EF=BC=8C=E5=B9=B6=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E6=8B=86=E8=A7=A3=E5=8D=95=E9=93=BE=E6=8E=A5=E6=8C=89?=
=?UTF-8?q?=E9=92=AE=EF=BC=9B=E6=B7=BB=E5=8A=A0tree=E8=A7=86=E5=9B=BE?=
=?UTF-8?q?=E6=8C=89=E7=8A=B6=E6=80=81=E6=8E=92=E5=BA=8F=EF=BC=8C=E5=B0=86?=
=?UTF-8?q?=E6=8A=A5=E8=AD=A6=E7=8A=B6=E6=80=81=E5=88=80=E5=85=B7=E8=AE=B0?=
=?UTF-8?q?=E5=BD=95=E6=98=BE=E7=A4=BA=E5=9C=A8=E6=9C=80=E5=89=8D=E9=9D=A2?=
=?UTF-8?q?=EF=BC=9B3=E3=80=81=E4=BC=98=E5=8C=96=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E5=88=80=E5=85=B7=E9=A2=84=E8=AD=A6=E6=A8=A1=E5=9E=8B=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5=E5=8F=8A=E5=85=B3=E8=81=94=E5=85=B3=E7=B3=BB=EF=BC=8C?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=84=E8=AD=A6=E8=AE=B0=E5=BD=95=E8=B7=B3?=
=?UTF-8?q?=E8=BD=AC=E5=88=B0=E5=AF=B9=E5=BA=94=E7=94=B1=E8=AF=A5=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E5=88=80=E5=85=B7=E7=94=9F=E6=88=90=E7=9A=84=E6=8B=86?=
=?UTF-8?q?=E8=A7=A3=E5=8D=95=E9=93=BE=E6=8E=A5=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_tool_management/models/base.py | 19 +++-
sf_tool_management/models/functional_tool.py | 91 ++++++++++++++-----
.../views/functional_tool_views.xml | 21 ++++-
sf_tool_management/views/tool_base_views.xml | 2 +-
4 files changed, 103 insertions(+), 30 deletions(-)
diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py
index e756899b..fd9e6f29 100644
--- a/sf_tool_management/models/base.py
+++ b/sf_tool_management/models/base.py
@@ -760,6 +760,15 @@ class FunctionalToolDismantle(models.Model):
functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', required=True, tracking=True,
domain=[('functional_tool_status', '!=', '已拆除'),
('current_location', '=', '刀具房')])
+
+ @api.onchange('functional_tool_id')
+ def _onchange_functional_tool_id(self):
+ for item in self:
+ if item:
+ dismantle_id = self.search([('functional_tool_id', '=', item.functional_tool_id.id)])
+ if dismantle_id:
+ raise ValidationError(f'Rfid为【{item.rfid}】的功能刀具已经存在拆解单,单号是【{dismantle_id[0].code}】')
+
tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True,
compute='_compute_functional_tool_num')
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', compute='_compute_functional_tool_num', store=True)
@@ -942,11 +951,13 @@ class FunctionalToolDismantle(models.Model):
logging.info('%s刀具确认开始拆解' % self.dismantle_cause)
code = self.code
if self.functional_tool_id.functional_tool_status == '已拆除':
- raise ValidationError('Rfid为【%s】的功能刀具已经拆解,请勿重复操作!' % self.functional_tool_id.rfid_dismantle)
+ raise ValidationError('Rfid为【%s】名称为【%s】的功能刀具已经拆解,请勿重复操作!' % (
+ self.functional_tool_id.rfid_dismantle, self.name))
# 对拆解的功能刀具进行校验,只有在刀具房的功能刀具才能拆解
- if self.functional_tool_id.tool_room_num == 0:
- raise ValidationError('Rfid为【%s】的功能刀具当前位置为【%s】,不能进行拆解!' % (
- self.rfid, self.functional_tool_id.current_location))
+ elif self.functional_tool_id.functional_tool_status != '报警':
+ if self.functional_tool_id.tool_room_num == 0:
+ raise ValidationError('Rfid为【%s】的功能刀具当前位置为【%s】,不能进行拆解!' % (
+ self.rfid, self.functional_tool_id.current_location))
# 目标重复校验
self.location_duplicate_check()
datas = {'scrap': [], 'picking': []}
diff --git a/sf_tool_management/models/functional_tool.py b/sf_tool_management/models/functional_tool.py
index 2c677e60..c48cf2ac 100644
--- a/sf_tool_management/models/functional_tool.py
+++ b/sf_tool_management/models/functional_tool.py
@@ -11,6 +11,7 @@ from odoo.exceptions import ValidationError
class FunctionalCuttingToolEntity(models.Model):
_name = 'sf.functional.cutting.tool.entity'
_description = '功能刀具列表'
+ _order = 'functional_tool_status'
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具组装单', readonly=True)
@@ -40,7 +41,7 @@ class FunctionalCuttingToolEntity(models.Model):
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
used_value = fields.Integer(string='已使用值(min)', readonly=True)
- functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')],
+ functional_tool_status = fields.Selection([('报警', '报警'), ('正常', '正常'), ('已拆除', '已拆除')],
string='状态', store=True, default='正常')
current_location_id = fields.Many2one('stock.location', string='当前位置', compute='_compute_current_location_id',
store=True)
@@ -60,13 +61,14 @@ class FunctionalCuttingToolEntity(models.Model):
if item.functional_tool_status == '报警':
# 创建报警刀具拆解单
self.env['sf.functional.tool.dismantle'].sudo().create({
- 'functional_tool_id': item.id,
+ 'functional_tool_id': item.ids[0],
'dismantle_cause': '寿命到期报废'
})
# 创建刀具报警记录
- # self.env['sf.functional.tool.warning'].sudo().create({
- # ''
- # })
+ self.env['sf.functional.tool.warning'].sudo().create({
+ 'rfid': item.rfid,
+ 'functional_tool_id': item.ids[0]
+ })
@api.depends('barcode_id.quant_ids', 'barcode_id.quant_ids.location_id', 'functional_tool_status',
'current_shelf_location_id')
@@ -253,10 +255,30 @@ class FunctionalCuttingToolEntity(models.Model):
functional_tool_model_ids.append(functional_tool_model.id)
return [(6, 0, functional_tool_model_ids)]
+ def open_functional_tool_dismantle_form(self):
+ self.ensure_one()
+ dismantle_ids = self.env['sf.functional.tool.dismantle'].sudo().search([('functional_tool_id', '=', self.id)])
+ action = {
+ 'res_model': 'sf.functional.tool.dismantle',
+ 'type': 'ir.actions.act_window',
+ 'name': '拆解单',
+ }
+ if len(dismantle_ids) == 1:
+ action.update({
+ 'view_mode': 'form',
+ 'res_id': dismantle_ids[0].id,
+ })
+ else:
+ action.update({
+ 'domain': [('id', 'in', dismantle_ids.ids)],
+ 'view_mode': 'tree,form',
+ })
+ return action
+
def open_functional_tool_warning(self):
action = self.env.ref('sf_tool_management.action_sf_functional_tool_warning')
result = action.read()[0]
- result['domain'] = [('functional_tool_name_id', '=', self.functional_tool_name_id.id)]
+ result['domain'] = [('functional_tool_id', '=', self.id)]
return result
def open_stock_move_line(self):
@@ -338,10 +360,10 @@ class FunctionalToolWarning(models.Model):
_name = 'sf.functional.tool.warning'
_description = '功能刀具预警'
- code = fields.Char('编码', related='functional_tool_name_id.code')
- rfid = fields.Char('Rfid')
- tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_name_id.tool_groups_id')
- name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_name_id.name')
+ code = fields.Char('编码', related='functional_tool_id.code')
+ rfid = fields.Char('Rfid', readonly=True)
+ tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_id.tool_groups_id')
+ name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_id.name')
# 机床信息
production_line_id = fields.Many2one('sf.production.line', string='生产线',
group_expand='_read_group_machine_table_name_ids')
@@ -352,30 +374,55 @@ class FunctionalToolWarning(models.Model):
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号',
domain="[('equipment_id', '=', maintenance_equipment_id)]")
# 功能刀具信息
- functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
- barcode_id = fields.Many2one('stock.lot', string='序列号', related='functional_tool_name_id.barcode_id')
- mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
- diameter = fields.Float(string='刀具直径(mm)')
- knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
+ functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', string='功能刀具', readonly=True)
+ barcode_id = fields.Many2one('stock.lot', string='序列号', related='functional_tool_id.barcode_id')
+ mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型',
+ related='functional_tool_id.sf_cutting_tool_type_id')
+ diameter = fields.Float(string='刀具直径(mm)', related='functional_tool_id.functional_tool_diameter')
+ knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', related='functional_tool_id.knife_tip_r_angle')
# 其他信息
install_tool_time = fields.Datetime("刀具组装时间", related='functional_tool_name_id.tool_loading_time')
on_board_time = fields.Datetime('上机装刀时间')
- max_lifetime_value = fields.Integer(string='最大寿命值(min)')
- alarm_value = fields.Integer(string='报警值(min)')
- used_value = fields.Integer(string='已使用值(min)')
+ max_lifetime_value = fields.Integer(string='最大寿命值(min)', related='functional_tool_id.max_lifetime_value')
+ alarm_value = fields.Integer(string='报警值(min)', related='functional_tool_id.alarm_value')
+ used_value = fields.Integer(string='已使用值(min)', related='functional_tool_id.used_value')
functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态')
- alarm_time = fields.Datetime('报警时间')
- dispose_user = fields.Char('处理人')
- dispose_time = fields.Char('处理时间')
- dispose_func = fields.Char('处理方法/措施', readonly=False)
+ alarm_time = fields.Datetime('报警时间', default=lambda self: fields.Datetime.now(), readonly=True)
+ dispose_user = fields.Char('处理人', readonly=True)
+ dispose_time = fields.Char('处理时间', readonly=True)
+ dispose_func = fields.Char('处理方法/措施', readonly=True)
active = fields.Boolean(string='已归档', default=True)
+ functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
+
@api.model
def _read_group_machine_table_name_ids(self, categories, domain, order):
machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
return categories.browse(machine_table_name_ids)
+ def action_open_dismantle(self):
+ self.ensure_one()
+ dismantle_ids = self.env['sf.functional.tool.dismantle'].sudo().search(
+ [('functional_tool_id', '=', self.functional_tool_id.id)])
+ action = {
+ 'res_model': 'sf.functional.tool.dismantle',
+ 'type': 'ir.actions.act_window',
+ 'name': '拆解单'
+ }
+ if len(dismantle_ids) == 1:
+ action.update({
+ 'view_mode': 'form',
+ 'res_id': dismantle_ids.ids[0]
+ })
+ elif dismantle_ids:
+ action.update({
+ 'view_mode': 'tree,form',
+ 'res_id': dismantle_ids.ids
+ })
+ else:
+ return False
+ return action
# def create_tool_warning_record(self, obj):
# """
# 机台换刀申请报警状态时,创建功能刀具预警记录
diff --git a/sf_tool_management/views/functional_tool_views.xml b/sf_tool_management/views/functional_tool_views.xml
index 70edbafe..b0c78117 100644
--- a/sf_tool_management/views/functional_tool_views.xml
+++ b/sf_tool_management/views/functional_tool_views.xml
@@ -25,7 +25,10 @@