fix: 会计角色访问报表页面提示无权限

- reports API 两个 GET 接口 require_roles 加入 kuaiji
- 新增 migration 为 kuaiji 角色补上报表统计/报表核对的 sys_role_menu 记录

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wsb1224 2026-07-04 14:07:51 +08:00
parent 28024454d4
commit eebb5a849e
2 changed files with 67 additions and 3 deletions

View File

@ -30,7 +30,7 @@ def performance_report(
exclude_ecommerce: bool = Query(default=False), # 是否排除电商渠道订单
salesman_id: int | None = Query(default=None), # 业务员ID筛选
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 当前登录用户,仅manager和admin
current_user: dict = Depends(require_roles("manager", "admin", "kuaiji")), # 当前登录用户,manager/admin/会计
_permission_user: dict = Depends(require_permissions("report:performance:view")), # 权限校验:业绩报表查看权限
) -> dict:
"""
@ -48,7 +48,7 @@ def performance_report(
返回值
业绩统计数据包含各维度的销售汇总
权限要求manageradmin 角色 report:performance:view 权限
权限要求manageradminkuaiji 角色 report:performance:view 权限
"""
return success_payload(
report_service.performance_report(
@ -75,7 +75,7 @@ def report_audit(
exclude_ecommerce: bool = Query(default=False),
salesman_id: int | None = Query(default=None),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin")),
current_user: dict = Depends(require_roles("manager", "admin", "kuaiji")),
_permission_user: dict = Depends(require_permissions("report:performance:view")),
) -> dict:
"""报表核对接口,返回基础数据 + 动态异常检测结果。"""

View File

@ -0,0 +1,64 @@
"""为 kuaiji会计角色补上报表统计、报表核对页面的菜单权限。
会计角色可以看到菜单但访问时提示无权限原因是 sys_role_menu 缺少对应记录
"""
from alembic import op
import sqlalchemy as sa
revision = "20260704_0003"
down_revision = "20260704_0002"
def upgrade() -> None:
conn = op.get_bind()
# 找到会计角色 ID
role_row = conn.execute(
sa.text("SELECT id FROM sys_role WHERE role_code = 'kuaiji' LIMIT 1")
).mappings().first()
if role_row is None:
return
role_id = role_row["id"]
# 需要授权的菜单路径列表
menu_paths = ["/reports/performance", "/reports/audit"]
for menu_path in menu_paths:
menu_row = conn.execute(
sa.text("SELECT id FROM sys_menu WHERE menu_path = :mp LIMIT 1"),
{"mp": menu_path},
).mappings().first()
if menu_row is None:
continue
already = conn.execute(
sa.text("SELECT id FROM sys_role_menu WHERE role_id = :rid AND menu_id = :mid"),
{"rid": role_id, "mid": menu_row["id"]},
).first()
if already is None:
conn.execute(
sa.text(
"INSERT INTO sys_role_menu (role_id, menu_id, created_at, updated_at) VALUES (:rid, :mid, NOW(), NOW())"
),
{"rid": role_id, "mid": menu_row["id"]},
)
def downgrade() -> None:
conn = op.get_bind()
role_row = conn.execute(
sa.text("SELECT id FROM sys_role WHERE role_code = 'kuaiji' LIMIT 1")
).mappings().first()
if role_row is None:
return
menu_paths = ["/reports/performance", "/reports/audit"]
for menu_path in menu_paths:
menu_row = conn.execute(
sa.text("SELECT id FROM sys_menu WHERE menu_path = :mp LIMIT 1"),
{"mp": menu_path},
).mappings().first()
if menu_row is not None:
conn.execute(
sa.text("DELETE FROM sys_role_menu WHERE role_id = :rid AND menu_id = :mid"),
{"rid": role_id, "mid": menu_row["id"]},
)