certflow.views.correction_flag_query_view 源代码

"""校正队列黄标 tab —— 迁移到 BaseQueryView(任务 2.1 首域)

将 ``CorrectionQueueView`` 黄标校正表从手写 ``DataTable`` + 手动填充,迁移为
``BaseQueryView`` + ``CorrectionDataSource``(服务端排序/分页/筛选)。保留校正动作语义:

- 双击行 / 「校正并学习」→ 请求校正(由宿主 ``CorrectionQueueView`` 处理弹窗);
- 「标记已复核(清黄标)」→ 请求清黄标;
- 「刷新」→ 重新查询。

通过信号与宿主解耦,自身不直接依赖 ``CorrectionQueueController``(写操作仍由宿主负责)。
"""

from __future__ import annotations

from typing import Any

from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QTableWidgetItem

from certflow.views.bases.base_query_view import BaseQueryView
from certflow.widgets import ActionToolbar


[文档] class CorrectionFlagQueryView(BaseQueryView): """校正队列黄标查询视图(BaseQueryView + CorrectionDataSource 迁移版)。""" # 双击行 / 点「校正并学习」时发出:请求对当前选中行校正 correct_requested = Signal() # 「标记已复核」时发出:请求清除当前选中行黄标 clear_requested = Signal() # 双击或回车时发出(同 correct_requested 语义,便于宿主统一接线) row_activated = Signal() def __init__( self, session: Any = None, db_manager: Any = None, parent: Any = None, ) -> None: super().__init__(session=session, db_manager=db_manager, parent=parent) self._add_flag_toolbar() self._connect_table_signals() # ============================================================ # 工具栏 / 交互(与宿主解耦:仅发信号) # ============================================================ def _add_flag_toolbar(self) -> None: toolbar = ActionToolbar() toolbar.add_button("✏️ 校正并学习", lambda: self.correct_requested.emit()) toolbar.add_button("✅ 标记已复核(清黄标)", lambda: self.clear_requested.emit()) toolbar.add_stretch() toolbar.add_button("🔄 刷新", self.refresh) self.layout().insertWidget(0, toolbar) def _connect_table_signals(self) -> None: self.table.doubleClicked.connect(self._on_double_clicked) def _on_double_clicked(self, *_: Any) -> None: if self._selected_id() is not None: self.row_activated.emit() self.correct_requested.emit() # ============================================================ # 选中行 # ============================================================ def _selected_id(self) -> int | None: row = self.table.currentRow() if row < 0 or row >= len(self._records): return None item = self.table.item(row, 0) if item is None: return None return item.data(Qt.ItemDataRole.UserRole)
[文档] def selected_sale_plan_id(self) -> int | None: """返回当前选中行的销售计划 ID(供宿主校正/清黄标使用)。""" return self._selected_id()
# ============================================================ # 数据填充(在 id 列存 UserRole,便于选中解析) # ============================================================ def _populate(self, records: list[Any]) -> None: assert self.data_source is not None columns = self.data_source.get_columns() self.table.setRowCount(len(records)) for r, rec in enumerate(records): for c, (_, field) in enumerate(columns): val = rec.get(field) if isinstance(rec, dict) else getattr(rec, field, None) item = QTableWidgetItem("" if val is None else str(val)) if field == "id": item.setData(Qt.ItemDataRole.UserRole, getattr(rec, "id", None)) self.table.setItem(r, c, item)