86 lines
3.2 KiB
Python
86 lines
3.2 KiB
Python
"""采购工具的最小桌面应用入口。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from collections.abc import Sequence
|
|
|
|
from .core.errors import StateError
|
|
from .logging_policy import configure_application_logger
|
|
from .runtime import LocalStateRuntime, RuntimePaths
|
|
|
|
|
|
def select_application_argv(argv: Sequence[str] | None) -> list[str]:
|
|
"""保留调用方明确给出的空参数列表,避免改变测试或打包入口的语义。"""
|
|
|
|
return list(sys.argv if argv is None else argv)
|
|
|
|
|
|
def main(argv: Sequence[str] | None = None) -> int:
|
|
"""启动只表达当前工程状态的桌面外壳。
|
|
|
|
真机控制和采购执行必须在完成取证并实现后才可接入,因此此入口不导入
|
|
uiautomator2,也不提供任何会影响采购或支付状态的命令。
|
|
"""
|
|
|
|
try:
|
|
paths = RuntimePaths.default()
|
|
logger = configure_application_logger(paths)
|
|
except OSError as error:
|
|
print(f"无法创建采购工具运行目录:{error}", file=sys.stderr)
|
|
return 1
|
|
|
|
try:
|
|
from PySide6.QtWidgets import QApplication
|
|
except ImportError:
|
|
logger.error("缺少 PySide6,无法启动桌面界面。")
|
|
print("无法启动采购工具:缺少 PySide6。请先安装 requirements.txt 中的依赖。", file=sys.stderr)
|
|
return 2
|
|
|
|
application = QApplication.instance() or QApplication(select_application_argv(argv))
|
|
application.setApplicationName("采购工具")
|
|
runtime: LocalStateRuntime | None = None
|
|
coordinator = None
|
|
try:
|
|
runtime = LocalStateRuntime.open(paths)
|
|
try:
|
|
summary = runtime.store.load_profile_summary("default")
|
|
except StateError as error:
|
|
if error.reason != "profile_not_found":
|
|
raise
|
|
summary = None
|
|
|
|
from .polling.coordinator import PollingCoordinator
|
|
from .ui.main_window import PurchaseToolWindow
|
|
|
|
settings = None if summary is None else summary.settings
|
|
has_token = False if summary is None else summary.has_stored_device_token
|
|
coordinator = PollingCoordinator(
|
|
profile_id="default",
|
|
store=runtime.store,
|
|
gateway_factory=None,
|
|
consumer=None,
|
|
profile_settings=settings,
|
|
poll_interval_seconds=15 if settings is None else settings.poll_interval_seconds,
|
|
failure_threshold=3 if settings is None else settings.failure_threshold,
|
|
)
|
|
window = PurchaseToolWindow(
|
|
store=runtime.store,
|
|
coordinator=coordinator,
|
|
profile_settings=settings,
|
|
has_stored_device_token=has_token,
|
|
)
|
|
logger.info("应用已启动;单趟执行能力尚未接入,真实领取保持禁用。")
|
|
window.show()
|
|
return application.exec()
|
|
except (OSError, RuntimeError, StateError):
|
|
logger.error("无法打开采购工具本地安全状态。")
|
|
print("无法启动采购工具:本地安全状态不可用。", file=sys.stderr)
|
|
return 3
|
|
finally:
|
|
worker_stopped = True
|
|
if coordinator is not None:
|
|
worker_stopped = coordinator.shutdown()
|
|
if runtime is not None and worker_stopped:
|
|
runtime.close()
|