certflow.views package

Subpackages

Submodules

Module contents

视图模块

包含所有界面相关的类,提供系统的图形用户界面组件。 该模块是CertFlow系统的前端展示层,负责用户交互和数据展示。

class certflow.views.ImportConfigDialog(file_path='', view_key='sales_plan', parent=None, db_manager=None, session=None)[源代码]

基类:QDialog

导入配置对话框

提供Excel文件导入前的参数配置界面,支持: - 文件选择(新增) - 工作表选择 - 表头行和数据起始行设置 - 列映射预览和手动配置 - 跳过列管理 - 配置记忆(自动保存下次导入时恢复)

Signals:

config_confirmed: 配置确认信号,参数为配置参数字典

参数:
  • file_path (str)

  • view_key (str)

  • parent (Any)

  • db_manager (Any)

  • session (Any)

file_path

Excel文件路径

df_raw

原始DataFrame(未处理表头)

available_sheets

可用工作表列表

_skipped_columns

跳过的列名集合

_column_mapped_status

每列映射状态缓存

sheet_configs

各工作表的保存配置

config_confirmed
setup_ui()[源代码]

初始化UI(三页 Tab:① 源文件与导入设置 / ② 列映射 / ③ 导入配置项)

返回类型:

None

load_user_config()[源代码]

加载用户保存的配置(从 file_sheet_configs 读取)

返回类型:

Any

save_user_config(config)[源代码]

保存用户配置(到 file_sheet_configs)

参数:

config (dict)

返回类型:

None

browse_file()[源代码]

浏览选择Excel文件

返回类型:

None

load_excel_info()[源代码]

加载Excel文件信息(仅读取工作表清单;实际数据源表由「导入范围」驱动选择)。

返回类型:

None

load_sheet_data(sheet_name)[源代码]

加载指定工作表的数据

参数:

sheet_name (str)

返回类型:

None

update_preview()[源代码]

更新列映射预览

根据当前配置刷新预览表格的显示内容。

返回类型:

None

get_current_mapping()[源代码]

获取当前列映射(只包含选中的列)

返回:

Excel列名到目标字段的映射字典

返回类型:

Dict[str, str]

skip_unmapped_columns()[源代码]

跳过所有未配置的列

返回类型:

None

reset_skipped_columns()[源代码]

重置所有跳过列

返回类型:

None

select_all()[源代码]

全选所有列

清空跳过列,恢复所有列的原始映射状态。

返回类型:

None

deselect_all()[源代码]

取消全选

跳过所有列,将所有列标记为不导入。

返回类型:

None

clear_saved_config()[源代码]

清除当前文件保存的配置

清除跳过的列配置,恢复为默认状态。

返回类型:

None

on_checkbox_changed(row, col_name, state)[源代码]

复选框状态改变处理

三种状态的处理逻辑: - 已配置(✅): 列有目标映射 + 复选框选中 → 导入时使用该映射 - 未配置(⚠️): 列无目标映射 + 复选框选中 → 导入但不映射(保留原列名) - 跳过(⏭️): 复选框未选中 → 导入时忽略该列

转换规则: - 从未选中→选中: 从跳过恢复为原始状态(已配置或未配置) - 从选中→未选中: 标记为跳过

参数:
  • row (int) -- 行索引

  • col_name (str) -- 列名

  • state (int) -- 复选框状态

返回类型:

None

on_preview_changed()[源代码]

配置变更事件

当表头行、数据起始行或跳过行数改变时更新预览。

返回类型:

None

preview_data()[源代码]

预览数据

显示当前配置下即将导入的数据预览。

返回类型:

None

auto_detect()[源代码]

自动检测配置

根据关键词自动检测表头行位置。

返回类型:

None

validate_config(config_params)[源代码]

验证配置参数

参数:

config_params (dict[str, Any]) -- 配置参数字典

返回:

配置是否有效

返回类型:

bool

