Files
zcglxt/backend_new/app/services/organization_service.py

246 lines
5.8 KiB
Python

"""
机构网点业务服务层
"""
from typing import List, Optional, Tuple
from sqlalchemy.orm import Session
from app.crud.organization import organization
from app.schemas.organization import OrganizationCreate, OrganizationUpdate
from app.core.exceptions import NotFoundException, AlreadyExistsException
class OrganizationService:
"""机构网点服务类"""
def get_organization(self, db: Session, org_id: int):
"""
获取机构详情
Args:
db: 数据库会话
org_id: 机构ID
Returns:
机构对象
Raises:
NotFoundException: 机构不存在
"""
obj = organization.get(db, org_id)
if not obj:
raise NotFoundException("机构")
return obj
def get_organizations(
self,
db: Session,
skip: int = 0,
limit: int = 20,
org_type: Optional[str] = None,
status: Optional[str] = None,
keyword: Optional[str] = None
) -> Tuple[List, int]:
"""
获取机构列表
Args:
db: 数据库会话
skip: 跳过条数
limit: 返回条数
org_type: 机构类型
status: 状态
keyword: 搜索关键词
Returns:
(机构列表, 总数)
"""
return organization.get_multi(
db=db,
skip=skip,
limit=limit,
org_type=org_type,
status=status,
keyword=keyword
)
def get_organization_tree(
self,
db: Session,
status: Optional[str] = None
) -> List:
"""
获取机构树
Args:
db: 数据库会话
status: 状态筛选
Returns:
机构树列表
"""
return organization.get_tree(db, status)
def get_organization_children(
self,
db: Session,
parent_id: int
) -> List:
"""
获取直接子机构
Args:
db: 数据库会话
parent_id: 父机构ID
Returns:
子机构列表
Raises:
NotFoundException: 父机构不存在
"""
if parent_id > 0 and not organization.get(db, parent_id):
raise NotFoundException("父机构")
return organization.get_children(db, parent_id)
def get_all_children(
self,
db: Session,
parent_id: int
) -> List:
"""
递归获取所有子机构
Args:
db: 数据库会话
parent_id: 父机构ID
Returns:
所有子机构列表
Raises:
NotFoundException: 父机构不存在
"""
if not organization.get(db, parent_id):
raise NotFoundException("机构")
return organization.get_all_children(db, parent_id)
def get_parents(
self,
db: Session,
child_id: int
) -> List:
"""
递归获取所有父机构
Args:
db: 数据库会话
child_id: 子机构ID
Returns:
所有父机构列表
Raises:
NotFoundException: 机构不存在
"""
if not organization.get(db, child_id):
raise NotFoundException("机构")
return organization.get_parents(db, child_id)
def create_organization(
self,
db: Session,
obj_in: OrganizationCreate,
creator_id: Optional[int] = None
):
"""
创建机构
Args:
db: 数据库会话
obj_in: 创建数据
creator_id: 创建人ID
Returns:
创建的机构对象
Raises:
AlreadyExistsException: 机构代码已存在
NotFoundException: 父机构不存在
"""
try:
return organization.create(db, obj_in, creator_id)
except ValueError as e:
if "不存在" in str(e):
raise NotFoundException("父机构") from e
raise AlreadyExistsException("机构") from e
def update_organization(
self,
db: Session,
org_id: int,
obj_in: OrganizationUpdate,
updater_id: Optional[int] = None
):
"""
更新机构
Args:
db: 数据库会话
org_id: 机构ID
obj_in: 更新数据
updater_id: 更新人ID
Returns:
更新后的机构对象
Raises:
NotFoundException: 机构不存在
"""
db_obj = organization.get(db, org_id)
if not db_obj:
raise NotFoundException("机构")
try:
return organization.update(db, db_obj, obj_in, updater_id)
except ValueError as e:
if "不存在" in str(e):
raise NotFoundException("父机构") from e
raise
def delete_organization(
self,
db: Session,
org_id: int,
deleter_id: Optional[int] = None
) -> bool:
"""
删除机构
Args:
db: 数据库会话
org_id: 机构ID
deleter_id: 删除人ID
Returns:
是否删除成功
Raises:
NotFoundException: 机构不存在
ValueError: 机构下存在子机构
"""
if not organization.get(db, org_id):
raise NotFoundException("机构")
try:
return organization.delete(db, org_id, deleter_id)
except ValueError as e:
if "子机构" in str(e):
raise ValueError("该机构下存在子机构,无法删除") from e
raise
# 创建全局实例
organization_service = OrganizationService()