add new endpoint
parent
63dd671ef7
commit
b1f21c8c48
@ -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)
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
from sqlalchemy import UUID, Column, Float, Integer, String, ForeignKey
|
||||||
|
from src.database.core import Base
|
||||||
|
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
from src.workorder.model import MasterWorkOrder
|
||||||
|
from sqlalchemy.ext.hybrid import hybrid_property
|
||||||
|
|
||||||
|
|
||||||
|
class ScopeEquipmentJob(Base, DefaultMixin):
|
||||||
|
__tablename__ = "oh_mas_scope_equipment_job"
|
||||||
|
|
||||||
|
assetnum = Column(String, nullable=False)
|
||||||
|
job_id = Column(UUID(as_uuid=True), ForeignKey(
|
||||||
|
"oh_ms_job.id", ondelete="cascade"))
|
||||||
|
|
||||||
|
master_equipments = relationship(
|
||||||
|
"MasterEquipment", lazy="raise", primaryjoin="and_(ScopeEquipmentJob.assetnum == foreign(MasterEquipment.assetnum))", uselist=False)
|
||||||
|
|
||||||
|
job = relationship(
|
||||||
|
"MasterActivity", lazy="raise"
|
||||||
|
)
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
from typing import Dict, List
|
||||||
|
from fastapi import APIRouter, HTTPException, Query, status
|
||||||
|
|
||||||
|
from .service import get_all, delete, create
|
||||||
|
from .schema import ScopeEquipmentJobCreate, ScopeEquipmentJobPagination
|
||||||
|
|
||||||
|
from src.models import StandardResponse
|
||||||
|
from src.database.service import CommonParameters, search_filter_sort_paginate, DbSession
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/{assetnum}", response_model=StandardResponse[ScopeEquipmentJobPagination])
|
||||||
|
async def get_scope_equipment_jobs(db_session: DbSession, assetnum, common: CommonParameters):
|
||||||
|
"""Get all scope activity pagination."""
|
||||||
|
# return
|
||||||
|
data = await get_all(db_session=db_session, assetnum=assetnum, common=common)
|
||||||
|
|
||||||
|
return StandardResponse(
|
||||||
|
data=data,
|
||||||
|
message="Data retrieved successfully",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/{assetnum}", response_model=StandardResponse[None])
|
||||||
|
async def create_scope_equipment_jobs(db_session: DbSession, assetnum, scope_job_in: ScopeEquipmentJobCreate):
|
||||||
|
"""Get all scope activity pagination."""
|
||||||
|
# return
|
||||||
|
await create(db_session=db_session, assetnum=assetnum, scope_job_in=scope_job_in)
|
||||||
|
|
||||||
|
return StandardResponse(
|
||||||
|
data=None,
|
||||||
|
message="Data created successfully",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete("/{assetnum}", response_model=StandardResponse[None])
|
||||||
|
async def delete_scope_equipment_job(db_session: DbSession, assetnum, scope_job_id):
|
||||||
|
|
||||||
|
await delete(db_session=db_session, assetnum=assetnum, scope_job_id=scope_job_id)
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from typing import Any, Dict, List, Optional
|
||||||
|
from uuid import UUID
|
||||||
|
|
||||||
|
from pydantic import Field, BaseModel
|
||||||
|
from src.job.schema import ActivityMasterRead
|
||||||
|
from src.models import DefultBase, Pagination
|
||||||
|
|
||||||
|
|
||||||
|
class ScopeEquipmentJobBase(DefultBase):
|
||||||
|
assetnum: str = Field(..., description="Assetnum is required")
|
||||||
|
|
||||||
|
|
||||||
|
class ScopeEquipmentJobCreate(ScopeEquipmentJobBase):
|
||||||
|
job_ids: Optional[List[UUID]] = []
|
||||||
|
|
||||||
|
|
||||||
|
class ScopeEquipmentJobUpdate(ScopeEquipmentJobBase):
|
||||||
|
name: Optional[str] = Field(None)
|
||||||
|
cost: Optional[str] = Field(0)
|
||||||
|
|
||||||
|
|
||||||
|
class ScopeEquipmentJobRead(ScopeEquipmentJobBase):
|
||||||
|
id: UUID
|
||||||
|
assetnum: str
|
||||||
|
job: ActivityMasterRead
|
||||||
|
|
||||||
|
|
||||||
|
class ScopeEquipmentJobPagination(Pagination):
|
||||||
|
items: List[ScopeEquipmentJobRead] = []
|
||||||
|
|
||||||
|
|
||||||
|
# {
|
||||||
|
# "overview": {
|
||||||
|
# "totalEquipment": 30,
|
||||||
|
# "nextSchedule": {
|
||||||
|
# "date": "2025-01-12",
|
||||||
|
# "Overhaul": "B",
|
||||||
|
# "equipmentCount": 30
|
||||||
|
# }
|
||||||
|
# },
|
||||||
|
# "criticalParts": [
|
||||||
|
# "Boiler feed pump",
|
||||||
|
# "Boiler reheater system",
|
||||||
|
# "Drum Level (Right) Root Valve A",
|
||||||
|
# "BCP A Discharge Valve",
|
||||||
|
# "BFPT A EXH Press HI Root VLV"
|
||||||
|
# ],
|
||||||
|
# "schedules": [
|
||||||
|
# {
|
||||||
|
# "date": "2025-01-12",
|
||||||
|
# "Overhaul": "B",
|
||||||
|
# "status": "upcoming"
|
||||||
|
# }
|
||||||
|
# // ... other scheduled overhauls
|
||||||
|
# ],
|
||||||
|
# "systemComponents": {
|
||||||
|
# "boiler": {
|
||||||
|
# "status": "operational",
|
||||||
|
# "lastOverhaul": "2024-06-15"
|
||||||
|
# },
|
||||||
|
# "turbine": {
|
||||||
|
# "hpt": { "status": "operational" },
|
||||||
|
# "ipt": { "status": "operational" },
|
||||||
|
# "lpt": { "status": "operational" }
|
||||||
|
# }
|
||||||
|
# // ... other major components
|
||||||
|
# }
|
||||||
|
# }
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
|
||||||
|
|
||||||
|
import random
|
||||||
|
from sqlalchemy import Select, Delete, and_
|
||||||
|
from sqlalchemy.orm import selectinload
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
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.database.core import DbSession
|
||||||
|
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||||
|
from src.auth.service import CurrentUser
|
||||||
|
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
# return result
|
||||||
|
|
||||||
|
|
||||||
|
async def get_all(db_session: DbSession, assetnum: Optional[str], common):
|
||||||
|
# Example usage
|
||||||
|
if not assetnum:
|
||||||
|
raise ValueError("assetnum parameter is required")
|
||||||
|
|
||||||
|
# First get the parent equipment
|
||||||
|
equipment_stmt = Select(MasterEquipment).where(
|
||||||
|
MasterEquipment.assetnum == assetnum)
|
||||||
|
equipment: MasterEquipment = await db_session.scalar(equipment_stmt)
|
||||||
|
|
||||||
|
if not equipment:
|
||||||
|
raise ValueError(f"No equipment found with assetnum: {assetnum}")
|
||||||
|
|
||||||
|
# Build query for parts
|
||||||
|
stmt = (
|
||||||
|
Select(ScopeEquipmentJob)
|
||||||
|
.where(
|
||||||
|
ScopeEquipmentJob.assetnum == assetnum
|
||||||
|
).options(selectinload(ScopeEquipmentJob.job))
|
||||||
|
)
|
||||||
|
|
||||||
|
results = await search_filter_sort_paginate(model=stmt, **common)
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
async def create(*, db_session: DbSession, assetnum, scope_job_in: ScopeEquipmentJobCreate):
|
||||||
|
scope_jobs = []
|
||||||
|
|
||||||
|
if not assetnum:
|
||||||
|
raise ValueError("assetnum parameter is required")
|
||||||
|
|
||||||
|
# First get the parent equipment
|
||||||
|
equipment_stmt = Select(MasterEquipment).where(
|
||||||
|
MasterEquipment.assetnum == assetnum)
|
||||||
|
equipment: MasterEquipment = await db_session.scalar(equipment_stmt)
|
||||||
|
|
||||||
|
if not equipment:
|
||||||
|
raise ValueError(f"No equipment found with assetnum: {assetnum}")
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
db_session.add_all(scope_jobs)
|
||||||
|
await db_session.commit()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
# async def update(*, db_session: DbSession, activity: ScopeEquipmentActivity, scope_equipment_activty_in: ScopeEquipmentActivityUpdate):
|
||||||
|
# """Updates a document."""
|
||||||
|
# data = scope_equipment_activty_in.model_dump()
|
||||||
|
|
||||||
|
# update_data = scope_equipment_activty_in.model_dump(exclude_defaults=True)
|
||||||
|
|
||||||
|
# for field in data:
|
||||||
|
# if field in update_data:
|
||||||
|
# setattr(activity, field, update_data[field])
|
||||||
|
|
||||||
|
# await db_session.commit()
|
||||||
|
|
||||||
|
# return activity
|
||||||
|
|
||||||
|
|
||||||
|
async def delete(*, db_session: DbSession, assetnum, scope_job_id):
|
||||||
|
"""Deletes a document."""
|
||||||
|
activity = await db_session.get(ScopeEquipmentJob, scope_job_id)
|
||||||
|
await db_session.delete(activity)
|
||||||
|
await db_session.commit()
|
||||||
Loading…
Reference in New Issue