certflow.controllers.query_controller module¶
查询控制器
负责查询视图的业务逻辑处理,将 UI 层与数据层解耦。
职责: - 删除记录(含级联删除、事务回滚) - 批量更新字段 - 导出选中记录到 Excel - 自动编号并创建合格证 - 查询数据 - 获取字段可选值
- 架构:
- View (QueryView) → Controller (QueryController) → Service (QueryService/SalePlanService)
→ Handler (ShippedExportHandler)
- Usage:
controller = QueryController(session) success, count, msg = controller.delete_records([{"id": 1}, {"id": 2}])
- class certflow.controllers.query_controller.FieldValuesWorker(service, field_name, order_desc=True)[源代码]¶
基类:
QThread异步加载字段可选值的工作线程
避免同步 SQL 查询阻塞 UI 线程,通过信号将结果传回主线程。
- 参数:
service (QueryService)
field_name (str)
order_desc (bool)
- finished¶
(field_name, values)
- Type:
完成信号
- error¶
error_message
- Type:
错误信号
- run()[源代码]¶
线程主执行方法(由 QThread.start() 触发)
通过 service 查询字段可选值,成功后发出 finished 信号, 失败则发出 error 信号。
- 返回:
None
- 返回类型:
None
- staticMetaObject = PySide6.QtCore.QMetaObject("FieldValuesWorker" inherits "QThread": Methods: #12 type=Signal, signature=finished(QString,QVariantList), parameters=QString, QVariantList #13 type=Signal, signature=error(QString), parameters=QString )¶
- class certflow.controllers.query_controller.QueryController(session, db_manager=None, parent=None)[源代码]¶
基类:
QObject查询控制器 — 业务逻辑层
- 参数:
session (Session)
db_manager (Any)
parent (QObject | None)
- data_updated¶
数据变更信号(删除/更新后触发,视图应刷新)
- operation_completed¶
操作完成信号,携带状态消息
- operation_failed¶
操作失败信号,携带错误信息
- field_values_loaded¶
(field_name, values)
- Type:
字段可选值加载完成信号
- field_values_load_failed¶
(field_name, error_message)
- Type:
字段可选值加载失败信号
- query(conditions, page, page_size, order_by, order_desc, or_filters=None)[源代码]¶
执行分页查询
- 参数:
- 返回:
查询结果字典,包含 records、page、total_pages、total
- 返回类型:
示例
>>> controller = QueryController(session) >>> result = controller.query( ... conditions={"product_model": "DN100"}, ... page=1, ... page_size=20, ... order_by="id", ... order_desc=True, ... ) >>> print(result["total"], result["records"])
- get_field_values(field_name, order_desc=True)[源代码]¶
获取字段的所有可选值(同步,会阻塞 UI 线程)
推荐使用 load_field_values_async() 异步加载。
- load_field_values_async(field_name, order_desc=True)[源代码]¶
异步加载字段可选值(推荐)
通过后台线程加载,完成后通过 field_values_loaded 信号通知。
- 参数:
- 返回:
FieldValuesWorker 实例(调用方需保持引用避免 GC)
- 返回类型:
- generate_print_certificates(ids, prefix_override=None, print_status='待打印')[源代码]¶
统一「打印合格证」入口:去重安全地编号并生成合格证。
合并原
auto_number_and_create_certs``(查询页「编号/自动编号」)与 ``import_cert_list_from_sales_plan``(「导入合格证清单」)为单一入口。 业务编排在此层,实际生成委托 ``CertificatePrintService: 跳过已生成合格证的计划(避免重复生成 / 唯一约束冲突), 自动编号并写入 Certificate(待打印),返回 (编号数, 合格证数)。分层调用链: View(_goto_print) → Controller(本方法) → CertificatePrintService(编排) → CertNumberingService(数据访问) → Certificate(Model)。
- auto_number(ids, prefix_override=None)[源代码]¶
自动编号(正则解析生产令号/供货类型,委托 CertificatePrintService.auto_number)。
为选中且
product_code为空/占位符、needs_numbering!=False的记录生成产品编号, 写入 SalePlan 并即时刷新。对应工具栏「🔢 自动编号」按钮(修复「点击打印提示需先编号 却没有自动编号按钮」的体验缺口)。
- generate_batch(sale_plan_id, batch_qty, ym=None, start_override=None)[源代码]¶
按「本批台数」为单个销售计划生成一批产品编号(G4 入口)。
委托
CertificateNumberService.generate_batch:合同总数从SalePlan.quantity读取,用shipped_quantity判定剩余与满发,超额直接抛 ``ValueError``(调用方捕获 并转用户提示)。对应工具栏「🔢 自动编号」弹窗输入本批台数的路径。
- update_cert_fields(plan_id, fields)[源代码]¶
订正单条记录的合格证打印字段(仅 cert_* + certificate_remarks)
委托
SalePlanService.update_cert_fields,仅更新合格证字段, 不动合同字段。成功后在查询视图即时刷新。
- update_certificate_fields(cert_id, fields)[源代码]¶
订正单条合格证记录字段(白名单,对称于 update_cert_fields)
委托
CertificateService.update_fields,仅更新合格证打印字段, 不动编号/状态等系统字段。成功后触发查询视图刷新。
- staticMetaObject = PySide6.QtCore.QMetaObject("QueryController" inherits "QObject": Methods: #4 type=Signal, signature=data_updated() #5 type=Signal, signature=operation_completed(QString), parameters=QString #6 type=Signal, signature=operation_failed(QString), parameters=QString #7 type=Signal, signature=field_values_loaded(QString,QVariantList), parameters=QString, QVariantList #8 type=Signal, signature=field_values_load_failed(QString,QString), parameters=QString, QString )¶