From 12f9100b171a4867fdaff40e4af16cb436186651 Mon Sep 17 00:00:00 2001 From: XingQue Date: Wed, 8 Jul 2026 15:27:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=80=82=E9=85=8D=E8=80=81=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=8A=A2=E5=8D=95=E6=B1=A0=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E7=99=BB=E5=BD=95clumber=E5=90=AB=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 老端仅认 yaoqiuleixing=0 或 clumber.huiyuanid 严格匹配;统一 build_auth_clumber 与 dddhq 同源含 czjilu 兜底。 Co-authored-by: Cursor --- jituan/services/huiyuan_bundle.py | 76 +++++++++++++------------------ users/views/auth.py | 12 +++-- 2 files changed, 39 insertions(+), 49 deletions(-) diff --git a/jituan/services/huiyuan_bundle.py b/jituan/services/huiyuan_bundle.py index 01eb881..09e81b5 100644 --- a/jituan/services/huiyuan_bundle.py +++ b/jituan/services/huiyuan_bundle.py @@ -86,6 +86,17 @@ def is_bundle_huiyuan(huiyuan_id): return False +def _membership_record_active(record): + """会员记录是否未过期(体验=正式;时区安全,不依赖 jiance 副作用)。""" + if not record or int(record.huiyuan_zhuangtai or 0) != 1: + return False + if not record.daoqi_time: + return False + now = _normalize_datetime_for_compare(timezone.now()) + daoqi = _normalize_datetime_for_compare(record.daoqi_time) + return daoqi > now + + def user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=None): """ 抢单 /qiangdan 校验:有无对应会员且未过期(体验会员可抢对应类型单)。 @@ -96,11 +107,7 @@ def user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=None): return True def _record_valid(rec): - return ( - rec - and not rec.jiance_shifou_daoqi() - and rec.huiyuan_zhuangtai == 1 - ) + return _membership_record_active(rec) for rec in Huiyuangoumai.query.filter(yonghu_id=yonghu_id): if _record_valid(rec) and huiyuan_ids_match(rec.huiyuan_id, req): @@ -172,28 +179,24 @@ def user_has_huiyuan_access_any(yonghu_id, required_ids, club_id=None): def resolve_order_membership_ids(order_dict): - """订单可能关联的会员 ID(订单字段 + 商品类型配置,兼容老数据)。""" + """订单可能关联的会员 ID(订单字段 + 商品类型,兼容老数据)。""" ids = [] 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 order_dict.get('yaoqiuleixing') or 0) - if grab_req != 1: - return ids leixing_id = order_dict.get('ProductTypeID') or order_dict.get('leixing_id') - if not leixing_id: - return ids - try: - from products.models import ShangpinLeixing - row = ShangpinLeixing.query.filter(id=leixing_id).values('huiyuan_id').first() - if row: - lx_hid = normalize_huiyuan_id(row.get('huiyuan_id')) - if lx_hid and not any(huiyuan_ids_match(lx_hid, x) for x in ids): - ids.append(lx_hid) - except Exception: - pass + if leixing_id: + try: + from products.models import ShangpinLeixing + row = ShangpinLeixing.query.filter(id=leixing_id).values('huiyuan_id').first() + if row: + lx_hid = normalize_huiyuan_id(row.get('huiyuan_id')) + if lx_hid and not any(huiyuan_ids_match(lx_hid, x) for x in ids): + ids.append(lx_hid) + except Exception: + pass return ids @@ -227,9 +230,9 @@ def pool_display_has_valid_member_for_order(order_dict, yonghu_id, club_id=None) def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_clumber=None): """ - 【仅 dddhq 展示,骗老前端】有对应未过期会员(体验=正式)→ yaoqiuleixing=0。 - 无对应/已过期 → yaoqiuleixing=1。不区分体验/正式。 - 真实抢单 /dingdan/qiangdan;提现另走严格校验。 + 【仅 dddhq 适配老小程序,不改前端】 + 老端逻辑:yaoqiuleixing==1 时用 clumber.huiyuanid === huiyuan_id 判断; + 有对应未过期会员(体验=正式)→ 必须返回 yaoqiuleixing=0,否则显示「未开通会员」。 """ grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0) membership_id = resolve_order_membership_id(order_dict) @@ -238,7 +241,7 @@ def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_c 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 0, '', True return 1, membership_id or '', False @@ -297,9 +300,7 @@ def _build_user_clumber_core(yonghu_id): items = [] seen = set() for record in Huiyuangoumai.query.filter(yonghu_id=yonghu_id): - if record.jiance_shifou_daoqi(): - continue - if record.huiyuan_zhuangtai != 1: + if not _membership_record_active(record): continue base = enrich_clumber_item(record) _append_clumber_id_variants(items, seen, base, record.huiyuan_id) @@ -390,24 +391,9 @@ def build_user_clumber(yonghu_id, club_id=None): return items -def build_auth_clumber(yonghu_id): - """登录接口 clumber:老端认 huiyuanid,保留原状态字段。""" - from jituan.services.member_recharge import sync_member_entitlements_for_user - sync_member_entitlements_for_user(yonghu_id) - items = [] - seen = set() - for record in Huiyuangoumai.query.filter(yonghu_id=yonghu_id): - shifou_daoqi = record.jiance_shifou_daoqi() - base = enrich_clumber_item(record) - base.update({ - 'huiyuan_zhuangtai': 1 if (not shifou_daoqi and record.huiyuan_zhuangtai == 1) else record.huiyuan_zhuangtai, - 'daoqi_time': record.daoqi_time.isoformat() if record.daoqi_time else None, - 'shifou_daoqi': shifou_daoqi, - 'jieshao': record.jieshao, - }) - _append_clumber_id_variants(items, seen, base, record.huiyuan_id) - if not shifou_daoqi and record.huiyuan_zhuangtai == 1: - _append_bundle_sub_clumber(items, seen, record, base) +def build_auth_clumber(yonghu_id, club_id=None): + """登录/刷新 clumber:与 dddhq 同源(含体验会员 czjilu 兜底),老端只认 huiyuanid。""" + _, items = ensure_grab_pool_clumber(yonghu_id, club_id=club_id) return items diff --git a/users/views/auth.py b/users/views/auth.py index 7f247c4..951c51e 100644 --- a/users/views/auth.py +++ b/users/views/auth.py @@ -657,7 +657,8 @@ class DashouZhuceView(APIView): if is_new: huiyuan_goumai_list = [] else: - huiyuan_goumai_list = build_auth_clumber(current_user.UserUID) + cid = getattr(current_user, 'ClubID', None) or None + huiyuan_goumai_list = build_auth_clumber(current_user.UserUID, club_id=cid) data['clumber'] = huiyuan_goumai_list return data @@ -1226,7 +1227,8 @@ class WechatLoginAndDashouRegisterView(APIView): # 查询并处理会员列表 (clumber) from jituan.services.huiyuan_bundle import build_auth_clumber - huiyuan_goumai_list = build_auth_clumber(dashou_profile.user.UserUID) + cid = getattr(dashou_profile.user, 'ClubID', None) or None + huiyuan_goumai_list = build_auth_clumber(dashou_profile.user.UserUID, club_id=cid) data['clumber'] = huiyuan_goumai_list return data @@ -1424,7 +1426,8 @@ class WechatLoginAndGuanshiRegisterView(APIView): } from jituan.services.huiyuan_bundle import build_auth_clumber try: - huiyuan_list = build_auth_clumber(dashou_profile.user.UserUID) + cid = getattr(dashou_profile.user, 'ClubID', None) or None + huiyuan_list = build_auth_clumber(dashou_profile.user.UserUID, club_id=cid) except Exception as e: logger.warning(f"获取会员列表失败: {e}") huiyuan_list = [] @@ -1650,7 +1653,8 @@ class GuanshiRegisterView(APIView): # 会员列表 from jituan.services.huiyuan_bundle import build_auth_clumber try: - huiyuan_list = build_auth_clumber(dashou_profile.user.UserUID) + cid = getattr(dashou_profile.user, 'ClubID', None) or None + huiyuan_list = build_auth_clumber(dashou_profile.user.UserUID, club_id=cid) except Exception as e: logger.warning(f"获取会员列表失败: {e}") huiyuan_list = []