fix: 抢单池按订单会员类型逐单校验,取消任意会员放开全部单
会员单不再统一 yaoqiuleixing=0;clumber 裁剪为仅有权限的会员;ddhq 返回 hasRequiredMember。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -186,20 +186,41 @@ def resolve_order_membership_id(order_dict):
|
|||||||
return ids[0] if ids else ''
|
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):
|
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_id;has_access 供 hasRequiredMember。
|
||||||
"""
|
"""
|
||||||
grab_req = int(order_dict.get('GrabRequirement') or 0)
|
grab_req = int(order_dict.get('GrabRequirement') or 0)
|
||||||
membership_id = resolve_order_membership_id(order_dict)
|
membership_id = resolve_order_membership_id(order_dict)
|
||||||
if grab_req != 1:
|
if grab_req != 1:
|
||||||
return grab_req, membership_id or '', True
|
return grab_req, membership_id or '', True
|
||||||
if user_clumber is None:
|
|
||||||
_, user_clumber = ensure_grab_pool_clumber(yonghu_id)
|
required_ids = resolve_order_membership_ids(order_dict)
|
||||||
if user_clumber:
|
has_access = user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=club_id)
|
||||||
return 0, '', True
|
return 1, membership_id or '', has_access
|
||||||
return 1, membership_id or '', False
|
|
||||||
|
|
||||||
|
|
||||||
def enrich_clumber_item(record):
|
def enrich_clumber_item(record):
|
||||||
@@ -316,9 +337,9 @@ def _build_clumber_from_paid_czjilu(yonghu_id):
|
|||||||
return items
|
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。
|
不得用于提现/收款等权限校验;提现须走 check_dashou_has_formal_huiyuan_for_withdraw。
|
||||||
"""
|
"""
|
||||||
from jituan.services.member_recharge import sync_member_entitlements_for_user
|
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)
|
items = _build_user_clumber_core(yonghu_id)
|
||||||
if not items:
|
if not items:
|
||||||
items = _build_clumber_from_paid_czjilu(yonghu_id)
|
items = _build_clumber_from_paid_czjilu(yonghu_id)
|
||||||
|
items = _prune_clumber_items(yonghu_id, items, club_id=club_id)
|
||||||
return bool(items), items
|
return bool(items), items
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ class DashouDingdanHuoquView(APIView):
|
|||||||
resolve_grab_pool_member_display,
|
resolve_grab_pool_member_display,
|
||||||
)
|
)
|
||||||
yonghuid = request.user.UserUID
|
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. 格式化返回数据
|
# 12. 格式化返回数据
|
||||||
formatted_list = []
|
formatted_list = []
|
||||||
@@ -310,7 +310,7 @@ class DashouDingdanHuoquView(APIView):
|
|||||||
zid = order.get('AssignedID')
|
zid = order.get('AssignedID')
|
||||||
info = zhiding_info.get(zid, {})
|
info = zhiding_info.get(zid, {})
|
||||||
sj_uid = shangjia_id_map.get(oid) if order['Platform'] == 2 else None
|
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(
|
resolve_grab_pool_member_display(
|
||||||
order, yonghuid, club_id=club_id, user_clumber=user_clumber,
|
order, yonghuid, club_id=club_id, user_clumber=user_clumber,
|
||||||
)
|
)
|
||||||
@@ -324,6 +324,8 @@ class DashouDingdanHuoquView(APIView):
|
|||||||
'tupian': order['ImageURL'] or '',
|
'tupian': order['ImageURL'] or '',
|
||||||
'yaoqiuleixing': display_grab_req,
|
'yaoqiuleixing': display_grab_req,
|
||||||
'huiyuan_id': display_huiyuan_id,
|
'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,
|
'yajin': float(order['CommissionReq']) if order['CommissionReq'] else 0.0,
|
||||||
'jieshao': order['Description'] or '',
|
'jieshao': order['Description'] or '',
|
||||||
'beizhu': order['Remark'] or '',
|
'beizhu': order['Remark'] or '',
|
||||||
|
|||||||
Reference in New Issue
Block a user