Files
SCGL/backend/app/routers/approval.py

106 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""缺料审批 CRUD 路由"""
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from app.database import get_db_pms
from app.models import PmsWorkOrder, PmsMaterialApproval, MaterialBase, ApprovalStatus
from app.schemas.approval import (
ApprovalCreate,
ApprovalStatusUpdate,
ApprovalResponse,
)
router = APIRouter(prefix="/api/pms/approval", tags=["缺料审批"])
@router.post("", response_model=ApprovalResponse, status_code=201)
async def create_approval(data: ApprovalCreate, db: Session = Depends(get_db_pms)):
"""
提交缺料审批申请
- 员工提交缺料审批,系统自动设置状态为 PENDING
"""
work_order = db.query(PmsWorkOrder).filter(
PmsWorkOrder.id == data.work_order_id
).first()
if not work_order:
raise HTTPException(status_code=400, detail=f"工单 ID={data.work_order_id} 不存在")
material = db.query(MaterialBase).filter(
MaterialBase.id == data.missing_material_id
).first()
if not material:
raise HTTPException(status_code=400, detail=f"物料 ID={data.missing_material_id} 不存在")
approval = PmsMaterialApproval(
work_order_id=data.work_order_id,
missing_material_id=data.missing_material_id,
required_qty=data.required_qty,
reason=data.reason,
status=ApprovalStatus.PENDING,
)
db.add(approval)
db.commit()
db.refresh(approval)
return approval
@router.get("", response_model=list[ApprovalResponse])
async def list_pending_approvals(
skip: int = Query(0, ge=0),
limit: int = Query(20, gt=0, le=100),
db: Session = Depends(get_db_pms)
):
"""
分页查询所有待审批(状态为 PENDING的审批流
供主管查看待处理的缺料审批申请
"""
return db.query(PmsMaterialApproval).filter(
PmsMaterialApproval.status == ApprovalStatus.PENDING
).order_by(PmsMaterialApproval.created_at.desc()).offset(skip).limit(limit).all()
@router.put("/{approval_id}/status", response_model=ApprovalResponse)
async def update_approval_status(
approval_id: int,
data: ApprovalStatusUpdate,
db: Session = Depends(get_db_pms)
):
"""
更新审批状态
- 仅允许状态从 PENDING 流转到 APPROVED 或 REJECTED
- 终态不可再次修改
"""
approval = db.query(PmsMaterialApproval).filter(
PmsMaterialApproval.id == approval_id
).first()
if not approval:
raise HTTPException(status_code=404, detail=f"审批记录 ID={approval_id} 不存在")
if approval.status != ApprovalStatus.PENDING:
raise HTTPException(
status_code=400,
detail=f"当前状态为 {approval.status.value},不可修改(终态不可变更)"
)
if data.status == ApprovalStatus.PENDING:
raise HTTPException(status_code=400, detail="不允许将状态改回 PENDING")
approval.status = data.status
db.commit()
db.refresh(approval)
return approval
@router.get("/{approval_id}", response_model=ApprovalResponse)
async def get_approval(approval_id: int, db: Session = Depends(get_db_pms)):
"""获取单个审批详情"""
approval = db.query(PmsMaterialApproval).filter(
PmsMaterialApproval.id == approval_id
).first()
if not approval:
raise HTTPException(status_code=404, detail=f"审批记录 ID={approval_id} 不存在")
return approval