diff --git a/backend/views/system.py b/backend/views/system.py index 8368ef8..76c09c6 100644 --- a/backend/views/system.py +++ b/backend/views/system.py @@ -254,14 +254,13 @@ class GetProductTypeZoneView(APIView): } if club_scoped: - # 具体俱乐部:仅本俱乐部已上架类型(与抢单端一致) - admin_payload = build_club_leixing_admin_list(request) + # 具体俱乐部:已上架+未上架全部返回,前端展示下架/上架/换图 + admin_payload = build_club_leixing_admin_list(request, include_disabled=True) type_list = [] for item in (admin_payload.get('list') or []): type_list.append({ **item, 'product_count': zone_count_map.get(item['id'], 0), - 'club_enabled': True, }) else: type_list = [] diff --git a/jituan/services/club_rbac.py b/jituan/services/club_rbac.py index 7adbf43..38c6800 100644 --- a/jituan/services/club_rbac.py +++ b/jituan/services/club_rbac.py @@ -57,7 +57,9 @@ def filter_kefu_users_by_admin_scope(qs, request): """ 后台用户列表:按任职俱乐部过滤,而非仅 User.ClubID。 同一账号有多俱乐部任职时,在任一已分配俱乐部视图下均可见。 + 含:本店任职、本店功能角色、集团级任职、白名单超管;封禁账号也返回。 """ + from jituan.constants import SUPER_ADMIN_PHONES from jituan.models import AdminAssignment scope = resolve_club_scope(request) @@ -67,14 +69,28 @@ def filter_kefu_users_by_admin_scope(qs, request): assigned_uids = list( AdminAssignment.query.filter(status=1, club_id=club_id).values_list('yonghuid', flat=True) ) + group_uids = list( + AdminAssignment.query.filter(status=1) + .filter(Q(club_id__isnull=True) | Q(club_id='')) + .values_list('yonghuid', flat=True) + ) + role_uuids = list( + Role.objects.filter(ClubID=club_id).values_list('RoleUUID', flat=True) + ) + role_user_uuids = list( + UserRole.objects.filter(RoleUUID__in=role_uuids).values_list('UserUUID', flat=True) + ) if role_uuids else [] + + q = ( + Q(UserUID__in=assigned_uids) + | Q(UserUID__in=group_uids) + | Q(UserUUID__in=role_user_uuids) + | Q(Phone__in=list(SUPER_ADMIN_PHONES)) + | Q(ClubID=club_id) + ) if club_id == CLUB_ID_DEFAULT: - return qs.filter( - Q(UserUID__in=assigned_uids) - | Q(ClubID=club_id) - | Q(ClubID__isnull=True) - | Q(ClubID='') - ) - return qs.filter(Q(UserUID__in=assigned_uids) | Q(ClubID=club_id)) + q = q | Q(ClubID__isnull=True) | Q(ClubID='') + return qs.filter(q) def filter_kefu_users_qs(qs, request): diff --git a/jituan/services/club_shangpin_leixing.py b/jituan/services/club_shangpin_leixing.py index 29d41c1..d370f07 100644 --- a/jituan/services/club_shangpin_leixing.py +++ b/jituan/services/club_shangpin_leixing.py @@ -81,7 +81,12 @@ def build_club_leixing_list_for_api(club_id): return rows -def build_club_leixing_admin_list(request): +def build_club_leixing_admin_list(request, include_disabled=False): + """ + 后台类型列表。 + include_disabled=False:仅已上架(小程序配置页)。 + include_disabled=True:已上架+未上架全部返回并带 club_enabled(类型专区页)。 + """ if club_read_blocked(request): return { 'club_id': resolve_club_id_from_request(request), @@ -91,18 +96,22 @@ def build_club_leixing_admin_list(request): } club_id = resolve_club_id_from_request(request) cfg_map = _config_map(club_id) - enabled = [] + rows = [] for lx in ShangpinLeixing.query.exclude(shenhezhuangtai=2).order_by('-paixu', 'id'): cfg = cfg_map.get(lx.id) - if not _is_visible(club_id, lx.id, cfg): + enabled = bool(_is_visible(club_id, lx.id, cfg)) + if not include_disabled and not enabled: continue item = build_leixing_item(lx, cfg) - item['club_enabled'] = True - enabled.append(item) - enabled.sort(key=lambda x: (-int(x['paixu'] or 0), x['id'])) + item['club_enabled'] = enabled + rows.append(item) + if include_disabled: + rows.sort(key=lambda x: (0 if x.get('club_enabled') else 1, -int(x.get('paixu') or 0), x['id'])) + else: + rows.sort(key=lambda x: (-int(x.get('paixu') or 0), x['id'])) return { 'club_id': club_id, - 'list': enabled, + 'list': rows, 'scope': resolve_club_scope(request), }