mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-17 02:26:33 +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(
|
used_alternative_items = get_used_alternative_items(
|
||||||
subcontract_order_field=self.subcontract_data.order_field, work_order=self.work_order
|
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():
|
for item in item_dict.values():
|
||||||
# if source warehouse presents in BOM set from_warehouse as bom source_warehouse
|
# if source warehouse presents in BOM set from_warehouse as bom source_warehouse
|
||||||
if item["allow_alternative_item"]:
|
if item["allow_alternative_item"]:
|
||||||
@@ -3286,18 +3303,8 @@ class StockEntry(StockController, SubcontractingInwardController):
|
|||||||
"Work Order", self.work_order, "allow_alternative_item"
|
"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 = (
|
item.from_warehouse = (
|
||||||
frappe.get_value(
|
wo_item_source_warehouses.get(item.item_code)
|
||||||
"Work Order Item",
|
|
||||||
{"parent": self.work_order, "item_code": item.item_code},
|
|
||||||
"source_warehouse",
|
|
||||||
)
|
|
||||||
if skip_transfer and not from_wip_warehouse
|
if skip_transfer and not from_wip_warehouse
|
||||||
else self.from_warehouse or item.source_warehouse or item.default_warehouse
|
else self.from_warehouse or item.source_warehouse or item.default_warehouse
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user