- Rewrite yunda_smart_menu_click to check each parent submenu's
is-opened state before clicking (skip if already open), using XPath
parent-child isolation to avoid collapsing accordion menus
- Scope the expected/actual-arrival loading mask, #sum panel, and
empty-record hint to #tab-1 and add .first to fix Playwright Strict
Mode (5 elements found) leaks across multiple open tabs
- Move _yunda_poll_and_download_tasks above yunda_actual_download for
definition order
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement yunda_actual_download via the 报表管理 -> 扫描记录查询
menu: set date range, switch scan type to 到件, then reuse the
shared poll/download/merge engine
- Add a three-stage query buffer (yield, wait for the Bootstrap Table
loading mask, settle) before the data/empty verdict to avoid stale
DOM reads in the expected-arrival flow
- Trim the offline-export retry state machine's verbose logs
- Fix a typo (研编 -> 研判) and drop the 待开发 tag on menu [7]
Co-Authored-By: Claude <noreply@anthropic.com>
- Add site_yunda.py: Yunda expected-arrival download (进站交接单查询)
with Layui date-range setup, row double-click export, a retry state
machine for the offline-export dialog, and a shared poll/download/
merge engine; actual-arrival is a placeholder
- Wire Yunda into main_router: site URL, login detection, menu items,
and read yunda.query_days from config.yaml
- Rework the hub menu: drop the standalone Shunxin local-compare entry,
renumber modules (百世 3, 中通 4/5, 韵达 6/7), keep global compare [9]
- Streamline site-init cleanup and log wording
Co-Authored-By: Claude <noreply@anthropic.com>