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)