mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-24 13:37:13 +00:00
- Added *.pyc and *.pyo to .gitignore to prevent compiled Python files from being tracked. - Improved docstrings in various modules, providing clearer descriptions of functions, parameters, and return values to enhance code readability and maintainability.
201 lines
6.2 KiB
Python
201 lines
6.2 KiB
Python
from app.api.v1.module_system.auth.schema import AuthSchema
|
|
from app.core.base_schema import BatchSetAvailable
|
|
from app.core.exceptions import CustomException
|
|
from app.utils.excel_util import ExcelUtil
|
|
|
|
from .crud import PositionCRUD
|
|
from .schema import (
|
|
PositionCreateSchema,
|
|
PositionOutSchema,
|
|
PositionQueryParam,
|
|
PositionUpdateSchema,
|
|
)
|
|
|
|
|
|
class PositionService:
|
|
"""岗位模块服务层"""
|
|
|
|
@classmethod
|
|
async def get_position_detail_service(cls, auth: AuthSchema, id: int) -> dict:
|
|
"""
|
|
获取岗位详情
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- id (int): 岗位ID
|
|
|
|
返回:
|
|
- Dict: 岗位详情对象
|
|
"""
|
|
position = await PositionCRUD(auth).get_by_id_crud(id=id)
|
|
return PositionOutSchema.model_validate(position).model_dump()
|
|
|
|
@classmethod
|
|
async def get_position_list_service(
|
|
cls,
|
|
auth: AuthSchema,
|
|
search: PositionQueryParam | None = None,
|
|
order_by: list[dict] | None = None,
|
|
) -> list[dict]:
|
|
"""
|
|
获取岗位列表
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- search (PositionQueryParam | None): 查询参数对象
|
|
- order_by (list[dict] | None): 排序参数列表
|
|
|
|
返回:
|
|
- list[dict]: 岗位列表对象
|
|
"""
|
|
position_list = await PositionCRUD(auth).get_list_crud(
|
|
search=search.__dict__, order_by=order_by
|
|
)
|
|
return [
|
|
PositionOutSchema.model_validate(position).model_dump() for position in position_list
|
|
]
|
|
|
|
@classmethod
|
|
async def get_position_page_service(
|
|
cls,
|
|
auth: AuthSchema,
|
|
page_no: int,
|
|
page_size: int,
|
|
search: PositionQueryParam | None = None,
|
|
order_by: list[dict[str, str]] | None = None,
|
|
) -> dict:
|
|
"""
|
|
分页查询岗位(数据库 OFFSET/LIMIT)。
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- page_no (int): 页码(从 1 开始)
|
|
- page_size (int): 每页条数
|
|
- search (PositionQueryParam | None): 查询条件
|
|
- order_by (list[dict[str, str]] | None): 排序字段列表
|
|
|
|
返回:
|
|
- dict: 分页结果(结构由 `CRUD.page` 返回约定)
|
|
"""
|
|
offset = (page_no - 1) * page_size
|
|
return await PositionCRUD(auth).page(
|
|
offset=offset,
|
|
limit=page_size,
|
|
order_by=order_by or [{"id": "asc"}],
|
|
search=search.__dict__ if search else {},
|
|
out_schema=PositionOutSchema,
|
|
)
|
|
|
|
@classmethod
|
|
async def create_position_service(cls, auth: AuthSchema, data: PositionCreateSchema) -> dict:
|
|
"""
|
|
创建岗位
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- data (PositionCreateSchema): 岗位创建模型
|
|
|
|
返回:
|
|
- dict: 创建的岗位详情字典
|
|
"""
|
|
position = await PositionCRUD(auth).get(name=data.name)
|
|
if position:
|
|
raise CustomException(msg="创建失败,该岗位已存在")
|
|
new_position = await PositionCRUD(auth).create(data=data)
|
|
return PositionOutSchema.model_validate(new_position).model_dump()
|
|
|
|
@classmethod
|
|
async def update_position_service(
|
|
cls, auth: AuthSchema, id: int, data: PositionUpdateSchema
|
|
) -> dict:
|
|
"""
|
|
更新岗位
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- id (int): 岗位ID
|
|
- data (PositionUpdateSchema): 岗位更新模型
|
|
|
|
返回:
|
|
- dict: 更新的岗位对象
|
|
"""
|
|
position = await PositionCRUD(auth).get_by_id_crud(id=id)
|
|
if not position:
|
|
raise CustomException(msg="更新失败,该岗位不存在")
|
|
exist_position = await PositionCRUD(auth).get(name=data.name)
|
|
if exist_position and exist_position.id != id:
|
|
raise CustomException(msg="更新失败,岗位名称重复")
|
|
updated_position = await PositionCRUD(auth).update(id=id, data=data)
|
|
return PositionOutSchema.model_validate(updated_position).model_dump()
|
|
|
|
@classmethod
|
|
async def delete_position_service(cls, auth: AuthSchema, ids: list[int]) -> None:
|
|
"""
|
|
删除岗位
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- ids (list[int]): 岗位ID列表
|
|
|
|
返回:
|
|
- None
|
|
"""
|
|
if len(ids) < 1:
|
|
raise CustomException(msg="删除失败,删除对象不能为空")
|
|
for id in ids:
|
|
position = await PositionCRUD(auth).get_by_id_crud(id=id)
|
|
if not position:
|
|
raise CustomException(msg="删除失败,该岗位不存在")
|
|
await PositionCRUD(auth).delete(ids=ids)
|
|
|
|
@classmethod
|
|
async def set_position_available_service(
|
|
cls, auth: AuthSchema, data: BatchSetAvailable
|
|
) -> None:
|
|
"""
|
|
设置岗位状态
|
|
|
|
参数:
|
|
- auth (AuthSchema): 认证信息模型
|
|
- data (BatchSetAvailable): 批量设置状态模型
|
|
|
|
返回:
|
|
- None
|
|
"""
|
|
await PositionCRUD(auth).set_available_crud(ids=data.ids, status=data.status)
|
|
|
|
@classmethod
|
|
async def export_position_list_service(cls, position_list: list[dict]) -> bytes:
|
|
"""
|
|
导出岗位列表
|
|
|
|
参数:
|
|
- position_list (list[dict]): 岗位列表对象
|
|
|
|
返回:
|
|
- bytes: 导出的Excel文件字节流
|
|
"""
|
|
mapping_dict = {
|
|
"id": "编号",
|
|
"name": "岗位名称",
|
|
"order": "显示顺序",
|
|
"status": "状态",
|
|
"description": "备注",
|
|
"created_time": "创建时间",
|
|
"updated_time": "更新时间",
|
|
"created_id": "创建者ID",
|
|
"updated_id": "更新者ID",
|
|
}
|
|
|
|
# 复制数据并转换状态
|
|
data = position_list.copy()
|
|
for item in data:
|
|
item["status"] = "启用" if item.get("status") == "0" else "停用"
|
|
item["creator"] = (
|
|
item.get("creator", {}).get("name", "未知")
|
|
if isinstance(item.get("creator"), dict)
|
|
else "未知"
|
|
)
|
|
|
|
return ExcelUtil.export_list2excel(list_data=data, mapping_dict=mapping_dict)
|