Browse Source

perf: 优化岗位管理模块service层及异常处理

master
insistence 7 months ago
parent
commit
e3efca9648
  1. 42
      ruoyi-fastapi-backend/module_admin/controller/post_controler.py
  2. 19
      ruoyi-fastapi-backend/module_admin/dao/post_dao.py
  3. 72
      ruoyi-fastapi-backend/module_admin/service/post_service.py

42
ruoyi-fastapi-backend/module_admin/controller/post_controler.py

@ -19,93 +19,63 @@ postController = APIRouter(prefix='/system/post', dependencies=[Depends(LoginSer
@postController.get("/list", response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:list'))]) @postController.get("/list", response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:list'))])
async def get_system_post_list(request: Request, post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), query_db: AsyncSession = Depends(get_db)): async def get_system_post_list(request: Request, post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), query_db: AsyncSession = Depends(get_db)):
try:
# 获取分页数据 # 获取分页数据
post_page_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=True) post_page_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=True)
logger.info('获取成功') logger.info('获取成功')
return ResponseUtil.success(model_content=post_page_query_result) return ResponseUtil.success(model_content=post_page_query_result)
except Exception as e:
logger.exception(e)
return ResponseUtil.error(msg=str(e))
@postController.post("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))]) @postController.post("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))])
@ValidateFields(validate_model='add_post') @ValidateFields(validate_model='add_post')
@log_decorator(title='岗位管理', business_type=BusinessType.INSERT) @log_decorator(title='岗位管理', business_type=BusinessType.INSERT)
async def add_system_post(request: Request, add_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): async def add_system_post(request: Request, add_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
try:
add_post.create_by = current_user.user.user_name add_post.create_by = current_user.user.user_name
add_post.create_time = datetime.now() add_post.create_time = datetime.now()
add_post.update_by = current_user.user.user_name add_post.update_by = current_user.user.user_name
add_post.update_time = datetime.now() add_post.update_time = datetime.now()
add_post_result = await PostService.add_post_services(query_db, add_post) add_post_result = await PostService.add_post_services(query_db, add_post)
if add_post_result.is_success:
logger.info(add_post_result.message) logger.info(add_post_result.message)
return ResponseUtil.success(msg=add_post_result.message) return ResponseUtil.success(msg=add_post_result.message)
else:
logger.warning(add_post_result.message)
return ResponseUtil.failure(msg=add_post_result.message)
except Exception as e:
logger.exception(e)
return ResponseUtil.error(msg=str(e))
@postController.put("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))]) @postController.put("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))])
@ValidateFields(validate_model='edit_post') @ValidateFields(validate_model='edit_post')
@log_decorator(title='岗位管理', business_type=BusinessType.UPDATE) @log_decorator(title='岗位管理', business_type=BusinessType.UPDATE)
async def edit_system_post(request: Request, edit_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): async def edit_system_post(request: Request, edit_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
try:
edit_post.update_by = current_user.user.user_name edit_post.update_by = current_user.user.user_name
edit_post.update_time = datetime.now() edit_post.update_time = datetime.now()
edit_post_result = await PostService.edit_post_services(query_db, edit_post) edit_post_result = await PostService.edit_post_services(query_db, edit_post)
if edit_post_result.is_success:
logger.info(edit_post_result.message) logger.info(edit_post_result.message)
return ResponseUtil.success(msg=edit_post_result.message) return ResponseUtil.success(msg=edit_post_result.message)
else:
logger.warning(edit_post_result.message)
return ResponseUtil.failure(msg=edit_post_result.message)
except Exception as e:
logger.exception(e)
return ResponseUtil.error(msg=str(e))
@postController.delete("/{post_ids}", dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) @postController.delete("/{post_ids}", dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))])
@log_decorator(title='岗位管理', business_type=BusinessType.DELETE) @log_decorator(title='岗位管理', business_type=BusinessType.DELETE)
async def delete_system_post(request: Request, post_ids: str, query_db: AsyncSession = Depends(get_db)): async def delete_system_post(request: Request, post_ids: str, query_db: AsyncSession = Depends(get_db)):
try:
delete_post = DeletePostModel(postIds=post_ids) delete_post = DeletePostModel(postIds=post_ids)
delete_post_result = await PostService.delete_post_services(query_db, delete_post) delete_post_result = await PostService.delete_post_services(query_db, delete_post)
if delete_post_result.is_success:
logger.info(delete_post_result.message) logger.info(delete_post_result.message)
return ResponseUtil.success(msg=delete_post_result.message) return ResponseUtil.success(msg=delete_post_result.message)
else:
logger.warning(delete_post_result.message)
return ResponseUtil.failure(msg=delete_post_result.message)
except Exception as e:
logger.exception(e)
return ResponseUtil.error(msg=str(e))
@postController.get("/{post_id}", response_model=PostModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:query'))]) @postController.get("/{post_id}", response_model=PostModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:query'))])
async def query_detail_system_post(request: Request, post_id: int, query_db: AsyncSession = Depends(get_db)): async def query_detail_system_post(request: Request, post_id: int, query_db: AsyncSession = Depends(get_db)):
try:
post_detail_result = await PostService.post_detail_services(query_db, post_id) post_detail_result = await PostService.post_detail_services(query_db, post_id)
logger.info(f'获取post_id为{post_id}的信息成功') logger.info(f'获取post_id为{post_id}的信息成功')
return ResponseUtil.success(data=post_detail_result) return ResponseUtil.success(data=post_detail_result)
except Exception as e:
logger.exception(e)
return ResponseUtil.error(msg=str(e))
@postController.post("/export", dependencies=[Depends(CheckUserInterfaceAuth('system:post:export'))]) @postController.post("/export", dependencies=[Depends(CheckUserInterfaceAuth('system:post:export'))])
@log_decorator(title='岗位管理', business_type=BusinessType.EXPORT) @log_decorator(title='岗位管理', business_type=BusinessType.EXPORT)
async def export_system_post_list(request: Request, post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), query_db: AsyncSession = Depends(get_db)): async def export_system_post_list(request: Request, post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), query_db: AsyncSession = Depends(get_db)):
try:
# 获取全量数据 # 获取全量数据
post_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=False) post_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=False)
post_export_result = await PostService.export_post_list_services(post_query_result) post_export_result = await PostService.export_post_list_services(post_query_result)
logger.info('导出成功') logger.info('导出成功')
return ResponseUtil.streaming(data=bytes2file_response(post_export_result)) return ResponseUtil.streaming(data=bytes2file_response(post_export_result))
except Exception as e:
logger.exception(e)
return ResponseUtil.error(msg=str(e))

