mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-18 19:07:55 +00:00
Merge pull request #57194 from aerele/fix-operation-batch-size-flag-n-plus-one
fix: batch operation batch-size flag lookups to avoid n+1 query in wo…
This commit is contained in:
@@ -194,29 +194,49 @@ class OperationsService:
|
|||||||
op.wip_warehouse = self.doc.wip_warehouse
|
op.wip_warehouse = self.doc.wip_warehouse
|
||||||
|
|
||||||
def _collect_bom_operations(self):
|
def _collect_bom_operations(self):
|
||||||
operations = []
|
groups = []
|
||||||
if self.doc.use_multi_level_bom:
|
if self.doc.use_multi_level_bom:
|
||||||
bom_tree = frappe.get_doc("BOM", self.doc.bom_no).get_tree_representation()
|
bom_tree = frappe.get_doc("BOM", self.doc.bom_no).get_tree_representation()
|
||||||
for node in reversed(bom_tree.level_order_traversal()):
|
for node in reversed(bom_tree.level_order_traversal()):
|
||||||
if node.is_bom:
|
if node.is_bom:
|
||||||
qty = node.exploded_qty / node.bom_qty
|
qty = node.exploded_qty / node.bom_qty
|
||||||
operations.extend(self._bom_operations(node.name, qty=qty, exploded=True))
|
groups.append((self._bom_operations(node.name), qty, True))
|
||||||
|
|
||||||
bom_qty = frappe.get_cached_value("BOM", self.doc.bom_no, "quantity")
|
bom_qty = frappe.get_cached_value("BOM", self.doc.bom_no, "quantity")
|
||||||
operations.extend(self._bom_operations(self.doc.bom_no, qty=bom_qty))
|
groups.append((self._bom_operations(self.doc.bom_no), bom_qty, False))
|
||||||
|
|
||||||
|
all_rows = [d for rows, qty, exploded in groups for d in rows]
|
||||||
|
batch_size_flags = self._get_batch_size_flags(d.operation for d in all_rows)
|
||||||
|
|
||||||
|
operations = []
|
||||||
|
for rows, qty, exploded in groups:
|
||||||
|
for d in rows:
|
||||||
|
self._adjust_operation_row(d, qty, exploded, batch_size_flags)
|
||||||
|
operations.append(d)
|
||||||
return operations
|
return operations
|
||||||
|
|
||||||
def _bom_operations(self, bom_no, qty=1, exploded=False):
|
def _bom_operations(self, bom_no):
|
||||||
data = frappe.get_all(
|
return frappe.get_all(
|
||||||
"BOM Operation", filters={"parent": bom_no}, fields=_BOM_OPERATION_FIELDS, order_by="idx"
|
"BOM Operation", filters={"parent": bom_no}, fields=_BOM_OPERATION_FIELDS, order_by="idx"
|
||||||
)
|
)
|
||||||
for d in data:
|
|
||||||
self._adjust_operation_row(d, qty, exploded)
|
|
||||||
return data
|
|
||||||
|
|
||||||
def _adjust_operation_row(self, d, qty, exploded):
|
def _get_batch_size_flags(self, operation_names):
|
||||||
|
names = {name for name in operation_names if name}
|
||||||
|
if not names:
|
||||||
|
return {}
|
||||||
|
return dict(
|
||||||
|
frappe.get_all(
|
||||||
|
"Operation",
|
||||||
|
filters={"name": ["in", list(names)]},
|
||||||
|
fields=["name", "create_job_card_based_on_batch_size"],
|
||||||
|
as_list=True,
|
||||||
|
limit_page_length=0,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _adjust_operation_row(self, d, qty, exploded, batch_size_flags):
|
||||||
if not d.fixed_time:
|
if not d.fixed_time:
|
||||||
if frappe.get_value("Operation", d.operation, "create_job_card_based_on_batch_size"):
|
if batch_size_flags.get(d.operation):
|
||||||
qty = d.batch_size
|
qty = d.batch_size
|
||||||
d.time_in_mins = d.time_in_mins * flt(qty) if exploded else d.time_in_mins / flt(qty)
|
d.time_in_mins = d.time_in_mins * flt(qty) if exploded else d.time_in_mins / flt(qty)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user