1、功能刀具拆解单添加功能刀具唯一校验;2、功能刀具模型tree视图的状态字段根据不同状态添加不同颜色;当功能刀具状态为报警时,自动创建拆解单和预警记录,并添加拆解单链接按钮;添加tree视图按状态排序,将报警状态刀具记录显示在最前面;3、优化功能刀具预警模型字段及关联关系,添加预警记录跳转到对应由该功能刀具生成的拆解单链接;
This commit is contained in:
@@ -760,6 +760,15 @@ class FunctionalToolDismantle(models.Model):
|
|||||||
functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', required=True, tracking=True,
|
functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', required=True, tracking=True,
|
||||||
domain=[('functional_tool_status', '!=', '已拆除'),
|
domain=[('functional_tool_status', '!=', '已拆除'),
|
||||||
('current_location', '=', '刀具房')])
|
('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,
|
tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True,
|
||||||
compute='_compute_functional_tool_num')
|
compute='_compute_functional_tool_num')
|
||||||
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', compute='_compute_functional_tool_num', store=True)
|
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)
|
logging.info('%s刀具确认开始拆解' % self.dismantle_cause)
|
||||||
code = self.code
|
code = self.code
|
||||||
if self.functional_tool_id.functional_tool_status == '已拆除':
|
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:
|
elif self.functional_tool_id.functional_tool_status != '报警':
|
||||||
raise ValidationError('Rfid为【%s】的功能刀具当前位置为【%s】,不能进行拆解!' % (
|
if self.functional_tool_id.tool_room_num == 0:
|
||||||
self.rfid, self.functional_tool_id.current_location))
|
raise ValidationError('Rfid为【%s】的功能刀具当前位置为【%s】,不能进行拆解!' % (
|
||||||
|
self.rfid, self.functional_tool_id.current_location))
|
||||||
# 目标重复校验
|
# 目标重复校验
|
||||||
self.location_duplicate_check()
|
self.location_duplicate_check()
|
||||||
datas = {'scrap': [], 'picking': []}
|
datas = {'scrap': [], 'picking': []}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from odoo.exceptions import ValidationError
|
|||||||
class FunctionalCuttingToolEntity(models.Model):
|
class FunctionalCuttingToolEntity(models.Model):
|
||||||
_name = 'sf.functional.cutting.tool.entity'
|
_name = 'sf.functional.cutting.tool.entity'
|
||||||
_description = '功能刀具列表'
|
_description = '功能刀具列表'
|
||||||
|
_order = 'functional_tool_status'
|
||||||
|
|
||||||
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具组装单', readonly=True)
|
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)
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
|
||||||
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
||||||
used_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='正常')
|
string='状态', store=True, default='正常')
|
||||||
current_location_id = fields.Many2one('stock.location', string='当前位置', compute='_compute_current_location_id',
|
current_location_id = fields.Many2one('stock.location', string='当前位置', compute='_compute_current_location_id',
|
||||||
store=True)
|
store=True)
|
||||||
@@ -60,13 +61,14 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
if item.functional_tool_status == '报警':
|
if item.functional_tool_status == '报警':
|
||||||
# 创建报警刀具拆解单
|
# 创建报警刀具拆解单
|
||||||
self.env['sf.functional.tool.dismantle'].sudo().create({
|
self.env['sf.functional.tool.dismantle'].sudo().create({
|
||||||
'functional_tool_id': item.id,
|
'functional_tool_id': item.ids[0],
|
||||||
'dismantle_cause': '寿命到期报废'
|
'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',
|
@api.depends('barcode_id.quant_ids', 'barcode_id.quant_ids.location_id', 'functional_tool_status',
|
||||||
'current_shelf_location_id')
|
'current_shelf_location_id')
|
||||||
@@ -253,10 +255,30 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
functional_tool_model_ids.append(functional_tool_model.id)
|
functional_tool_model_ids.append(functional_tool_model.id)
|
||||||
return [(6, 0, functional_tool_model_ids)]
|
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):
|
def open_functional_tool_warning(self):
|
||||||
action = self.env.ref('sf_tool_management.action_sf_functional_tool_warning')
|
action = self.env.ref('sf_tool_management.action_sf_functional_tool_warning')
|
||||||
result = action.read()[0]
|
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
|
return result
|
||||||
|
|
||||||
def open_stock_move_line(self):
|
def open_stock_move_line(self):
|
||||||
@@ -338,10 +360,10 @@ class FunctionalToolWarning(models.Model):
|
|||||||
_name = 'sf.functional.tool.warning'
|
_name = 'sf.functional.tool.warning'
|
||||||
_description = '功能刀具预警'
|
_description = '功能刀具预警'
|
||||||
|
|
||||||
code = fields.Char('编码', related='functional_tool_name_id.code')
|
code = fields.Char('编码', related='functional_tool_id.code')
|
||||||
rfid = fields.Char('Rfid')
|
rfid = fields.Char('Rfid', readonly=True)
|
||||||
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_name_id.tool_groups_id')
|
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_name_id.name')
|
name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_id.name')
|
||||||
# 机床信息
|
# 机床信息
|
||||||
production_line_id = fields.Many2one('sf.production.line', string='生产线',
|
production_line_id = fields.Many2one('sf.production.line', string='生产线',
|
||||||
group_expand='_read_group_machine_table_name_ids')
|
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='刀位号',
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号',
|
||||||
domain="[('equipment_id', '=', maintenance_equipment_id)]")
|
domain="[('equipment_id', '=', maintenance_equipment_id)]")
|
||||||
# 功能刀具信息
|
# 功能刀具信息
|
||||||
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', string='功能刀具', readonly=True)
|
||||||
barcode_id = fields.Many2one('stock.lot', string='序列号', related='functional_tool_name_id.barcode_id')
|
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='功能刀具类型')
|
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型',
|
||||||
diameter = fields.Float(string='刀具直径(mm)')
|
related='functional_tool_id.sf_cutting_tool_type_id')
|
||||||
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
|
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')
|
install_tool_time = fields.Datetime("刀具组装时间", related='functional_tool_name_id.tool_loading_time')
|
||||||
on_board_time = fields.Datetime('上机装刀时间')
|
on_board_time = fields.Datetime('上机装刀时间')
|
||||||
max_lifetime_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)')
|
alarm_value = fields.Integer(string='报警值(min)', related='functional_tool_id.alarm_value')
|
||||||
used_value = fields.Integer(string='已使用值(min)')
|
used_value = fields.Integer(string='已使用值(min)', related='functional_tool_id.used_value')
|
||||||
functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态')
|
functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态')
|
||||||
alarm_time = fields.Datetime('报警时间')
|
alarm_time = fields.Datetime('报警时间', default=lambda self: fields.Datetime.now(), readonly=True)
|
||||||
dispose_user = fields.Char('处理人')
|
dispose_user = fields.Char('处理人', readonly=True)
|
||||||
dispose_time = fields.Char('处理时间')
|
dispose_time = fields.Char('处理时间', readonly=True)
|
||||||
dispose_func = fields.Char('处理方法/措施', readonly=False)
|
dispose_func = fields.Char('处理方法/措施', readonly=True)
|
||||||
|
|
||||||
active = fields.Boolean(string='已归档', default=True)
|
active = fields.Boolean(string='已归档', default=True)
|
||||||
|
|
||||||
|
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _read_group_machine_table_name_ids(self, categories, domain, order):
|
def _read_group_machine_table_name_ids(self, categories, domain, order):
|
||||||
machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
return categories.browse(machine_table_name_ids)
|
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):
|
# def create_tool_warning_record(self, obj):
|
||||||
# """
|
# """
|
||||||
# 机台换刀申请报警状态时,创建功能刀具预警记录
|
# 机台换刀申请报警状态时,创建功能刀具预警记录
|
||||||
|
|||||||
@@ -25,7 +25,10 @@
|
|||||||
<field name="max_lifetime_value"/>
|
<field name="max_lifetime_value"/>
|
||||||
<field name="alarm_value"/>
|
<field name="alarm_value"/>
|
||||||
<field name="used_value"/>
|
<field name="used_value"/>
|
||||||
<field name="functional_tool_status"/>
|
<field name="functional_tool_status" widget='badge'
|
||||||
|
decoration-success="functional_tool_status == '正常'"
|
||||||
|
decoration-muted="functional_tool_status == '已拆除'"
|
||||||
|
decoration-danger="functional_tool_status == '报警'"/>
|
||||||
<field name="current_location" string="当前位置"/>
|
<field name="current_location" string="当前位置"/>
|
||||||
|
|
||||||
<field name="current_location_id" invisible="1"/>
|
<field name="current_location_id" invisible="1"/>
|
||||||
@@ -48,6 +51,16 @@
|
|||||||
<div class="oe_button_box" name="button_box">
|
<div class="oe_button_box" name="button_box">
|
||||||
<!-- <button name="button_safe_inventory_id" string="更新功能刀具关联的安全库存记录"-->
|
<!-- <button name="button_safe_inventory_id" string="更新功能刀具关联的安全库存记录"-->
|
||||||
<!-- type="object" class="btn-primary"/>-->
|
<!-- type="object" class="btn-primary"/>-->
|
||||||
|
<button class="oe_stat_button" groups="sf_base.group_sf_mrp_user"
|
||||||
|
name="open_functional_tool_dismantle_form"
|
||||||
|
icon="fa-list-ul"
|
||||||
|
type="object">
|
||||||
|
<div class="o_field_widget o_stat_info">
|
||||||
|
<span>
|
||||||
|
拆解单
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
<button class="oe_stat_button" groups="sf_base.group_sf_mrp_user"
|
<button class="oe_stat_button" groups="sf_base.group_sf_mrp_user"
|
||||||
name="open_functional_tool_warning"
|
name="open_functional_tool_warning"
|
||||||
icon="fa-list-ul"
|
icon="fa-list-ul"
|
||||||
@@ -235,16 +248,18 @@
|
|||||||
<field name="name">sf.functional.tool.warning.tree</field>
|
<field name="name">sf.functional.tool.warning.tree</field>
|
||||||
<field name="model">sf.functional.tool.warning</field>
|
<field name="model">sf.functional.tool.warning</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="功能刀具预警" create="0" edit="0" delete="0" editable="bottom">
|
<tree string="功能刀具预警" create="0" edit="0" delete="0" editable="bottom" default_order="id desc"
|
||||||
|
action="action_open_dismantle" type="object">
|
||||||
<field name="production_line_id" invisible="1"/>
|
<field name="production_line_id" invisible="1"/>
|
||||||
<field name="maintenance_equipment_id" invisible="1"/>
|
<field name="maintenance_equipment_id" invisible="1"/>
|
||||||
<field name="machine_tool_code" invisible="1"/>
|
<field name="machine_tool_code" invisible="1"/>
|
||||||
<field name="cutter_spacing_code_id" invisible="1"/>
|
<field name="cutter_spacing_code_id" invisible="1"/>
|
||||||
<field name="on_board_time" invisible="1"/>
|
<field name="on_board_time" invisible="1"/>
|
||||||
<field name="functional_tool_status" invisible="1"/>
|
<field name="functional_tool_status" invisible="1"/>
|
||||||
|
<field name="functional_tool_name_id" invisible="1"/>
|
||||||
|
|
||||||
<field name="rfid"/>
|
<field name="rfid"/>
|
||||||
<field name="functional_tool_name_id"/>
|
<field name="functional_tool_id"/>
|
||||||
<field name="barcode_id" optional="hide"/>
|
<field name="barcode_id" optional="hide"/>
|
||||||
<field name="diameter" optional="hide"/>
|
<field name="diameter" optional="hide"/>
|
||||||
<field name="knife_tip_r_angle" optional="hide"/>
|
<field name="knife_tip_r_angle" optional="hide"/>
|
||||||
|
|||||||
@@ -911,7 +911,7 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
<page string="报废"
|
<page string="报废单"
|
||||||
attrs="{'invisible':[('dismantle_cause', 'not in', ['寿命到期报废','崩刀报废'])]}">
|
attrs="{'invisible':[('dismantle_cause', 'not in', ['寿命到期报废','崩刀报废'])]}">
|
||||||
<field name="scrap_ids">
|
<field name="scrap_ids">
|
||||||
<tree>
|
<tree>
|
||||||
|
|||||||
Reference in New Issue
Block a user