financial_system/financial_system/repositories/organization_repository.py
2026-06-18 13:21:20 +08:00

186 lines
6.1 KiB
Python

from __future__ import annotations
from sqlalchemy import or_
from sqlalchemy.orm import Session, joinedload
from ..database.orm import DepartmentORM, PositionORM
class OrganizationRepository:
"""组织架构仓库:封装部门和岗位表的读写。"""
def __init__(self, session: Session):
self.session = session
def list_departments(self, *, active_only: bool = False, keyword: str | None = None) -> list[DepartmentORM]:
query = self.session.query(DepartmentORM)
if active_only:
query = query.filter(DepartmentORM.is_active.is_(True))
if keyword:
like_keyword = f"%{keyword}%"
query = query.filter(
or_(
DepartmentORM.department_code.like(like_keyword),
DepartmentORM.name.like(like_keyword),
)
)
return query.order_by(DepartmentORM.sort_order.asc(), DepartmentORM.id.asc()).all()
def create_department(
self,
*,
parent_id: int | None,
department_code: str,
name: str,
sort_order: int,
is_active: bool,
remark: str,
) -> DepartmentORM:
department = DepartmentORM(
parent_id=parent_id,
department_code=department_code,
name=name,
sort_order=sort_order,
is_active=is_active,
remark=remark,
)
self.session.add(department)
self.session.commit()
self.session.refresh(department)
return department
def update_department(
self,
department_id: int,
*,
parent_id: int | None,
department_code: str,
name: str,
sort_order: int,
is_active: bool,
remark: str,
) -> DepartmentORM:
department = self.require_department(department_id)
department.parent_id = parent_id
department.department_code = department_code
department.name = name
department.sort_order = sort_order
department.is_active = is_active
department.remark = remark
self.session.commit()
self.session.refresh(department)
return department
def require_department(self, department_id: int) -> DepartmentORM:
department = self.session.query(DepartmentORM).filter(DepartmentORM.id == department_id).one_or_none()
if department is None:
raise ValueError("部门不存在")
return department
def get_department_by_name(self, name: str) -> DepartmentORM | None:
return self.session.query(DepartmentORM).filter(DepartmentORM.name == name).one_or_none()
def get_department_by_code(self, department_code: str) -> DepartmentORM | None:
return (
self.session.query(DepartmentORM)
.filter(DepartmentORM.department_code == department_code)
.one_or_none()
)
def list_positions(
self,
*,
department_id: int | None = None,
active_only: bool = False,
keyword: str | None = None,
) -> list[PositionORM]:
query = self.session.query(PositionORM).join(PositionORM.department).options(joinedload(PositionORM.department))
if department_id:
query = query.filter(PositionORM.department_id == department_id)
if active_only:
query = query.filter(PositionORM.is_active.is_(True))
if keyword:
like_keyword = f"%{keyword}%"
query = query.filter(
or_(
PositionORM.position_code.like(like_keyword),
PositionORM.name.like(like_keyword),
)
)
return query.order_by(
DepartmentORM.sort_order.asc(),
PositionORM.sort_order.asc(),
PositionORM.id.asc(),
).all()
def create_position(
self,
*,
department_id: int,
position_code: str,
name: str,
sort_order: int,
is_active: bool,
remark: str,
) -> PositionORM:
position = PositionORM(
department_id=department_id,
position_code=position_code,
name=name,
sort_order=sort_order,
is_active=is_active,
remark=remark,
)
self.session.add(position)
self.session.commit()
return self.require_position(position.id)
def update_position(
self,
position_id: int,
*,
department_id: int,
position_code: str,
name: str,
sort_order: int,
is_active: bool,
remark: str,
) -> PositionORM:
position = self.require_position(position_id)
position.department_id = department_id
position.position_code = position_code
position.name = name
position.sort_order = sort_order
position.is_active = is_active
position.remark = remark
self.session.commit()
return self.require_position(position_id)
def require_position(self, position_id: int) -> PositionORM:
position = (
self.session.query(PositionORM)
.options(joinedload(PositionORM.department))
.filter(PositionORM.id == position_id)
.one_or_none()
)
if position is None:
raise ValueError("岗位不存在")
return position
def get_position_by_code(self, position_code: str) -> PositionORM | None:
return (
self.session.query(PositionORM)
.options(joinedload(PositionORM.department))
.filter(PositionORM.position_code == position_code)
.one_or_none()
)
def get_position_by_department_and_name(self, department_id: int, name: str) -> PositionORM | None:
"""按部门和岗位名称查询,用于避免同一部门下重复维护同名岗位。"""
return (
self.session.query(PositionORM)
.options(joinedload(PositionORM.department))
.filter(PositionORM.department_id == department_id, PositionORM.name == name)
.one_or_none()
)