from datetime import datetime, timezone from fastapi.logger import logger from shared.constants import PAGE_SIZE from modules.system.position.schemas import PositionForm, PositionStatusForm from modules.system.position.models import Position from modules.system.position.repository import position_repo from core.database import get_db_session from core import R from core.security import get_user_id from utils.request import like_contains # 查询岗位分页数据 def get_position_page(request): # 页码 page = int(request.query_params.get("pageNo", 1)) # 每页数 limit = int(request.query_params.get("pageSize", PAGE_SIZE)) # 实例化查询对象 query = position_repo.filter(Position.is_delete == 0) # 岗位名称 name = request.query_params.get('name') if name: query = query.filter(Position.name.like(like_contains(name), escape='\\')) # 岗位状态筛选 status = request.query_params.get('status') if status: query = query.filter(Position.status == status) # 排序 query = query.order_by(Position.sort.asc()) # 记录总数 count = query.count() # 分页查询 position_list = query.limit(limit).offset((page - 1) * limit).all() # 若当前页超出末页(数据被并发删除),自动回退到第一页 if page > 1 and not position_list: page = 1 count = query.count() position_list = query.limit(limit).offset(0).all() # 实例化结果 result = [] # 遍历数据源 if len(position_list) > 0: for item in position_list: # 对象转字典 data = item.to_dict() # 加入列表 result.append(data) # 返回结果 return R.ok(data=result, count=count) # 根据ID查询岗位详情 def get_position_detail(position_id): # 根据ID查询岗位 position = position_repo.get_by_id(position_id) # 查询结果判空 if not position: return None # 对象转字典 data = position.to_dict() # 返回结果 return data # 添加岗位 def add_position(request, data: PositionForm): # 唯一性校验 if position_repo.filter(Position.name == data.name, Position.is_delete == 0).first(): return R.failed("岗位名称不能重复") # 表单数据赋值给对象并插入 position_repo.create(**data.model_dump(exclude={'id'}), create_user=get_user_id(request)) # 返回结果 return R.ok(msg="添加成功") # 更新岗位 def update_position(request, data: PositionForm): # 记录ID判空 if not data.id or data.id <= 0: return R.failed("记录ID不能为空") # 唯一性校验(排除自身) if position_repo.filter(Position.name == data.name, Position.id != data.id, Position.is_delete == 0).first(): return R.failed("岗位名称不能重复") # 根据ID查询记录 if not position_repo.get_by_id(data.id): return R.failed("记录不存在") # 构造更新数据(排除 id) updData = data.model_dump(exclude={'id'}) updData['update_user'] = get_user_id(request) updData['update_time'] = datetime.now(tz=timezone.utc) result = position_repo.update(data.id, updData) # 提交数据 if not result: return R.failed("更新失败") # 返回结果 return R.ok(msg="更新成功") # 删除岗位 def delete_position(position_id): return position_repo.batch_delete_r(position_id) # 设置状态 def update_position_status(request, data: PositionStatusForm): # 根据ID查询记录 if not position_repo.get_by_id(data.id): return R.failed("记录不存在") # 更新记录 result = position_repo.update(data.id, { "status": data.status, "update_user": get_user_id(request), "update_time": datetime.now(tz=timezone.utc) }) # 提交数据 if not result: return R.failed("设置失败") # 返回结果 return R.ok(msg="设置成功") # 获取岗位数据列表 def get_position_list(): # 查询岗位数据列表 position_rows = position_repo.filter(Position.is_delete == 0, Position.status == 1).order_by( Position.sort.asc()).all() # 实例化列表 position_list = [] # 遍历数据源 if position_rows: for v in position_rows: # 对象转字典 item = v.to_dict() # 加入数组 position_list.append(item) # 返回结果 return position_list