65 lines
2.7 KiB
Python
65 lines
2.7 KiB
Python
from fastapi import APIRouter, HTTPException, Depends
|
|
from sqlalchemy.orm import Session
|
|
from datetime import datetime, timedelta
|
|
from typing import List
|
|
from app.models import Dewar as DewarModel, Slot as SlotModel, LogisticsEvent as LogisticsEventModel
|
|
from app.schemas import LogisticsEventCreate, Slot as SlotSchema, Dewar as DewarSchema
|
|
from app.database import get_db
|
|
import logging
|
|
|
|
router = APIRouter()
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.get("/slots", response_model=List[SlotSchema])
|
|
async def get_all_slots(db: Session = Depends(get_db)):
|
|
slots = db.query(SlotModel).all()
|
|
return slots
|
|
|
|
@router.get("/dewars", response_model=List[DewarSchema])
|
|
async def get_all_dewars(db: Session = Depends(get_db)):
|
|
dewars = db.query(DewarModel).all()
|
|
return dewars
|
|
|
|
@router.get("/dewar/{unique_id}", response_model=DewarSchema)
|
|
async def get_dewar_by_unique_id(unique_id: str, db: Session = Depends(get_db)):
|
|
logger.info(f"Received request for dewar with unique_id: {unique_id}")
|
|
dewar = db.query(DewarModel).filter(DewarModel.unique_id == unique_id.strip()).first()
|
|
if not dewar:
|
|
logger.warning(f"Dewar with unique_id '{unique_id}' not found.")
|
|
raise HTTPException(status_code=404, detail="Dewar not found")
|
|
logger.info(f"Returning dewar: {dewar}")
|
|
return dewar
|
|
|
|
@router.post("/dewar/scan", response_model=dict)
|
|
async def scan_dewar(event_data: LogisticsEventCreate, db: Session = Depends(get_db)):
|
|
dewar_qr_code = event_data.dewar_qr_code
|
|
location_qr_code = event_data.location_qr_code
|
|
transaction_type = event_data.transaction_type
|
|
|
|
dewar = db.query(DewarModel).filter(DewarModel.unique_id == dewar_qr_code).first()
|
|
if not dewar:
|
|
raise HTTPException(status_code=404, detail="Dewar not found")
|
|
|
|
slot = db.query(SlotModel).filter(SlotModel.qr_code == location_qr_code).first()
|
|
if transaction_type == 'incoming':
|
|
if not slot or slot.occupied:
|
|
raise HTTPException(status_code=400, detail="Slot not found or already occupied")
|
|
slot.dewar_id = dewar.id
|
|
slot.occupied = True
|
|
elif transaction_type == 'outgoing':
|
|
if not slot or not slot.occupied or slot.dewar_id != dewar.id:
|
|
raise HTTPException(status_code=400, detail="Slot not found or dewar not associated with slot")
|
|
slot.dewar_id = None
|
|
slot.occupied = False
|
|
|
|
log_event(db, dewar.id, slot.id if slot else None, transaction_type)
|
|
db.commit()
|
|
return {"message": "Status updated successfully"}
|
|
|
|
def log_event(db: Session, dewar_id: int, slot_id: int, event_type: str):
|
|
new_event = LogisticsEventModel(dewar_id=dewar_id, slot_id=slot_id, event_type=event_type)
|
|
db.add(new_event)
|
|
db.commit() |