diff --git a/jituan/services/huiyuan_bundle.py b/jituan/services/huiyuan_bundle.py index efbe862..01eb881 100644 --- a/jituan/services/huiyuan_bundle.py +++ b/jituan/services/huiyuan_bundle.py @@ -87,7 +87,10 @@ def is_bundle_huiyuan(huiyuan_id): def user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=None): - """用户是否可接要求 required_huiyuan_id 的会员单(含总会员覆盖、体验会员)。""" + """ + 抢单 /qiangdan 校验:有无对应会员且未过期(体验会员可抢对应类型单)。 + 总会员按包含子会员判断。提现不走此函数。 + """ req = normalize_huiyuan_id(required_huiyuan_id) if not req: return True @@ -171,13 +174,15 @@ def user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=None): def resolve_order_membership_ids(order_dict): """订单可能关联的会员 ID(订单字段 + 商品类型配置,兼容老数据)。""" ids = [] - mid = normalize_huiyuan_id(order_dict.get('MembershipID')) + mid = normalize_huiyuan_id( + order_dict.get('MembershipID') or order_dict.get('huiyuan_id') + ) if mid: ids.append(mid) - grab_req = int(order_dict.get('GrabRequirement') or 0) + grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0) if grab_req != 1: return ids - leixing_id = order_dict.get('ProductTypeID') + leixing_id = order_dict.get('ProductTypeID') or order_dict.get('leixing_id') if not leixing_id: return ids try: @@ -197,39 +202,42 @@ def resolve_order_membership_id(order_dict): return ids[0] if ids else '' -def _clumber_covers_required_ids(user_clumber, required_ids): - """抢单池展示:clumber 是否包含本单所需会员(体验条目与正式同格式)。""" - if not user_clumber or not required_ids: +def pool_display_has_valid_member(yonghu_id, required_huiyuan_id, club_id=None): + """ + 【仅 dddhq 抢单池展示】有无对应会员且未过期。 + 体验会员与正式会员完全同等;不读 is_trial,不拦截体验。 + 总会员按包含子会员判断。 + """ + return user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=club_id) + + +def pool_display_has_valid_member_for_order(order_dict, yonghu_id, club_id=None): + """抢单池:本单所需会员类型是否有效(只看类型+过期,体验=正式)。""" + grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0) + if grab_req != 1: + return True + required_ids = resolve_order_membership_ids(order_dict) + if not required_ids: return False for rid in required_ids: - for item in user_clumber: - hid = item.get('huiyuanid') or item.get('huiyuan_id') - if huiyuan_ids_match(hid, rid): - return True + if pool_display_has_valid_member(yonghu_id, rid, club_id=club_id): + return True return False def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_clumber=None): """ - 【仅抢单池 dddhq 展示】体验会员按正式会员返回,让老端能看见分佣/可抢。 - - 本单有所需会员(体验=正式)→ yaoqiuleixing=0 - - 本单无对应会员 → yaoqiuleixing=1,显示未开通 - 真实抢单走 /qiangdan;提现走正式会员+禁体验,与此无关。 + 【仅 dddhq 展示,骗老前端】有对应未过期会员(体验=正式)→ yaoqiuleixing=0。 + 无对应/已过期 → yaoqiuleixing=1。不区分体验/正式。 + 真实抢单 /dingdan/qiangdan;提现另走严格校验。 """ - grab_req = int(order_dict.get('GrabRequirement') or 0) + grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') 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, club_id=club_id) - - required_ids = resolve_order_membership_ids(order_dict) - has_access = user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=club_id) - if not has_access: - has_access = _clumber_covers_required_ids(user_clumber, required_ids) - - if has_access: + has_valid = pool_display_has_valid_member_for_order(order_dict, yonghu_id, club_id=club_id) + if has_valid: return 0, membership_id or '', True return 1, membership_id or '', False @@ -373,14 +381,12 @@ def ensure_grab_pool_clumber(yonghu_id, club_id=None): return bool(items), items -def build_user_clumber(yonghu_id): +def build_user_clumber(yonghu_id, club_id=None): """ - 老小程序抢单页 clumber: - - 字段 huiyuanid(必须)+ daoqi 字符串 - - 体验会员、总会员子类型均展开 - - 同一会员补齐 1/001 等 ID 变体 + 老小程序抢单页 clumber(体验=正式格式)。 + 仅展示用;只含未过期会员。 """ - _, items = ensure_grab_pool_clumber(yonghu_id) + _, items = ensure_grab_pool_clumber(yonghu_id, club_id=club_id) return items diff --git a/users/views/user_info.py b/users/views/user_info.py index 5955128..b3cfc75 100644 --- a/users/views/user_info.py +++ b/users/views/user_info.py @@ -337,10 +337,12 @@ class DashouXinxiAPIView(APIView): 'chenghao': dashou_profile.chenghao or '', } - # 4. 查询会员信息(老端 clumber:huiyuanid + daoqi 字符串) + # 4. 查询会员信息(老端 clumber:huiyuanid + daoqi,体验=正式) try: from jituan.services.huiyuan_bundle import build_user_clumber - huiyuan_list = build_user_clumber(yonghuid) + from jituan.services.club_context import resolve_effective_club_id + cid = resolve_effective_club_id(request, request.user) + huiyuan_list = build_user_clumber(yonghuid, club_id=cid) except Exception: huiyuan_list = []