"""口径映射管理界面
可视化维护 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()