fix time constaint calculation

main
Cizz22 12 months ago
parent 3c95085bf8
commit a770bf85d5

@ -10,7 +10,6 @@ from src.auth.service import JWTBearer
# from src.overhaul_scope.router import router as scope_router # from src.overhaul_scope.router import router as scope_router
# from src.scope_equipment.router import router as scope_equipment_router # from src.scope_equipment.router import router as scope_equipment_router
# from src.overhaul.router import router as overhaul_router # from src.overhaul.router import router as overhaul_router
# from src.calculation_time_constrains.router import router as calculation_time_constrains_router
# from src.overhaul_history.router import router as overhaul_history_router # from src.overhaul_history.router import router as overhaul_history_router
# from src.overhaul_activity.router import router as scope_equipment_activity_router # from src.overhaul_activity.router import router as scope_equipment_activity_router
# # from src.overhaul_schedule.router import router as ovehaul_schedule_router # # from src.overhaul_schedule.router import router as ovehaul_schedule_router
@ -27,6 +26,9 @@ from src.overhaul_activity.router import router as overhaul_activity_router
from src.calculation_target_reliability.router import router as calculation_target_reliability from src.calculation_target_reliability.router import router as calculation_target_reliability
from src.scope_equipment_job.router import router as scope_equipment_job_router from src.scope_equipment_job.router import router as scope_equipment_job_router
from src.job.router import router as job_router from src.job.router import router as job_router
from src.calculation_time_constrains.router import router as calculation_time_constrains_router
class ErrorMessage(BaseModel): class ErrorMessage(BaseModel):
msg: str msg: str
@ -101,9 +103,9 @@ authenticated_api_router.include_router(
# calculation # calculation
calculation_router = APIRouter(prefix="/calculation", tags=["calculations"]) calculation_router = APIRouter(prefix="/calculation", tags=["calculations"])
# # Time constrains # Time constrains
# calculation_router.include_router( calculation_router.include_router(
# calculation_time_constrains_router, prefix="/time-constraint", tags=["calculation", "time_constraint"]) calculation_time_constrains_router, prefix="/time-constraint", tags=["calculation", "time_constraint"])
# Target reliability # Target reliability
calculation_router.include_router( calculation_router.include_router(

@ -66,6 +66,7 @@ async def create_calculation(*, db_session: DbSession, calculation_time_constrai
results = await create_calculation_result_service(db_session=db_session, calculation_id=calculation_data.id) results = await create_calculation_result_service(db_session=db_session, calculation_id=calculation_data.id)
return results return results

@ -62,9 +62,12 @@ class CalculationData(Base, DefaultMixin, IdentityMixin):
parameter_id = Column(UUID(as_uuid=True), ForeignKey( parameter_id = Column(UUID(as_uuid=True), ForeignKey(
'oh_ms_calculation_param.id'), nullable=True) 'oh_ms_calculation_param.id'), nullable=True)
overhaul_session_id= Column(UUID(as_uuid=True), ForeignKey('oh_ms_overhaul.id')) overhaul_session_id= Column(UUID(as_uuid=True), ForeignKey('oh_ms_overhaul_scope.id'))
optimum_oh_day = Column(Integer, nullable=True) optimum_oh_day = Column(Integer, nullable=True)
session = relationship(
"OverhaulScope", lazy="raise")
parameter = relationship( parameter = relationship(
"CalculationParam", back_populates="calculation_data") "CalculationParam", back_populates="calculation_data")
@ -72,8 +75,7 @@ class CalculationData(Base, DefaultMixin, IdentityMixin):
@classmethod @classmethod
async def create_with_param( async def create_with_param(
cls, cls,
overhaul_reference_type: str, overhaul_session_id: str,
reference_id: Union[str, UUID],
db: DbSession, db: DbSession,
avg_failure_cost: Optional[float], avg_failure_cost: Optional[float],
overhaul_cost: Optional[float], overhaul_cost: Optional[float],
@ -93,8 +95,7 @@ class CalculationData(Base, DefaultMixin, IdentityMixin):
params_id = params.id params_id = params.id
calculation_data = cls( calculation_data = cls(
overhaul_reference_type=overhaul_reference_type, overhaul_session_id=overhaul_session_id,
reference_id=str(reference_id),
created_by=created_by, created_by=created_by,
parameter_id=params_id parameter_id=params_id
) )

@ -6,6 +6,7 @@ from uuid import UUID
from pydantic import Field from pydantic import Field
from src.models import DefultBase from src.models import DefultBase
from dataclasses import dataclass
class CalculationTimeConstrainsBase(DefultBase): class CalculationTimeConstrainsBase(DefultBase):
@ -54,13 +55,28 @@ class CalculationResultsRead(CalculationTimeConstrainsBase):
overhaul_cost: float overhaul_cost: float
num_failures: int num_failures: int
class OptimumResult(CalculationTimeConstrainsBase):
overhaul_cost: float
corrective_cost: float
num_failures: int
days: int
class EquipmentResult(CalculationTimeConstrainsBase):
corrective_costs: List[float]
overhaul_costs: List[float]
daily_failures: List[float]
assetnum: str
material_cost: float
service_cost: float
optimum: OptimumResult # Added optimum result for each equipment
class CalculationTimeConstrainsRead(CalculationTimeConstrainsBase): class CalculationTimeConstrainsRead(CalculationTimeConstrainsBase):
id: Union[UUID, str] id: Union[UUID, str]
name: str reference: UUID
results: List[Any] results: List[CalculationResultsRead]
equipment_results: List[Any] equipment_results: List[EquipmentResult]
optimumOh: Dict[str, Any] optimum_oh: Any
class CalculationTimeConstrainsCreate(CalculationTimeConstrainsBase): class CalculationTimeConstrainsCreate(CalculationTimeConstrainsBase):
@ -71,19 +87,4 @@ class CalculationTimeConstrainsSimulationRead(CalculationTimeConstrainsBase):
simulation: CalculationResultsRead simulation: CalculationResultsRead
@dataclass
class EquipmentResult:
corrective_costs: List[float]
overhaul_costs: List[float]
daily_failures: List[float]
equipment_id: str
material_cost: float
service_cost: float
optimum: OptimumResult # Added optimum result for each equipment
@dataclass
class OptimumResult:
overhaul_cost: float
corrective_cost: float
num_failures: int
days: int

@ -1,4 +1,4 @@
from typing import List, Optional from typing import List, Optional, Tuple
from uuid import UUID from uuid import UUID
import numpy as np import numpy as np
from sqlalchemy import and_, func, select from sqlalchemy import and_, func, select
@ -17,6 +17,7 @@ from src.scope_equipment.service import get_by_assetnum
def get_overhaul_cost_by_time_chart(overhaul_cost: float, days: int) -> list: def get_overhaul_cost_by_time_chart(overhaul_cost: float, days: int) -> list:
exponents = np.arange(0, days) exponents = np.arange(0, days)
results = overhaul_cost / (2 ** exponents) results = overhaul_cost / (2 ** exponents)
results = np.where(np.isfinite(results), results, 0)
return results return results
@ -43,24 +44,10 @@ def get_corrective_cost_time_chart(material_cost: float, service_cost: float, da
async def create_param_and_data(*, db_session: DbSession, calculation_param_in: CalculationTimeConstrainsParametersCreate, created_by: str, parameter_id: Optional[UUID] = None): async def create_param_and_data(*, db_session: DbSession, calculation_param_in: CalculationTimeConstrainsParametersCreate, created_by: str, parameter_id: Optional[UUID] = None):
"""Creates a new document.""" """Creates a new document."""
if calculation_param_in.scopeOH is None and calculation_param_in.assetnum is None: if calculation_param_in.ohSessionId is None:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail="Either scope_id or assetnum must be provided" detail="overhaul_session_id is required"
)
if calculation_param_in.scopeOH is not None and calculation_param_in.assetnum is not None:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Only one of scope_id or assetnum must be provided"
)
scope = await get_by_scope_name(db_session=db_session, scope_name=calculation_param_in.scopeOH) if calculation_param_in.scopeOH is not None else None
if calculation_param_in.scopeOH is not None and scope is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Scope not found"
) )
calculationData = await CalculationData.create_with_param( calculationData = await CalculationData.create_with_param(
@ -217,7 +204,7 @@ async def create_calculation_result_service(
corrective_costs=corrective_costs.tolist(), corrective_costs=corrective_costs.tolist(),
overhaul_costs=overhaul_cost_points.tolist(), overhaul_costs=overhaul_cost_points.tolist(),
daily_failures=daily_failures.tolist(), daily_failures=daily_failures.tolist(),
equipment_id=eq.id, assetnum=eq.assetnum,
material_cost=eq.material_cost, material_cost=eq.material_cost,
service_cost=eq.service_cost, service_cost=eq.service_cost,
optimum=equipment_optimum optimum=equipment_optimum
@ -262,7 +249,6 @@ async def create_calculation_result_service(
# Return results including individual equipment data # Return results including individual equipment data
return CalculationTimeConstrainsRead( return CalculationTimeConstrainsRead(
id=calculation.id, id=calculation.id,
name=calculation.name,
reference=calculation.overhaul_session_id, reference=calculation.overhaul_session_id,
results=calculation_results, results=calculation_results,
optimum_oh=optimum, optimum_oh=optimum,

@ -18,4 +18,4 @@ class OverhaulScope(Base, DefaultMixin):
activity_equipments = relationship( activity_equipments = relationship(
"OverhaulActivity", "OverhaulActivity",
lazy="selectin" lazy="selectin"
) )

@ -8,6 +8,7 @@ from src.scope_equipment.service import get_by_scope_name
from src.utils import time_now from src.utils import time_now
from .model import OverhaulScope from .model import OverhaulScope
from .schema import ScopeCreate, ScopeUpdate from .schema import ScopeCreate, ScopeUpdate
from .utils import get_material_cost, get_service_cost
from typing import Optional from typing import Optional
from src.database.core import DbSession from src.database.core import DbSession
@ -48,12 +49,15 @@ async def create(*, db_session: DbSession, scope_in: ScopeCreate):
scope_name=scope_name scope_name=scope_name
) )
material_cost = get_material_cost(scope=overhaul_session.type, total_equipment=len(equipments))
service_cost = get_service_cost(scope=overhaul_session.type, total_equipment=len(equipments))
scope_equipments = [ scope_equipments = [
OverhaulActivity( OverhaulActivity(
assetnum=equipment.assetnum, assetnum=equipment.assetnum,
overhaul_scope_id=overhaul_session.id, overhaul_scope_id=overhaul_session.id,
material_cost=100000, material_cost=material_cost,
service_cost=100000, service_cost=service_cost,
) )
for equipment in equipments for equipment in equipments
] ]

@ -0,0 +1,33 @@
from decimal import Decimal, getcontext
def get_material_cost(scope, total_equipment):
# Set precision to 28 digits (maximum precision for Decimal)
getcontext().prec = 28
if not total_equipment: # Guard against division by zero
return float(0)
if scope == 'B':
result = Decimal('365539731101') / Decimal(str(total_equipment))
return float(result)
else:
result = Decimal('8565468127') / Decimal(str(total_equipment))
return float(result)
return float(0)
def get_service_cost(scope, total_equipment):
# Set precision to 28 digits (maximum precision for Decimal)
getcontext().prec = 28
if not total_equipment: # Guard against division by zero
return float(0)
if scope == 'B':
result = Decimal('36405830225') / Decimal(str(total_equipment))
return float(result)
else:
result = Decimal('36000000000') / Decimal(str(total_equipment))
return float(result)
return float(0)
Loading…
Cancel
Save