diff --git a/src/calculation_time_constrains/flows.py b/src/calculation_time_constrains/flows.py index 5e5612d..7397cd7 100644 --- a/src/calculation_time_constrains/flows.py +++ b/src/calculation_time_constrains/flows.py @@ -9,7 +9,7 @@ from src.scope.model import Scope from src.database.core import DbSession from src.scope.service import get_all from .schema import CalculationTimeConstrainsParametersRead, CalculationTimeConstrainsParametersRetrive, CalculationTimeConstrainsParametersCreate -from .service import get_calculation_by_reference_and_parameter, get_calculation_result, get_overhaul_cost_by_time_chart, get_corrective_cost_time_chart, create_param_and_data, get_calculation_data_by_id, create_calculation_result_service +from .service import get_calculation_by_reference_and_parameter, get_calculation_result, get_overhaul_cost_by_time_chart, get_corrective_cost_time_chart, create_param_and_data, get_calculation_data_by_id, create_calculation_result_service, get_avg_cost_by_asset from .model import CalculationResult from .model import CalculationParam @@ -87,13 +87,16 @@ async def get_or_create_scope_equipment_calculation(*, db_session: DbSession, sc if not scope_equipment_calculation: # Update Parameter input from scope calculation - calculation_time_constrains_in.costPerFailure = scope_calculation.parameter.avg_failure_cost + costFailure = get_avg_cost_by_asset( + db_session=db_session, assetnum=calculation_time_constrains_in.assetnum) + + calculation_time_constrains_in.costPerFailure = costFailure calculation_time_constrains_in.overhaulCost = scope_calculation.parameter.overhaul_cost scope_equipment_calculation = await create_param_and_data( db_session=db_session, calculation_param_in=calculation_time_constrains_in, created_by=scope_calculation.created_by, parameter_id=scope_calculation.parameter_id) - results = await create_calculation_result_service(db_session=db_session, calculation_id=scope_equipment_calculation.id) + results = await create_calculation_result_service(db_session=db_session, calculation_id=scope_equipment_calculation.id, costPerFailure=costFailure) return results diff --git a/src/calculation_time_constrains/service.py b/src/calculation_time_constrains/service.py index 95e076c..32985d0 100644 --- a/src/calculation_time_constrains/service.py +++ b/src/calculation_time_constrains/service.py @@ -1,9 +1,11 @@ from typing import Optional from uuid import UUID import numpy as np -from sqlalchemy import and_, select +from sqlalchemy import and_, func, select from sqlalchemy.orm import joinedload from src.database.core import DbSession +from src.scope_equipment.model import ScopeEquipment +from src.workorder.model import MasterWorkOrder from .schema import CalculationTimeConstrainsParametersCreate, CalculationTimeConstrainsRead from .model import CalculationParam, OverhaulReferenceType, CalculationData, CalculationResult from fastapi import HTTPException, status @@ -110,14 +112,14 @@ async def get_calculation_data_by_id(db_session: DbSession, calculation_id) -> C return result.unique().scalar() -async def create_calculation_result_service(db_session: DbSession, calculation_id: UUID): +async def create_calculation_result_service(db_session: DbSession, calculation_id: UUID, costPerFailure: Optional[float]): days = 60 calculation = await get_calculation_data_by_id(db_session=db_session, calculation_id=calculation_id) reference = calculation.reference_id if calculation.overhaul_reference_type == OverhaulReferenceType.ASSET else await get(db_session=db_session, scope_id=calculation.reference_id) # Parameter overhaulCost = calculation.parameter.overhaul_cost - costPerFailure = calculation.parameter.avg_failure_cost + costPerFailure = costPerFailure if costPerFailure else calculation.parameter.avg_failure_cost overhaul_cost_points = get_overhaul_cost_by_time_chart( overhaulCost, days=days) @@ -168,19 +170,28 @@ async def get_calculation_by_reference_and_parameter(*, db_session: DbSession, c CalculationData.reference_id == calculation_reference_id, CalculationData.parameter_id == parameter_id, )) - + result = await db_session.execute(stmt) - + return result.scalar() -async def get_calculation_result_by_day(*, db_session:DbSession, calculation_id, simulation_day): +async def get_calculation_result_by_day(*, db_session: DbSession, calculation_id, simulation_day): stmt = select(CalculationResult).filter(and_( CalculationResult.day == simulation_day, CalculationResult.calculation_data_id == calculation_id )) - + result = await db_session.execute(stmt) - + return result.scalar() - + + +async def get_avg_cost_by_asset(*, db_session: DbSession, assetnum: str): + stmt = ( + select(func.avg(MasterWorkOrder.total_cost_max).label('average_cost')) + .where(MasterWorkOrder.assetnum == assetnum) + ) + + result = await db_session.execute(stmt) + return result.scalar_one_or_none()