"""采购工具的最小桌面应用入口。""" 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()