fix material cost and service cost

main
Cizz22 1 year ago
parent 99b0288239
commit 6b6aa09877

@ -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.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
class ErrorMessage(BaseModel): class ErrorMessage(BaseModel):
msg: str msg: str
@ -58,6 +59,8 @@ authenticated_api_router = APIRouter(dependencies=[Depends(JWTBearer())],
authenticated_api_router.include_router( authenticated_api_router.include_router(
overhaul_router, prefix="/overhauls", tags=["overhaul"]) overhaul_router, prefix="/overhauls", tags=["overhaul"])
authenticated_api_router.include_router(
job_router, prefix="/jobs", tags=["job"])
# # Overhaul session data # # Overhaul session data
authenticated_api_router.include_router( authenticated_api_router.include_router(
@ -72,7 +75,7 @@ authenticated_api_router.include_router(
) )
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( # authenticated_api_router.include_router(

@ -10,7 +10,7 @@ from sqlalchemy.ext.hybrid import hybrid_property
class MasterActivity(Base, DefaultMixin): class MasterActivity(Base, DefaultMixin):
__tablename__ = "oh_ms_job" __tablename__ = "oh_ms_job"
name = Column(String, nullable=False) description = Column(String, nullable=False)
# details = relationship( # details = relationship(
# "MasterActivityDetail", # "MasterActivityDetail",

@ -8,7 +8,7 @@ from src.models import DefultBase, Pagination
class ActivityMaster(DefultBase): class ActivityMaster(DefultBase):
name: str pass
class ActivityMasterDetail(DefultBase): class ActivityMasterDetail(DefultBase):
@ -21,7 +21,7 @@ class ActivityMasterCreate(ActivityMaster):
class ActivityMasterRead(ActivityMaster): class ActivityMasterRead(ActivityMaster):
id: UUID id: UUID
details: List[ActivityMasterDetail] = [] description: str
class ActivityMasterPagination(Pagination): class ActivityMasterPagination(Pagination):

@ -4,7 +4,7 @@ from sqlalchemy import Select, Delete
from sqlalchemy.orm import joinedload, selectinload from sqlalchemy.orm import joinedload, selectinload
from typing import Optional from typing import Optional
from .model import MasterActivity, MasterActivityDetail from .model import MasterActivity
from .schema import ActivityMaster, ActivityMasterCreate from .schema import ActivityMaster, ActivityMasterCreate
from src.database.core import DbSession 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): async def get_all(common: CommonParameters):
query = Select(MasterActivity).options( query = Select(MasterActivity)
selectinload(MasterActivity.details))
results = await search_filter_sort_paginate(model=query, **common) results = await search_filter_sort_paginate(model=query, **common)

@ -1,5 +1,5 @@
from typing import Optional from typing import List, Optional
from uuid import UUID from uuid import UUID
from fastapi import APIRouter, HTTPException, Query, status 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): 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) activity = await create(db_session=db_session, overhaul_activty_in=overhaul_activty_in, overhaul_session_id=overhaul_session)

@ -9,7 +9,7 @@ from src.scope_equipment.schema import MasterEquipmentRead
class OverhaulActivityBase(DefultBase): class OverhaulActivityBase(DefultBase):
assetnum: str = Field(..., description="Assetnum is required") pass
class OverhaulActivityCreate(OverhaulActivityBase): class OverhaulActivityCreate(OverhaulActivityBase):
@ -25,6 +25,7 @@ class OverhaulActivityRead(OverhaulActivityBase):
id: UUID id: UUID
material_cost: Optional[float] = Field(0) material_cost: Optional[float] = Field(0)
service_cost: Optional[float] = Field(0) service_cost: Optional[float] = Field(0)
assetnum: str = Field(..., description="Assetnum is required")
status: str status: str
equipment: MasterEquipmentRead equipment: MasterEquipmentRead

