按 2026-11-02 需求补齐计划交付后端能力: - 角色授权:权限目录化,接口统一准入校验,未登记默认拒绝; 管理员判断改为按数据库角色重新判定,防止权限码持有者绕过 - 系统监控:单进程采集资源、请求与异常指标,分钟级聚合, 阈值配置化;敏感配置增加 repr 保护,Redis 密码 URL 转义 - 试用期计提:按回款日判定并写入快照,年度结清与调整单联动; 人员模型补试用期、离职日期与工资版本历史字段 - 计提模板:公式骨架受控,页面维护名称与参数绑定 - T+ 采集:自动化配置表与进度查询 内置角色禁停用保护对齐模块注释;核算规则版本提为常量并 补充批量核算失败堆栈日志。 影响范围:后端全部模块、数据库迁移 V22-V28 验证:uv run ruff check 通过;922 个单元测试全部通过; 集成测试因本机 MySQL 数据卷被其他容器锁定暂未运行
35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
"""岗位下拉选项(基础数据与报表筛选共用)。
|
||
|
||
岗位管理本身仅管理员可用(FR-006),但报表的「岗位」筛选对财务/领导
|
||
开放(FR-029)。为避免把管理接口整体放开,这里提供只读、登录即可的
|
||
启用岗位选项;写操作仍走 `/system/business-roles` 的管理员端点。
|
||
"""
|
||
|
||
from typing import Annotated
|
||
|
||
from fastapi import APIRouter, Depends
|
||
|
||
from app.api.deps import DbSession, get_current_user
|
||
from app.core.response import ApiResponse, ok
|
||
from app.models import User
|
||
from app.schemas.business_role import BusinessRoleOptionOut
|
||
from app.services.authorization_metadata import options
|
||
|
||
router = APIRouter(prefix="/business-roles", tags=["人员管理"])
|
||
|
||
# 基础数据是业务操作:登录即可,不要求管理员
|
||
CurrentUser = Annotated[User, Depends(get_current_user)]
|
||
|
||
|
||
@router.get(
|
||
"/options",
|
||
response_model=ApiResponse[list[BusinessRoleOptionOut]],
|
||
summary="岗位下拉选项",
|
||
)
|
||
def list_options(session: DbSession, _: CurrentUser) -> ApiResponse[list[BusinessRoleOptionOut]]:
|
||
"""岗位选项(登录即可;含停用——人员档案可能仍引用停用岗位)。
|
||
|
||
岗位规模有限(内置 + 自定义),一次取全量,不做分页。
|
||
"""
|
||
return ok([BusinessRoleOptionOut.model_validate(row) for row in options(session, _, "business_roles")])
|