From 3ec821ae6a5dd399fb08dd1e231a9c4c6a02e00d Mon Sep 17 00:00:00 2001 From: XingQue Date: Wed, 8 Jul 2026 14:59:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8A=A2=E5=8D=95=E6=B1=A0=E6=8C=89?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=BC=9A=E5=91=98=E7=B1=BB=E5=9E=8B=E9=80=90?= =?UTF-8?q?=E5=8D=95=E6=A0=A1=E9=AA=8C=EF=BC=8C=E5=8F=96=E6=B6=88=E4=BB=BB?= =?UTF-8?q?=E6=84=8F=E4=BC=9A=E5=91=98=E6=94=BE=E5=BC=80=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 会员单不再统一 yaoqiuleixing=0;clumber 裁剪为仅有权限的会员;ddhq 返回 hasRequiredMember。 Co-authored-by: Cursor --- jituan/services/huiyuan_bundle.py | 40 ++++++++++++++++++++++++------- orders/views/dashou.py | 6 +++-- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/jituan/services/huiyuan_bundle.py b/jituan/services/huiyuan_bundle.py index 3c6d992..bcbf3db 100644 --- a/jituan/services/huiyuan_bundle.py +++ b/jituan/services/huiyuan_bundle.py @@ -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_id;has_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 diff --git a/orders/views/dashou.py b/orders/views/dashou.py index 390db24..4f86ade 100644 --- a/orders/views/dashou.py +++ b/orders/views/dashou.py @@ -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 '',