From d47dcc76117dda520dc473b7886ea4ff1326d7ce Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Tue, 4 Jun 2024 17:25:45 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=8F=96=E6=B6=88=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E6=97=B6=EF=BC=8C=E8=87=AA=E5=8A=A8=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=86=85=E9=83=A8=E5=8F=82=E8=80=83=E7=9A=84=E5=80=BC?= =?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=8D=95=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=94=B1=E6=8B=86=E8=A7=A3=E5=8D=95=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=9A=84=E7=A7=BB=E5=8A=A8=E5=8E=86=E5=8F=B2=E5=8D=95=E6=8D=AE?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E7=94=9F=E6=88=90=E8=A7=84=E5=88=99=EF=BC=9B?= =?UTF-8?q?3=E3=80=81=E4=BC=98=E5=8C=96=E8=B4=A7=E4=BD=8D=E7=9C=8B?= =?UTF-8?q?=E6=9D=BF=E4=BB=A5=E5=8F=8A=E8=B4=A7=E4=BD=8D=E7=9C=8B=E6=9D=BF?= =?UTF-8?q?=E7=9A=84=E8=B4=A7=E4=BD=8D=E5=8F=98=E6=9B=B4=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product_template_management_view.xml | 10 +-- sf_manufacturing/models/product_template.py | 7 +- sf_tool_management/models/base.py | 29 ++++---- sf_warehouse/models/model.py | 12 +++- sf_warehouse/views/shelf_location.xml | 4 +- sf_warehouse/wizard/wizard.py | 66 ++++++++++++++----- sf_warehouse/wizard/wizard_view.xml | 34 +++++++--- 7 files changed, 111 insertions(+), 51 deletions(-) diff --git a/sf_dlm_management/views/product_template_management_view.xml b/sf_dlm_management/views/product_template_management_view.xml index 8dc5005d..a62adf34 100644 --- a/sf_dlm_management/views/product_template_management_view.xml +++ b/sf_dlm_management/views/product_template_management_view.xml @@ -102,11 +102,11 @@ '刀具')], 'required': True} - - {'readonly': [('categ_type', '=', '刀具')], 'invisible': - [('product_variant_count', '>' , 1)]} - - + + + + + diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index f1086c41..b500a6e8 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -106,17 +106,12 @@ class ResProductMo(models.Model): name = fields.Char('产品名称', compute='_compute_tool_name', store=True, required=False) - @api.depends('categ_id', 'cutting_tool_material_id', 'cutting_tool_model_id', 'specification_id') + @api.depends('cutting_tool_model_id', 'specification_id') def _compute_tool_name(self): for item in self: if item.cutting_tool_model_id and item.specification_id: name = '%s%s' % (item.cutting_tool_model_id.name, item.specification_id.name) item.name = name - if item.categ_id and item.cutting_tool_material_id and item.cutting_tool_model_id: - if item.cutting_tool_model_id.code: - default_code = '%s-T-DJWL-%s' % ( - item.cutting_tool_model_id.code.split('-')[0], item.cutting_tool_material_id.code) - item.default_code = default_code @api.onchange('cutting_tool_model_id') def _onchange_cutting_tool_model_id(self): diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index e4fdf3ef..87dcfb28 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -824,6 +824,7 @@ class FunctionalToolDismantle(models.Model): def confirmation_disassembly(self): logging.info('%s刀具确认开始拆解' % self.dismantle_cause) + t_id = self.id if self.functional_tool_id.functional_tool_status == '已拆除': raise ValidationError('Rfid为【%s】的功能刀具已经拆解,请勿重复操作!' % self.functional_tool_id.rfid_dismantle) location = self.env['stock.location'].search([('name', '=', '刀具组装位置')]) @@ -848,15 +849,19 @@ class FunctionalToolDismantle(models.Model): # 除刀柄外物料报废 入库到Scrap if self.integral_product_id: self.integral_product_id.dismantle_stock_moves(False, self.integral_lot_id, location, - location_dest_scrap) + location_dest_scrap, t_id) elif self.blade_product_id: - self.blade_product_id.dismantle_stock_moves(False, self.blade_lot_id, location, location_dest_scrap) + self.blade_product_id.dismantle_stock_moves(False, self.blade_lot_id, location, location_dest_scrap, + t_id) if self.bar_product_id: - self.bar_product_id.dismantle_stock_moves(False, self.bar_lot_id, location, location_dest_scrap) + self.bar_product_id.dismantle_stock_moves(False, self.bar_lot_id, location, location_dest_scrap, + t_id) elif self.pad_product_id: - self.pad_product_id.dismantle_stock_moves(False, self.pad_lot_id, location, location_dest_scrap) + self.pad_product_id.dismantle_stock_moves(False, self.pad_lot_id, location, location_dest_scrap, + t_id) if self.chuck_product_id: - self.chuck_product_id.dismantle_stock_moves(False, self.chuck_lot_id, location, location_dest_scrap) + self.chuck_product_id.dismantle_stock_moves(False, self.chuck_lot_id, location, location_dest_scrap, + t_id) # ===========功能刀具[磨削]拆解============== # elif self.dismantle_cause in ['刀具需磨削']: # location_dest = self.env['stock.location'].search([('name', '=', '磨削房')]) @@ -876,19 +881,19 @@ class FunctionalToolDismantle(models.Model): # 除刀柄外物料拆解 入库到具体货位 if self.integral_freight_id: self.integral_product_id.dismantle_stock_moves(self.integral_freight_id, self.integral_lot_id, location, - location_dest) + location_dest, t_id) elif self.blade_freight_id: self.blade_product_id.dismantle_stock_moves(self.blade_freight_id, self.blade_lot_id, location, - location_dest) + location_dest, t_id) if self.bar_freight_id: self.bar_product_id.dismantle_stock_moves(self.bar_freight_id, self.bar_lot_id, location, - location_dest) + location_dest, t_id) elif self.pad_freight_id: self.pad_product_id.dismantle_stock_moves(self.pad_freight_id, self.pad_lot_id, location, - location_dest) + location_dest, t_id) if self.chuck_freight_id: self.chuck_product_id.dismantle_stock_moves(self.chuck_freight_id, self.chuck_lot_id, location, - location_dest) + location_dest, t_id) # ===============删除功能刀具的Rfid字段的值, 赋值给Rfid(已拆解)字段===== self.functional_tool_id.write({ 'rfid_dismantle': self.functional_tool_id.rfid, @@ -909,10 +914,10 @@ class FunctionalToolDismantle(models.Model): class ProductProduct(models.Model): _inherit = 'product.product' - def dismantle_stock_moves(self, shelf_location_id, lot_id, location_id, location_dest_id): + def dismantle_stock_moves(self, shelf_location_id, lot_id, location_id, location_dest_id, t_id): # 创建功能刀具拆解单产品库存移动记录 stock_move_id = self.env['stock.move'].sudo().create({ - 'name': '功能刀具拆解', + 'name': 'DJCJ/%s' % t_id, 'product_id': self.id, 'location_id': location_id.id, 'location_dest_id': location_dest_id.id, diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py index 53d785d1..155d5924 100644 --- a/sf_warehouse/models/model.py +++ b/sf_warehouse/models/model.py @@ -481,7 +481,7 @@ class ShelfLocation(models.Model): def action_location_status_enable(self): self.location_status = '空闲' - @api.depends('product_sn_id') + @api.depends('product_sn_id', 'product_sn_ids') def _compute_product_id(self): """ 根据产品序列号,获取产品 @@ -494,7 +494,8 @@ class ShelfLocation(models.Model): record.sudo().product_num = 1 except Exception as e: print('eeeeeee占用', e) - + elif record.product_sn_ids: + return True else: try: record.sudo().product_id = False @@ -543,6 +544,13 @@ class SfShelfLocationLot(models.Model): shelf_location_id = fields.Many2one('sf.shelf.location', string="货位") lot_id = fields.Many2one('stock.lot', string='批次号') qty = fields.Integer('数量') + qty_num = fields.Integer('变更数量') + + @api.onchange('qty_num') + def _onchange_qty_num(self): + for item in self: + if item.qty_num > item.qty: + raise ValidationError('变更数量不能比库存数量大!!!') class SfStockMoveLine(models.Model): diff --git a/sf_warehouse/views/shelf_location.xml b/sf_warehouse/views/shelf_location.xml index 2716dd91..418f7d5c 100644 --- a/sf_warehouse/views/shelf_location.xml +++ b/sf_warehouse/views/shelf_location.xml @@ -133,9 +133,11 @@ type="action" context="{'default_name':name, 'default_current_name':name, + 'default_current_product_sn_ids':product_sn_ids, + 'default_lot_id':product_sn_id, 'default_current_shelf_id':shelf_id, 'default_current_location_id':location_id, - 'default_current_barcode':barcode, + 'default_current_barcode_id':id, 'default_current_product_id':product_id, }" class="btn-primary" attrs="{'invisible':[('location_status','!=','占用')]}"/> diff --git a/sf_warehouse/wizard/wizard.py b/sf_warehouse/wizard/wizard.py index db64fe07..62ed5771 100644 --- a/sf_warehouse/wizard/wizard.py +++ b/sf_warehouse/wizard/wizard.py @@ -8,17 +8,23 @@ class ShelfLocationWizard(models.TransientModel): name = fields.Char('') - current_location_id = fields.Many2one('stock.location', string='所属库区', readonly=True) + lot_id = fields.Many2one('stock.lot', string="序列号", readonly=True) + current_location_id = fields.Many2one('stock.location', string='所属库区', readonly=True) current_shelf_id = fields.Many2one('sf.shelf', string='当前货架', readonly=True) - current_barcode = fields.Char('当前货位编码', readonly=True) + current_barcode_id = fields.Many2one('sf.shelf.location', string='当前货位编码', readonly=True) current_name = fields.Char('当前货位名称', readonly=True) current_product_id = fields.Many2one('product.product', string='产品', readonly=True) + current_product_sn_ids = fields.Many2many('sf.shelf.location.lot', 'shelf_location_wizard', string='产品批次号', + readonly=True) + destination_location_id = fields.Many2one('stock.location', string='目标库区', compute='_compute_destination_name') destination_shelf_id = fields.Many2one('sf.shelf', string='目标货架', compute='_compute_destination_name') destination_barcode_id = fields.Many2one('sf.shelf.location', string='目标货位编码', required=True, - domain="") + domain="[('product_id', 'in', (False, current_product_id))]") destination_name = fields.Char('目标货位名称', compute='_compute_destination_name') + destination_product_sn_ids = fields.Many2many('sf.shelf.location.lot', 'shelf_location_wizard', string='批次号', + domain="[('shelf_location_id', '=', current_barcode_id)]") def return_domain(self): val = [('location_status', '=', '空闲')] @@ -32,9 +38,11 @@ class ShelfLocationWizard(models.TransientModel): def _compute_destination_name(self): if self.destination_barcode_id: self.destination_name = self.destination_barcode_id.name + self.destination_location_id = self.destination_barcode_id.location_id.id self.destination_shelf_id = self.destination_barcode_id.shelf_id.id else: self.destination_name = '' + self.destination_location_id = False self.destination_shelf_id = False # @@ -43,22 +51,46 @@ class ShelfLocationWizard(models.TransientModel): # if self.destination_barcode_id: # self.destination_shelf_id = self.destination_barcode_id.shelf_id.id - def confirm_the_change(self): - shelf_location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', self.current_barcode)]) - # 变更货位 - if self.destination_barcode_id and shelf_location: - if self.destination_barcode_id.product_id and self.destination_barcode_id.product_id == shelf_location.product_id and not self.destination_barcode_id.product_sn_id: - self.destination_barcode_id.product_num += shelf_location.product_num - else: - self.destination_barcode_id.product_sn_id = shelf_location.product_sn_id.id - self.destination_barcode_id.product_id = shelf_location.product_id.id - self.destination_barcode_id.product_num = shelf_location.product_num + def create_stock_moves(self, lot_id, num): + # 创建产品货位变更的库存移动记录 + stock_move_id = self.env['stock.move'].sudo().create({ + 'name': 'HWBG/%s' % self.id, + 'product_id': self.current_product_id.id, + 'location_id': self.current_location_id.id, + 'location_dest_id': self.destination_location_id.id, + 'product_uom_qty': num, + 'state': 'done' + }) + # 创建移动历史记录 + stock_move_line_id = self.env['stock.move.line'].sudo().create({ + 'product_id': self.current_product_id.id, + 'lot_id': lot_id.id, + 'move_id': stock_move_id.id, + 'current_location_id': self.current_barcode_id.id, + 'destination_location_id': self.destination_barcode_id.id, + 'install_tool_time': fields.Datetime.now(), + 'qty_done': num, + 'state': 'done' + }) - shelf_location.product_sn_id = False - shelf_location.product_id = False - shelf_location.product_num = 0 + return stock_move_id, stock_move_line_id + + def confirm_the_change(self): + if self.destination_barcode_id: + if self.lot_id: + self.current_barcode_id.product_sn_id = False + self.destination_barcode_id.product_sn_id = self.lot_id.id + self.create_stock_moves(self.lot_id, 1) + elif self.current_product_sn_ids: + for current_product_sn_id in self.current_product_sn_ids: + self.create_stock_moves(current_product_sn_id.lot_id, current_product_sn_id.qty_num) + current_product_sn_id.write({ + 'qty_num': 0 + }) + else: + raise ValidationError('没有需要变更的批次/序列号!') else: - raise ValidationError('目标货位出错,请联系管理员!') + raise ValidationError('请选择目标货位编码!') # 关闭弹出窗口 return {'type': 'ir.actions.act_window_close'} diff --git a/sf_warehouse/wizard/wizard_view.xml b/sf_warehouse/wizard/wizard_view.xml index 1bb95e15..d77a813c 100644 --- a/sf_warehouse/wizard/wizard_view.xml +++ b/sf_warehouse/wizard/wizard_view.xml @@ -6,27 +6,45 @@
- + - + + + + + + + + + + - - - + + + + + + + + + + + +