diff --git a/src/api.py b/src/api.py index 293737b..bf6bdb9 100644 --- a/src/api.py +++ b/src/api.py @@ -26,6 +26,7 @@ from src.overhaul_scope.router import router as scope_router 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.scope_equipment_job.router import router as scope_equipment_job_router +from src.job.router import router as job_router class ErrorMessage(BaseModel): msg: str @@ -58,6 +59,8 @@ authenticated_api_router = APIRouter(dependencies=[Depends(JWTBearer())], authenticated_api_router.include_router( overhaul_router, prefix="/overhauls", tags=["overhaul"]) +authenticated_api_router.include_router( + job_router, prefix="/jobs", tags=["job"]) # # Overhaul session data authenticated_api_router.include_router( @@ -72,7 +75,7 @@ authenticated_api_router.include_router( ) authenticated_api_router.include_router( - scope_equipment_job_router, prefix="/scope-equipment-jobs" + scope_equipment_job_router, prefix="/scope-equipment-jobs", tags=["scope_equipment", "job"] ) # authenticated_api_router.include_router( diff --git a/src/job/model.py b/src/job/model.py index 20452b2..5eabb12 100644 --- a/src/job/model.py +++ b/src/job/model.py @@ -10,7 +10,7 @@ from sqlalchemy.ext.hybrid import hybrid_property class MasterActivity(Base, DefaultMixin): __tablename__ = "oh_ms_job" - name = Column(String, nullable=False) + description = Column(String, nullable=False) # details = relationship( # "MasterActivityDetail", diff --git a/src/job/schema.py b/src/job/schema.py index 6de64e8..5fecd9f 100644 --- a/src/job/schema.py +++ b/src/job/schema.py @@ -8,7 +8,7 @@ from src.models import DefultBase, Pagination class ActivityMaster(DefultBase): - name: str + pass class ActivityMasterDetail(DefultBase): @@ -21,7 +21,7 @@ class ActivityMasterCreate(ActivityMaster): class ActivityMasterRead(ActivityMaster): id: UUID - details: List[ActivityMasterDetail] = [] + description: str class ActivityMasterPagination(Pagination): diff --git a/src/job/service.py b/src/job/service.py index 2dead4e..48a3665 100644 --- a/src/job/service.py +++ b/src/job/service.py @@ -4,7 +4,7 @@ from sqlalchemy import Select, Delete from sqlalchemy.orm import joinedload, selectinload from typing import Optional -from .model import MasterActivity, MasterActivityDetail +from .model import MasterActivity from .schema import ActivityMaster, ActivityMasterCreate from src.database.core import DbSession @@ -19,8 +19,7 @@ async def get(*, db_session: DbSession, activity_id: str) -> Optional[ActivityMa async def get_all(common: CommonParameters): - query = Select(MasterActivity).options( - selectinload(MasterActivity.details)) + query = Select(MasterActivity) results = await search_filter_sort_paginate(model=query, **common) diff --git a/src/overhaul_activity/router.py b/src/overhaul_activity/router.py index f3cf3a2..95c4f53 100644 --- a/src/overhaul_activity/router.py +++ b/src/overhaul_activity/router.py @@ -1,5 +1,5 @@ -from typing import Optional +from typing import List, Optional from uuid import UUID from fastapi import APIRouter, HTTPException, Query, status @@ -25,7 +25,7 @@ async def get_scope_equipments(common: CommonParameters, overhaul_session: str, ) -@ router.post("/{overhaul_session}", response_model=StandardResponse[OverhaulActivityRead]) +@ router.post("/{overhaul_session}", response_model=StandardResponse[List[str]]) async def create_overhaul_equipment(db_session: DbSession, overhaul_activty_in: OverhaulActivityCreate, overhaul_session: str): activity = await create(db_session=db_session, overhaul_activty_in=overhaul_activty_in, overhaul_session_id=overhaul_session) diff --git a/src/overhaul_activity/schema.py b/src/overhaul_activity/schema.py index 315e1a4..9875ac7 100644 --- a/src/overhaul_activity/schema.py +++ b/src/overhaul_activity/schema.py @@ -9,7 +9,7 @@ from src.scope_equipment.schema import MasterEquipmentRead class OverhaulActivityBase(DefultBase): - assetnum: str = Field(..., description="Assetnum is required") + pass class OverhaulActivityCreate(OverhaulActivityBase): @@ -25,6 +25,7 @@ class OverhaulActivityRead(OverhaulActivityBase): id: UUID material_cost: Optional[float] = Field(0) service_cost: Optional[float] = Field(0) + assetnum: str = Field(..., description="Assetnum is required") status: str equipment: MasterEquipmentRead diff --git a/src/overhaul_activity/service.py b/src/overhaul_activity/service.py index 1e1ca9e..254e570 100644 --- a/src/overhaul_activity/service.py +++ b/src/overhaul_activity/service.py @@ -2,9 +2,10 @@ import asyncio from uuid import UUID -from sqlalchemy import Select, Delete, func, insert, select, update as sqlUpdate +from sqlalchemy import Select, Delete, func, select, update as sqlUpdate from sqlalchemy.orm import joinedload from typing import List, Optional +from sqlalchemy.dialects.postgresql import insert from src.overhaul_activity.utils import get_material_cost, get_service_cost from src.overhaul_scope.model import OverhaulScope @@ -88,41 +89,44 @@ async def create(*, db_session: DbSession, overhaul_activty_in: OverhaulActivity return [] # Get session and count in parallel - session, equipment_count = await asyncio.gather( - get_session(db_session=db_session, overhaul_session_id=overhaul_session_id), - db_session.scalar( - select(func.count()) - .select_from(OverhaulActivity) - .where(OverhaulActivity.overhaul_scope_id == overhaul_session_id) - ) + session = await get_session(db_session=db_session, overhaul_session_id=overhaul_session_id) + equipment_count = await db_session.scalar( + select(func.count()) + .select_from(OverhaulActivity) + .where(OverhaulActivity.overhaul_scope_id == overhaul_session_id) ) # Calculate costs for all records total_equipment = equipment_count + len(assetnums) - material_cost = get_material_cost(scope=session.type, total_equipment=total_equipment) - service_cost = get_service_cost(scope=session.type, total_equipment=total_equipment) - - # Bulk create new activities - overhaul_activities = [ - OverhaulActivity( - assetnum=assetnum, - overhaul_scope_id=overhaul_session_id, - material_cost=material_cost, - service_cost=service_cost - ) + material_cost = get_material_cost( + scope=session.type, total_equipment=total_equipment) + service_cost = get_service_cost( + scope=session.type, total_equipment=total_equipment) + + # Create the insert statement + stmt = insert(OverhaulActivity).values([ + { + 'assetnum': assetnum, + 'overhaul_scope_id': overhaul_session_id, + 'material_cost': material_cost, + 'service_cost': service_cost + } for assetnum in assetnums - ] - - # Add new records and update all existing records in parallel - await asyncio.gather( - db_session.add_all(overhaul_activities), - db_session.execute( - update(OverhaulActivity) - .where(OverhaulActivity.overhaul_scope_id == overhaul_session_id) - .values(material_cost=material_cost, service_cost=service_cost) + ]) + + # Add the ON CONFLICT DO NOTHING clause + stmt = stmt.on_conflict_do_nothing( + index_elements=["assetnum", "overhaul_scope_id"] ) + + # Execute the statement + db_session.execute(stmt) + await db_session.execute( + sqlUpdate(OverhaulActivity) + .where(OverhaulActivity.overhaul_scope_id == overhaul_session_id) + .values(material_cost=material_cost, service_cost=service_cost) ) - + await db_session.commit() return assetnums diff --git a/src/scope_equipment_job/model.py b/src/scope_equipment_job/model.py index cba145b..ea7cac7 100644 --- a/src/scope_equipment_job/model.py +++ b/src/scope_equipment_job/model.py @@ -8,7 +8,7 @@ from sqlalchemy.ext.hybrid import hybrid_property class ScopeEquipmentJob(Base, DefaultMixin): - __tablename__ = "oh_mas_scope_equipment_job" + __tablename__ = "oh_ms_scope_equipment_job" assetnum = Column(String, nullable=False) job_id = Column(UUID(as_uuid=True), ForeignKey( diff --git a/src/scope_equipment_job/schema.py b/src/scope_equipment_job/schema.py index 26b4771..e8097d4 100644 --- a/src/scope_equipment_job/schema.py +++ b/src/scope_equipment_job/schema.py @@ -9,7 +9,7 @@ from src.models import DefultBase, Pagination class ScopeEquipmentJobBase(DefultBase): - assetnum: str = Field(..., description="Assetnum is required") + assetnum: Optional[str] = Field(None, description="Assetnum is required") class ScopeEquipmentJobCreate(ScopeEquipmentJobBase): diff --git a/src/scope_equipment_job/service.py b/src/scope_equipment_job/service.py index 6ce245b..cd8a4c4 100644 --- a/src/scope_equipment_job/service.py +++ b/src/scope_equipment_job/service.py @@ -65,7 +65,7 @@ async def create(*, db_session: DbSession, assetnum, scope_job_in: ScopeEquipmen for job_id in scope_job_in.job_ids: scope_equipment_job = ScopeEquipmentJob( assetnum=assetnum, job_id=job_id) - scope_jobs.appeand(scope_equipment_job) + scope_jobs.append(scope_equipment_job) db_session.add_all(scope_jobs) await db_session.commit()