certflow.controllers.model_param_mapping_controller 源代码
"""型号参数对照表控制器
桥接型号→压力对照表管理界面(View)与型号参数服务(Service):读操作直接委托
ModelParamMappingService;写操作在此统一提交事务,失败时回滚并向上抛出。模型类
经服务层间接引用,控制器不直接依赖 ``certflow.models.*``。
架构层次:View (ModelParamMappingManagerView) → Controller
(ModelParamMappingController) → Service (ModelParamMappingService)
→ Model (ModelParamMapping)
"""
from __future__ import annotations
from pathlib import Path
from typing import Any
from certflow.controllers.base_controller import BaseController
from certflow.services.model_param_mapping_service import (
ModelParamMapping,
ModelParamMappingService,
)
[文档]
class ModelParamMappingController(BaseController):
"""型号参数对照表控制器 — 管理界面的业务调度层"""
def __init__(self, db_session=None, db_manager=None, use_shared: bool = True):
"""初始化控制器
Args:
db_session: 外部会话(可选);不传则按 BaseController 规则自动创建
db_manager: 数据库管理器(可选)
use_shared: 是否使用全局共享管理器
"""
super().__init__(db_session=db_session, db_manager=db_manager, use_shared=use_shared)
self._service = self.get_service(ModelParamMappingService)
[文档]
def list_all(self) -> list[ModelParamMapping]:
"""返回全部型号参数对照记录(按 id 升序)
Returns:
list[ModelParamMapping]: 对照记录列表
"""
return self._service.list_all()
[文档]
def get_by_id(self, mapping_id: int) -> ModelParamMapping | None:
"""按主键获取记录
Args:
mapping_id: 记录主键
Returns:
ModelParamMapping | None: 匹配的记录;不存在时返回 None
"""
return self._service.get_by_id(mapping_id)
[文档]
def get_by_model(self, product_model: str) -> ModelParamMapping | None:
"""按产品型号查询对照记录(阶段 C:收口 print_view 的裸 session.query)
视图层不再直接剥出 Controller 的 session 自己写 ORM 查询,统一经此方法。
Args:
product_model: 产品型号字符串
Returns:
ModelParamMapping | None: 匹配的记录;不存在时返回 None
"""
return self._service.get_by_model(product_model)
[文档]
def create(self, data: dict[str, Any]) -> int:
"""新增记录并提交
Returns:
int: 新记录主键 id
"""
obj = self._service.create(data)
self.commit()
return obj.id
[文档]
def update(self, mapping_id: int, data: dict[str, Any]) -> bool:
"""更新记录并提交
Args:
mapping_id: 记录主键
data: 待更新的字段字典
Returns:
bool: 是否更新成功(id 不存在返回 False)
"""
obj = self._service.update(mapping_id, data)
if obj is None:
return False
self.commit()
return True
[文档]
def delete(self, mapping_id: int) -> bool:
"""删除记录并提交
Returns:
bool: 是否删除成功
"""
if not self._service.delete(mapping_id):
return False
self.commit()
return True
[文档]
def seed_common_models(self) -> int:
"""幂等灌入常见型号→压力示例,库非空则跳过(不破坏已有数据)"""
count = self._service.seed_common_models()
if count:
self.commit()
return count
[文档]
def upsert_for_learnback(
self,
product_model: str,
updates: dict[str, str],
strategy: str = "conservative",
overwrite_manual: bool = False,
) -> None:
"""打印成功后学回型号字典(保守合并语义,见 docs/PRINT_BLUEPRINT.md §2.4)。
- 不存在 → 新建 source='auto-learned',应用全部非空 updates。
- 已存在且 source=='manual' 且 overwrite_manual=False → 整条不动(人工权威)。
- 已存在且非 manual → 按策略合并:
conservative / field_level:仅补缺(DB 为空、表单非空才写;已非空保持)。
last_write_wins:所有非空表单字段覆盖 DB。
- 无论新建/补缺,usage_count++。
"""
self._service.upsert_for_learnback(
product_model,
updates,
strategy=strategy,
overwrite_manual=overwrite_manual,
)
self.commit()
[文档]
def export_csv(self, path: str | Path) -> int:
"""把当前 model_param_mappings 表整表导出为 CSV 快照,返回行数。"""
return self._service.export_csv(path)
[文档]
def import_csv(self, path: str | Path) -> dict[str, int]:
"""把 CSV 快照 upsert 回 model_param_mappings 表,返回统计。"""
return self._service.import_csv(path)