diff --git a/src/api.py b/src/api.py index c7de630..de0049d 100644 --- a/src/api.py +++ b/src/api.py @@ -31,8 +31,6 @@ from src.scope_equipment_job.router import router as scope_equipment_job_router # from src.master_activity.router import router as activity_router - - class ErrorMessage(BaseModel): msg: str diff --git a/src/calculation_time_constrains/router.py b/src/calculation_time_constrains/router.py index a4ef915..43160e8 100644 --- a/src/calculation_time_constrains/router.py +++ b/src/calculation_time_constrains/router.py @@ -15,9 +15,9 @@ from .schema import (CalculationResultsRead, CalculationTimeConstrainsParametersCreate, CalculationTimeConstrainsParametersRead, CalculationTimeConstrainsParametersRetrive, - CalculationTimeConstrainsRead) + CalculationTimeConstrainsRead, EquipmentResult) from .service import (bulk_update_equipment, get_calculation_result, - get_calculation_result_by_day) + get_calculation_result_by_day, get_calculation_by_assetnum) router = APIRouter() @@ -92,6 +92,21 @@ async def get_calculation_results(db_session: DbSession, calculation_id): message="Data retrieved successfully", ) +@router.get( + "/{calculation_id}/{assetnum}", response_model=StandardResponse[EquipmentResult] +) +async def get_calculation_per_equipment(db_session: DbSession, calculation_id, assetnum): + + results = await get_calculation_by_assetnum( + db_session=db_session, assetnum=assetnum, calculation_id=calculation_id + ) + + return StandardResponse( + data=results, + message="Data retrieved successfully", + ) + + @router.post( "/{calculation_id}/simulation", diff --git a/src/calculation_time_constrains/service.py b/src/calculation_time_constrains/service.py index e8bc038..7b7fb1c 100644 --- a/src/calculation_time_constrains/service.py +++ b/src/calculation_time_constrains/service.py @@ -11,6 +11,7 @@ from sqlalchemy.orm import joinedload from src.database.core import DbSession from src.overhaul_activity.service import get_all_by_session_id from src.overhaul_scope.service import get as get_scope +from src.utils import get_latest_numOfFail from src.workorder.model import MasterWorkOrder from .model import (CalculationData, CalculationEquipmentResult, @@ -20,7 +21,6 @@ from .schema import (CalculationResultsRead, CalculationTimeConstrainsParametersCreate, CalculationTimeConstrainsRead, OptimumResult) -from src.utils import get_latest_numOfFail def get_overhaul_cost_by_time_chart( overhaul_cost: float, days: int, numEquipments: int, decay_base: float = 1.01 @@ -32,7 +32,7 @@ def get_overhaul_cost_by_time_chart( hours = days * 24 - rate = np.arange(1, hours+1) + rate = np.arange(1, hours + 1) cost_per_equipment = overhaul_cost / numEquipments @@ -79,7 +79,7 @@ async def get_corrective_cost_time_chart( ## Get latest data fromdata_today # latest_num_of_fail:float = get_latest_numOfFail(location_tag=location_tag, token=token) - latest_num = data['data'][-1]['num_fail'] + latest_num = data["data"][-1]["num_fail"] if not latest_num: latest_num = 1 @@ -94,7 +94,6 @@ async def get_corrective_cost_time_chart( for item in data["data"] } - # Fill in missing dates with nearest available value complete_data = [] last_known_value = 0 # Default value if no data is available @@ -112,8 +111,6 @@ async def get_corrective_cost_time_chart( hourly_failure = np.repeat(daily_failure, 24) / 24 - - # failure_counts = np.cumsum(daily_failure) # Calculate corrective costs @@ -124,7 +121,6 @@ async def get_corrective_cost_time_chart( corrective_costs = hourly_failure * cost_per_failure - return corrective_costs, hourly_failure except Exception as e: @@ -185,7 +181,7 @@ async def create_param_and_data( async def get_calculation_result(db_session: DbSession, calculation_id: str): - days = 667*24 + days = 667 * 24 scope_calculation = await get_calculation_data_by_id( db_session=db_session, calculation_id=calculation_id ) @@ -249,6 +245,19 @@ async def get_calculation_data_by_id( return result.unique().scalar() +async def get_calculation_by_assetnum( + *, db_session: DbSession, assetnum: str, calculation_id: str +): + stmt = ( + select(CalculationEquipmentResult) + .where(CalculationEquipmentResult.assetnum == assetnum) + .where(CalculationEquipmentResult.calculation_data_id == calculation_id) + ) + result = await db_session.execute(stmt) + + return result.scalar() + + # async def create_calculation_result_service(db_session: DbSession, calculation_id: UUID, costPerFailure: Optional[float] = None): # days = 360 # calculation = await get_calculation_data_by_id(db_session=db_session, calculation_id=calculation_id) @@ -327,8 +336,8 @@ async def create_calculation_result_service( # Store results for each equipment equipment_results: List[CalculationEquipmentResult] = [] - total_corrective_costs = np.zeros(days*24) - total_daily_failures = np.zeros(days*24) + total_corrective_costs = np.zeros(days * 24) + total_daily_failures = np.zeros(days * 24) # Calculate for each equipment for eq in equipments: @@ -337,7 +346,7 @@ async def create_calculation_result_service( service_cost=eq.service_cost, token=token, location_tag=eq.equipment.location_tag, - max_days=667 + max_days=667, ) overhaul_cost_points = get_overhaul_cost_by_time_chart( diff --git a/src/overhaul_job/router.py b/src/overhaul_job/router.py index e1066ad..f0d1615 100644 --- a/src/overhaul_job/router.py +++ b/src/overhaul_job/router.py @@ -9,7 +9,7 @@ from src.models import StandardResponse from .schema import (OverhaulJobBase, OverhaulJobCreate, OverhaulJobPagination, OverhaulJobRead) -from .service import create, get_all, delete +from .service import create, delete, get_all router = APIRouter() @@ -45,8 +45,9 @@ async def create_overhaul_equipment_jobs( message="Data created successfully", ) + @router.delete("/{overhaul_job_id}", response_model=StandardResponse[None]) -async def delete_overhaul_equipment_job(db_session: DbSession,overhaul_job_id): +async def delete_overhaul_equipment_job(db_session: DbSession, overhaul_job_id): await delete(db_session=db_session, overhaul_job_id=overhaul_job_id) return StandardResponse( diff --git a/src/overhaul_job/service.py b/src/overhaul_job/service.py index f15f62c..028975b 100644 --- a/src/overhaul_job/service.py +++ b/src/overhaul_job/service.py @@ -1,5 +1,6 @@ from typing import Optional +from fastapi import HTTPException, status from sqlalchemy import Delete, Select, func from sqlalchemy.orm import selectinload @@ -10,7 +11,6 @@ from src.database.service import search_filter_sort_paginate from .model import OverhaulJob from .schema import OverhaulJobCreate -from fastapi import HTTPException, status async def get_all(*, common, overhaul_equipment_id: str): """Returns all documents.""" @@ -78,9 +78,9 @@ async def delete( scope_job = await db_session.get(OverhaulJob, overhaul_job_id) if not scope_job: raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail="A data with this id does not exist.", - ) + status_code=status.HTTP_404_NOT_FOUND, + detail="A data with this id does not exist.", + ) # Perform deletion await db_session.delete(scope_job) @@ -92,6 +92,7 @@ async def delete( await db_session.rollback() raise + # async def update(*, db_session: DbSession, scope: OverhaulScope, scope_in: ScopeUpdate): # """Updates a document.""" # data = scope_in.model_dump() diff --git a/src/scope_equipment/schema.py b/src/scope_equipment/schema.py index e03aa77..fec2884 100644 --- a/src/scope_equipment/schema.py +++ b/src/scope_equipment/schema.py @@ -34,7 +34,7 @@ class ScopeEquipmentRead(ScopeEquipmentBase): id: UUID assetnum: str assigned_date: datetime - master_equipment: Optional[MasterEquipmentBase] =Field(None) + master_equipment: Optional[MasterEquipmentBase] = Field(None) class ScopeEquipmentPagination(Pagination): diff --git a/src/scope_equipment_job/service.py b/src/scope_equipment_job/service.py index 85214b4..8721668 100644 --- a/src/scope_equipment_job/service.py +++ b/src/scope_equipment_job/service.py @@ -1,23 +1,21 @@ import random from typing import Optional +from fastapi import HTTPException, status from sqlalchemy import Delete, Select, and_ from sqlalchemy.orm import selectinload from src.auth.service import CurrentUser from src.database.core import DbSession from src.database.service import CommonParameters, search_filter_sort_paginate +from src.overhaul_activity.model import OverhaulActivity +from src.overhaul_job.model import OverhaulJob from src.scope_equipment.model import MasterEquipment, MasterEquipmentTree from src.scope_equipment.service import get_equipment_level_by_no from .model import ScopeEquipmentJob from .schema import ScopeEquipmentJobCreate -from src.overhaul_job.model import OverhaulJob -from src.overhaul_activity.model import OverhaulActivity - -from fastapi import HTTPException, status - # async def get(*, db_session: DbSession, scope_equipment_activity_id: str) -> Optional[ScopeEquipmentActivity]: # """Returns a document based on the given document id.""" # result = await db_session.get(ScopeEquipmentActivity, scope_equipment_activity_id) @@ -117,9 +115,9 @@ async def delete( scope_job = await db_session.get(ScopeEquipmentJob, scope_job_id) if not scope_job: raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail="A data with this id does not exist.", - ) + status_code=status.HTTP_404_NOT_FOUND, + detail="A data with this id does not exist.", + ) # Perform deletion await db_session.delete(scope_job) diff --git a/src/utils.py b/src/utils.py index 4b9dff1..9d6aa8f 100644 --- a/src/utils.py +++ b/src/utils.py @@ -89,29 +89,33 @@ def parse_date_string(date_str: str) -> Optional[datetime]: def time_now(): return datetime.now(pytz.timezone(TIMEZONE)) + import requests -def get_latest_numOfFail(location_tag, token)-> float: + +def get_latest_numOfFail(location_tag, token) -> float: today = datetime.today().strftime("%Y-%m-%d") url_today = f"http://192.168.1.82:8000/reliability/main/number-of-failures/{location_tag}/2016-01-01/{today}" try: - response = requests.get(url_today, { - "Content-Type": "application/json", - "Authorization": f"Bearer {token}", - }) + response = requests.get( + url_today, + { + "Content-Type": "application/json", + "Authorization": f"Bearer {token}", + }, + ) data = response.json() raise Exception(data) - latest_num = data['data'][-1]['num_fail'] + latest_num = data["data"][-1]["num_fail"] raise Exception(latest_num) if not latest_num: latest_num = 0 - return latest_num except requests.exceptions.RequestException as e: print(f"Error fetching data: {e}") diff --git a/tests/factories.py b/tests/factories.py index 8554ac0..c15b514 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -13,7 +13,6 @@ from .database import Session # from pytz import UTC - fake = Faker() fake.add_provider(misc)