diff --git a/ruoyi-fastapi-backend/module_admin/controller/post_controler.py b/ruoyi-fastapi-backend/module_admin/controller/post_controler.py index 97cd459..299d900 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/post_controler.py +++ b/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'))]) 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) - logger.info('获取成功') - return ResponseUtil.success(model_content=post_page_query_result) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + # 获取分页数据 + post_page_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=True) + logger.info('获取成功') + + return ResponseUtil.success(model_content=post_page_query_result) @postController.post("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))]) @ValidateFields(validate_model='add_post') @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)): - try: - add_post.create_by = current_user.user.user_name - add_post.create_time = datetime.now() - add_post.update_by = current_user.user.user_name - add_post.update_time = datetime.now() - add_post_result = await PostService.add_post_services(query_db, add_post) - if add_post_result.is_success: - logger.info(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)) + add_post.create_by = current_user.user.user_name + add_post.create_time = datetime.now() + add_post.update_by = current_user.user.user_name + add_post.update_time = datetime.now() + add_post_result = await PostService.add_post_services(query_db, add_post) + logger.info(add_post_result.message) + + return ResponseUtil.success(msg=add_post_result.message) @postController.put("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))]) @ValidateFields(validate_model='edit_post') @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)): - try: - edit_post.update_by = current_user.user.user_name - edit_post.update_time = datetime.now() - edit_post_result = await PostService.edit_post_services(query_db, edit_post) - if edit_post_result.is_success: - logger.info(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)) + edit_post.update_by = current_user.user.user_name + edit_post.update_time = datetime.now() + edit_post_result = await PostService.edit_post_services(query_db, edit_post) + logger.info(edit_post_result.message) + + return ResponseUtil.success(msg=edit_post_result.message) @postController.delete("/{post_ids}", dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) @log_decorator(title='岗位管理', business_type=BusinessType.DELETE) 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_result = await PostService.delete_post_services(query_db, delete_post) - if delete_post_result.is_success: - logger.info(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)) + delete_post = DeletePostModel(postIds=post_ids) + delete_post_result = await PostService.delete_post_services(query_db, delete_post) + logger.info(delete_post_result.message) + + return ResponseUtil.success(msg=delete_post_result.message) @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)): - try: - post_detail_result = await PostService.post_detail_services(query_db, post_id) - logger.info(f'获取post_id为{post_id}的信息成功') - return ResponseUtil.success(data=post_detail_result) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + post_detail_result = await PostService.post_detail_services(query_db, post_id) + logger.info(f'获取post_id为{post_id}的信息成功') + + return ResponseUtil.success(data=post_detail_result) @postController.post("/export", dependencies=[Depends(CheckUserInterfaceAuth('system:post: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)): - try: - # 获取全量数据 - 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) - logger.info('导出成功') - return ResponseUtil.streaming(data=bytes2file_response(post_export_result)) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + # 获取全量数据 + 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) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(post_export_result)) diff --git a/ruoyi-fastapi-backend/module_admin/dao/post_dao.py b/ruoyi-fastapi-backend/module_admin/dao/post_dao.py index a1945ed..6478012 100644 --- a/ruoyi-fastapi-backend/module_admin/dao/post_dao.py +++ b/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 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 utils.page_util import PageUtil @@ -116,3 +117,19 @@ class PostDao: delete(SysPost) .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 diff --git a/ruoyi-fastapi-backend/module_admin/service/post_service.py b/ruoyi-fastapi-backend/module_admin/service/post_service.py index 13882ab..b9a088c 100644 --- a/ruoyi-fastapi-backend/module_admin/service/post_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/post_service.py @@ -1,5 +1,7 @@ from module_admin.dao.post_dao import * 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 @@ -20,6 +22,34 @@ class PostService: 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 async def add_post_services(cls, query_db: AsyncSession, page_object: PostModel): """ @@ -28,20 +58,19 @@ class PostService: :param page_object: 新增岗位对象 :return: 新增岗位校验结果 """ - post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name)) - if post: - result = dict(is_success=False, message='岗位名称已存在') + if not await cls.check_post_name_unique_services(query_db, page_object): + raise ServiceException(message=f'新增岗位{page_object.post_name}失败,岗位名称已存在') + elif not await cls.check_post_code_unique_services(query_db, page_object): + raise ServiceException(message=f'新增岗位{page_object.post_name}失败,岗位编码已存在') else: try: await PostDao.add_post_dao(query_db, page_object) await query_db.commit() - result = dict(is_success=True, message='新增成功') + return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: await query_db.rollback() raise e - return CrudResponseModel(**result) - @classmethod async def edit_post_services(cls, query_db: AsyncSession, page_object: PostModel): """ @@ -51,24 +80,22 @@ class PostService: :return: 编辑岗位校验结果 """ edit_post = page_object.model_dump(exclude_unset=True) - post_info = await cls.post_detail_services(query_db, edit_post.get('post_id')) - if post_info: - if post_info.post_name != page_object.post_name: - post = await PostDao.get_post_detail_by_info(query_db, PostModel(postName=page_object.post_name)) - if post: - result = dict(is_success=False, message='岗位名称已存在') - return CrudResponseModel(**result) - try: - await PostDao.edit_post_dao(query_db, edit_post) - await query_db.commit() - result = dict(is_success=True, message='更新成功') - except Exception as e: - await query_db.rollback() - raise e + post_info = await cls.post_detail_services(query_db, page_object.post_id) + if post_info.post_id: + if not await cls.check_post_name_unique_services(query_db, page_object): + raise ServiceException(message=f'修改岗位{page_object.post_name}失败,岗位名称已存在') + elif not await cls.check_post_code_unique_services(query_db, page_object): + raise ServiceException(message=f'修改岗位{page_object.post_name}失败,岗位编码已存在') + else: + try: + await PostDao.edit_post_dao(query_db, edit_post) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e else: - result = dict(is_success=False, message='岗位不存在') - - return CrudResponseModel(**result) + raise ServiceException(message='岗位不存在') @classmethod 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(',') try: 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 query_db.commit() - result = dict(is_success=True, message='删除成功') + return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: await query_db.rollback() raise e else: - result = dict(is_success=False, message='传入岗位id为空') - return CrudResponseModel(**result) + raise ServiceException(message='传入岗位id为空') @classmethod async def post_detail_services(cls, query_db: AsyncSession, post_id: int): @@ -101,7 +130,10 @@ class PostService: :return: 岗位id对应的信息 """ post = await PostDao.get_post_detail_by_id(query_db, post_id=post_id) - result = PostModel(**CamelCaseUtil.transform_result(post)) + if post: + result = PostModel(**CamelCaseUtil.transform_result(post)) + else: + result = PostModel(**dict()) return result