certflow.controllers.scan_controller module

扫描件控制器 - UI 交互层

提供扫描件生成的异步控制,封装 ScanWorker 线程和信号机制。 通过信号槽实现非阻塞扫描件生成。

class certflow.controllers.scan_controller.ScanWorker(service, params)[源代码]

基类:QThread

扫描件生成工作线程

参数:
progress
finished
error
cancel()[源代码]

取消任务

返回:

None

返回类型:

None

run()[源代码]

线程主执行方法

调用 ScanService 生成扫描件,成功后发出 finished 信号, 异常时发出 error 信号。

返回:

None

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("ScanWorker" inherits "QThread": Methods:   #12 type=Signal, signature=progress(int,int,QString), parameters=int, int, QString   #13 type=Signal, signature=finished(QVariantMap), parameters=QVariantMap   #14 type=Signal, signature=error(QString), parameters=QString )
class certflow.controllers.scan_controller.ScanController(session=None, db_manager=None)[源代码]

基类:QObject

扫描件控制器

管理扫描件生成任务,通过信号槽实现 UI 与业务逻辑的解耦。

Signals:

progress: 进度信号 (current, total, message) completed: 完成信号 (result: dict) error: 错误信号 (error_message: str)

参数:
  • session (Any)

  • db_manager (Any)

progress
completed
error
strip_unit(pn_display)[源代码]

从展示用压力串拆出 (数值, 单位)

收口 ScanView 原先直连 PNService.strip_unit 的静态调用, 使压力单位解析逻辑的唯一入口收敛到 Controller 层。

参数:

pn_display (str) -- 打印界面展示的压力串(如 25MPa / 150Lb

返回:

(数值, 单位);无法拆分时返回 ("", "")

返回类型:

tuple[str, str]

static family_of(template_key)[源代码]

由模板键推导语言族(委托 template_field_formatter.family_of)。

参数:

template_key (str | None)

返回类型:

str

static scan_required_fields(family, base)[源代码]

按语言族计算扫描必填字段(委托 output_guard.scan_required_fields_for)。

参数:
返回类型:

list[str]

static family_requires_pn_unit(family)[源代码]

判断语言族是否要求压力单位(委托 output_guard.family_requires_pn_unit)。

参数:

family (str)

返回类型:

bool

static collect_incomplete(cdata, required)[源代码]

收集缺失必填字段(委托 output_guard.collect_incomplete)。

参数:
返回类型:

list[str]

static field_label(field)[源代码]

字段中文标签(委托 output_guard.FIELD_LABELS)。

参数:

field (str)

返回类型:

str

static list_enabled_templates()[源代码]

列出已启用模板(委托 template_manager.get_template_manager)。

返回类型:

list[tuple[str, str, str]]

static load_dual_defaults(session, sale_plan_id)[源代码]

读取关联 SalePlan 的 SN/KKS 基准值(委托 SalePlanService.find_by_id)。

查询失败或不存在时返回空串字典,不影响基础字段。

参数:
  • session (Any)

  • sale_plan_id (Any)

返回类型:

dict[str, str]

individual_codes(cert, override=None)[源代码]

展开逐台编号(委托 ScanService._individual_codes)。

参数:
  • cert (Certificate)

  • override (dict[str, Any] | None)

返回类型:

list[str]

load_coordinates(template_type)[源代码]

加载模板坐标(委托 ScanService._load_coordinates)。

参数:

template_type (str)

返回类型:

dict[str, Any]

build_cert_data(cert, template_type, serial_number=None, overrides=None, dual_code=False)[源代码]

构建单台合格证字段数据(委托 ScanService._build_cert_data)。

参数:
  • cert (Certificate)

  • template_type (str)

  • serial_number (str | None)

  • overrides (dict[str, Any] | None)

  • dual_code (bool)

返回类型:

dict[str, Any]

render_preview_png(cert, template_type, width_mm, height_mm, serial_number=None, overrides=None, dual_code=False)[源代码]

渲染扫描件预览并返回 PNG 字节流(框架无关,不含 PySide6)。

收口 ScanView 原先对 ScanService``(坐标/数据)与 ``ScanImageHandler (画布/绘制)的直连:预览 == 产出,统一经 Controller 管道。

参数:
  • cert (Certificate)

  • template_type (str)

  • width_mm (float)

  • height_mm (float)

  • serial_number (str | None)

  • overrides (dict[str, Any] | None)

  • dual_code (bool)

返回类型:

bytes

load_certificates(certificate_ids)[源代码]

加载合格证记录

参数:

certificate_ids (list[int]) -- 合格证 ID 列表

返回:

合格证列表

返回类型:

list[Certificate]

generate_scans(certificate_ids, output_dir, template_type='全中文', output_format='JPG', rows=1, cols=1, paper_width_mm=60, paper_height_mm=100, data_overrides=None, dual_code=False)[源代码]

异步生成扫描件

参数:
  • certificate_ids (list[int]) -- 合格证 ID 列表

  • output_dir (str) -- 输出目录

  • template_type (str) -- 模板类型 (全中文/中英文/俄英文)

  • output_format (str) -- 输出格式 (JPG/PDF)

  • rows (int) -- 每页行数

  • cols (int) -- 每页列数

  • paper_width_mm (float) -- 纸张宽度 (mm)

  • paper_height_mm (float) -- 纸张高度 (mm)

  • data_overrides (dict[int, dict] | None)

  • dual_code (bool)

返回:

任务 ID

返回类型:

int

示例

>>> controller = ScanController(session)
>>> from certflow.config.paths_override import cfg
>>> task_id = controller.generate_scans([1, 2, 3], cfg("paths.output.scans", "output/scans"), "全中文")
>>> print(task_id)
cancel()[源代码]

取消当前生成任务

返回类型:

None

is_running()[源代码]

检查是否有任务正在运行

返回:

是否有任务正在运行

返回类型:

bool

staticMetaObject = PySide6.QtCore.QMetaObject("ScanController" inherits "QObject": Methods:   #4 type=Signal, signature=progress(int,int,QString), parameters=int, int, QString   #5 type=Signal, signature=completed(QVariantMap), parameters=QVariantMap   #6 type=Signal, signature=error(QString), parameters=QString )