19
ruoyi-fastapi-backend/module_admin/dao/post_dao.py

@ -1,6 +1,7 @@
from sqlalchemy import select, update, delete from sqlalchemy import select, update, delete, func
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.post_do import SysPost from module_admin.entity.do.post_do import SysPost
from module_admin.entity.do.user_do import SysUserPost
from module_admin.entity.vo.post_vo import * from module_admin.entity.vo.post_vo import *
from utils.page_util import PageUtil from utils.page_util import PageUtil
@ -116,3 +117,19 @@ class PostDao:
delete(SysPost) delete(SysPost)
.where(SysPost.post_id.in_([post.post_id])) .where(SysPost.post_id.in_([post.post_id]))
) )
@classmethod
async def count_user_post_dao(cls, db: AsyncSession, post_id: int):
"""
根据岗位id查询岗位关联的用户数量
:param db: orm对象
:param post_id: 岗位id
:return: 岗位关联的用户数量
"""
user_post_count = (await db.execute(
select(func.count('*'))
.select_from(SysUserPost)
.where(SysUserPost.post_id == post_id)
)).scalar()
return user_post_count

72
ruoyi-fastapi-backend/module_admin/service/post_service.py

@ -1,5 +1,7 @@
from module_admin.dao.post_dao import * from module_admin.dao.post_dao import *
from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.common_vo import CrudResponseModel
from config.constant import CommonConstant
from exceptions.exception import ServiceException
from utils.common_util import export_list2excel, CamelCaseUtil from utils.common_util import export_list2excel, CamelCaseUtil
@ -20,6 +22,34 @@ class PostService:
return post_list_result return post_list_result
@classmethod
async def check_post_name_unique_services(cls, query_db: AsyncSession, page_object: PostModel):
"""
检查岗位名称是否唯一service
:param query_db: orm对象
:param page_object: 岗位对象
:return: 校验结果
"""
post_id = -1 if page_object.post_id is None else page_object.post_id
post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name))
if post and post.post_id != post_id:
return CommonConstant.NOT_UNIQUE
return CommonConstant.UNIQUE
@classmethod
async def check_post_code_unique_services(cls, query_db: AsyncSession, page_object: PostModel):
"""
检查岗位编码是否唯一service
:param query_db: orm对象
:param page_object: 岗位对象
:return: 校验结果
"""
post_id = -1 if page_object.post_id is None else page_object.post_id
post = await PostDao.get_post_detail_by_info(query_db, PostModel(postCode=page_object.post_code))
if post and post.post_id != post_id:
return CommonConstant.NOT_UNIQUE
return CommonConstant.UNIQUE
@classmethod @classmethod
async def add_post_services(cls, query_db: AsyncSession, page_object: PostModel): async def add_post_services(cls, query_db: AsyncSession, page_object: PostModel):
""" """
@ -28,20 +58,19 @@ class PostService:
:param page_object: 新增岗位对象 :param page_object: 新增岗位对象
:return: 新增岗位校验结果 :return: 新增岗位校验结果
""" """
post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name)) if not await cls.check_post_name_unique_services(query_db, page_object):
if post: raise ServiceException(message=f'新增岗位{page_object.post_name}失败,岗位名称已存在')
result = dict(is_success=False, message='岗位名称已存在') elif not await cls.check_post_code_unique_services(query_db, page_object):
raise ServiceException(message=f'新增岗位{page_object.post_name}失败,岗位编码已存在')
else: else:
try: try:
await PostDao.add_post_dao(query_db, page_object) await PostDao.add_post_dao(query_db, page_object)
await query_db.commit() await query_db.commit()
result = dict(is_success=True, message='新增成功') return CrudResponseModel(is_success=True, message='新增成功')
except Exception as e: except Exception as e:
await query_db.rollback() await query_db.rollback()
raise e raise e
return CrudResponseModel(**result)
@classmethod @classmethod
async def edit_post_services(cls, query_db: AsyncSession, page_object: PostModel): async def edit_post_services(cls, query_db: AsyncSession, page_object: PostModel):
""" """
@ -51,24 +80,22 @@ class PostService:
:return: 编辑岗位校验结果 :return: 编辑岗位校验结果
""" """
edit_post = page_object.model_dump(exclude_unset=True) edit_post = page_object.model_dump(exclude_unset=True)
post_info = await cls.post_detail_services(query_db, edit_post.get('post_id')) post_info = await cls.post_detail_services(query_db, page_object.post_id)
if post_info: if post_info.post_id:
if post_info.post_name != page_object.post_name: if not await cls.check_post_name_unique_services(query_db, page_object):
post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name)) raise ServiceException(message=f'修改岗位{page_object.post_name}失败,岗位名称已存在')
if post: elif not await cls.check_post_code_unique_services(query_db, page_object):
result = dict(is_success=False, message='岗位名称已存在') raise ServiceException(message=f'修改岗位{page_object.post_name}失败,岗位编码已存在')
return CrudResponseModel(**result) else:
try: try:
await PostDao.edit_post_dao(query_db, edit_post) await PostDao.edit_post_dao(query_db, edit_post)
await query_db.commit() await query_db.commit()
result = dict(is_success=True, message='更新成功') return CrudResponseModel(is_success=True, message='更新成功')
except Exception as e: except Exception as e:
await query_db.rollback() await query_db.rollback()
raise e raise e
else: else:
result = dict(is_success=False, message='岗位不存在') raise ServiceException(message='岗位不存在')
return CrudResponseModel(**result)
@classmethod @classmethod
async def delete_post_services(cls, query_db: AsyncSession, page_object: DeletePostModel): async def delete_post_services(cls, query_db: AsyncSession, page_object: DeletePostModel):
@ -82,15 +109,17 @@ class PostService:
post_id_list = page_object.post_ids.split(',') post_id_list = page_object.post_ids.split(',')
try: try:
for post_id in post_id_list: for post_id in post_id_list:
post = await cls.post_detail_services(query_db, int(post_id))
if (await PostDao.count_user_post_dao(query_db, int(post_id))) > 0:
raise ServiceException(message=f'{post.post_name}已分配,不能删除')
await PostDao.delete_post_dao(query_db, PostModel(postId=post_id)) await PostDao.delete_post_dao(query_db, PostModel(postId=post_id))
await query_db.commit() await query_db.commit()
result = dict(is_success=True, message='删除成功') return CrudResponseModel(is_success=True, message='删除成功')
except Exception as e: except Exception as e:
await query_db.rollback() await query_db.rollback()
raise e raise e
else: else:
result = dict(is_success=False, message='传入岗位id为空') raise ServiceException(message='传入岗位id为空')
return CrudResponseModel(**result)
@classmethod @classmethod
async def post_detail_services(cls, query_db: AsyncSession, post_id: int): async def post_detail_services(cls, query_db: AsyncSession, post_id: int):
@ -101,7 +130,10 @@ class PostService:
:return: 岗位id对应的信息 :return: 岗位id对应的信息
""" """
post = await PostDao.get_post_detail_by_id(query_db, post_id=post_id) post = await PostDao.get_post_detail_by_id(query_db, post_id=post_id)
if post:
result = PostModel(**CamelCaseUtil.transform_result(post)) result = PostModel(**CamelCaseUtil.transform_result(post))
else:
result = PostModel(**dict())
return result return result

Loading…
Cancel
Save