AutoRpa/rpa_cart/main.py

110 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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 settle import PAID_STATUSES
from yaoex_client import day_range, export_orders, fetch_order_details
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
token = ""
if xls_path is None or not args.dry_run:
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
if xls_path is None:
if not token:
raise SystemExit("导出需要登录。")
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)}")
order_nos = sorted({line.order_no for line in lines if line.status in PAID_STATUSES})
details: dict = {}
if order_nos:
if not token:
auth = resolve_yaoex_auth(
secrets_path=args.secrets,
auth_path=args.yaoex_auth,
fresh=args.fresh_login,
)
token = auth.token
details = fetch_order_details(token, order_nos)
print(f"拉取详情 {len(details)} 单")
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, details, 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()