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)