's'
This commit is contained in:
@@ -361,6 +361,15 @@ async def nomadvip_check_vip(user_id: str = ""):
|
|||||||
or str(wx_link.get("anonymous_user_id", "")).strip()
|
or str(wx_link.get("anonymous_user_id", "")).strip()
|
||||||
)
|
)
|
||||||
wx_link_email = str(wx_link.get("email", "")).strip().lower()
|
wx_link_email = str(wx_link.get("email", "")).strip().lower()
|
||||||
|
if admin_token and linked_user_id and _uid_has_vip(pb, linked_user_id):
|
||||||
|
# 补齐标准关联表,避免后续链路只能依赖 raw_contact
|
||||||
|
if wx_link_email:
|
||||||
|
_pb_upsert_email_link(
|
||||||
|
admin_token,
|
||||||
|
wx_link_email,
|
||||||
|
linked_user_id,
|
||||||
|
user_id,
|
||||||
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
linked_user_id = ""
|
linked_user_id = ""
|
||||||
wx_link_email = ""
|
wx_link_email = ""
|
||||||
@@ -501,6 +510,12 @@ def _pb_bind_wechat_vip_link(
|
|||||||
or None,
|
or None,
|
||||||
"updated_at": int(time.time()),
|
"updated_at": int(time.time()),
|
||||||
}
|
}
|
||||||
|
if not raw_contact["_vip_link"].get("anonymous_user_id"):
|
||||||
|
derived = _pb_find_anonymous_user_id_by_member(
|
||||||
|
admin_token, str(raw_contact["_vip_link"].get("pb_user_id") or "").strip()
|
||||||
|
)
|
||||||
|
if derived:
|
||||||
|
raw_contact["_vip_link"]["anonymous_user_id"] = derived
|
||||||
|
|
||||||
base = (PB_URL or "").rstrip("/")
|
base = (PB_URL or "").rstrip("/")
|
||||||
_http_session.patch(
|
_http_session.patch(
|
||||||
@@ -514,6 +529,58 @@ def _pb_bind_wechat_vip_link(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _pb_find_anonymous_user_id_by_member(
|
||||||
|
admin_token: str, member_user_id: str
|
||||||
|
) -> str | None:
|
||||||
|
"""
|
||||||
|
从会员用户 ID 反查对应历史支付匿名 user_id(user[0-9]+)。
|
||||||
|
路径:site_vip(user_id=member) -> order_id -> payments(order_id) -> user_id
|
||||||
|
"""
|
||||||
|
member_user_id = (member_user_id or "").strip()
|
||||||
|
if not member_user_id:
|
||||||
|
return None
|
||||||
|
base = (PB_URL or "").rstrip("/")
|
||||||
|
safe_member = _pb_escape(member_user_id)
|
||||||
|
site_resp = _http_session.get(
|
||||||
|
f"{base}/api/collections/site_vip/records",
|
||||||
|
params={
|
||||||
|
"filter": f'user_id = "{safe_member}" && site_id = "vip"',
|
||||||
|
"perPage": 20,
|
||||||
|
"sort": "-created",
|
||||||
|
},
|
||||||
|
headers={"Authorization": f"Bearer {admin_token}"},
|
||||||
|
timeout=DEFAULT_HTTP_TIMEOUT,
|
||||||
|
)
|
||||||
|
if site_resp.status_code != 200:
|
||||||
|
return None
|
||||||
|
site_items = (site_resp.json() or {}).get("items") or []
|
||||||
|
seen_orders = set()
|
||||||
|
for sv in site_items:
|
||||||
|
order_id = str((sv or {}).get("order_id") or "").strip()
|
||||||
|
if not order_id or order_id in seen_orders:
|
||||||
|
continue
|
||||||
|
seen_orders.add(order_id)
|
||||||
|
safe_order = _pb_escape(order_id)
|
||||||
|
pay_resp = _http_session.get(
|
||||||
|
f"{base}/api/collections/payments/records",
|
||||||
|
params={
|
||||||
|
"filter": f'order_id = "{safe_order}" && type = "vip"',
|
||||||
|
"perPage": 20,
|
||||||
|
"sort": "-created",
|
||||||
|
},
|
||||||
|
headers={"Authorization": f"Bearer {admin_token}"},
|
||||||
|
timeout=DEFAULT_HTTP_TIMEOUT,
|
||||||
|
)
|
||||||
|
if pay_resp.status_code != 200:
|
||||||
|
continue
|
||||||
|
pay_items = (pay_resp.json() or {}).get("items") or []
|
||||||
|
for payment in pay_items:
|
||||||
|
uid = str((payment or {}).get("user_id") or "").strip()
|
||||||
|
if uid.startswith("user") and uid[4:].isdigit():
|
||||||
|
return uid
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _pb_get_user_by_id(admin_token: str, user_id: str) -> dict | None:
|
def _pb_get_user_by_id(admin_token: str, user_id: str) -> dict | None:
|
||||||
base = (PB_URL or "").rstrip("/")
|
base = (PB_URL or "").rstrip("/")
|
||||||
response = _http_session.get(
|
response = _http_session.get(
|
||||||
|
|||||||
Reference in New Issue
Block a user