feat: 迁移商务与游戏商务画像及交互看板
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
"""只读验证运行实例的商务画像、缺数据处理与参数校验。"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--base-url", default="http://127.0.0.1:18000")
|
||||
parser.add_argument("--token-file", required=True, type=Path)
|
||||
parser.add_argument("--output", required=True, type=Path)
|
||||
args = parser.parse_args()
|
||||
token = args.token_file.read_text(encoding="utf-8").strip()
|
||||
checks = []
|
||||
|
||||
def get(path, expected=0):
|
||||
request = urllib.request.Request(args.base_url + path, headers={"x-token": token})
|
||||
with urllib.request.urlopen(request, timeout=30) as response:
|
||||
payload = json.load(response)
|
||||
check = {"path": path, "http": response.status, "code": payload.get("code"),
|
||||
"msg": payload.get("msg"), "passed": response.status == 200 and payload.get("code") == expected}
|
||||
data = payload.get("data", {})
|
||||
if isinstance(data, dict) and "basic" in data:
|
||||
check.update(available=data.get("available"), promote_count=data["basic"].get("promoteCount"),
|
||||
register_points=len(data.get("registerTrend", [])), pay_points=len(data.get("payTrend", [])))
|
||||
checks.append(check)
|
||||
return data
|
||||
|
||||
accounts = get("/sw/business/list?pageNum=1&pageSize=500")["rows"]
|
||||
|
||||
def bound_subtree(account):
|
||||
prefix = f"{account.get('idPath') or '0'},{account['userId']}"
|
||||
ids = [account]
|
||||
if int(account.get("level") or 0) < 3:
|
||||
ids += [row for row in accounts if row["userId"] != account["userId"] and
|
||||
(row.get("parentId") == account["userId"] or row.get("idPath") == prefix or
|
||||
str(row.get("idPath") or "").startswith(prefix + ","))]
|
||||
return sum(row.get("bindCount") or 0 for row in ids)
|
||||
|
||||
empty = next((row for row in accounts if bound_subtree(row) == 0), None)
|
||||
bound = next((row for row in accounts if bound_subtree(row) > 0), None)
|
||||
if empty:
|
||||
data = get(f"/sw/business/{empty['userId']}/portrait?sourceDbList=lx,hw,yq&period=today")
|
||||
checks[-1]["passed"] &= data.get("available") is True and data.get("metrics", {}).get("register", {}).get("value") == "0" and len(data.get("registerTrend", [])) == 24
|
||||
data = get(f"/sw/business/{empty['userId']}/portrait?sourceDbList=lx&period=thisMonth")
|
||||
checks[-1]["passed"] &= data.get("period") == "thismonth" and 1 <= len(data.get("registerTrend", [])) <= 31
|
||||
if bound:
|
||||
data = get(f"/sw/business/{bound['userId']}/portrait?sourceDbList=lx,hw,yq&period=last7")
|
||||
if data.get("available") is False:
|
||||
checks[-1]["passed"] &= data.get("metrics") is None and bool(data.get("unavailableReason"))
|
||||
else:
|
||||
checks[-1]["passed"] &= len(data.get("registerTrend", [])) == 7
|
||||
if accounts:
|
||||
get(f"/sw/business/{accounts[0]['userId']}/portrait", expected=7)
|
||||
get("/sw/business/bindPlatform/portrait?sourceDb=lx&platformBusierId=0", expected=7)
|
||||
report = {"scope": "真实 sw7 登录会话,只读请求;有绑定但业务表未接入时不伪造零,无绑定时验证真实空画像。完整指标和 SDK 基本信息通过隔离双库 TCP HTTP 测试。",
|
||||
"checks": checks, "passed": all(check["passed"] for check in checks)}
|
||||
args.output.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
print(json.dumps(report, ensure_ascii=False))
|
||||
if not report["passed"]:
|
||||
raise SystemExit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user