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
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
|