From fbcd8c57c56b184e8ddcf8d11766cd23a12367ea Mon Sep 17 00:00:00 2001 From: guanhuan Date: Wed, 4 Jun 2025 16:38:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AA=E9=BD=90=E5=A5=97=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/sf_production_demand_plan.py | 65 ++++++++++++++----- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/sf_demand_plan/models/sf_production_demand_plan.py b/sf_demand_plan/models/sf_production_demand_plan.py index ea5b36fb..155c64d6 100644 --- a/sf_demand_plan/models/sf_production_demand_plan.py +++ b/sf_demand_plan/models/sf_production_demand_plan.py @@ -362,7 +362,8 @@ class sf_production_plan(models.Model): def _compute_hide_action_purchase_orders(self): for record in self: record.hide_action_purchase_orders = False - if record.material_check == '0' and not record.sale_order_line_id.is_incoming_material: + if record.supply_method in ('automation', + 'manual') and record.material_check == '0' and not record.sale_order_line_id.is_incoming_material: mrp_production = record.sale_order_id.mrp_production_ids.filtered( lambda p: p.product_id.id == record.product_id.id ).sorted(key=lambda p: p.id) @@ -379,13 +380,30 @@ class sf_production_plan(models.Model): if line.product_id in raw_materials ) record.hide_action_purchase_orders = total_purchase_quantity < record.product_uom_qty and pr_ids.state != 'done' + elif record.supply_method == 'purchase': + purchase_orders = self.env['purchase.order'].sudo().search([ + ('state', 'in', ('purchase', 'done')), + ('order_line.product_id', '=', record.product_id.id) + ]) + total_purchase_quantity = sum( + line.product_qty for order in purchase_orders for line in order.order_line + if line.product_id in record.product_id + ) + record.hide_action_purchase_orders = total_purchase_quantity < record.product_uom_qty @api.depends('sale_order_id.mrp_production_ids.picking_ids', 'sale_order_id.mrp_production_ids.picking_ids.state') def _compute_hide_action_stock_picking(self): for record in self: - manufacturing_orders = record.sale_order_id.mrp_production_ids - record.hide_action_stock_picking = bool(manufacturing_orders.mapped('picking_ids').filtered( - lambda p: p.state == 'assigned')) + record.hide_action_stock_picking = False + if record.supply_method in ('automation', 'manual'): + manufacturing_orders = record.sale_order_id.mrp_production_ids + record.hide_action_stock_picking = bool(manufacturing_orders.mapped('picking_ids').filtered( + lambda p: p.state == 'assigned')) + elif record.supply_method == 'purchase': + assigned_picking_ids = record.sale_order_id.picking_ids.filtered( + lambda + p: p.state == 'assigned' and p.picking_type_id.name != '发料出库' and p.move_line_ids.product_id in record.product_id) + record.hide_action_stock_picking = bool(assigned_picking_ids) def action_open_sale_order(self): self.ensure_one() @@ -420,9 +438,14 @@ class sf_production_plan(models.Model): def action_view_purchase_request(self): self.ensure_one() - first_mp = self.env['mrp.production'].search( - [('origin', '=', self.sale_order_id.name)], limit=1, order='id asc') - pr_ids = self.env['purchase.request'].sudo().search([('origin', 'like', first_mp.name)]) + domain = [] + if self.supply_method in ('automation', 'manual'): + first_mp = self.env['mrp.production'].search( + [('origin', '=', self.sale_order_id.name)], limit=1, order='id asc') + domain = [('origin', 'like', first_mp.name)] + elif self.supply_method == 'purchase': + domain = [('origin', 'like', self.sale_order_id.name)] + pr_ids = self.env['purchase.request'].sudo().search(domain) action = { 'res_model': 'purchase.request', 'type': 'ir.actions.act_window', @@ -443,16 +466,23 @@ class sf_production_plan(models.Model): def action_view_stock_picking(self): self.ensure_one() action = self.env["ir.actions.actions"]._for_xml_id("stock.action_picking_tree_all") - picking_ids = self.sale_order_id.mrp_production_ids.mapped('picking_ids').filtered( - lambda p: p.state == 'assigned') - if len(picking_ids) > 1: - action['domain'] = [('id', 'in', picking_ids.ids)] - elif picking_ids: - action['res_id'] = picking_ids.id - action['views'] = [(self.env.ref('stock.view_picking_form').id, 'form')] - if 'views' in action: - action['views'] += [(state, view) for state, view in action['views'] if view != 'form'] - return action + picking_ids = None + if self.supply_method in ('automation', 'manual'): + picking_ids = self.sale_order_id.mrp_production_ids.mapped('picking_ids').filtered( + lambda p: p.state == 'assigned') + elif self.supply_method == 'purchase': + picking_ids = self.sale_order_id.picking_ids.filtered( + lambda + p: p.state == 'assigned' and p.picking_type_id.name != '发料出库' and p.move_line_ids.product_id in self.product_id) + if picking_ids: + if len(picking_ids) > 1: + action['domain'] = [('id', 'in', picking_ids.ids)] + elif picking_ids: + action['res_id'] = picking_ids.id + action['views'] = [(self.env.ref('stock.view_picking_form').id, 'form')] + if 'views' in action: + action['views'] += [(state, view) for state, view in action['views'] if view != 'form'] + return action def action_view_programming(self): self.ensure_one() @@ -463,4 +493,3 @@ class sf_production_plan(models.Model): programming_no = list(set(programming_mrp_production_ids)) numbers_str = "、".join(programming_no) raise ValidationError(f"编程单号:{numbers_str},请去云平台处理") -