from __future__ import annotations from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.orm import Session from iti.auth import require_permission from iti.db import get_db from iti.responses import ok, page from iti_system.models import SysDept from iti_system.schemas import DeptCreate, DeptQuery, DeptUpdate from iti_system.services import apply_keyword, build_tree, dump_dept, get_or_404, paginate_query router = APIRouter(prefix="/sys/dept", tags=["system.dept"]) @router.get("/list", dependencies=[Depends(require_permission("system:dept:list"))]) def list_dept(query: DeptQuery = Depends(), db: Session = Depends(get_db)): return ok([dump_dept(dept) for dept in db.scalars(_query_depts(query)).all()]) @router.get("/page", dependencies=[Depends(require_permission("system:dept:list"))]) def page_dept(query: DeptQuery = Depends(), db: Session = Depends(get_db)): result = paginate_query(db, _query_depts(query), page=query.page, size=query.size) return page([dump_dept(dept) for dept in result["items"]], result["page"]) @router.get("/tree", dependencies=[Depends(require_permission("system:dept:list"))]) def tree_dept(db: Session = Depends(get_db)): depts = db.scalars(select(SysDept).order_by(SysDept.sort, SysDept.name)).all() return ok(build_tree(depts, dump_dept)) @router.post("", dependencies=[Depends(require_permission("system:dept:create"))]) def create_dept(payload: DeptCreate, db: Session = Depends(get_db)): dept = SysDept(**payload.model_dump()) db.add(dept) db.commit() db.refresh(dept) return ok(dump_dept(dept)) @router.put("/{id}", dependencies=[Depends(require_permission("system:dept:edit"))]) def update_dept(id: str, payload: DeptUpdate, db: Session = Depends(get_db)): dept = get_or_404(db, SysDept, id, "部门不存在") for key, value in payload.model_dump(exclude_unset=True).items(): setattr(dept, key, value) db.commit() db.refresh(dept) return ok(dump_dept(dept)) @router.delete("/{id}", dependencies=[Depends(require_permission("system:dept:delete"))]) def delete_dept(id: str, db: Session = Depends(get_db)): dept = get_or_404(db, SysDept, id, "部门不存在") db.delete(dept) db.commit() return ok() def _query_depts(query: DeptQuery): stmt = select(SysDept).order_by(SysDept.sort, SysDept.created_at.desc()) stmt = apply_keyword(stmt, query.keyword, SysDept.name, SysDept.desc) if query.name: stmt = stmt.where(SysDept.name.like(f"%{query.name}%")) if query.status: stmt = stmt.where(SysDept.status == query.status) return stmt