- 从物料跟踪页面移除订单号列和表单字段 - 从导航菜单移除PDI管理,添加设备巡检 - 新增InspectionLocation和InspectionRecord后端模型和API - 新增设备巡检前端页面(左侧点位列表,右侧设备和历史记录)
113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Query
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
from sqlalchemy import select, func, desc
|
||
from typing import Optional
|
||
from datetime import datetime
|
||
|
||
from app.database import get_db
|
||
from app.models.pdi import PDIRecord, L3Status, L2Status
|
||
from app.schemas.pdi import PDIRecordCreate, PDIRecordUpdate, PDIRecordOut
|
||
from app.schemas.common import Response, PageResponse
|
||
from app.services.auth_service import get_current_user
|
||
|
||
router = APIRouter()
|
||
|
||
|
||
@router.get("/stats", response_model=Response[dict])
|
||
async def get_pdi_stats(
|
||
db: AsyncSession = Depends(get_db),
|
||
_=Depends(get_current_user),
|
||
):
|
||
"""各状态PDI数量统计"""
|
||
total_q = await db.execute(select(func.count()).select_from(PDIRecord))
|
||
pending_q = await db.execute(
|
||
select(func.count()).select_from(PDIRecord).where(PDIRecord.l2_status == L2Status.pending)
|
||
)
|
||
proc_q = await db.execute(
|
||
select(func.count()).select_from(PDIRecord).where(PDIRecord.l2_status == L2Status.processing)
|
||
)
|
||
done_q = await db.execute(
|
||
select(func.count()).select_from(PDIRecord).where(PDIRecord.l2_status == L2Status.done)
|
||
)
|
||
confirmed_q = await db.execute(
|
||
select(func.count()).select_from(PDIRecord).where(PDIRecord.l3_status == L3Status.confirmed)
|
||
)
|
||
|
||
return Response.ok({
|
||
"total": total_q.scalar(),
|
||
"pending": pending_q.scalar(),
|
||
"processing": proc_q.scalar(),
|
||
"done": done_q.scalar(),
|
||
"confirmed": confirmed_q.scalar(),
|
||
})
|
||
|
||
|
||
@router.get("/", response_model=Response[PageResponse[PDIRecordOut]])
|
||
async def list_pdi(
|
||
page: int = 1,
|
||
page_size: int = 20,
|
||
coil_no: Optional[str] = None,
|
||
l3_status: Optional[str] = None,
|
||
l2_status: Optional[str] = None,
|
||
db: AsyncSession = Depends(get_db),
|
||
_=Depends(get_current_user),
|
||
):
|
||
query = select(PDIRecord).order_by(desc(PDIRecord.created_at))
|
||
if coil_no:
|
||
query = query.where(PDIRecord.coil_no.ilike(f"%{coil_no}%"))
|
||
if l3_status:
|
||
query = query.where(PDIRecord.l3_status == l3_status)
|
||
if l2_status:
|
||
query = query.where(PDIRecord.l2_status == l2_status)
|
||
|
||
total = (await db.execute(select(func.count()).select_from(query.subquery()))).scalar()
|
||
result = await db.execute(query.offset((page - 1) * page_size).limit(page_size))
|
||
items = [PDIRecordOut.model_validate(r) for r in result.scalars()]
|
||
return Response.ok(PageResponse(total=total, page=page, page_size=page_size, items=items))
|
||
|
||
|
||
@router.post("/", response_model=Response[PDIRecordOut])
|
||
async def create_pdi(
|
||
body: PDIRecordCreate,
|
||
db: AsyncSession = Depends(get_db),
|
||
_=Depends(get_current_user),
|
||
):
|
||
record = PDIRecord(**body.model_dump())
|
||
db.add(record)
|
||
await db.flush()
|
||
return Response.ok(PDIRecordOut.model_validate(record))
|
||
|
||
|
||
@router.put("/{pdi_id}", response_model=Response[PDIRecordOut])
|
||
async def update_pdi(
|
||
pdi_id: int,
|
||
body: PDIRecordUpdate,
|
||
db: AsyncSession = Depends(get_db),
|
||
_=Depends(get_current_user),
|
||
):
|
||
result = await db.execute(select(PDIRecord).where(PDIRecord.id == pdi_id))
|
||
record = result.scalar_one_or_none()
|
||
if not record:
|
||
raise HTTPException(status_code=404, detail="PDI记录不存在")
|
||
for k, v in body.model_dump(exclude_none=True).items():
|
||
setattr(record, k, v)
|
||
await db.flush()
|
||
return Response.ok(PDIRecordOut.model_validate(record))
|
||
|
||
|
||
@router.patch("/{pdi_id}/confirm", response_model=Response[PDIRecordOut])
|
||
async def confirm_pdi(
|
||
pdi_id: int,
|
||
db: AsyncSession = Depends(get_db),
|
||
_=Depends(get_current_user),
|
||
):
|
||
"""L2确认PDI,将状态设置为processing"""
|
||
result = await db.execute(select(PDIRecord).where(PDIRecord.id == pdi_id))
|
||
record = result.scalar_one_or_none()
|
||
if not record:
|
||
raise HTTPException(status_code=404, detail="PDI记录不存在")
|
||
record.l2_status = L2Status.processing
|
||
record.confirm_time = datetime.utcnow()
|
||
await db.flush()
|
||
return Response.ok(PDIRecordOut.model_validate(record))
|