From f87a40fbd69057df4fe6498e1a1fe290b4f0ed61 Mon Sep 17 00:00:00 2001 From: XingQue Date: Wed, 8 Jul 2026 16:41:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8A=A2=E5=8D=95=E6=B1=A0=20clumber=20?= =?UTF-8?q?=E5=8F=AA=E8=AF=BB=E5=90=88=E5=B9=B6=E6=9C=89=E6=95=88=E6=9C=9F?= =?UTF-8?q?=E5=86=85=E5=85=85=E5=80=BC=E5=8D=95=EF=BC=8C=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=8C=89=E6=AD=A3=E5=BC=8F=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不写库、不 sync;修复体验单已付但 huiyuangoumai 未落库时老端显示未开通。 Co-authored-by: Cursor --- jituan/services/huiyuan_bundle.py | 46 ++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/jituan/services/huiyuan_bundle.py b/jituan/services/huiyuan_bundle.py index 008923d..f0c7fab 100644 --- a/jituan/services/huiyuan_bundle.py +++ b/jituan/services/huiyuan_bundle.py @@ -311,20 +311,38 @@ def _build_user_clumber_core(yonghu_id): return items +def _merge_clumber_extra_items(items, extra): + """只读合并:有效期内充值单合成的会员条目补进 clumber(体验=正式)。""" + if not extra: + return items + seen_cores = set() + for it in items: + hid = normalize_huiyuan_id(it.get('huiyuanid') or it.get('huiyuan_id')) + if hid: + seen_cores.add(hid.lstrip('0') or '0') + for it in extra: + hid = normalize_huiyuan_id(it.get('huiyuanid') or it.get('huiyuan_id')) + if not hid: + continue + core = hid.lstrip('0') or '0' + if core in seen_cores: + continue + items.append(it) + seen_cores.add(core) + return items + + def _build_clumber_from_paid_czjilu(yonghu_id): - """huiyuangoumai 缺失时,用已支付会员充值单合成 clumber(体验=正式)。""" - from jituan.constants import CLUB_ID_DEFAULT + """只读:huiyuangoumai 缺失时,用已支付会员充值单合成 clumber(体验=正式,不写库)。""" from jituan.services.member_recharge import ( MEMBER_LEIXING, MEMBER_PAID_STATUS, - _order_is_trial_like, - club_huiyuan_sellable, + czjilu_entitlement_active, ) from products.models import Czjilu, Huiyuan items = [] seen = set() - now = _normalize_datetime_for_compare(timezone.now()) for order in Czjilu.query.filter( yonghuid=yonghu_id, leixing=MEMBER_LEIXING, @@ -333,21 +351,16 @@ def _build_clumber_from_paid_czjilu(yonghu_id): hid = normalize_huiyuan_id(order.huiyuan_id) if not hid: continue - cid = getattr(order, 'club_id', None) or CLUB_ID_DEFAULT - is_trial = _order_is_trial_like(order, cid) - days = int(getattr(order, 'purchase_days', None) or 0) - if days <= 0: - _, _, days = club_huiyuan_sellable(cid, hid, is_trial=is_trial) - days = max(int(days or 0), 1) - start = _normalize_datetime_for_compare(order.CreateTime or now) - daoqi = start + timedelta(days=days) - if daoqi <= now: + cid = getattr(order, 'club_id', None) or '' + if not czjilu_entitlement_active(order, cid): continue try: hy = Huiyuan.query.get(huiyuan_id=hid) ming = hy.jieshao or f'会员{hid}' except Huiyuan.DoesNotExist: ming = f'会员{hid}' + from jituan.services.member_recharge import _czjilu_entitlement_end + daoqi = _czjilu_entitlement_end(order, cid) base = { 'huiyuanming': ming, 'daoqi': format_legacy_daoqi(daoqi), @@ -360,8 +373,8 @@ def _build_clumber_from_paid_czjilu(yonghu_id): def ensure_grab_pool_clumber(yonghu_id, club_id=None): """ - dddhq / dashouxinxi:只读 huiyuangoumai 生成 clumber(体验=正式)。 - 不在每次请求全量 sync 充值单(后台移除后会被补回)。 + dddhq / dashouxinxi:只读 huiyuangoumai + 有效期内充值单 生成 clumber(体验=正式)。 + 不写库、不全量 sync;仅在无任何会员时尝试补最近已付单(防回调丢失)。 """ from jituan.services.member_recharge import repair_recent_paid_entitlements_if_missing @@ -369,6 +382,7 @@ def ensure_grab_pool_clumber(yonghu_id, club_id=None): if not items: repair_recent_paid_entitlements_if_missing(yonghu_id, limit=3) items = _build_user_clumber_core(yonghu_id) + items = _merge_clumber_extra_items(items, _build_clumber_from_paid_czjilu(yonghu_id)) return bool(items), items