certflow.views.caliber_mapping_manager_view 源代码

"""口径映射管理界面

可视化维护 caliber_mappings 表(原始口径 → 标准口径 / 英制 / 来源)。
复用通用基类 ``LookupTableManagerView``,本模块仅声明列/字段定义。

字段维度说明:
- raw_text:原始口径字符串(如 "DN100"、"2\\""),唯一
- caliber_value:标准化口径值(如 "100"、"50")
- is_imperial:是否英制(True=英寸,False=毫米)
- source:来源(manual/auto_learn/import)
"""

from __future__ import annotations

from typing import Any

from PySide6.QtWidgets import QMessageBox

from certflow.controllers.caliber_mapping_controller import CaliberMappingController
from certflow.utils.logger import logger
from certflow.views.bases.lookup_table_manager_view import (
    ColumnSpec,
    FieldSpec,
    LookupTableManagerView,
)

_COLUMNS = [
    ColumnSpec("ID", "id", False),
    ColumnSpec("原始口径", "raw_text"),
    ColumnSpec("标准口径", "caliber_value"),
    ColumnSpec("英制", "is_imperial", field_type="bool"),
    ColumnSpec("来源", "source"),
    ColumnSpec("使用次数", "usage_count", field_type="int"),
]

_EDIT_FIELDS = [
    FieldSpec("raw_text", "原始口径 *", required=True, placeholder='如 DN100, 2"'),
    FieldSpec("caliber_value", "标准口径 *", required=True, placeholder="如 100, 50"),
    FieldSpec("is_imperial", "是否英制", field_type="bool", default=False),
    FieldSpec(
        "source",
        "来源",
        field_type="choice",
        choices=["manual", "auto_learn", "import"],
        default="manual",
    ),
]


[文档] class CaliberMappingManagerView(LookupTableManagerView): """口径映射管理对话框(通用基类 + 口径映射专属配置)""" def __init__( self, db_manager: Any = None, session: Any = None, dict_key: str | None = "caliber_mappings", parent: Any = None, ) -> None: """初始化管理对话框 Args: db_manager: 数据库管理器(优先) session: 外部会话(与 db_manager 二选一) dict_key: 字典键名(``dictionary.<key>.csv``),缺省 ``caliber_mappings`` parent: 父窗口 """ if db_manager is not None: controller = CaliberMappingController(db_manager=db_manager) else: controller = CaliberMappingController(db_session=session) super().__init__( controller=controller, columns=_COLUMNS, edit_fields=_EDIT_FIELDS, title="口径映射", window_title="口径映射管理", extra_actions=[("📥 载入示例", self._on_seed, False)], dict_key=dict_key, table_key="caliber_mapping", parent=parent, ) def _on_seed(self) -> None: """载入常见口径映射示例(幂等,库非空则跳过)""" try: count = self._controller.seed_common_calibers() except Exception as e: logger.error(f"载入示例失败: {e}") QMessageBox.critical(self, "错误", f"载入示例失败: {e}") return if count == 0: QMessageBox.information(self, "提示", "库中已有数据,未重复写入。") else: QMessageBox.information(self, "成功", f"已载入 {count} 条示例数据。") self.refresh()