From f46e36b539a8a7641545db7331c06eafb565ff39 Mon Sep 17 00:00:00 2001 From: XingQue Date: Wed, 8 Jul 2026 14:13:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=80=81=E7=AB=AF=E6=8A=A2=E5=8D=95?= =?UTF-8?q?=E6=B1=A0=E6=9C=89=E4=BD=93=E9=AA=8C/=E6=AD=A3=E5=BC=8F?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=97=B6=20yaoqiuleixing=20=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /ddhq 在用户有有效会员(含体验)时将 yaoqiuleixing 置 0,老小程序不再显示未开通会员;抢单仍由服务端校验。 Co-authored-by: Cursor --- jituan/services/huiyuan_bundle.py | 54 ++++++++++++++++++++++++++++--- orders/views/dashou.py | 9 ++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/jituan/services/huiyuan_bundle.py b/jituan/services/huiyuan_bundle.py index a333265..e2e01f8 100644 --- a/jituan/services/huiyuan_bundle.py +++ b/jituan/services/huiyuan_bundle.py @@ -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): diff --git a/orders/views/dashou.py b/orders/views/dashou.py index 0c7234c..7a96a82 100644 --- a/orders/views/dashou.py +++ b/orders/views/dashou.py @@ -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, } })