ForcePilot/backend/package/yuxi/repositories/department_repository.py
Wenjie Zhang 410dd47c14 refactor: 将后端代码迁移至 backend 目录
- 将 server/, src/, scripts/, test/ 等目录移动到 backend/ 目录下
- 使用 git rename 保留文件历史记录
- 更新 docker-compose.yml 和 api.Dockerfile 配置

WIP: 项目结构重构进行中
2026-03-24 11:08:12 +08:00

96 lines
4.0 KiB
Python

"""部门数据访问层 - Repository"""
from typing import Any
from sqlalchemy import func, select
from yuxi.storage.postgres.manager import pg_manager
from yuxi.storage.postgres.models_business import Department
class DepartmentRepository:
"""部门数据访问层"""
async def get_by_id(self, id: int) -> Department | None:
"""根据 ID 获取部门"""
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(Department).where(Department.id == id))
return result.scalar_one_or_none()
async def get_by_name(self, name: str) -> Department | None:
"""根据名称获取部门"""
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(Department).where(Department.name == name))
return result.scalar_one_or_none()
async def list_departments(self) -> list[Department]:
"""获取所有部门列表"""
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(Department).order_by(Department.created_at.desc()))
return list(result.scalars().all())
async def list_with_user_count(self) -> list[dict[str, Any]]:
"""获取所有部门列表,包含用户数量"""
async with pg_manager.get_async_session_context() as session:
from yuxi.storage.postgres.models_business import User
result = await session.execute(select(Department).order_by(Department.created_at.desc()))
departments = result.scalars().all()
department_list = []
for dep in departments:
user_count_result = await session.execute(
select(func.count(User.id)).where(User.department_id == dep.id, User.is_deleted == 0)
)
user_count = user_count_result.scalar()
dep_dict = dep.to_dict()
dep_dict["user_count"] = user_count
department_list.append(dep_dict)
return department_list
async def create(self, data: dict[str, Any]) -> Department:
"""创建部门"""
async with pg_manager.get_async_session_context() as session:
department = Department(**data)
session.add(department)
return department
async def update(self, id: int, data: dict[str, Any]) -> Department | None:
"""更新部门"""
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(Department).where(Department.id == id))
department = result.scalar_one_or_none()
if department is None:
return None
for key, value in data.items():
if key != "id":
setattr(department, key, value)
return department
async def delete(self, id: int) -> bool:
"""删除部门"""
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(Department).where(Department.id == id))
department = result.scalar_one_or_none()
if department is None:
return False
await session.delete(department)
return True
async def count_users(self, id: int) -> int:
"""统计部门用户数量"""
async with pg_manager.get_async_session_context() as session:
from yuxi.storage.postgres.models_business import User
result = await session.execute(
select(func.count(User.id)).where(User.department_id == id, User.is_deleted == 0)
)
return result.scalar() or 0
async def exists_by_name(self, name: str) -> bool:
"""检查部门名称是否存在"""
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(Department.id).where(Department.name == name))
return result.scalar_one_or_none() is not None