Merge branch 'feature/刀具添加归档功能' into feature/功能优化

This commit is contained in:
yuxianghui
2024-03-04 17:13:42 +08:00
7 changed files with 97 additions and 69 deletions

View File

@@ -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"

View 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

View File

@@ -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>-->

View File

@@ -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,33 +185,45 @@ 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):
# def _register_functional_tool_groups(self, obj): """
# create_url = '/AutoDeviceApi/ToolGroup' 机床当前刀库实时信息接口,功能刀具出库
# sf_sync_config = self.env['res.config.settings'].get_values() """
# token = sf_sync_config['token'] # 获取位置对象
# sf_secret_key = sf_sync_config['sf_secret_key'] location_inventory_id = self.current_location_id
# headers = Common.get_headers(obj, token, sf_secret_key) stock_location_id = self.env['stock.location'].search([('name', '=', '制造前')])
# strurl = sf_sync_config['sf_url'] + create_url # 创建功能刀具该批次/序列号 库存移动和移动历史
# val = { self.barcode_id.create_stock_quant(location_inventory_id, stock_location_id,
# 'ToolName': obj.name, self.functional_tool_name_id.id, '机床装刀')
# 'GroupName': obj.tool_groups_id.name,
# 'ToolId': obj.code
# }
# kw = json.dumps(val, ensure_ascii=False)
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
# ret = r.json()
# if r == 200:
# return "刀具组发送成功"
# else:
# raise ValidationError("刀具组发送失败")
# @api.model_create_multi
# def create(self, vals): # ==========刀具组接口==========
# obj = super(FunctionalCuttingToolEntity, self).create(vals) # def _register_functional_tool_groups(self, obj):
# # 调用刀具组接口 # create_url = '/AutoDeviceApi/ToolGroup'
# self._register_functional_tool_groups(obj) # sf_sync_config = self.env['res.config.settings'].get_values()
# return obj # token = sf_sync_config['token']
# sf_secret_key = sf_sync_config['sf_secret_key']
# headers = Common.get_headers(obj, token, sf_secret_key)
# strurl = sf_sync_config['sf_url'] + create_url
# val = {
# 'ToolName': obj.name,
# 'GroupName': obj.tool_groups_id.name,
# 'ToolId': obj.code
# }
# kw = json.dumps(val, ensure_ascii=False)
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
# ret = r.json()
# if r == 200:
# return "刀具组发送成功"
# else:
# raise ValidationError("刀具组发送失败")
# @api.model_create_multi
# def create(self, vals):
# obj = super(FunctionalCuttingToolEntity, self).create(vals)
# # 调用刀具组接口
# self._register_functional_tool_groups(obj)
# return obj
class FunctionalToolWarning(models.Model): class FunctionalToolWarning(models.Model):

View File

@@ -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'],

View File

@@ -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>

View File

@@ -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,