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
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

View File

@@ -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 = []