fix: 适配老小程序抢单池展示,登录clumber含体验会员
老端仅认 yaoqiuleixing=0 或 clumber.huiyuanid 严格匹配;统一 build_auth_clumber 与 dddhq 同源含 czjilu 兜底。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
Reference in New Issue
Block a user