From cbc8a419849cf602b0f4088e731bd9216734d9d6 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Tue, 2 Jul 2024 17:32:27 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0=E6=8B=86=E8=A7=A3?=
=?UTF-8?q?=E7=9A=84=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86=E5=9C=B0=E7=82=B9?=
=?UTF-8?q?=EF=BC=9B2=E3=80=81=E4=BC=98=E5=8C=96=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E5=88=80=E5=85=B7=E6=8B=86=E8=A7=A3=E5=BA=93=E5=AD=98=E7=AE=A1?=
=?UTF-8?q?=E7=90=86=EF=BC=9B3=E3=80=81=E4=BB=A3=E7=A0=81=E8=BF=81?=
=?UTF-8?q?=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_dlm_management/data/stock_data.xml | 10 +
sf_tool_management/models/base.py | 190 +++++++++++++------
sf_tool_management/views/tool_base_views.xml | 19 +-
sf_tool_management/wizard/wizard.py | 62 +-----
4 files changed, 166 insertions(+), 115 deletions(-)
diff --git a/sf_dlm_management/data/stock_data.xml b/sf_dlm_management/data/stock_data.xml
index 3d2c4527..be2a36e0 100644
--- a/sf_dlm_management/data/stock_data.xml
+++ b/sf_dlm_management/data/stock_data.xml
@@ -22,6 +22,16 @@
+
+ 拆解
+
+ internal
+ DJCJ
+ true
+ true
+
+
+
刀具组装入库
diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py
index 20c1e45d..12f7e79e 100644
--- a/sf_tool_management/models/base.py
+++ b/sf_tool_management/models/base.py
@@ -933,79 +933,55 @@ class FunctionalToolDismantle(models.Model):
self.rfid, self.functional_tool_id.current_location))
# 目标重复校验
self.location_duplicate_check()
- location = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
- location_dest = self.env['stock.location'].search([('name', '=', '刀具房')])
+ datas = {'scrap': [], 'picking': []}
# =================刀柄是否[报废]拆解=======
- location_dest_scrap_ids = self.env['stock.location'].search([('name', 'in', ('Scrap', '报废'))])
if self.handle_rfid:
lot = self.env['stock.lot'].sudo().search([('rfid', '=', self.handle_rfid)])
if not lot:
- raise ValidationError('Rfid为【%s】的功能刀具序列号不存在!' % self.handle_rfid)
+ raise ValidationError('Rfid为【%s】的刀柄序列号不存在!' % self.handle_rfid)
if self.scrap_boolean:
# 刀柄报废 入库到Scrap
- lot.create_stock_quant(location, location_dest_scrap_ids[-1], False, code, False, False)
+ datas['scrap'].append({'lot_id': lot})
lot.tool_material_status = '报废'
else:
# 刀柄不报废 入库到刀具房
- lot.create_stock_quant(location, location_dest, False, code, False, False)
+ datas['picking'].append({'lot_id': lot, 'destination': self.env['sf.shelf.location']})
lot.tool_material_status = '可用'
-
# ==============功能刀具[报废]拆解================
if self.dismantle_cause in ['寿命到期报废', '崩刀报废']:
# 除刀柄外物料报废 入库到Scrap
if self.integral_product_id:
- self.integral_product_id.dismantle_stock_moves(False, self.integral_lot_id, location,
- location_dest_scrap_ids[-1], code)
+ datas['scrap'].append({'lot_id': self.integral_lot_id})
elif self.blade_product_id:
- self.blade_product_id.dismantle_stock_moves(False, self.blade_lot_id, location,
- location_dest_scrap_ids[-1], code)
+ datas['scrap'].append({'lot_id': self.blade_lot_id})
if self.bar_product_id:
- self.bar_product_id.dismantle_stock_moves(False, self.bar_lot_id, location,
- location_dest_scrap_ids[-1], code)
+ datas['scrap'].append({'lot_id': self.bar_lot_id})
elif self.pad_product_id:
- self.pad_product_id.dismantle_stock_moves(False, self.pad_lot_id, location,
- location_dest_scrap_ids[-1], code)
+ datas['scrap'].append({'lot_id': self.pad_lot_id})
if self.chuck_product_id:
- self.chuck_product_id.dismantle_stock_moves(False, self.chuck_lot_id, location,
- location_dest_scrap_ids[-1], code)
- # ===========功能刀具[磨削]拆解==============
- # elif self.dismantle_cause in ['刀具需磨削']:
- # location_dest = self.env['stock.location'].search([('name', '=', '磨削房')])
- # # 除刀柄外物料拆解 入库到具体库位
- # if self.integral_product_id:
- # self.integral_product_id.dismantle_stock_moves(False, location, location_dest)
- # elif self.blade_product_id:
- # self.blade_product_id.dismantle_stock_moves(False, location, location_dest)
- # if self.bar_product_id:
- # self.bar_product_id.dismantle_stock_moves(False, location, location_dest)
- # elif self.pad_product_id:
- # self.pad_product_id.dismantle_stock_moves(False, location, location_dest)
- # if self.chuck_product_id:
- # self.chuck_product_id.dismantle_stock_moves(False, location, location_dest)
+ datas['scrap'].append({'lot_id': self.chuck_lot_id})
# ==============功能刀具[更换,磨削]拆解==============
elif self.dismantle_cause in ['更换为其他刀具', '刀具需磨削']:
# 除刀柄外物料拆解 入库到具体货位
if self.integral_freight_id:
- self.integral_product_id.dismantle_stock_moves(self.integral_freight_id, self.integral_lot_id, location,
- location_dest, code)
+ datas['picking'].append({'lot_id': self.integral_lot_id, 'destination': self.integral_freight_id})
elif self.blade_freight_id:
- self.blade_product_id.dismantle_stock_moves(self.blade_freight_id, self.blade_lot_id, location,
- location_dest, code)
+ datas['picking'].append({'lot_id': self.blade_lot_id, 'destination': self.blade_freight_id})
if self.bar_freight_id:
- self.bar_product_id.dismantle_stock_moves(self.bar_freight_id, self.bar_lot_id, location,
- location_dest, code)
+ datas['picking'].append({'lot_id': self.bar_lot_id, 'destination': self.bar_freight_id})
elif self.pad_freight_id:
- self.pad_product_id.dismantle_stock_moves(self.pad_freight_id, self.pad_lot_id, location,
- location_dest, code)
+ datas['picking'].append({'lot_id': self.pad_lot_id, 'destination': self.pad_freight_id})
if self.chuck_freight_id:
- self.chuck_product_id.dismantle_stock_moves(self.chuck_freight_id, self.chuck_lot_id, location,
- location_dest, code)
- # ===============删除功能刀具的Rfid字段的值, 赋值给Rfid(已拆解)字段=====
+ datas['picking'].append({'lot_id': self.chuck_lot_id, 'destination': self.chuck_freight_id})
+ self.create_tool_picking_scrap(datas)
+ # ===============修改功能刀具数据=====
self.functional_tool_id.write({
'rfid_dismantle': self.functional_tool_id.rfid,
'rfid': '',
'functional_tool_status': '已拆除'
})
+ # 创建功能刀具拆解移动记录
+ location_dismantle_id = self.env['stock.location'].search([('name', '=', '拆解')])
# 修改拆解单的值
self.write({
'rfid_dismantle': self.rfid,
@@ -1016,31 +992,120 @@ class FunctionalToolDismantle(models.Model):
})
logging.info('【%s】刀具拆解成功!' % self.name)
+ def create_tool_picking_scrap(self, datas):
+ scrap_data = datas['scrap']
+ picking_data = datas['picking']
+ if scrap_data:
+ for data in scrap_data:
+ if data:
+ self.env['stock.scrap'].create_tool_dismantle_stock_scrap(data['lot_id'], self)
+ if picking_data:
+ picking_id = self.env['stock.picking'].create_tool_dismantle_picking(self)
+ self.env['stock.move'].create_tool_stock_move({'data': picking_data, 'picking_id': picking_id})
+ # 将刀具物料出库库单的状态更改为就绪
+ picking_id.action_confirm()
+ # 修改刀具物料出库移动历史记录
+ self.env['stock.move'].write_tool_stock_move_line({'data': picking_data, 'picking_id': picking_id})
+ # 设置数量,并验证完成
+ picking_id.action_set_quantities_to_reservation()
+ picking_id.button_validate()
-class ProductProduct(models.Model):
- _inherit = 'product.product'
- def dismantle_stock_moves(self, shelf_location_id, lot_id, location_id, location_dest_id, code):
- # 创建功能刀具拆解单产品库存移动记录
- stock_move_id = self.env['stock.move'].sudo().create({
- 'name': code,
- 'product_id': self.id,
+class StockPicking(models.Model):
+ _inherit = 'stock.picking'
+
+ def create_tool_dismantle_picking(self, obj):
+ """
+ 创建刀具物料入库单
+ """
+ # 获取名称为内部调拨的作业类型
+ picking_type_id = self.env['stock.picking.type'].sudo().search([('name', '=', '内部调拨')])
+ location_id = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
+ location_dest_id = self.env['stock.location'].search([('name', '=', '刀具房')])
+ if not location_id:
+ raise ValidationError('缺少名称为【刀具组装位置】的仓库管理地点')
+ if not location_dest_id:
+ raise ValidationError('缺少名称为【刀具房】的仓库管理地点')
+ # 创建刀具物料出库单
+ picking_id = self.env['stock.picking'].create({
+ 'name': self._get_name_stock1(picking_type_id),
+ 'picking_type_id': picking_type_id.id,
'location_id': location_id.id,
'location_dest_id': location_dest_id.id,
+ 'origin': obj.code
+ })
+
+ return picking_id
+
+
+class StockMove(models.Model):
+ _inherit = 'stock.move'
+
+ def create_tool_stock_move(self, datas):
+ picking_id = datas['picking_id']
+ data = datas['data']
+ stock_move_ids = []
+ for res in data:
+ if res:
+ # 创建库存移动记录
+ stock_move_id = self.env['stock.move'].sudo().create({
+ 'name': picking_id.name,
+ 'picking_id': picking_id.id,
+ 'product_id': res['lot_id'].product_id.id,
+ 'location_id': picking_id.location_id.id,
+ 'location_dest_id': picking_id.location_dest_id.id,
+ 'product_uom_qty': 1.00,
+ 'reserved_availability': 1.00
+ })
+ stock_move_ids.append(stock_move_id)
+ return stock_move_ids
+
+ def write_tool_stock_move_line(self, datas):
+ picking_id = datas['picking_id']
+ data = datas['data']
+ move_line_ids = picking_id.move_line_ids
+ for move_line_id in move_line_ids:
+ for res in data:
+ if move_line_id.lot_id.product_id == res['lot_id'].product_id:
+ move_line_id.write({
+ 'destination_location_id': res.get('destination').id,
+ 'lot_id': res.get('lot_id').id
+ })
+ return True
+
+ def create_functional_tool_stock_move(self, location_inventory_id, stock_location_id, functional_tool_assembly_id,
+ name, obj,
+ tool_groups_id):
+ """
+ 对功能刀具拆解过程的功能刀具进行库存移动,以及创建移动历史
+ """
+ # 创建库存移动记录
+ stock_move_id = self.env['stock.move'].sudo().create({
+ 'name': name,
+ 'product_id': self.product_id.id,
+ 'location_id': location_inventory_id.id,
+ 'location_dest_id': stock_location_id.id,
'product_uom_qty': 1.00,
'state': 'done'
})
+
# 创建移动历史记录
stock_move_line_id = self.env['stock.move.line'].sudo().create({
- 'product_id': self.id,
- 'lot_id': lot_id.id,
+ 'product_id': self.product_id.id,
+ 'functional_tool_name_id': functional_tool_assembly_id,
+ 'lot_id': self.id,
'move_id': stock_move_id.id,
- 'destination_location_id': shelf_location_id.id if shelf_location_id else False,
'install_tool_time': fields.Datetime.now(),
'qty_done': 1.0,
'state': 'done',
+ 'functional_tool_type_id': False if not obj else obj.functional_tool_type_id.id,
+ 'diameter': None if not obj else obj.after_assembly_functional_tool_diameter,
+ 'knife_tip_r_angle': None if not obj else obj.after_assembly_knife_tip_r_angle,
+ 'code': '' if not obj else obj.code,
+ 'rfid': '' if not obj else obj.rfid,
+ 'functional_tool_name': '' if not obj else obj.after_assembly_functional_tool_name,
+ 'tool_groups_id': False if not tool_groups_id else tool_groups_id.id
})
-
return stock_move_id, stock_move_line_id
@@ -1048,3 +1113,22 @@ class CustomStockScrap(models.Model):
_inherit = 'stock.scrap'
functional_tool_dismantle_id = fields.Many2one('sf.functional.tool.dismantle', string="功能刀具拆解单")
+
+ def create_tool_dismantle_stock_scrap(self, lot, dismantle_id):
+ location_id = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
+ scrap_location_id = self.env['stock.location'].search([('name', 'in', ('Scrap', '报废'))])
+ if not location_id:
+ raise ValidationError('缺少名称为【刀具组装位置】的仓库管理地点')
+ if not scrap_location_id:
+ raise ValidationError('缺少名称为【Scrap】或【Scrap】的仓库管理地点')
+ stock_scrap_id = self.create({
+ 'product_id': lot.product_id.id,
+ 'lot_id': lot.id,
+ 'location_id': location_id.id,
+ 'scrap_location_id': scrap_location_id.id,
+ 'functional_tool_dismantle_id': dismantle_id.id,
+ 'origin': dismantle_id.code
+ })
+ # 完成报废单
+ stock_scrap_id.action_validate()
+ return stock_scrap_id
diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml
index 31fe53c9..42f2c3ca 100644
--- a/sf_tool_management/views/tool_base_views.xml
+++ b/sf_tool_management/views/tool_base_views.xml
@@ -711,10 +711,14 @@
-
-
-
-
+
+
+
+
@@ -791,8 +795,8 @@
attrs="{'readonly': [('state', '=', '已拆解')]}"/>
-
+
+
@@ -879,6 +883,9 @@
+
+
+
diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py
index 111211c2..4edd3617 100644
--- a/sf_tool_management/wizard/wizard.py
+++ b/sf_tool_management/wizard/wizard.py
@@ -622,9 +622,9 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
# 封装功能刀具数据,用于创建功能刀具记录
desc_2 = self.get_desc_2(stock_lot, functional_tool_assembly)
# 创建功能刀具组装入库单
- self.env['stock.picking'].create_stocking_picking(stock_lot, functional_tool_assembly, self)
+ self.env['stock.picking'].create_tool_stocking_picking(stock_lot, functional_tool_assembly, self)
# 创建刀具物料出库单
- self.env['stock.picking'].create_stocking_picking1(self)
+ self.env['stock.picking'].create_tool_stocking_picking1(self)
# ============================创建功能刀具列表、安全库存记录===============================
# 创建功能刀具列表记录
@@ -770,7 +770,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
class StockPicking(models.Model):
_inherit = 'stock.picking'
- def create_stocking_picking(self, stock_lot, functional_tool_assembly, obj):
+ def create_tool_stocking_picking(self, stock_lot, functional_tool_assembly, obj):
"""
创建功能刀具组装入库单
"""
@@ -821,7 +821,7 @@ class StockPicking(models.Model):
num = "%03d" % m
return name + str(num)
- def create_stocking_picking1(self, obj):
+ def create_tool_stocking_picking1(self, obj):
"""
创建刀具物料出库单
"""
@@ -874,10 +874,10 @@ class StockPicking(models.Model):
order="id desc"
)
if not stock_id:
- num = "%03d" % 1
+ num = "%05d" % 1
else:
m = int(stock_id.name[-3:]) + 1
- num = "%03d" % m
+ num = "%05d" % m
return name + str(num)
@@ -950,53 +950,3 @@ class ProductProduct(models.Model):
m = int(stock_lot_id.name[-3:]) + 1
num = "%03d" % m
return '%s-%s' % (code, num)
-
-
-class StockLot(models.Model):
- _inherit = 'stock.lot'
-
- def create_stock_quant(self, location_inventory_id, stock_location_id, functional_tool_assembly_id, name, obj,
- tool_groups_id):
- """
- 对功能刀具组装过程的功能刀具和刀具物料进行库存移动,以及创建移动历史
- """
-
- # 创建库存移动记录
- stock_move_id = self.env['stock.move'].sudo().create({
- 'name': name,
- 'product_id': self.product_id.id,
- 'location_id': location_inventory_id.id,
- 'location_dest_id': stock_location_id.id,
- 'product_uom_qty': 1.00,
- 'state': 'done'
- })
-
- # 创建移动历史记录
- stock_move_line_id = self.env['stock.move.line'].sudo().create({
- 'product_id': self.product_id.id,
- 'functional_tool_name_id': functional_tool_assembly_id,
- 'lot_id': self.id,
- 'move_id': stock_move_id.id,
- 'install_tool_time': fields.Datetime.now(),
- 'qty_done': 1.0,
- 'state': 'done',
- 'functional_tool_type_id': False if not obj else obj.functional_tool_type_id.id,
- 'diameter': None if not obj else obj.after_assembly_functional_tool_diameter,
- 'knife_tip_r_angle': None if not obj else obj.after_assembly_knife_tip_r_angle,
- 'code': '' if not obj else obj.code,
- 'rfid': '' if not obj else obj.rfid,
- 'functional_tool_name': '' if not obj else obj.after_assembly_functional_tool_name,
- 'tool_groups_id': False if not tool_groups_id else tool_groups_id.id
- })
- return stock_move_id, stock_move_line_id
-
-# class StockQuant(models.Model):
-# _inherit = 'stock.quant'
-#
-# @api.model_create_multi
-# def create(self, vals_list):
-# records = super(StockQuant, self).create(vals_list)
-# for record in records:
-# if record.lot_id.product_id.categ_id.name == '刀具':
-# record.lot_id.enroll_tool_material_stock()
-# return records