mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-12 22:21:50 +00:00
perf(stock): avoid n+1 queries for work order item source warehouse
hoist the invariant work order lookup and batch-fetch work order item
source warehouses once instead of querying per raw material row in
get_bom_raw_materials
(cherry picked from commit 3e4d5e6745)
This commit is contained in:
@@ -3279,6 +3279,23 @@ class StockEntry(StockController, SubcontractingInwardController):
|
||||
used_alternative_items = get_used_alternative_items(
|
||||
subcontract_order_field=self.subcontract_data.order_field, work_order=self.work_order
|
||||
)
|
||||
|
||||
skip_transfer, from_wip_warehouse = (
|
||||
frappe.get_value("Work Order", self.work_order, ["skip_transfer", "from_wip_warehouse"])
|
||||
if self.work_order
|
||||
else [None, None]
|
||||
)
|
||||
wo_item_source_warehouses = {}
|
||||
if skip_transfer and not from_wip_warehouse:
|
||||
for d in frappe.get_all(
|
||||
"Work Order Item",
|
||||
filters={"parent": self.work_order},
|
||||
fields=["item_code", "source_warehouse"],
|
||||
):
|
||||
# default ordering is creation desc; keep the first (most recent) row per
|
||||
# item_code to match the limit-1 behaviour of the get_value call this replaces
|
||||
wo_item_source_warehouses.setdefault(d.item_code, d.source_warehouse)
|
||||
|
||||
for item in item_dict.values():
|
||||
# if source warehouse presents in BOM set from_warehouse as bom source_warehouse
|
||||
if item["allow_alternative_item"]:
|
||||
@@ -3286,18 +3303,8 @@ class StockEntry(StockController, SubcontractingInwardController):
|
||||
"Work Order", self.work_order, "allow_alternative_item"
|
||||
)
|
||||
|
||||
skip_transfer, from_wip_warehouse = (
|
||||
frappe.get_value("Work Order", self.work_order, ["skip_transfer", "from_wip_warehouse"])
|
||||
if self.work_order
|
||||
else [None, None]
|
||||
)
|
||||
|
||||
item.from_warehouse = (
|
||||
frappe.get_value(
|
||||
"Work Order Item",
|
||||
{"parent": self.work_order, "item_code": item.item_code},
|
||||
"source_warehouse",
|
||||
)
|
||||
wo_item_source_warehouses.get(item.item_code)
|
||||
if skip_transfer and not from_wip_warehouse
|
||||
else self.from_warehouse or item.source_warehouse or item.default_warehouse
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user