staticMetaObject = PySide6.QtCore.QMetaObject("ImportConfigDialog" inherits "QDialog": Methods:   #41 type=Signal, signature=config_confirmed(QVariantMap), parameters=QVariantMap )
class certflow.views.MainWindow(session, config=None, db_manager=None, settings_controller=None)[源代码]

基类:QMainWindow

主窗口 - 统一调度各流程视图

参数:
show_output_view(sale_plan_ids=None, certificate_ids=None, target=None)[源代码]

显示统一输出视图并加载数据(§11.5 阶段3)。

参数:
  • sale_plan_ids (list[int]) -- 待打印的销售计划 ID 列表(委托打印子视图)。

  • certificate_ids (list[int]) -- 待生成扫描件的合格证 ID 列表(委托扫描子视图)。

  • target (str | None) -- 预置输出目标("print"/"scan"),缺省不强制切换。

返回类型:

None

closeEvent(event)[源代码]

窗口关闭事件,清理资源

参数:

event (Any)

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("MainWindow" inherits "QMainWindow": )
class certflow.views.PrintView(session, config=None, db_manager=None, parent=None, printer_controller=None)[源代码]

基类:QWidget

合格证打印视图

Signals:

print_completed: 打印完成信号,携带 certificate_ids 列表

参数:
  • session (Any)

  • config (dict)

  • db_manager (Any)

  • parent (Any)

  • printer_controller (Any)

print_completed
navigate_to_scan
setup_ui()[源代码]

构建打印界面

整体:顶部【主操作面:队列传输控制条】+ QSplitter(左控制面板 / 右预览面板) + 底部【打印队列表格】。传输控制条(启动/暂停/继续/置顶/上移/取消/清空已完成) 提升到顶部,用户可显式控制队列;左右均包 QScrollArea 兜底防裁切。

返回类型:

None

load_selected_sale_plan_ids(sale_plan_ids)[源代码]

加载选中的销售计划 ID 列表,支持一次打印多条记录。

多条记录均加入打印视图:各自绑定最新 Certificate 并按整批编号区间 回填;批量打印时依次逐条打印(如 12 台 + 32 台 = 44 台)。表单编辑 / 预览默认展示第一条,可通过「批量」按钮一次打印全部。

参数:

sale_plan_ids (list[int])

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("PrintView" inherits "QWidget": Methods:   #33 type=Signal, signature=print_completed(QVariantList), parameters=QVariantList   #34 type=Signal, signature=navigate_to_scan(QVariantList), parameters=QVariantList )
class certflow.views.HistoryView(session, db_manager=None, parent=None)[源代码]

基类:QWidget

打印历史视图

参数:
  • session (Any)

  • db_manager (Any)

  • parent (Any)

setup_ui()[源代码]

构建界面

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("HistoryView" inherits "QWidget": )
class certflow.views.SettingsView(config=None, controller=None, parent=None)[源代码]

基类:QWidget

系统设置视图(配置中心)

标签页: - 概览: config.yaml 全量树(只读,含旁路配置),可编辑项灰显 - 可编辑: 由 settings_ui.yaml spec 自动渲染分区/控件 - 我的覆盖: 列出 paths.local.yaml + userconfig 稳定段覆盖,一键恢复默认

通过 SettingsController 保存设置并立即生效(主题切换、语言切换等)。

参数:
setup_ui()[源代码]

构建界面

返回类型:

None

retranslate_ui()[源代码]

语言切换后刷新所有 UI 文本

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("SettingsView" inherits "QWidget": )
class certflow.views.ScanView(session, db_manager=None, parent=None, scan_controller=None)[源代码]

基类:QWidget

合格证扫描件生成视图(WYSIWYG 单页)

参数:
  • session (Any)

  • db_manager (Any)

  • parent (Any)

  • scan_controller (Any)

scan_completed
load_certificates(certificate_ids)[源代码]

加载要生成扫描件的合格证(来自打印视图跳转或外部调用)。

参数:

certificate_ids (list[int])

返回类型:

None

set_template_by_family(family)[源代码]

按语言族(全中文/中英文/全英文/俄英文)设置模板下拉(D 套用)。

解析 family→具体 key(取该族首个启用变体),再定位 template_combo 项设选中; 找不到则忽略(保持现状)。设置会触发 _on_template_changed 重绘预览。

参数:

family (str)

返回类型:

None

apply_layout_preset(label)[源代码]

按拼版推荐值 label 套用扫描拼版(D 套用)。

  • label 为空或「自定义」→ 设为自定义(启用自旋框)。

  • 否则在 layout_combo 精确/包含匹配;匹配到则选中并触发预设套用, 匹配不到则回退自定义。

参数:

label (str)

返回类型:

None

resizeEvent(event)[源代码]

窗口/分屏尺寸变化 → 重新缩放预览。

参数:

event (Any)

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("ScanView" inherits "QWidget": Methods:   #33 type=Signal, signature=scan_completed(QVariantList), parameters=QVariantList )
class certflow.views.ParamSupplementDialog(model='', prefill=None, material_grades=None, parent=None)[源代码]

基类:QDialog

参数补充对话框

对标 VBA print.vb 批量打印时的一连串 InputBox 交互: 1. 口径 InputBox(第635/671行) 2. 压力 InputBox(第651/703行) 3. 温度 InputBox(第660/716行) 4. 介质 InputBox(第741行)

参数:
params

用户填写的参数字典

confirmed

用户是否点击了"确认"

skip_all

用户是否点击了"跳过全部"

supplement_confirmed
property confirmed: bool

用户是否确认

property skip_all: bool

用户是否跳过全部(留空)

property params: dict[str, str]

获取用户填写的参数

setup_ui()[源代码]

构建对话框 UI

返回类型:

None

load_prefill()[源代码]

加载预填数据

返回类型:

None

static get_parameters(model='', prefill=None, material_grades=None, parent=None)[源代码]

弹出参数补充对话框并返回结果

对标 VBA 的 InputBox 调用模式,提供便捷的静态方法。

参数:
  • model (str) -- 产品型号

  • prefill (dict[str, Any] | None) -- 预填参数

  • material_grades (dict[str, list[str]] | None) -- 材质牌号选项

  • parent (QWidget | None) -- 父窗口

返回:

(confirmed, skip_all, params) 元组 - confirmed: 用户是否确认(含跳过) - skip_all: 是否跳过全部留空 - params: 填写的参数字典

返回类型:

tuple[bool, bool, dict[str, str]]

staticMetaObject = PySide6.QtCore.QMetaObject("ParamSupplementDialog" inherits "QDialog": Methods:   #41 type=Signal, signature=supplement_confirmed(QVariantMap), parameters=QVariantMap )
class certflow.views.PrintPreviewDialog(data, serial_number='预览编号', template_key='full_chinese_3', parent=None)[源代码]

基类:QDialog

打印预览对话框

显示合格证预览位图,支持打印、图片导出和关闭操作。

参数:
  • data (dict[str, Any])

  • serial_number (str)

  • template_key (str)

  • parent (QDialog | None)

data

打印数据字典

serial_number

当前预览的产品编号

copies

打印份数

property result: bool

用户是否确认打印

setup_ui()[源代码]

构建 UI

返回类型:

None

load_preview()[源代码]

用 QPainter 绘制预览(替代 Chromium HTML 渲染)

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("PrintPreviewDialog" inherits "QDialog": )
class certflow.views.QueryView(session, db_manager=None, controller=None)[源代码]

基类:QuickSearchPresetMixin, QWidget

销售计划查询视图 - 配置驱动

参数:
navigate_to_print
back_to_home
setup_ui()[源代码]

初始化整体界面布局

返回类型:

None

setup_view_toolbar(parent_layout)[源代码]

设置视图切换工具栏

参数:

parent_layout (Any)

返回类型:

None

setup_filter_section(parent_layout)[源代码]

设置筛选条件区域

参数:

parent_layout (Any)

返回类型:

None

qsp_get_quick_search_items(fields)[源代码]

快查候选数据源(重写 mixin 钩子):以视图默认范围(_view_default_conditions)作为 稳定基础抽出去重组合,不随快查临时行收窄(与历史行为一致)。

参数:

fields (list[str])

返回类型:

list[str]

qsp_get_field_label(field)[源代码]

字段中文标签(重写 mixin 钩子,仅用于快查框占位提示)。

参数:

field (str)

返回类型:

str

快查确认入口(mixin 回调):桥接到 View 的 search()

mixin 在 AND 分支以无参调用、OR 分支带 or_filters 调用,二者都能正确转发。

参数:

or_filters (Any)

返回类型:

None

setup_result_table(parent_layout)[源代码]

设置结果表格(迁移到 BaseQueryView:SalePlanQueryView 宿主驱动渲染器)。

保留 QueryView 自身的高级 FilterBar / 快查预设 / 统计 / 导出 / 打印跳转, 仅把结果表格 + 分页展示委托给 SalePlanQueryView;其内置分页条隐藏, 翻页由 QueryView 自有分页控件经 run_query 驱动。

参数:

parent_layout (Any)

返回类型:

None

setup_pagination(parent_layout)[源代码]

设置分页控件

参数:

parent_layout (Any)

返回类型:

None

switch_view(view_key)[源代码]

切换当前查询视图

参数:

view_key (str)

返回类型:

None

search(or_filters=None, reset_page=True)[源代码]

执行搜索

参数:
  • or_filters (Any) -- 可选 OR 条件列表([{field, operator, value}, ...]), 与筛选行条件以 OR 组合,用于快查「跨字段任一命中」。

  • reset_page (bool) -- 是否将当前页复位到第 1 页。新查询(筛选变更 / 查询按钮 / 预设 / 切换视图)应为 True;翻页与改页大小由调用方显式维持页码, 传 False,避免上一页残留页码超出新结果范围导致显示为空。

返回类型:

None

refresh()[源代码]

刷新当前视图数据(保留当前页码)

返回类型:

None

showEvent(event)[源代码]

首次显示时加载数据(避免构造期在无事件循环的测试/无头环境触发阻塞式查询)。

参数:

event (Any)

返回类型:

None

display_results(result)[源代码]

将查询结果填充到表格中显示(委托 SalePlanQueryView,渲染保真见其 _render)。

注意:不在每次结果刷新时重算快查候选项——否则 QuickSearch 的选中态(currentIndex) 会被重置回首项,导致键盘 ↓ 永远回到第一个候选、无法翻页切换(与 report_view 行为不一致)。 候选仅在初始化 / preset 切换 / 视图默认范围变化时重算。

参数:

result (dict[str, Any])

返回类型:

None

get_filters()[源代码]

获取当前所有筛选条件(委托 FilterBar,统一条件契约)。

遍历所有筛选行,收集非空的筛选条件,构造成查询服务可用的格式。 如果启用了「按计划日期范围筛选」且用户已勾选,自动附加 plan_date 区间条件。

返回:

{'value': ..., 'operator': ...}} 区间条件 value 为 [min, max] 列表

返回类型:

筛选条件字典,格式为 {field_name

add_filter_row()[源代码]

添加一行空筛选条件(公共入口)

创建一个包含字段选择、操作符选择、值输入框和删除按钮的筛选行。

返回类型:

None

reset_filters()[源代码]

重置筛选条件

恢复为当前视图的默认筛选条件(或空行),恢复默认时间范围复选框,重置页码并重新搜索。

返回类型:

None

setup_quick_filter_bar(parent_layout)[源代码]

设置快速筛选按钮栏

参数:

parent_layout (Any)

返回类型:

None

get_selected_ids()[源代码]

获取当前选中的 SalePlan ID 列表

用于跨页面数据传递,将查询视图中选中的记录 ID 传递给合格证页面。

返回:

选中的 SalePlan.id 列表

返回类型:

List[int]

show_statistics()[源代码]

显示统计信息弹窗

返回类型:

None

export_results()[源代码]

导出当前查询结果为 Excel 文件(委托 Controller → Service → Handler)

返回类型:

None

prev_page()[源代码]

方法说明。

返回:

None

返回类型:

None

next_page()[源代码]

方法说明。

返回:

None

返回类型:

None

on_page_size_changed()[源代码]

方法说明。

返回:

None

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("QueryView" inherits "QWidget": Methods:   #33 type=Signal, signature=navigate_to_print(QVariantList), parameters=QVariantList   #34 type=Signal, signature=back_to_home() )
class certflow.views.ReportView(controller=None, parent=None)[源代码]

基类:QuickSearchPresetMixin, QWidget

报告生成视图。

提供报告类型/语言/每页记录数选择、可勾选的数据列表(来自数据库销售计划)、 生成按钮与结果提示。

参数:
populate_page_options(report_kind)[源代码]

按报告类型填充「每页行数」候选(配置可选,而非数字递增)。

参数:

report_kind (str)

返回类型:

None

setup_ui()[源代码]
返回类型:

None

create_template_group()[源代码]
返回类型:

QGroupBox

create_data_group()[源代码]
返回类型:

QGroupBox

create_preview_group()[源代码]
返回类型:

QGroupBox

create_button_bar()[源代码]
返回类型:

QHBoxLayout

load_data()[源代码]

从数据库加载销售计划到选择表格(全库,无 500 上限)。

返回类型:

None

load_all()[源代码]

加载全部销售计划(全库检索,不限制 500 条)。

返回类型:

None

取 FilterBar 统一条件契约,对全库做检索并刷新勾选表格。

参数:

or_filters (Any) -- 可选 OR 条件列表(快查模糊输入无分隔符时传入), 与筛选行条件以 OR 组合。

返回类型:

None

on_report_type_changed(report_type)[源代码]

报告类型切换时刷新「每页行数」候选(配置驱动)。

参数:

report_type (str)

返回类型:

None

select_all()[源代码]
返回类型:

None

clear_all()[源代码]
返回类型:

None

get_selected_ids()[源代码]
返回类型:

list[int]

update_data_table(data)[源代码]
参数:

data (list[dict[str, Any]])

返回类型:

None

update_info(text)[源代码]
参数:

text (str)

返回类型:

None

on_generate()[源代码]
返回类型:

None

show_result(result)[源代码]
参数:

result (dict[str, Any])

返回类型:

None

on_open_folder()[源代码]
返回类型:

None

on_preview_bom()[源代码]

对首个选中行取生产令号,预览 BOM 材质归类(命中主材位 + 待核对明细)。

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("ReportView" inherits "QWidget": )
class certflow.views.BaseView(parent=None)[源代码]

基类:QWidget

所有业务视图的基类。

现有视图当前在 __init__ 内联构造 UI、各自实现 refresh / retranslate_ui (仅 settings_viewretranslate_ui、仅 query_view_is_dark_theme)。 本类把这些散落约定收敛为统一钩子 + helper,供后续灰度迁移继承。

参数:

parent (QWidget | None)

init_ui()[源代码]

构造 UI。子类必须实现;基类在 __init__ 末尾调用一次。

返回类型:

None

refresh()[源代码]

外部触发的数据刷新(如切换流水线阶段、数据变更后)。默认空实现。

返回类型:

None

retranslate_ui()[源代码]

语言切换后刷新 UI 文本。默认空实现,MainWindow 可在语言变更时广播。

返回类型:

None

on_theme_changed(theme)[源代码]

主题切换回调("light" / "dark")。默认空实现,主题感知视图覆写。

参数:

theme (str)

返回类型:

None

tr(text)[源代码]

翻译文本。

委托 QApplication.instance().i18n_manager.tr``(与现有视图读取 ``app.theme_manager 的同一种全局挂载约定);找不到则原样返回。

参数:

text (str)

返回类型:

str

is_dark_theme()[源代码]

当前是否为深色主题(集中 query_view._is_dark_theme 的重复实现)。

返回类型:

bool

staticMetaObject = PySide6.QtCore.QMetaObject("BaseView" inherits "QWidget": )
class certflow.views.BaseDialog(parent=None, title='', show_apply=False, confirm_text='确认', cancel_text='取消')[源代码]

基类:QDialog

标准对话框基类。

用法:

class MyDialog(BaseDialog):
    def init_ui(self) -> None:
        self.content_layout.addWidget(QLabel("内容"))

dlg = MyDialog(self, title="编辑", confirm_text="保存")
if dlg.exec():
    ...

按钮栏信号已接线:accepted -> accept()rejected -> reject()``applied -> self.applied``(可选「应用」按钮)。

参数:
  • parent (QWidget | None)

  • title (str)

  • show_apply (bool)

  • confirm_text (str)

  • cancel_text (str)

applied
confirm_danger(title, message, preview=None, ok_text='删除', ok_default=False)[源代码]

弹出来自 widgets.ConfirmDialog 的危险操作二次确认(确认逻辑收敛进 widgets)。

参数:
  • title (str) -- 对话框标题。

  • message (str) -- 提示正文。

  • preview (str | None) -- 可选详情(如待删除记录预览),折叠在「显示详情」里。

  • ok_text (str) -- 确认按钮文案(默认「删除」)。

  • ok_default (bool) -- 确认按钮是否默认聚焦(危险操作默认 False,聚焦取消)。

返回:

用户是否确认。

返回类型:

bool

init_ui()[源代码]

构造对话框内容。子类必须实现,往 self.content_layout 填充。

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("BaseDialog" inherits "QDialog": Methods:   #41 type=Signal, signature=applied() )
class certflow.views.BomMaterialQueryView(session=None, db_manager=None, controller=None, parent=None)[源代码]

基类:BaseQueryView

BOM 零件牌号查询视图(BaseQueryView + BomQueryDataSource 迁移版)。

参数:
  • session (Any)

  • db_manager (Any)

  • controller (Any)

  • parent (Any)

refresh()[源代码]

刷新当前结果(导入完成后由查询中心调用,修复 BOM 查询陈旧/双倍)。

返回类型:

None

closeEvent(event)[源代码]

关闭时释放控制器会话(持有独立会话时)。

参数:

event (Any)

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("BomMaterialQueryView" inherits "BaseQueryView": )