certflow.views.import_page 源代码

"""计划导入堆叠页(阶段 B1)

替代原「计划导入」模态对话框,作为主窗口的一个堆叠页,内含两个导入类型标签:

- 📋 销售计划导入:内嵌现有 ``ImportConfigDialog``(其 3 个子页:源文件/列映射/配置项)
  原逻辑零改动,仅去模态、作子控件嵌入。
- 📦 BOM导入(目录扫描):``BomImportWidget`` 目录递归扫描入库。

``imported`` 信号在销售计划导入确认后发出(供主窗口刷新查询视图);
``busy_changed`` 信号在 BOM 导入运行中发出(供主窗口锁定导航)。

蓝图关联:``docs/BLUEPRINT_QUERY_UNIFY.md`` 阶段 B1。
"""

from __future__ import annotations

from typing import Any

from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QTabWidget, QVBoxLayout, QWidget

from certflow.views.bom_import_widget import BomImportWidget
from certflow.views.import_dialog import ImportConfigDialog


[文档] class ImportPage(QWidget): """计划导入堆叠页(销售计划导入 / BOM导入 两个导入类型 tab)。""" imported = Signal(dict) # 销售计划导入确认后的配置 busy_changed = Signal(bool) # BOM 导入运行中 True / 结束 False def __init__( self, db_manager: Any = None, session: Any = None, parent: QWidget | None = None, ) -> None: super().__init__(parent) self._db_manager = db_manager self._session = session self._init_ui() def _init_ui(self) -> None: layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) self._tabs = QTabWidget() # —— 销售计划导入:内嵌 ImportConfigDialog(去模态)—— self._sales_dialog = ImportConfigDialog( "", "sales_plan", parent=self, db_manager=self._db_manager, session=self._session, ) self._sales_dialog.setModal(False) self._sales_dialog.setWindowFlags(Qt.WindowType.Widget) self._sales_dialog.setMinimumSize(0, 0) # 内嵌形态下「关闭」无意义,隐藏 if getattr(self._sales_dialog, "cancel_btn", None) is not None: self._sales_dialog.cancel_btn.setVisible(False) self._sales_dialog.config_confirmed.connect(self._on_sales_confirmed) self._tabs.addTab(self._sales_dialog, "📋 销售计划导入") # —— BOM 导入(目录扫描)—— self._bom_widget = BomImportWidget( db_manager=self._db_manager, session=self._session, parent=self, ) self._bom_widget.import_started.connect(lambda: self.busy_changed.emit(True)) self._bom_widget.import_finished.connect(lambda: self.busy_changed.emit(False)) self._tabs.addTab(self._bom_widget, "📦 BOM导入(目录扫描)") layout.addWidget(self._tabs, stretch=1) def _on_sales_confirmed(self, config: dict) -> None: self.imported.emit(config)