fix: 俱乐部ID统一解析;会员支付/分红/展示按club隔离

This commit is contained in:
XingQue
2026-06-25 01:37:58 +08:00
parent cca53bbc96
commit 0c4b28ea45
5 changed files with 76 additions and 28 deletions

View File

@@ -82,9 +82,29 @@ def filter_queryset_by_club(qs, request, club_field='club_id'):
return qs.filter(**{club_field: club_id})
def club_id_for_write(request):
def resolve_effective_club_id(request, user=None):
"""
小程序/API 实际生效俱乐部(展示价、支付价、分红须一致)。
优先级Header X-Club-Id > 用户归属 ClubID > 默认 xq。
勿用 middleware 注入的 request.club_id无 Header 时恒为 xq
"""
header = request.META.get(f'HTTP_{CLUB_HEADER.upper().replace("-", "_")}', '')
if not header and hasattr(request, 'headers'):
header = request.headers.get(CLUB_HEADER, '')
header = (header or '').strip()
if header:
return header
if user is not None:
from jituan.services.club_user import get_user_club_id
user_club = get_user_club_id(user)
if user_club:
return user_club
return CLUB_ID_DEFAULT
def club_id_for_write(request, user=None):
"""写入业务流水时使用的 club_id集团汇总视图写入仍须指定目标 club"""
return resolve_club_id_from_request(request)
return resolve_effective_club_id(request, user)
def orders_for_request(request):

View File

@@ -12,7 +12,7 @@ def resolve_club_id_for_write(request=None, user=None, club_id=None):
if club_id:
return club_id
if request is not None:
return club_id_for_write(request)
return club_id_for_write(request, user)
if user is not None:
return get_user_club_id(user)
return CLUB_ID_DEFAULT

View File

@@ -1,6 +1,11 @@
"""轮播 / 公告 / 弹窗按俱乐部读取与写入。"""
from jituan.constants import CLUB_ID_DEFAULT, DATA_SCOPE_ALL
from jituan.services.club_context import filter_queryset_by_club, resolve_club_id_from_request, resolve_club_scope
from jituan.services.club_context import (
filter_queryset_by_club,
resolve_club_id_from_request,
resolve_club_scope,
resolve_effective_club_id,
)
from rest_framework.response import Response
# 定稿 B 方案 page_key
@@ -46,16 +51,23 @@ def forbid_popup_page_out_of_scope(request, page):
return None
def _display_club_id(request):
user = getattr(request, 'user', None)
if user is not None and getattr(user, 'is_authenticated', False):
return resolve_effective_club_id(request, user)
return resolve_effective_club_id(request, None)
def get_gonggao_content(request, notice_type=1):
from config.models import Gonggao
club_id = resolve_club_id_from_request(request)
club_id = _display_club_id(request)
obj = Gonggao.query.filter(club_id=club_id, NoticeType=notice_type).first()
return obj.Content if obj and obj.Content else ''
def get_lunbo_urls(request, page_key=None, image_type=1):
from config.models import Lunbo
club_id = resolve_club_id_from_request(request)
club_id = _display_club_id(request)
pk = normalize_page_key(page_key, image_type=image_type)
qs = Lunbo.query.filter(club_id=club_id, ImageType=image_type, page_key=pk)
return [row.ImageURL for row in qs.order_by('id') if row.ImageURL]
@@ -67,13 +79,11 @@ def list_response_meta(request):
def get_tupianpeizhi_url(request, image_type):
"""按俱乐部读图片配置(无则 xq 回退,避免 xzj 未配时全空)。"""
"""按俱乐部读图片配置(各俱乐部独立,不回退 xq避免串台)。"""
from config.models import Tupianpeizhi
club_id = resolve_club_id_from_request(request)
club_id = _display_club_id(request)
row = Tupianpeizhi.query.filter(club_id=club_id, ImageType=image_type).first()
if not row and club_id != CLUB_ID_DEFAULT:
row = Tupianpeizhi.query.filter(club_id=CLUB_ID_DEFAULT, ImageType=image_type).first()
return (row.ImageURL or '').strip() if row else ''