fix: 适配老小程序抢单池展示,登录clumber含体验会员

老端仅认 yaoqiuleixing=0 或 clumber.huiyuanid 严格匹配;统一 build_auth_clumber 与 dddhq 同源含 czjilu 兜底。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-08 15:27:58 +08:00
parent bcfa30d5de
commit 12f9100b17
2 changed files with 39 additions and 49 deletions

View File

@@ -86,6 +86,17 @@ def is_bundle_huiyuan(huiyuan_id):
return False 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): def user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=None):
""" """
抢单 /qiangdan 校验:有无对应会员且未过期(体验会员可抢对应类型单)。 抢单 /qiangdan 校验:有无对应会员且未过期(体验会员可抢对应类型单)。
@@ -96,11 +107,7 @@ def user_has_huiyuan_access(yonghu_id, required_huiyuan_id, club_id=None):
return True return True
def _record_valid(rec): def _record_valid(rec):
return ( return _membership_record_active(rec)
rec
and not rec.jiance_shifou_daoqi()
and rec.huiyuan_zhuangtai == 1
)
for rec in Huiyuangoumai.query.filter(yonghu_id=yonghu_id): for rec in Huiyuangoumai.query.filter(yonghu_id=yonghu_id):
if _record_valid(rec) and huiyuan_ids_match(rec.huiyuan_id, req): 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): def resolve_order_membership_ids(order_dict):
"""订单可能关联的会员 ID订单字段 + 商品类型配置,兼容老数据)。""" """订单可能关联的会员 ID订单字段 + 商品类型,兼容老数据)。"""
ids = [] ids = []
mid = normalize_huiyuan_id( mid = normalize_huiyuan_id(
order_dict.get('MembershipID') or order_dict.get('huiyuan_id') order_dict.get('MembershipID') or order_dict.get('huiyuan_id')
) )
if mid: if mid:
ids.append(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') leixing_id = order_dict.get('ProductTypeID') or order_dict.get('leixing_id')
if not leixing_id: if leixing_id:
return ids try:
try: from products.models import ShangpinLeixing
from products.models import ShangpinLeixing row = ShangpinLeixing.query.filter(id=leixing_id).values('huiyuan_id').first()
row = ShangpinLeixing.query.filter(id=leixing_id).values('huiyuan_id').first() if row:
if row: lx_hid = normalize_huiyuan_id(row.get('huiyuan_id'))
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):
if lx_hid and not any(huiyuan_ids_match(lx_hid, x) for x in ids): ids.append(lx_hid)
ids.append(lx_hid) except Exception:
except Exception: pass
pass
return ids 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): def resolve_grab_pool_member_display(order_dict, yonghu_id, club_id=None, user_clumber=None):
""" """
【仅 dddhq 展示,骗老前端】有对应未过期会员(体验=正式)→ yaoqiuleixing=0。 【仅 dddhq 适配老小程序,不改前端】
无对应/已过期 → yaoqiuleixing=1。不区分体验/正式。 老端逻辑:yaoqiuleixing==1 时用 clumber.huiyuanid === huiyuan_id 判断;
真实抢单 /dingdan/qiangdan提现另走严格校验 有对应未过期会员(体验=正式)→ 必须返回 yaoqiuleixing=0否则显示「未开通会员」
""" """
grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0) grab_req = int(order_dict.get('GrabRequirement') or order_dict.get('yaoqiuleixing') or 0)
membership_id = resolve_order_membership_id(order_dict) 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) has_valid = pool_display_has_valid_member_for_order(order_dict, yonghu_id, club_id=club_id)
if has_valid: if has_valid:
return 0, membership_id or '', True return 0, '', True
return 1, membership_id or '', False return 1, membership_id or '', False
@@ -297,9 +300,7 @@ def _build_user_clumber_core(yonghu_id):
items = [] items = []
seen = set() seen = set()
for record in Huiyuangoumai.query.filter(yonghu_id=yonghu_id): for record in Huiyuangoumai.query.filter(yonghu_id=yonghu_id):
if record.jiance_shifou_daoqi(): if not _membership_record_active(record):
continue
if record.huiyuan_zhuangtai != 1:
continue continue
base = enrich_clumber_item(record) base = enrich_clumber_item(record)
_append_clumber_id_variants(items, seen, base, record.huiyuan_id) _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 return items
def build_auth_clumber(yonghu_id): def build_auth_clumber(yonghu_id, club_id=None):
"""登录接口 clumber老端认 huiyuanid,保留原状态字段""" """登录/刷新 clumber与 dddhq 同源(含体验会员 czjilu 兜底),老端认 huiyuanid。"""
from jituan.services.member_recharge import sync_member_entitlements_for_user _, items = ensure_grab_pool_clumber(yonghu_id, club_id=club_id)
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)
return items return items

View File

@@ -657,7 +657,8 @@ class DashouZhuceView(APIView):
if is_new: if is_new:
huiyuan_goumai_list = [] huiyuan_goumai_list = []
else: 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 data['clumber'] = huiyuan_goumai_list
return data return data
@@ -1226,7 +1227,8 @@ class WechatLoginAndDashouRegisterView(APIView):
# 查询并处理会员列表 (clumber) # 查询并处理会员列表 (clumber)
from jituan.services.huiyuan_bundle import build_auth_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 data['clumber'] = huiyuan_goumai_list
return data return data
@@ -1424,7 +1426,8 @@ class WechatLoginAndGuanshiRegisterView(APIView):
} }
from jituan.services.huiyuan_bundle import build_auth_clumber from jituan.services.huiyuan_bundle import build_auth_clumber
try: 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: except Exception as e:
logger.warning(f"获取会员列表失败: {e}") logger.warning(f"获取会员列表失败: {e}")
huiyuan_list = [] huiyuan_list = []
@@ -1650,7 +1653,8 @@ class GuanshiRegisterView(APIView):
# 会员列表 # 会员列表
from jituan.services.huiyuan_bundle import build_auth_clumber from jituan.services.huiyuan_bundle import build_auth_clumber
try: 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: except Exception as e:
logger.warning(f"获取会员列表失败: {e}") logger.warning(f"获取会员列表失败: {e}")
huiyuan_list = [] huiyuan_list = []