60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
# 生产 finder:登录一次,按合同号搜返利中心。Callable[[str], bool]。
|
||
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
|
||
from rebate_flow_steps import (
|
||
DEFAULT_URL,
|
||
RebateFlowContext,
|
||
enter_purchase_agreement,
|
||
login_rebate_center,
|
||
open_rebate_center,
|
||
search_contract,
|
||
)
|
||
|
||
|
||
# 按合同号查返利中心。一次班次只登录一次,后面的合同号复用这个会话。
|
||
class RebateFinder:
|
||
# 记下浏览器和地址账密。还没登录。
|
||
def __init__(self, browser, ctx: RebateFlowContext | None = None, **kwargs):
|
||
self._browser = browser
|
||
self._ctx = ctx or RebateFlowContext(
|
||
rebate_url=kwargs["rebate_url"],
|
||
username=kwargs["username"],
|
||
password=kwargs["password"],
|
||
)
|
||
self._ready = False
|
||
|
||
# 搜这个合同号。表里出现该号才是 True,输入框回显不算。
|
||
def __call__(self, contract_no: str) -> bool:
|
||
self._ensure_session()
|
||
return search_contract(self._browser, contract_no)
|
||
|
||
# 第一次搜之前打开返利中心、登录、进入采购协议。
|
||
def _ensure_session(self) -> None:
|
||
if self._ready:
|
||
return
|
||
open_rebate_center(self._browser, self._ctx)
|
||
login_rebate_center(self._browser, self._ctx)
|
||
enter_purchase_agreement(self._browser)
|
||
self._ready = True
|
||
|
||
|
||
# 从 REBATE_URL / 账号环境变量拼页面会话。没配地址时用默认内网地址。
|
||
def context_from_env() -> RebateFlowContext:
|
||
return RebateFlowContext(
|
||
rebate_url=(os.getenv("REBATE_URL") or DEFAULT_URL).strip(),
|
||
username=(os.getenv("REBATE_USERNAME") or "").strip(),
|
||
password=os.getenv("REBATE_PASSWORD") or "",
|
||
)
|
||
|
||
|
||
# 按环境变量打开浏览器,做成班次用的查号器。
|
||
def production_finder() -> RebateFinder:
|
||
from apa_browser_adapter import ApaBrowserAdapter
|
||
|
||
ctx = context_from_env()
|
||
browser = ApaBrowserAdapter(url=ctx.rebate_url, flow="REBATE_FIND")
|
||
return RebateFinder(browser, ctx)
|