@ -2,9 +2,10 @@
import asyncio import asyncio
from uuid import UUID 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 sqlalchemy.orm import joinedload
from typing import List, Optional 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_activity.utils import get_material_cost, get_service_cost
from src.overhaul_scope.model import OverhaulScope from src.overhaul_scope.model import OverhaulScope
@ -88,41 +89,44 @@ async def create(*, db_session: DbSession, overhaul_activty_in: OverhaulActivity
return [] return []
# Get session and count in parallel # Get session and count in parallel
session, equipment_count = await asyncio.gather( session = await get_session(db_session=db_session, overhaul_session_id=overhaul_session_id)
get_session(db_session=db_session, overhaul_session_id=overhaul_session_id), equipment_count = await db_session.scalar(
db_session.scalar( select(func.count())
select(func.count()) .select_from(OverhaulActivity)
.select_from(OverhaulActivity) .where(OverhaulActivity.overhaul_scope_id == overhaul_session_id)
.where(OverhaulActivity.overhaul_scope_id == overhaul_session_id)
)
) )
# Calculate costs for all records # Calculate costs for all records
total_equipment = equipment_count + len(assetnums) total_equipment = equipment_count + len(assetnums)
material_cost = get_material_cost(scope=session.type, total_equipment=total_equipment) material_cost = get_material_cost(
service_cost = get_service_cost(scope=session.type, total_equipment=total_equipment) scope=session.type, total_equipment=total_equipment)
service_cost = get_service_cost(
# Bulk create new activities scope=session.type, total_equipment=total_equipment)
overhaul_activities = [
OverhaulActivity( # Create the insert statement
assetnum=assetnum, stmt = insert(OverhaulActivity).values([
overhaul_scope_id=overhaul_session_id, {
material_cost=material_cost, 'assetnum': assetnum,
service_cost=service_cost 'overhaul_scope_id': overhaul_session_id,
) 'material_cost': material_cost,
'service_cost': service_cost
}
for assetnum in assetnums for assetnum in assetnums
] ])
# Add new records and update all existing records in parallel # Add the ON CONFLICT DO NOTHING clause
await asyncio.gather( stmt = stmt.on_conflict_do_nothing(
db_session.add_all(overhaul_activities), index_elements=["assetnum", "overhaul_scope_id"]
db_session.execute(
update(OverhaulActivity)
.where(OverhaulActivity.overhaul_scope_id == overhaul_session_id)
.values(material_cost=material_cost, service_cost=service_cost)
) )
# 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() await db_session.commit()
return assetnums return assetnums

@ -8,7 +8,7 @@ from sqlalchemy.ext.hybrid import hybrid_property
class ScopeEquipmentJob(Base, DefaultMixin): class ScopeEquipmentJob(Base, DefaultMixin):
__tablename__ = "oh_mas_scope_equipment_job" __tablename__ = "oh_ms_scope_equipment_job"
assetnum = Column(String, nullable=False) assetnum = Column(String, nullable=False)
job_id = Column(UUID(as_uuid=True), ForeignKey( job_id = Column(UUID(as_uuid=True), ForeignKey(

@ -9,7 +9,7 @@ from src.models import DefultBase, Pagination
class ScopeEquipmentJobBase(DefultBase): class ScopeEquipmentJobBase(DefultBase):
assetnum: str = Field(..., description="Assetnum is required") assetnum: Optional[str] = Field(None, description="Assetnum is required")
class ScopeEquipmentJobCreate(ScopeEquipmentJobBase): class ScopeEquipmentJobCreate(ScopeEquipmentJobBase):

@ -65,7 +65,7 @@ async def create(*, db_session: DbSession, assetnum, scope_job_in: ScopeEquipmen
for job_id in scope_job_in.job_ids: for job_id in scope_job_in.job_ids:
scope_equipment_job = ScopeEquipmentJob( scope_equipment_job = ScopeEquipmentJob(
assetnum=assetnum, job_id=job_id) assetnum=assetnum, job_id=job_id)
scope_jobs.appeand(scope_equipment_job) scope_jobs.append(scope_equipment_job)
db_session.add_all(scope_jobs) db_session.add_all(scope_jobs)
await db_session.commit() await db_session.commit()

Loading…
Cancel
Save