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