110 lines
3.9 KiB
Python
110 lines
3.9 KiB
Python
"""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()
|