fix: 抢单池按订单会员类型逐单校验,取消任意会员放开全部单

会员单不再统一 yaoqiuleixing=0;clumber 裁剪为仅有权限的会员;ddhq 返回 hasRequiredMember。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-08 14:59:00 +08:00
parent b54904a9f2
commit 3ec821ae6a
2 changed files with 35 additions and 11 deletions

View File

@@ -186,20 +186,41 @@ def resolve_order_membership_id(order_dict):
return ids[0] if ids else ''
def _prune_clumber_items(yonghu_id, items, club_id=None):
"""clumber 只保留用户当前真有权限的会员(含总会员子类型)。"""
if not items:
return []
from collections import defaultdict
groups = defaultdict(list)
for item in items:
hid = normalize_huiyuan_id(item.get('huiyuanid') or item.get('huiyuan_id'))
if not hid:
continue
core = hid.lstrip('0') or '0'
groups[core].append(item)
kept = []
for group_items in groups.values():
sample_hid = group_items[0].get('huiyuanid') or group_items[0].get('huiyuan_id')
if user_has_huiyuan_access(yonghu_id, sample_hid, club_id=club_id):
kept.extend(group_items)
return kept
def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_clumber=None):
"""
老小程序抢单池:yaoqiuleixing==1 且 huiyuan_id 有值才会显示「未开通会员」
用户只要有任意有效会员(体验=正式),会员单一律返回 yaoqiuleixing=0
老小程序抢单池:按「本单所需会员类型」逐单判断,禁止有任意会员就放开全部订单
会员单固定返回 yaoqiuleixing=1 + 本单 huiyuan_idhas_access 供 hasRequiredMember
"""
grab_req = int(order_dict.get('GrabRequirement') 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)
if user_clumber:
return 0, '', True
return 1, membership_id or '', False
required_ids = resolve_order_membership_ids(order_dict)
has_access = user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=club_id)
return 1, membership_id or '', has_access
def enrich_clumber_item(record):
@@ -316,9 +337,9 @@ def _build_clumber_from_paid_czjilu(yonghu_id):
return items
def ensure_grab_pool_clumber(yonghu_id):
def ensure_grab_pool_clumber(yonghu_id, club_id=None):
"""
【仅抢单池展示】同步权益并构造 clumber供老小程序识别会员
【仅抢单池展示】同步权益并构造 clumber供老小程序按 huiyuan_id 逐单匹配
不得用于提现/收款等权限校验;提现须走 check_dashou_has_formal_huiyuan_for_withdraw。
"""
from jituan.services.member_recharge import sync_member_entitlements_for_user
@@ -327,6 +348,7 @@ def ensure_grab_pool_clumber(yonghu_id):
items = _build_user_clumber_core(yonghu_id)
if not items:
items = _build_clumber_from_paid_czjilu(yonghu_id)
items = _prune_clumber_items(yonghu_id, items, club_id=club_id)
return bool(items), items

View File

@@ -301,7 +301,7 @@ class DashouDingdanHuoquView(APIView):
resolve_grab_pool_member_display,
)
yonghuid = request.user.UserUID
_has_member, user_clumber = ensure_grab_pool_clumber(yonghuid)
_has_member, user_clumber = ensure_grab_pool_clumber(yonghuid, club_id=club_id)
# 12. 格式化返回数据
formatted_list = []
@@ -310,7 +310,7 @@ class DashouDingdanHuoquView(APIView):
zid = order.get('AssignedID')
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 = (
display_grab_req, display_huiyuan_id, has_required_member = (
resolve_grab_pool_member_display(
order, yonghuid, club_id=club_id, user_clumber=user_clumber,
)
@@ -324,6 +324,8 @@ class DashouDingdanHuoquView(APIView):
'tupian': order['ImageURL'] or '',
'yaoqiuleixing': display_grab_req,
'huiyuan_id': display_huiyuan_id,
'hasRequiredMember': has_required_member,
'has_required_member': has_required_member,
'yajin': float(order['CommissionReq']) if order['CommissionReq'] else 0.0,
'jieshao': order['Description'] or '',
'beizhu': order['Remark'] or '',