69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""奇成数据迁移脚本2:关联数据导入。
|
|
|
|
前提:脚本1的 SQL 已在新系统执行(线上库已包含本次迁移所有 ICCID)。
|
|
|
|
工作流:
|
|
1. 读 mapping.yaml + cards.csv
|
|
2. 连奇成查:卡元数据(card_meta) + 累计流量(card_usage) + 代理佣金/主钱包余额
|
|
3. 卡 → 当前生效套餐 → mapping.packages → target_package_id
|
|
4. 生成 step2_*.sql
|
|
|
|
用法:
|
|
python3 migrate_runtime.py [--config-dir config] [--resources-dir resources] [--output-dir output]
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
|
|
from lib import csv_loader, legacy_query, mapping_loader, sql_builder # noqa: E402
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description="奇成数据迁移脚本2:关联数据导入")
|
|
parser.add_argument("--config-dir", default="config", help="yaml 配置目录")
|
|
parser.add_argument("--resources-dir", default="resources", help="CSV 资源目录")
|
|
parser.add_argument("--output-dir", default="output", help="SQL/CSV 输出目录")
|
|
args = parser.parse_args()
|
|
|
|
base = Path(__file__).resolve().parent
|
|
config_dir = (base / args.config_dir).resolve()
|
|
resources_dir = (base / args.resources_dir).resolve()
|
|
output_dir = (base / args.output_dir).resolve()
|
|
output_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
mapping = mapping_loader.load_mapping(config_dir)
|
|
cards, _devices, _errors = csv_loader.load_assets(resources_dir)
|
|
|
|
iccid_pairs = [(c.iccid_19, c.iccid_20) for c in cards]
|
|
agent_ids = [a.legacy_agent_id for a in mapping.agents.values() if (a.target_shop_code or "").strip()]
|
|
|
|
dsn = mapping_loader.load_legacy_dsn(config_dir)
|
|
with legacy_query.connect_readonly(dsn) as conn:
|
|
card_metas, _dup_iccid_19 = legacy_query.fetch_card_meta(conn, iccid_pairs)
|
|
usage_snapshots = legacy_query.fetch_card_usage(conn, iccid_pairs)
|
|
commission_snapshots = legacy_query.fetch_commission_accounts(conn, agent_ids) if agent_ids else {}
|
|
agent_balances = legacy_query.fetch_agent_balances(conn, agent_ids) if agent_ids else {}
|
|
|
|
warnings = sql_builder.write_step2(
|
|
output_dir,
|
|
cards=cards,
|
|
mapping=mapping,
|
|
card_metas=card_metas,
|
|
usage_snapshots=usage_snapshots,
|
|
commission_snapshots=commission_snapshots,
|
|
agent_balances=agent_balances,
|
|
)
|
|
|
|
print(f"完成:卡 {len(cards)} 张,代理 {len(agent_ids)} 个,警告 {len(warnings)} 条")
|
|
print(f"SQL 输出: {output_dir}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|