"""企业微信成功案例的安全提炼:probe 和 dry-run,不默认发送邀请。""" from __future__ import annotations from dataclasses import asdict from typing import Any from service.desktop_session import activate_window, resolve_unique_window from service.uia_locator import locate_unique, root_from_window, type_text from util.selectors import ( ADD_CUSTOMER_WINDOW, CONTACTS_ENTRY, MAIN_WINDOW, NEW_CUSTOMER_ROW, SEARCH_INPUT, ) def probe() -> dict[str, Any]: """最小 probe:主窗 + 通讯录入口。 生产技能应对「新的客户 / 添加」等关键节点做更深探测;本函数不等于生产完整度。 调用前会 maximize 主窗,避免侧栏折叠导致 org_op_new 抖动。 """ main = resolve_unique_window(MAIN_WINDOW) activate_window(main, maximize=True) root = root_from_window(main) contacts = locate_unique(root, CONTACTS_ENTRY) payload: dict[str, Any] = { "success": True, "minimized_probe": True, "main_window": asdict(main), "contacts_entry": { "name": getattr(contacts, "Name", ""), "control_type": getattr(contacts, "ControlTypeName", ""), }, } # 可选:若已在通讯录页,尝试按 Value 定位「新的客户」行(失败不视为 probe 失败) try: row = locate_unique(root, NEW_CUSTOMER_ROW) payload["new_customer_row"] = {"name": getattr(row, "Name", "")} except Exception: payload["new_customer_row"] = None return payload def fill_search_dry_run(target: str) -> dict[str, Any]: """要求操作者已打开“添加客户”窗口;只填写搜索框,不提交。""" search_window = resolve_unique_window(ADD_CUSTOMER_WINDOW) activate_window(search_window, maximize=False) root = root_from_window(search_window) search_input = locate_unique(root, SEARCH_INPUT) type_text(search_input, target, window=search_window) return { "success": True, "mode": "dry-run", "message": "已填写搜索条件,未发送邀请", }