diff --git a/src/calculation_time_constrains/flows.py b/src/calculation_time_constrains/flows.py index 4ca8540..dfb01ca 100644 --- a/src/calculation_time_constrains/flows.py +++ b/src/calculation_time_constrains/flows.py @@ -7,7 +7,7 @@ from src.workorder.model import MasterWorkOrder from src.scope_equipment.model import ScopeEquipment from src.database.core import DbSession from src.overhaul_scope.service import get_all -from .schema import CalculationTimeConstrainsParametersRead, CalculationTimeConstrainsParametersRetrive, CalculationTimeConstrainsParametersCreate +from .schema import CalculationTimeConstrainsParametersRead, CalculationTimeConstrainsParametersRetrive, CalculationTimeConstrainsParametersCreate, CalculationTimeConstrainsRead 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 src.scope_equipment.service import get_by_assetnum @@ -80,24 +80,10 @@ async def get_or_create_scope_equipment_calculation(*, db_session: DbSession, sc ) # Check if calculation already exist - scope_equipment_calculation = await get_calculation_by_reference_and_parameter( - db_session=db_session, calculation_reference_id=calculation_time_constrains_in.assetnum, parameter_id=scope_calculation.parameter_id) - - if not scope_equipment_calculation: - # Update Parameter input from scope calculation - costFailure = await 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, costPerFailure=costFailure) - - return results - - results = await get_calculation_result(db_session=db_session, calculation_id=scope_equipment_calculation.id) - - return results + return CalculationTimeConstrainsRead( + id=scope_calculation.id, + reference=scope_calculation.overhaul_session_id, + results=scope_calculation.results, + optimum_oh=scope_calculation.optimum_oh_day, + equipment_results=scope_calculation.equipment_results + ) diff --git a/src/calculation_time_constrains/model.py b/src/calculation_time_constrains/model.py index 5e3b76c..1145137 100644 --- a/src/calculation_time_constrains/model.py +++ b/src/calculation_time_constrains/model.py @@ -2,7 +2,7 @@ from enum import Enum from typing import List, Optional, Union -from sqlalchemy import UUID, Column, Float, ForeignKey, Integer, String +from sqlalchemy import UUID, Column, Float, ForeignKey, Integer, String, JSON, Numeric from sqlalchemy.orm import relationship from src.database.core import Base, DbSession from src.models import DefaultMixin, IdentityMixin, TimeStampMixin, UUIDMixin @@ -70,6 +70,14 @@ class CalculationData(Base, DefaultMixin, IdentityMixin): parameter = relationship( "CalculationParam", back_populates="calculation_data") + + equipment_results = relationship( + "CalculationEquipmentResult", lazy="raise" + ) + + results = relationship( + "CalculationResult", lazy="raise" + ) @classmethod @@ -123,3 +131,19 @@ class CalculationResult(Base, DefaultMixin): parameter = relationship("CalculationParam", back_populates="results") reference_link = relationship("CalculationData") + + +class CalculationEquipmentResult(Base, DefaultMixin): + + __tablename__ = "oh_tr_calculation_equipment_result" + + corrective_costs = Column(JSON, nullable=False) + overhaul_costs = Column(JSON, nullable=False) + daily_failures = Column(JSON, nullable=False) + assetnum = Column(String(255), nullable=False) + material_cost = Column(Float, nullable=False) + service_cost = Column(Float, nullable=False) + calculation_data_id = Column(UUID(as_uuid=True), ForeignKey('oh_tr_calculation_data.id'), nullable=True) + optimum_day = Column(Integer, default=1) + + diff --git a/src/calculation_time_constrains/schema.py b/src/calculation_time_constrains/schema.py index 9867a7a..00c2e0b 100644 --- a/src/calculation_time_constrains/schema.py +++ b/src/calculation_time_constrains/schema.py @@ -69,7 +69,7 @@ class EquipmentResult(CalculationTimeConstrainsBase): assetnum: str material_cost: float service_cost: float - optimum: OptimumResult # Added optimum result for each equipment + optimum_day: int # Added optimum result for each equipment class CalculationTimeConstrainsRead(CalculationTimeConstrainsBase): id: Union[UUID, str] diff --git a/src/calculation_time_constrains/service.py b/src/calculation_time_constrains/service.py index f2856fe..4c02d83 100644 --- a/src/calculation_time_constrains/service.py +++ b/src/calculation_time_constrains/service.py @@ -8,7 +8,7 @@ from src.overhaul_activity.service import get_all_by_session_id from src.scope_equipment.model import ScopeEquipment from src.workorder.model import MasterWorkOrder from .schema import CalculationTimeConstrainsParametersCreate, CalculationTimeConstrainsRead, EquipmentResult, OptimumResult -from .model import CalculationParam, OverhaulReferenceType, CalculationData, CalculationResult +from .model import CalculationParam, OverhaulReferenceType, CalculationData, CalculationResult, CalculationEquipmentResult from fastapi import HTTPException, status from src.overhaul_scope.service import get_by_scope_name, get from src.scope_equipment.service import get_by_assetnum @@ -94,7 +94,7 @@ async def get_calculation_result(db_session: DbSession, calculation_id: str): async def get_calculation_data_by_id(db_session: DbSession, calculation_id) -> CalculationData: stmt = select(CalculationData).filter(CalculationData.id == - calculation_id).options(joinedload(CalculationData.parameter)) + calculation_id).options(joinedload(CalculationData.results), joinedload(CalculationData.equipment_results)) result = await db_session.execute(stmt) return result.unique().scalar() @@ -176,7 +176,7 @@ async def create_calculation_result_service( ) # Store results for each equipment - equipment_results: List[EquipmentResult] = [] + equipment_results: List[CalculationEquipmentResult] = [] total_corrective_costs = np.zeros(days) total_daily_failures = np.zeros(days) @@ -200,19 +200,22 @@ async def create_calculation_result_service( days=int(equipment_optimum_index + 1) ) - equipment_results.append(EquipmentResult( + equipment_results.append(CalculationEquipmentResult( corrective_costs=corrective_costs.tolist(), overhaul_costs=overhaul_cost_points.tolist(), daily_failures=daily_failures.tolist(), assetnum=eq.assetnum, material_cost=eq.material_cost, service_cost=eq.service_cost, - optimum=equipment_optimum + optimum_day=int(equipment_optimum_index + 1), + calculation_data_id=calculation.id )) # Add to totals total_corrective_costs += corrective_costs total_daily_failures += daily_failures + + db_session.add_all(equipment_results) # Calculate optimum points using total costs total_cost = total_corrective_costs + overhaul_cost_points