fix: 俱乐部超管可审本店提现与订单,禁跨店改单
放宽身份校验与权限推断,列表带回俱乐部信息,写操作按本店范围拦截。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user