add endpoint to save calculation

main
Cizz22 12 months ago
parent a770bf85d5
commit c2ff480584

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

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

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

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

Loading…
Cancel
Save