fix: 抢单池展示只校验对应会员未过期,体验与正式同等
ddhq 不区分体验/正式;qiangdan 校验会员+过期;提现仍禁体验会员。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -87,7 +87,10 @@ def is_bundle_huiyuan(huiyuan_id):
|
||||
|
||||
|
||||
def user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=None):
|
||||
"""用户是否可接要求 required_huiyuan_id 的会员单(含总会员覆盖、体验会员)。"""
|
||||
"""
|
||||
抢单 /qiangdan 校验:有无对应会员且未过期(体验会员可抢对应类型单)。
|
||||
总会员按包含子会员判断。提现不走此函数。
|
||||
"""
|
||||
req = normalize_huiyuan_id(required_huiyuan_id)
|
||||
if not req:
|
||||
return True
|
||||
@@ -171,13 +174,15 @@ def user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=None):
|
||||
def resolve_order_membership_ids(order_dict):
|
||||
"""订单可能关联的会员 ID(订单字段 + 商品类型配置,兼容老数据)。"""
|
||||
ids = []
|
||||
mid = normalize_huiyuan_id(order_dict.get('MembershipID'))
|
||||
mid = normalize_huiyuan_id(
|
||||
order_dict.get('MembershipID') or order_dict.get('huiyuan_id')
|
||||
)
|
||||
if mid:
|
||||
ids.append(mid)
|
||||
grab_req = int(order_dict.get('GrabRequirement') or 0)
|
||||
grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0)
|
||||
if grab_req != 1:
|
||||
return ids
|
||||
leixing_id = order_dict.get('ProductTypeID')
|
||||
leixing_id = order_dict.get('ProductTypeID') or order_dict.get('leixing_id')
|
||||
if not leixing_id:
|
||||
return ids
|
||||
try:
|
||||
@@ -197,39 +202,42 @@ def resolve_order_membership_id(order_dict):
|
||||
return ids[0] if ids else ''
|
||||
|
||||
|
||||
def _clumber_covers_required_ids(user_clumber, required_ids):
|
||||
"""抢单池展示:clumber 是否包含本单所需会员(体验条目与正式同格式)。"""
|
||||
if not user_clumber or not required_ids:
|
||||
def pool_display_has_valid_member(yonghu_id, required_huiyuan_id, club_id=None):
|
||||
"""
|
||||
【仅 dddhq 抢单池展示】有无对应会员且未过期。
|
||||
体验会员与正式会员完全同等;不读 is_trial,不拦截体验。
|
||||
总会员按包含子会员判断。
|
||||
"""
|
||||
return user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=club_id)
|
||||
|
||||
|
||||
def pool_display_has_valid_member_for_order(order_dict, yonghu_id, club_id=None):
|
||||
"""抢单池:本单所需会员类型是否有效(只看类型+过期,体验=正式)。"""
|
||||
grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0)
|
||||
if grab_req != 1:
|
||||
return True
|
||||
required_ids = resolve_order_membership_ids(order_dict)
|
||||
if not required_ids:
|
||||
return False
|
||||
for rid in required_ids:
|
||||
for item in user_clumber:
|
||||
hid = item.get('huiyuanid') or item.get('huiyuan_id')
|
||||
if huiyuan_ids_match(hid, rid):
|
||||
return True
|
||||
if pool_display_has_valid_member(yonghu_id, rid, club_id=club_id):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_clumber=None):
|
||||
"""
|
||||
【仅抢单池 dddhq 展示】体验会员按正式会员返回,让老端能看见分佣/可抢。
|
||||
- 本单有所需会员(体验=正式)→ yaoqiuleixing=0
|
||||
- 本单无对应会员 → yaoqiuleixing=1,显示未开通
|
||||
真实抢单走 /qiangdan;提现走正式会员+禁体验,与此无关。
|
||||
【仅 dddhq 展示,骗老前端】有对应未过期会员(体验=正式)→ yaoqiuleixing=0。
|
||||
无对应/已过期 → yaoqiuleixing=1。不区分体验/正式。
|
||||
真实抢单 /dingdan/qiangdan;提现另走严格校验。
|
||||
"""
|
||||
grab_req = int(order_dict.get('GrabRequirement') or 0)
|
||||
grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0)
|
||||
membership_id = resolve_order_membership_id(order_dict)
|
||||
if grab_req != 1:
|
||||
return grab_req, membership_id or '', True
|
||||
|
||||
if user_clumber is None:
|
||||
_, user_clumber = ensure_grab_pool_clumber(yonghu_id, club_id=club_id)
|
||||
|
||||
required_ids = resolve_order_membership_ids(order_dict)
|
||||
has_access = user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=club_id)
|
||||
if not has_access:
|
||||
has_access = _clumber_covers_required_ids(user_clumber, required_ids)
|
||||
|
||||
if has_access:
|
||||
has_valid = pool_display_has_valid_member_for_order(order_dict, yonghu_id, club_id=club_id)
|
||||
if has_valid:
|
||||
return 0, membership_id or '', True
|
||||
return 1, membership_id or '', False
|
||||
|
||||
@@ -373,14 +381,12 @@ def ensure_grab_pool_clumber(yonghu_id, club_id=None):
|
||||
return bool(items), items
|
||||
|
||||
|
||||
def build_user_clumber(yonghu_id):
|
||||
def build_user_clumber(yonghu_id, club_id=None):
|
||||
"""
|
||||
老小程序抢单页 clumber:
|
||||
- 字段 huiyuanid(必须)+ daoqi 字符串
|
||||
- 体验会员、总会员子类型均展开
|
||||
- 同一会员补齐 1/001 等 ID 变体
|
||||
老小程序抢单页 clumber(体验=正式格式)。
|
||||
仅展示用;只含未过期会员。
|
||||
"""
|
||||
_, items = ensure_grab_pool_clumber(yonghu_id)
|
||||
_, items = ensure_grab_pool_clumber(yonghu_id, club_id=club_id)
|
||||
return items
|
||||
|
||||
|
||||
|
||||
@@ -337,10 +337,12 @@ class DashouXinxiAPIView(APIView):
|
||||
'chenghao': dashou_profile.chenghao or '',
|
||||
}
|
||||
|
||||
# 4. 查询会员信息(老端 clumber:huiyuanid + daoqi 字符串)
|
||||
# 4. 查询会员信息(老端 clumber:huiyuanid + daoqi,体验=正式)
|
||||
try:
|
||||
from jituan.services.huiyuan_bundle import build_user_clumber
|
||||
huiyuan_list = build_user_clumber(yonghuid)
|
||||
from jituan.services.club_context import resolve_effective_club_id
|
||||
cid = resolve_effective_club_id(request, request.user)
|
||||
huiyuan_list = build_user_clumber(yonghuid, club_id=cid)
|
||||
except Exception:
|
||||
huiyuan_list = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user