fix: 俱乐部超管可审本店提现与订单,禁跨店改单

放宽身份校验与权限推断,列表带回俱乐部信息,写操作按本店范围拦截。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-27 18:39:46 +08:00
parent 17b38d07a9
commit 955b76cbea
6 changed files with 193 additions and 52 deletions

View File

@@ -41,3 +41,20 @@ def forbid_if_order_out_of_scope(request, order):
if order_belongs_to_request(order, request):
return None
return Response({'code': 403, 'msg': '该订单不属于当前俱乐部数据范围'})
def forbid_if_order_mutate_out_of_scope(request, order):
"""
订单写操作闸门:
- SINGLE_CLUB只能处理当前俱乐部订单
- ALL_CLUBS仅集团高管可处理本店超管须切到具体俱乐部
"""
if resolve_club_scope(request) == DATA_SCOPE_ALL:
from jituan.services.group_finance_gate import has_group_finance_exec
if not has_group_finance_exec(request.user, request):
return Response({
'code': 403,
'msg': '跨俱乐部订单处理仅集团高管可执行,请切换到具体俱乐部后再操作',
})
return None
return forbid_if_order_out_of_scope(request, order)

View File

@@ -5,9 +5,10 @@
- 当前俱乐部超级管理 000001仅限 SINGLE_CLUB 本店,且目标用户必须属于当前俱乐部
不再强制「仅集团高管才能加余额」。
提现审核:权限码 005bb + 按俱乐部隔离——
- 子公司视图:持有 005bb 且任职含当前俱乐部 → 可审本俱乐部
提现审核:权限码 005bb 或本店超级管理 000001 + 按俱乐部隔离——
- 子公司视图:持有 005bb/000001 且任职含当前俱乐部 → 可审本俱乐部
- 集团汇总视图 / 跨俱乐部:须集团资金处置权
不再强制「必须集团权限才能审本店提现」。
"""
from django.db.models import Q
@@ -107,19 +108,19 @@ def deny_balance_add_exec(request, *, permissions=None, target_user=None):
def require_withdraw_audit_access(request, phone):
"""
提现审核访问:
1) 权限码 005bb
1) 权限码 005bb,或本店超级管理 000001
2) 集团高管:可在 ALL_CLUBS 或任意子公司视图操作
3) 俱乐部管理员:仅 SINGLE_CLUB 且当前 club 在其任职范围内
3) 俱乐部:仅 SINGLE_CLUB 且当前 club 在其任职范围内(只能审本店)
"""
from backend.utils import verify_kefu_permission
from backend.utils import has_club_super_perm, verify_kefu_permission
from rest_framework.response import Response
from jituan.services.club_context import resolve_club_id_from_request, resolve_club_scope
kefu, permissions = verify_kefu_permission(request, phone)
if kefu is None:
return None, permissions
if '005bb' not in permissions:
return None, Response({'code': 403, 'msg': '您无权操作提现审核'})
if '005bb' not in permissions and not has_club_super_perm(permissions):
return None, Response({'code': 403, 'msg': '您无权操作提现审核(需要 005bb 或本店超级管理 000001'})
if has_group_finance_exec(request.user, request):
return kefu, None

View File

@@ -2,7 +2,7 @@
import logging
from types import SimpleNamespace
from backend.utils import _AllPermissions, verify_kefu_permission
from backend.utils import _AllPermissions, verify_kefu_permission, CLUB_SUPER_IMPLIED_PERMS
from jituan.models import KefuMenuPage
from jituan.services.admin_context import (
build_admin_club_context,
@@ -43,14 +43,19 @@ def _page_visible(page, permissions, user):
if page.require_super:
return _has_super_perm(permissions) or is_system_super_admin(user)
# 仅系统级超管可见全部菜单;俱乐部 000001 不展开业务菜单
# 仅系统级超管可见全部菜单;俱乐部 000001 不展开全部业务菜单
if is_system_super_admin(user):
return True
codes = page.perm_codes or []
if not codes:
return False
return any(code in permissions for code in codes)
if any(code in permissions for code in codes):
return True
# 本店超管:解锁订单/提现审核等核心页(与加余额闸门一致,不要求集团权限)
if _has_super_perm(permissions) and any(code in CLUB_SUPER_IMPLIED_PERMS for code in codes):
return True
return False
def _permission_codes_list(permissions):