未齐套提示

This commit is contained in:
guanhuan
2025-06-05 16:17:18 +08:00
parent fc41f30244
commit 1d01e3ad2e

View File

@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
import ast
import json
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.tools import float_compare
@@ -118,12 +120,20 @@ class sf_production_plan(models.Model):
default=False
)
hide_action_outsourcing_stock_picking = fields.Boolean(
string='委外显示调拨单按钮',
compute='_compute_hide_action_stock_picking',
default=False
)
hide_action_view_programming = fields.Boolean(
string='显示编程单按钮',
compute='_compute_hid_button',
default=False
)
outsourcing_purchase_request = fields.Char('委外采购申请单')
@api.depends('sale_order_id.state', 'sale_order_id.mrp_production_ids.schedule_state', 'sale_order_id.order_line',
'sale_order_id.mrp_production_ids.state')
def _compute_status(self):
@@ -362,13 +372,13 @@ class sf_production_plan(models.Model):
def _compute_hide_action_purchase_orders(self):
for record in self:
record.hide_action_purchase_orders = False
outsourcing_purchase_request = []
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)
if mrp_production:
pr_ids = self.env['purchase.request'].sudo().search([('origin', 'like', mrp_production[0].name)])
raw_materials = mrp_production.mapped('move_raw_ids.product_id')
if raw_materials:
purchase_orders = self.env['purchase.order'].sudo().search([
@@ -376,34 +386,89 @@ class sf_production_plan(models.Model):
('order_line.product_id', 'in', raw_materials.ids)
])
total_purchase_quantity = sum(
line.product_qty for order in purchase_orders for line in order.order_line
if line.product_id in raw_materials
sum(
order.order_line.filtered(
lambda line: line.product_id in raw_materials
).mapped('product_qty')
)
for order in purchase_orders
)
record.hide_action_purchase_orders = total_purchase_quantity < record.product_uom_qty and pr_ids.state != 'done'
if total_purchase_quantity < record.product_uom_qty:
pr_ids = self.env['purchase.request'].sudo().search(
[('origin', 'like', mrp_production[0].name), ('state', '!=', 'done')])
outsourcing_purchase_request.extend(pr_ids.ids)
elif record.supply_method in ('purchase', 'outsourcing'):
pr_ids = None
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
sum(
order.order_line.filtered(
lambda line: line.product_id in record.product_id
).mapped('product_qty')
)
for order in purchase_orders
)
record.hide_action_purchase_orders = total_purchase_quantity < record.product_uom_qty
if total_purchase_quantity < record.product_uom_qty:
pr_ids = self.env['purchase.request'].sudo().search(
[('origin', 'like', record.sale_order_id.name), ('state', '!=', 'done')])
outsourcing_purchase_request.extend(pr_ids.ids)
if record.supply_method == 'outsourcing' and not record.sale_order_line_id.is_incoming_material:
bom_line_ids = record.product_id.bom_ids.bom_line_ids
# BOM_数量
total_product_qty = sum(line.product_qty for line in bom_line_ids)
bom_product_ids = bom_line_ids.mapped('product_id')
product_purchase_orders = self.env['purchase.order'].sudo().search([
('state', 'in', ('purchase', 'done')),
('order_line.product_id', 'in', bom_product_ids.ids)
])
# 购订单_数量
total_outsourcing_purchase_quantity = sum(
sum(
order.order_line.filtered(
lambda line: line.product_id in bom_product_ids
).mapped('product_qty')
)
for order in product_purchase_orders
)
if total_outsourcing_purchase_quantity / total_product_qty < record.product_uom_qty:
purchase_request = self.env['purchase.request'].sudo().search(
[('line_ids.product_id', 'in', bom_product_ids.ids),
('line_ids.purchase_state', 'not in', ('purchase', 'done')), ('state', '!=', 'done')])
outsourcing_purchase_request.extend(purchase_request.ids)
record.outsourcing_purchase_request = json.dumps(outsourcing_purchase_request)
if outsourcing_purchase_request:
record.hide_action_purchase_orders = True
@api.depends('sale_order_id.mrp_production_ids.picking_ids', 'sale_order_id.mrp_production_ids.picking_ids.state')
@api.depends('sale_order_id.mrp_production_ids.picking_ids.state', 'sale_order_id.picking_ids.state')
def _compute_hide_action_stock_picking(self):
for record in self:
record.hide_action_stock_picking = False
record.hide_action_outsourcing_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':
elif record.supply_method in ('purchase', 'outsourcing'):
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)
if record.supply_method == 'outsourcing':
outsourcing_assigned_picking_ids = record.get_outsourcing_picking_ids()
record.hide_action_outsourcing_stock_picking = outsourcing_assigned_picking_ids
record.hide_action_stock_picking = assigned_picking_ids or outsourcing_assigned_picking_ids
else:
record.hide_action_stock_picking = assigned_picking_ids
def get_outsourcing_picking_ids(self):
order_ids = self.env['purchase.order'].sudo().search(
[('order_line.product_id', 'in', self.product_id.ids),
('purchase_type', '=', 'outsourcing')])
outsourcing_picking_ids = order_ids._get_subcontracting_resupplies()
outsourcing_assigned_picking_ids = outsourcing_picking_ids.filtered(lambda p: p.state == 'assigned')
return outsourcing_assigned_picking_ids
def action_open_sale_order(self):
self.ensure_one()
@@ -418,7 +483,7 @@ class sf_production_plan(models.Model):
self.ensure_one()
mrp_production_ids = self.sale_order_id.mrp_production_ids.filtered(
lambda p: p.state == 'technology_to_confirmed' and p.product_id.id == self.product_id.id
).ids
)
action = {
'res_model': 'mrp.production',
'type': 'ir.actions.act_window',
@@ -426,26 +491,20 @@ class sf_production_plan(models.Model):
if len(mrp_production_ids) == 1:
action.update({
'view_mode': 'form',
'res_id': mrp_production_ids[0],
'res_id': mrp_production_ids.id,
})
else:
action.update({
'name': _("制造订单列表"),
'domain': [('id', 'in', mrp_production_ids)],
'domain': [('id', 'in', mrp_production_ids.ids)],
'view_mode': 'tree,form',
})
return action
def action_view_purchase_request(self):
self.ensure_one()
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 in ('purchase', 'outsourcing'):
domain = [('origin', 'like', self.sale_order_id.name)]
pr_ids = self.env['purchase.request'].sudo().search(domain)
pr_ids = self.env['purchase.request'].sudo().search(
[('id', 'in', ast.literal_eval(self.outsourcing_purchase_request))])
action = {
'res_model': 'purchase.request',
'type': 'ir.actions.act_window',
@@ -457,8 +516,8 @@ class sf_production_plan(models.Model):
})
else:
action.update({
'name': _("%s生成采购请求单", self.name),
'domain': [('id', 'in', pr_ids)],
'name': _("采购申请"),
'domain': [('id', 'in', pr_ids.ids)],
'view_mode': 'tree,form',
})
return action
@@ -470,10 +529,12 @@ class sf_production_plan(models.Model):
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':
elif self.supply_method in ('purchase', 'outsourcing'):
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 self.supply_method == 'outsourcing' and self.hide_action_outsourcing_stock_picking:
picking_ids = picking_ids.union(self.get_outsourcing_picking_ids())
if picking_ids:
if len(picking_ids) > 1:
action['domain'] = [('id', 'in', picking_ids.ids)]