"""1 号药城支付落表:导出当天已付订单 → 写入表 2 operate_type=2。不对加购行。""" from __future__ import annotations import argparse import tempfile from datetime import date from pathlib import Path from db import RepoUnavailable from job import run_yaoex_pay from parse_xls import parse_order_xls from repo import EmptyPayRepo, OraclePayRepo from yaoex_client import day_range, export_orders from yaoex_login import load_cart_dotenv, resolve_yaoex_auth PROJECT_ROOT = Path(__file__).resolve().parent def parse_args(argv: list[str] | None = None) -> argparse.Namespace: parser = argparse.ArgumentParser(description="1 号药城支付落表") parser.add_argument("--xls", type=Path, default=None, help="已导出的订单明细 xls,跳过商城导出") parser.add_argument( "--days", type=int, default=0, help="导出日期跨度,0=仅当天。与 --xls 互斥时仍用于无 xls 的导出", ) parser.add_argument("--day", type=str, default=None, help="结束日期 YYYY-MM-DD,默认今天") parser.add_argument("--dry-run", action="store_true", help="解析但不写库") parser.add_argument("--fresh-login", action="store_true", help="忽略登录缓存") parser.add_argument("--secrets", type=Path, default=None) parser.add_argument("--yaoex-auth", type=Path, default=None) return parser.parse_args(argv) def main(argv: list[str] | None = None, repo=None) -> None: args = parse_args(argv) load_cart_dotenv() xls_path = args.xls tmp_xls: Path | None = None if xls_path is None: try: auth = resolve_yaoex_auth( secrets_path=args.secrets, auth_path=args.yaoex_auth, fresh=args.fresh_login, ) token = auth.token print("1号药城认证就绪。") except SystemExit: raise except Exception as exc: print(f"1号药城登录失败:{exc}") raise SystemExit(2) from exc end = date.fromisoformat(args.day) if args.day else date.today() begin, end_ts = day_range(end, args.days) print(f"导出 {begin} ~ {end_ts}") content = export_orders(token, begin=begin, end=end_ts) tmp_dir = Path(tempfile.mkdtemp(prefix="yaoex_pay_")) tmp_xls = tmp_dir / "orders.xls" tmp_xls.write_bytes(content) xls_path = tmp_xls print(f"导出文件 {xls_path} ({len(content)} bytes)") lines = parse_order_xls(xls_path) print(f"导出行 {len(lines)}") if repo is None: try: repo = OraclePayRepo.from_env() except RepoUnavailable as exc: if not args.dry_run: print(f"数据库不可用:{exc}") raise SystemExit(2) from exc print(f"无库,dry-run 只解析:{exc}") repo = EmptyPayRepo() summary = run_yaoex_pay(repo, lines, dry_run=args.dry_run) print( "落表 " f"inserted={summary.inserted} " f"skipped_status={summary.skipped_status} " f"skipped_dup={summary.skipped_dup} " f"unmatched={summary.unmatched} " f"reasons={summary.unmatched_reasons}" ) if __name__ == "__main__": main()