from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.core.deps import get_current_user, require_role from app.models.user import User from app.schemas.batch import BatchCreate, BatchUpdate, BatchResponse, BatchDispense, BatchAddStock from app.services.batch import BatchService router = APIRouter() @router.get("/medicine/{medicine_id}", response_model=List[BatchResponse]) async def list_batches_by_medicine( medicine_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = BatchService(db) batches = await service.get_batches_by_medicine(medicine_id) return [BatchResponse.model_validate(b) for b in batches] @router.get("/{batch_id}", response_model=BatchResponse) async def get_batch( batch_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = BatchService(db) batch = await service.get_batch(batch_id) if not batch: raise HTTPException(status_code=404, detail="批次不存在") return BatchResponse.model_validate(batch) @router.post("/medicine/{medicine_id}", response_model=BatchResponse) async def create_batch( medicine_id: int, data: BatchCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin", "user"])) ): service = BatchService(db) batch = await service.create_batch(medicine_id, data) return BatchResponse.model_validate(batch) @router.put("/{batch_id}", response_model=BatchResponse) async def update_batch( batch_id: int, data: BatchUpdate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin", "user"])) ): service = BatchService(db) batch = await service.update_batch(batch_id, data) if not batch: raise HTTPException(status_code=404, detail="批次不存在") return BatchResponse.model_validate(batch) @router.delete("/{batch_id}") async def delete_batch( batch_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = BatchService(db) success = await service.delete_batch(batch_id) if not success: raise HTTPException(status_code=404, detail="批次不存在") return {"message": "删除成功"} @router.post("/{batch_id}/dispense", response_model=BatchResponse) async def dispense_batch( batch_id: int, data: BatchDispense, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin", "user"])) ): service = BatchService(db) try: batch = await service.dispense(batch_id, data.quantity, current_user.id) return BatchResponse.model_validate(batch) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.post("/{batch_id}/add-stock", response_model=BatchResponse) async def add_stock_batch( batch_id: int, data: BatchAddStock, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin", "user"])) ): service = BatchService(db) try: batch = await service.add_stock(batch_id, data.quantity, current_user.id) return BatchResponse.model_validate(batch) except ValueError as e: raise HTTPException(status_code=400, detail=str(e))