Merge branch 'feature/刀具添加归档功能' into feature/功能优化
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
<field name="inherit_id" ref="sf_sale.view_product_template_form_inherit_sf"/>
|
<field name="inherit_id" ref="sf_sale.view_product_template_form_inherit_sf"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="invoice_policy" position="after">
|
<field name="invoice_policy" position="after">
|
||||||
<field name='categ_id' attrs="{'readonly': [('id', '!=', False)]}"/>
|
<field name='categ_id' class="custom_required" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name='is_bfm' invisible="1"/>
|
<field name='is_bfm' invisible="1"/>
|
||||||
<field name='categ_type' invisible="1"/>
|
<field name='categ_type' invisible="1"/>
|
||||||
<field name="upload_model_file"
|
<field name="upload_model_file"
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'workorder_id', '工件配送')
|
workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'workorder_id', '工件配送')
|
||||||
is_delivery = fields.Boolean('是否配送完成', default=False)
|
is_delivery = fields.Boolean('是否配送完成', default=False)
|
||||||
rfid_code = fields.Char('RFID码')
|
rfid_code = fields.Char('RFID码')
|
||||||
|
rfid_code_old = fields.Char('RFID码(已解除)')
|
||||||
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
|
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
|
||||||
string='生产线', store=True)
|
string='生产线', store=True)
|
||||||
production_line_state = fields.Selection(related='production_id.production_line_state',
|
production_line_state = fields.Selection(related='production_id.production_line_state',
|
||||||
@@ -624,6 +625,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
is_production_id = False
|
is_production_id = False
|
||||||
if is_production_id == True and self.name == '解除装夹':
|
if is_production_id == True and self.name == '解除装夹':
|
||||||
for workorder in self.production_id.workorder_ids:
|
for workorder in self.production_id.workorder_ids:
|
||||||
|
workorder.rfid_code_old = workorder.rfid_code
|
||||||
workorder.rfid_code = None
|
workorder.rfid_code = None
|
||||||
for move_raw_id in self.production_id.move_raw_ids:
|
for move_raw_id in self.production_id.move_raw_ids:
|
||||||
move_raw_id.quantity_done = move_raw_id.product_uom_qty
|
move_raw_id.quantity_done = move_raw_id.product_uom_qty
|
||||||
|
|||||||
@@ -183,7 +183,9 @@
|
|||||||
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||||
<field name="functional_fixture_type_id"
|
<field name="functional_fixture_type_id"
|
||||||
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||||
<field name="rfid_code" force_save="1" readonly="1" class="customRFID"/>
|
<field name="rfid_code" force_save="1" readonly="1" class="customRFID"
|
||||||
|
attrs="{'invisible': [('rfid_code_old', '!=', False)]}"/>
|
||||||
|
<field name="rfid_code_old" readonly="1" attrs="{'invisible': [('rfid_code_old', '=', False)]}"/>
|
||||||
<script src="/sf_manufacturing/static/src/js/customRFID.js"></script>
|
<script src="/sf_manufacturing/static/src/js/customRFID.js"></script>
|
||||||
</group>
|
</group>
|
||||||
<!-- <group>-->
|
<!-- <group>-->
|
||||||
|
|||||||
@@ -39,24 +39,29 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
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='当前位置', readonly=True)
|
current_location_id = fields.Many2one('stock.location', string='当前位置', readonly=True)
|
||||||
current_location = fields.Char('位置', compute='_compute_current_location_id')
|
current_location = fields.Selection(
|
||||||
|
[('组装后', '组装后'), ('刀具房', '刀具房'), ('线边刀库', '线边刀库'), ('机内刀库', '机内刀库')],
|
||||||
|
string='位置', compute='_compute_current_location_id', store=True)
|
||||||
image = fields.Binary('图片', readonly=True)
|
image = fields.Binary('图片', readonly=True)
|
||||||
|
|
||||||
active = fields.Boolean(string='已归档', default=True)
|
active = fields.Boolean(string='已归档', default=True)
|
||||||
|
|
||||||
@api.depends('barcode_id')
|
@api.depends('barcode_id.quant_ids')
|
||||||
def _compute_current_location_id(self):
|
def _compute_current_location_id(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.barcode_id.quant_ids:
|
if record.barcode_id.quant_ids:
|
||||||
for quant_id in record.barcode_id.quant_ids:
|
for quant_id in record.barcode_id.quant_ids:
|
||||||
if quant_id.inventory_quantity_auto_apply > 0:
|
if quant_id.inventory_quantity_auto_apply > 0:
|
||||||
record.sudo().current_location_id = quant_id.location_id
|
record.current_location_id = quant_id.location_id
|
||||||
record.sudo().current_location = quant_id.location_id.name
|
if quant_id.location_id.name == '制造前':
|
||||||
|
record.current_location = '机内刀库'
|
||||||
|
else:
|
||||||
|
record.current_location = quant_id.location_id.name
|
||||||
if record.current_location_id:
|
if record.current_location_id:
|
||||||
record.sudo().get_location_num()
|
record.sudo().get_location_num()
|
||||||
else:
|
else:
|
||||||
record.sudo().current_location_id = False
|
record.current_location_id = False
|
||||||
record.sudo().current_location = False
|
record.current_location = False
|
||||||
|
|
||||||
def get_location_num(self):
|
def get_location_num(self):
|
||||||
"""
|
"""
|
||||||
@@ -64,15 +69,15 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
"""
|
"""
|
||||||
for obj in self:
|
for obj in self:
|
||||||
if obj.current_location_id:
|
if obj.current_location_id:
|
||||||
if obj.current_location_id.name in ['刀具房']:
|
if obj.current_location in ['刀具房']:
|
||||||
obj.tool_room_num = 1
|
obj.tool_room_num = 1
|
||||||
obj.line_edge_knife_library_num = 0
|
obj.line_edge_knife_library_num = 0
|
||||||
obj.machine_knife_library_num = 0
|
obj.machine_knife_library_num = 0
|
||||||
elif "线边刀库" in obj.current_location_id.name:
|
elif "线边刀库" in obj.current_location:
|
||||||
obj.tool_room_num = 0
|
obj.tool_room_num = 0
|
||||||
obj.line_edge_knife_library_num = 1
|
obj.line_edge_knife_library_num = 1
|
||||||
obj.machine_knife_library_num = 0
|
obj.machine_knife_library_num = 0
|
||||||
elif "机内刀库" in obj.current_location_id.name:
|
elif "机内刀库" in obj.current_location:
|
||||||
obj.tool_room_num = 0
|
obj.tool_room_num = 0
|
||||||
obj.line_edge_knife_library_num = 0
|
obj.line_edge_knife_library_num = 0
|
||||||
obj.machine_knife_library_num = 1
|
obj.machine_knife_library_num = 1
|
||||||
@@ -180,6 +185,18 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
('coarse_middle_thin', '=', self.coarse_middle_thin)]
|
('coarse_middle_thin', '=', self.coarse_middle_thin)]
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def tool_inventory_displacement_out(self):
|
||||||
|
"""
|
||||||
|
机床当前刀库实时信息接口,功能刀具出库
|
||||||
|
"""
|
||||||
|
# 获取位置对象
|
||||||
|
location_inventory_id = self.current_location_id
|
||||||
|
stock_location_id = self.env['stock.location'].search([('name', '=', '制造前')])
|
||||||
|
# 创建功能刀具该批次/序列号 库存移动和移动历史
|
||||||
|
self.barcode_id.create_stock_quant(location_inventory_id, stock_location_id,
|
||||||
|
self.functional_tool_name_id.id, '机床装刀')
|
||||||
|
|
||||||
|
|
||||||
# ==========刀具组接口==========
|
# ==========刀具组接口==========
|
||||||
# def _register_functional_tool_groups(self, obj):
|
# def _register_functional_tool_groups(self, obj):
|
||||||
# create_url = '/AutoDeviceApi/ToolGroup'
|
# create_url = '/AutoDeviceApi/ToolGroup'
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ class SfMaintenanceEquipment(models.Model):
|
|||||||
'functional_tool_name_id': functional_tool_id.id,
|
'functional_tool_name_id': functional_tool_id.id,
|
||||||
'tool_install_time': time
|
'tool_install_time': time
|
||||||
})
|
})
|
||||||
|
if functional_tool_id.current_location_id.name != '制造前':
|
||||||
|
# 对功能刀具进行出库到生产线
|
||||||
|
functional_tool_id.tool_inventory_displacement_out()
|
||||||
functional_tool_id.write({
|
functional_tool_id.write({
|
||||||
'max_lifetime_value': data['MaxLife'],
|
'max_lifetime_value': data['MaxLife'],
|
||||||
'used_value': data['UseLife'],
|
'used_value': data['UseLife'],
|
||||||
|
|||||||
@@ -152,8 +152,8 @@
|
|||||||
<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="current_location_id"/>
|
<field name="current_location_id" invisible="1"/>
|
||||||
<field name="current_location" invisible="1"/>
|
<field name="current_location"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="tool_loading_length"/>
|
<field name="tool_loading_length"/>
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
|
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
|
||||||
<searchpanel>
|
<searchpanel>
|
||||||
<field name="sf_cutting_tool_type_id" icon="fa-building" enable_counters="1"/>
|
<field name="sf_cutting_tool_type_id" icon="fa-building" enable_counters="1"/>
|
||||||
<field name="current_location_id" icon="fa-building" enable_counters="1"/>
|
<field name="current_location" icon="fa-building" enable_counters="1"/>
|
||||||
<field name="functional_tool_status" icon="fa-building" enable_counters="1"/>
|
<field name="functional_tool_status" icon="fa-building" enable_counters="1"/>
|
||||||
</searchpanel>
|
</searchpanel>
|
||||||
</search>
|
</search>
|
||||||
|
|||||||
@@ -300,6 +300,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
智能工厂组装单处扫码绑定刀具物料')
|
智能工厂组装单处扫码绑定刀具物料')
|
||||||
"""
|
"""
|
||||||
for record in self:
|
for record in self:
|
||||||
|
if 'DJWL' in barcode:
|
||||||
records = record.env['stock.lot'].search([('name', '=', barcode)])
|
records = record.env['stock.lot'].search([('name', '=', barcode)])
|
||||||
if not records:
|
if not records:
|
||||||
raise ValidationError('扫描的条形码数据不存在,请重新扫描!')
|
raise ValidationError('扫描的条形码数据不存在,请重新扫描!')
|
||||||
@@ -323,6 +324,8 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
record.chuck_code_id = record_stock_lot.id
|
record.chuck_code_id = record_stock_lot.id
|
||||||
else:
|
else:
|
||||||
raise ValidationError('扫描的刀具物料不存在,请重新扫描!')
|
raise ValidationError('扫描的刀具物料不存在,请重新扫描!')
|
||||||
|
else:
|
||||||
|
record.rfid = barcode
|
||||||
|
|
||||||
# 组装功能刀具参数信息
|
# 组装功能刀具参数信息
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号')
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号')
|
||||||
@@ -676,7 +679,8 @@ class ProductProduct(models.Model):
|
|||||||
location_inventory_id = self.env['stock.location'].search([('name', '=', 'Production')])
|
location_inventory_id = self.env['stock.location'].search([('name', '=', 'Production')])
|
||||||
stock_location_id = self.env['stock.location'].search([('name', '=', '组装后')])
|
stock_location_id = self.env['stock.location'].search([('name', '=', '组装后')])
|
||||||
# 创建功能刀具该批次/序列号 库存移动和移动历史
|
# 创建功能刀具该批次/序列号 库存移动和移动历史
|
||||||
stock_lot.create_stock_quant(location_inventory_id, stock_location_id, functional_tool_assembly.id)
|
stock_lot.create_stock_quant(location_inventory_id, stock_location_id, functional_tool_assembly.id,
|
||||||
|
'功能刀具组装')
|
||||||
|
|
||||||
return stock_lot
|
return stock_lot
|
||||||
|
|
||||||
@@ -710,20 +714,20 @@ class ProductProduct(models.Model):
|
|||||||
location_inventory_id = tool_material.quant_ids.location_id[-1]
|
location_inventory_id = tool_material.quant_ids.location_id[-1]
|
||||||
stock_location_id = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
|
stock_location_id = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
|
||||||
# 创建功能刀具该批次/序列号 库存移动和移动历史
|
# 创建功能刀具该批次/序列号 库存移动和移动历史
|
||||||
tool_material.create_stock_quant(location_inventory_id, stock_location_id, None)
|
tool_material.create_stock_quant(location_inventory_id, stock_location_id, None, '功能刀具组装')
|
||||||
|
|
||||||
|
|
||||||
class StockLot(models.Model):
|
class StockLot(models.Model):
|
||||||
_inherit = 'stock.lot'
|
_inherit = 'stock.lot'
|
||||||
|
|
||||||
def create_stock_quant(self, location_inventory_id, stock_location_id, functional_tool_assembly_id):
|
def create_stock_quant(self, location_inventory_id, stock_location_id, functional_tool_assembly_id, name):
|
||||||
"""
|
"""
|
||||||
对功能刀具组装过程的功能刀具和刀具物料进行库存移动,以及创建移动历史
|
对功能刀具组装过程的功能刀具和刀具物料进行库存移动,以及创建移动历史
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 创建库存移动记录
|
# 创建库存移动记录
|
||||||
stock_move_id = self.env['stock.move'].create({
|
stock_move_id = self.env['stock.move'].sudo().create({
|
||||||
'name': '功能刀具组装',
|
'name': name,
|
||||||
'product_id': self.product_id.id,
|
'product_id': self.product_id.id,
|
||||||
'location_id': location_inventory_id.id,
|
'location_id': location_inventory_id.id,
|
||||||
'location_dest_id': stock_location_id.id,
|
'location_dest_id': stock_location_id.id,
|
||||||
@@ -732,7 +736,7 @@ class StockLot(models.Model):
|
|||||||
})
|
})
|
||||||
|
|
||||||
# 创建移动历史记录
|
# 创建移动历史记录
|
||||||
stock_move_line_id = self.env['stock.move.line'].create({
|
stock_move_line_id = self.env['stock.move.line'].sudo().create({
|
||||||
'product_id': self.product_id.id,
|
'product_id': self.product_id.id,
|
||||||
'functional_tool_name_id': functional_tool_assembly_id,
|
'functional_tool_name_id': functional_tool_assembly_id,
|
||||||
'lot_id': self.id,
|
'lot_id': self.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user