fix: 老端抢单池有体验/正式会员时 yaoqiuleixing 返回 0

/ddhq 在用户有有效会员(含体验)时将 yaoqiuleixing 置 0,老小程序不再显示未开通会员;抢单仍由服务端校验。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-08 14:13:24 +08:00
parent eedd5fbd46
commit f46e36b539
2 changed files with 57 additions and 6 deletions

View File

@@ -145,14 +145,60 @@ def resolve_order_membership_id(order_dict):
return ids[0] if ids else ''
def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None):
def _clumber_covers_required_ids(user_clumber, required_ids):
"""老端用 clumber[].huiyuanid 匹配,补齐 ID 变体。"""
owned = set()
for item in user_clumber or []:
for key in ('huiyuanid', 'huiyuan_id'):
v = normalize_huiyuan_id(item.get(key))
if not v:
continue
owned.add(v)
owned.add(v.lstrip('0') or '0')
for req in required_ids or []:
req_n = normalize_huiyuan_id(req)
if not req_n:
continue
req_variants = set(expand_huiyuan_id_variants(req_n))
if owned & req_variants:
return True
for o in owned:
if huiyuan_ids_match(o, req_n):
return True
return False
def user_can_grab_pool_show_member_order(order_dict, yonghu_id, club_id=None, user_clumber=None):
"""抢单池展示/老端本地校验:体验会员与正式会员同等视为已开通。"""
grab_req = int(order_dict.get('GrabRequirement') or 0)
if grab_req != 1:
return True
required_ids = resolve_order_membership_ids(order_dict)
if not required_ids:
return True
if user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=club_id):
return True
if user_clumber is None:
user_clumber = build_user_clumber(yonghu_id)
return _clumber_covers_required_ids(user_clumber, required_ids)
def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_clumber=None):
"""
抢单池订单字段:保持原 yaoqiuleixing / huiyuan_id,供老端用 clumber 匹配
体验会员已在 clumber 中按正式会员返回;抢单权限由 /dingdan/qiangdan 服务端校验
老小程序抢单池:仅当 yaoqiuleixing==1 且 huiyuan_id 有值时才显示「未开通会员」
用户已有体验/正式/总会员权限时,强制返回 yaoqiuleixing=0老端无需改代码即可正常显示与点抢单
真实权限仍在 /dingdan/qiangdan 服务端校验。
"""
grab_req = int(order_dict.get('GrabRequirement') or 0)
membership_id = resolve_order_membership_id(order_dict)
return grab_req, membership_id, True
if grab_req != 1:
return grab_req, membership_id or '', True
if user_can_grab_pool_show_member_order(
order_dict, yonghu_id, club_id=club_id, user_clumber=user_clumber,
):
return 0, '', True
required_ids = resolve_order_membership_ids(order_dict)
return 1, (required_ids[0] if required_ids else membership_id), False
def enrich_clumber_item(record):

View File

@@ -300,7 +300,10 @@ class DashouDingdanHuoquView(APIView):
build_user_clumber,
resolve_grab_pool_member_display,
)
from jituan.services.member_recharge import sync_member_entitlements_for_user
yonghuid = request.user.UserUID
sync_member_entitlements_for_user(yonghuid)
user_clumber = build_user_clumber(yonghuid)
# 12. 格式化返回数据
formatted_list = []
@@ -310,7 +313,9 @@ class DashouDingdanHuoquView(APIView):
info = zhiding_info.get(zid, {})
sj_uid = shangjia_id_map.get(oid) if order['Platform'] == 2 else None
display_grab_req, display_huiyuan_id, _has_required_member = (
resolve_grab_pool_member_display(order, yonghuid, club_id=club_id)
resolve_grab_pool_member_display(
order, yonghuid, club_id=club_id, user_clumber=user_clumber,
)
)
formatted_list.append({
'dingdan_id': order['OrderID'],
@@ -357,7 +362,7 @@ class DashouDingdanHuoquView(APIView):
'current_page': page,
'page_size': page_size,
'total_pages': (total + page_size - 1) // page_size,
'clumber': build_user_clumber(yonghuid),
'clumber': user_clumber,
}
})