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.
108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
from typing import Optional
|
|
from uuid import UUID
|
|
|
|
import numpy as np
|
|
from fastapi import HTTPException
|
|
from fastapi import status
|
|
from sqlalchemy import Select
|
|
from sqlalchemy import func
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import joinedload
|
|
|
|
from src.database.core import DbSession
|
|
from src.auth.service import Token
|
|
from src.overhaul_scope.service import get_all
|
|
from src.scope_equipment.model import ScopeEquipment
|
|
from src.scope_equipment.service import get_by_assetnum
|
|
from src.workorder.model import MasterWorkOrder
|
|
|
|
from .schema import CalculationTimeConstrainsParametersCreate
|
|
from .schema import CalculationTimeConstrainsParametersRead
|
|
from .schema import CalculationTimeConstrainsParametersRetrive
|
|
from .schema import CalculationTimeConstrainsRead
|
|
from .service import create_calculation_result_service
|
|
from .service import create_param_and_data
|
|
from .service import get_avg_cost_by_asset
|
|
from .service import get_calculation_by_reference_and_parameter
|
|
from .service import get_calculation_data_by_id
|
|
from .service import get_calculation_result
|
|
from .service import get_corrective_cost_time_chart
|
|
from .service import get_overhaul_cost_by_time_chart
|
|
|
|
|
|
async def get_create_calculation_parameters(*, db_session: DbSession, calculation_id: Optional[str] = None):
|
|
if calculation_id is not None:
|
|
calculation = await get_calculation_data_by_id(calculation_id=calculation_id, db_session=db_session)
|
|
|
|
if not calculation:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="A data with this id does not exist.",
|
|
)
|
|
|
|
return CalculationTimeConstrainsParametersRead(
|
|
costPerFailure=calculation.parameter.avg_failure_cost,
|
|
overhaulCost=calculation.parameter.overhaul_cost,
|
|
reference=calculation
|
|
)
|
|
|
|
stmt = (
|
|
select(
|
|
ScopeEquipment.scope_id,
|
|
func.avg(MasterWorkOrder.total_cost_max).label('average_cost')
|
|
)
|
|
.outerjoin(MasterWorkOrder, ScopeEquipment.assetnum == MasterWorkOrder.assetnum)
|
|
.group_by(ScopeEquipment.scope_id)
|
|
.order_by(ScopeEquipment.scope_id)
|
|
)
|
|
|
|
results = await db_session.execute(stmt)
|
|
costFailure = results.all()
|
|
scopes = await get_all(db_session=db_session)
|
|
avaiableScopes = {scope.id: scope.scope_name for scope in scopes}
|
|
costFailurePerScope = {avaiableScopes.get(
|
|
costPerFailure[0]): costPerFailure[1] for costPerFailure in costFailure}
|
|
|
|
return CalculationTimeConstrainsParametersRetrive(
|
|
costPerFailure=costFailurePerScope,
|
|
availableScopes=avaiableScopes.values(),
|
|
recommendedScope="A",
|
|
# historicalData={
|
|
# "averageOverhaulCost": 10000000,
|
|
# "lastCalculation": {
|
|
# "id": "calc_122",
|
|
# "date": "2024-10-15",
|
|
# "scope": "B",
|
|
# },
|
|
# },
|
|
)
|
|
|
|
|
|
async def create_calculation(*,token:str, db_session: DbSession, calculation_time_constrains_in: CalculationTimeConstrainsParametersCreate, created_by: str):
|
|
calculation_data = await create_param_and_data(
|
|
db_session=db_session, calculation_param_in=calculation_time_constrains_in, created_by=created_by)
|
|
|
|
|
|
results = await create_calculation_result_service(db_session=db_session, calculation=calculation_data, token=token)
|
|
|
|
return results
|
|
|
|
|
|
async def get_or_create_scope_equipment_calculation(*, db_session: DbSession, scope_calculation_id, calculation_time_constrains_in: Optional[CalculationTimeConstrainsParametersCreate]):
|
|
scope_calculation = await get_calculation_data_by_id(db_session=db_session, calculation_id=scope_calculation_id)
|
|
|
|
if not scope_calculation:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="A data with this id does not exist.",
|
|
)
|
|
|
|
# Check if calculation already exist
|
|
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
|
|
)
|