You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.7 KiB
Python

from sqlalchemy import Select, Delete
from typing import Optional
from src.database.core import DbSession
from src.auth.service import CurrentUser
from src.scope_equipment.model import ScopeEquipment
from src.scope_equipment.service import get_by_scope_name
async def get_all_target_reliability(*, db_session: DbSession, scope_name: str, eaf_threshold: float = 100.0):
"""Get all overhaul overview with EAF values that sum to 100%."""
equipments = await get_by_scope_name(db_session=db_session, scope_name=scope_name)
# If no equipments found, return empty list
if not equipments:
return []
import random
n = len(equipments)
base_value = 100 / n # Even distribution as base
# Generate EAF values with ±30% variation from base
eaf_values = [
base_value + random.uniform(-0.3 * base_value, 0.3 * base_value)
for _ in range(n)
]
# Normalize to ensure sum is 100
total = sum(eaf_values)
eaf_values = [(v * 100 / total) for v in eaf_values]
# Create result array of dictionaries
result = [
{
'id': equipment.id,
'assetnum': equipment.assetnum,
'location_tag': equipment.master_equipment.location_tag,
'name' : equipment.master_equipment.name,
'eaf': round(eaf, 4) # Add EAF value
}
for equipment, eaf in zip(equipments, eaf_values)
]
result.sort(key=lambda x: x['eaf'], reverse=True)
# Filter equipment up to threshold
cumulative_eaf = 0
filtered_result = []
for equipment in result:
cumulative_eaf += equipment['eaf']
filtered_result.append(equipment)
if cumulative_eaf >= eaf_threshold:
break
return filtered_result