From 791d6b7fb1e8ddc639ed8ffc609a60175cce88bb Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Fri, 20 Dec 2024 09:16:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E4=BE=9B=E6=96=99=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 10 +++- sf_manufacturing/models/sale_order.py | 46 ++++++++++++++++++- sf_manufacturing/models/stock.py | 18 ++++++-- sf_manufacturing/views/stock_picking_view.xml | 1 + 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 7bfc0abb..07438afb 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -1574,12 +1574,18 @@ class MrpProduction(models.Model): first_order = self.env['mrp.production'].search( [('origin', '=', order.origin), ('product_id', '=', order.product_id.id)], limit=1, order='id asc') order.picking_ids = self.env['stock.picking'].search([ - ('group_id', '=', first_order.procurement_group_id.id), ('group_id', '!=', False), + ('group_id', '!=', False), ('state', '!=', 'cancel'), + '|', # 表示“或”的开始 + ('group_id', '=', order.procurement_group_id.id), + ('related_group_ids', '=', order.procurement_group_id.id) ]) order.delivery_count = len(first_order.picking_ids) else: order.picking_ids = self.env['stock.picking'].search([ - ('group_id', '=', order.procurement_group_id.id), ('group_id', '!=', False), + ('group_id', '!=', False),('state', '!=', 'cancel'), + '|', # 表示“或”的开始 + ('group_id', '=', order.procurement_group_id.id), + ('related_group_ids', '=', order.procurement_group_id.id) ]) order.delivery_count = len(order.picking_ids) diff --git a/sf_manufacturing/models/sale_order.py b/sf_manufacturing/models/sale_order.py index 5d318141..3cc8e587 100644 --- a/sf_manufacturing/models/sale_order.py +++ b/sf_manufacturing/models/sale_order.py @@ -148,8 +148,52 @@ class SaleOrder(models.Model): self.env.ref("base.user_admin")).bom_create(product, bom_type, 'product') product_bom_purchase.with_user(self.env.ref("base.user_admin")).bom_create_line_has( purchase_embryo) - return super(SaleOrder, self).action_confirm() + result = super(SaleOrder, self).action_confirm() + self.merge_picking() + return result + def merge_picking(self): + """ + 合并多个stock.picking为一个新的stock.picking。 + :param picking_ids: 需要合并的stock.picking记录ID列表 + :return: 合并后的新的stock.picking对象 + """ + picking_ids = self.env['stock.picking'].search([('retrospect_ref', '=', self.default_code)]) + if not picking_ids: + return + # 获取需要合并的 stock.picking 记录 + # 创建一个新的 stock.picking 作为合并结果 + new_picking = self.env['stock.picking'].create({ + 'partner_id': picking_ids[0].partner_id.id, + 'location_id': picking_ids[0].location_id.id, + 'location_dest_id': picking_ids[0].location_dest_id.id, + 'move_ids': False, + 'sale_id': self.id, + 'picking_type_id': picking_ids[0].picking_type_id.id, + 'origin': '合并自: ' + ','.join([p.origin for p in picking_ids]), + 'retrospect_ref':self.default_code, + 'person_of_delivery':picking_ids[0].person_of_delivery, + 'telephone_of_delivery': picking_ids[0].telephone_of_delivery, + 'address_of_delivery': picking_ids[0].address_of_delivery, + 'group_id':picking_ids[0].group_id.id + }) + + # 合并所有 move_lines + for picking in picking_ids: + for move in picking.move_ids: + # 复制 move_lines 到新的 picking + new_move_vals = move.copy_data()[0] + new_move_vals['picking_id']=new_picking.id + self.env['stock.move'].create(new_move_vals) + + # 处理合并后的配送单状态 + new_picking.action_confirm() # 确认新的配送单 + new_picking.action_assign() # 分配新的配送单 + + # 删除原有的配送单 + picking_ids.write({'state': 'cancel'}) # 将原配送单状态更改为取消 + + return new_picking class SaleOrderLine(models.Model): _inherit = 'sale.order.line' diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index fbe3be8c..710d9abb 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -587,16 +587,28 @@ class StockPicking(models.Model): telephone_of_delivery = fields.Char('电话号码', compute='_compute_move_ids', store=True) address_of_delivery = fields.Char('联系地址', compute='_compute_move_ids', store=True) - retrospect_ref = fields.Char('追溯参考', compute='_compute_move_ids', store=True) - + retrospect_ref = fields.Char('平台订单号', compute='_compute_move_ids', store=True) + sale_name = fields.Char('销售订单', compute='_compute_move_ids', store=True) picking_type_sequence_code = fields.Char(related='picking_type_id.sequence_code') + related_group_ids = fields.Many2many( + 'procurement.group', string='关联捕获组', + readonly=True, compute='_compute_related_group_ids', store=True) + @api.depends('origin') + def _compute_related_group_ids(self): + for record in self: + if not record.origin: + continue + names = record.origin.split(',') + related_group_ids = self.env['procurement.group'].search([('name', 'in', names)]) + record.related_group_ids = [(6, 0, related_group_ids.ids)] @api.depends('move_ids', 'move_ids.product_id') def _compute_move_ids(self): for item in self: if item.move_ids: if item.picking_type_id.sequence_code == 'DL': - sale_name = item.move_ids[0].product_id.name.split('-')[1] + sale_name = item.move_ids[0].product_id.with_context(lang='zh_CN').name.split('-')[1] + item.sale_name=sale_name if 'S' in sale_name: sale_id = self.env['sale.order'].sudo().search([('name', '=', sale_name)]) item.person_of_delivery = sale_id.person_of_delivery diff --git a/sf_manufacturing/views/stock_picking_view.xml b/sf_manufacturing/views/stock_picking_view.xml index 30264f89..2fc61908 100644 --- a/sf_manufacturing/views/stock_picking_view.xml +++ b/sf_manufacturing/views/stock_picking_view.xml @@ -35,6 +35,7 @@ +