CertFlow API 参考¶
配置模块¶
ConfigLoader 类¶
配置加载器,支持YAML文件加载、环境变量替换和文件包含。
from certflow.config import ConfigLoader, get_config
# 方式1: 使用加载器实例
loader = ConfigLoader()
config = loader.load("config.yaml")
# 方式2: 使用全局单例(推荐)
config = get_config()
# 访问配置
print(config.app.name) # "CertFlow"
print(config.paths.database.dir) # "database"
print(config.database.type) # "sqlite"
settings 模块 - 配置常量¶
直接导入配置常量使用(零硬编码)。
from certflow.config.settings import (
APP_NAME, APP_VERSION, APP_DEBUG,
DATABASE_PATH, LOGS_DIR,
SALE_PLAN_COLUMNS, COLUMN_ALIASES,
SORT_KEYS, REQUIRED_FIELDS,
get_column_by_alias
)
print(APP_NAME) # "CertFlow"
print(DATABASE_PATH) # Path("/path/to/certflow.db")
# 根据别名获取标准列名
field = get_column_by_alias("产品型号") # 返回 "product_model"
get_config_value 函数¶
获取配置值,优先级: 环境变量 > YAML > 默认值。
from certflow.config.settings import get_config_value
# 优先从环境变量VALVE_SALES_PLAN_PATH读取,否则从YAML读取
path = get_config_value("paths.sales_plan.primary", "VALVE_SALES_PLAN_PATH")
服务模块¶
SalePlanService¶
销售计划服务,提供Excel导入、查询、统计等功能。
from certflow.services import SalePlanService
from certflow.utils.database import DatabaseManager
db = DatabaseManager()
session = db.get_session()
service = SalePlanService(session)
# 导入Excel(带格式)
result = service.import_from_excel_with_config({
"file_path": "sales.xlsx",
"sheet_name": "Sheet1",
"header_row": 1, # 第2行作为表头
"data_start_row": 2, # 第3行开始为数据
"skip_rows": 0,
"column_mapping": {"产品型号": "product_model"},
"preserve_formatting": True # 保留格式(背景色/字体色/批注)
})
print(f"新增: {result['new_count']}, 重复: {result['duplicate_count']}")
# 查询
plans = service.get_all_sale_plans()
plans = service.get_by_product_model("阀门A")
plans = service.get_by_sort_group("产品A_订单001")
# 统计
stats = service.get_statistics()
print(stats['total_records']) # 总记录数
print(stats['group_count']) # 分组数
print(stats['status_stats']) # 状态统计
# 清空数据
count = service.clear_all()
QueryService¶
高级查询服务,支持多条件级联查询和分页。
from certflow.services import QueryService
service = QueryService(session)
# 多条件查询
filters = {
"product_model": "阀门",
"customer": "某某公司",
"date_range": {"start": "2024-01-01", "end": "2024-12-31"},
"supply_type": "自制"
}
result = service.search(
filters=filters,
page=1,
page_size=50,
sort_by="plan_date",
sort_order="desc"
)
print(f"共{result['total']}条,当前页{len(result['results'])}条")
# 获取级联选项
models = service.get_cascading_options({"customer": "某某公司"}, "product_model")
# 统计信息
stats = service.get_statistics(filters)
AutoNumberService¶
自动编号服务,支持分组计数和周期重置。
from certflow.services import AutoNumberService
service = AutoNumberService(session)
# 初始化默认规则
service.init_default_rules()
# 生成单个编号
number = service.generate_certificate_number(sale_plan_id=100, rule_code="certificate")
# 批量生成
results = service.batch_generate_numbers([100, 101, 102], "certificate")
for sid, num in results.items():
print(f"ID {sid} -> {num}")
# 预览下一个编号
preview = service.get_next_serial_preview("certificate", "product_A")
# 获取可用规则
rules = service.get_available_rules()
ReportService¶
报告生成服务。
from certflow.services import ReportService
service = ReportService(session)
# 生成试压报告
result = service.generate_pressure_test_report(
sale_plan_ids=[1, 2, 3],
language="zh",
records_per_page=6
)
if result["success"]:
print(f"报告已生成: {result['filepath']}")
# 批量生成报告
configs = [
{"type": "pressure_test", "data_ids": [1,2,3], "language": "zh"},
{"type": "material", "data_ids": [4,5], "language": "en"}
]
result = service.generate_batch_reports(configs)
# 获取报告历史
history = service.get_report_history()
控制器模块¶
BaseController¶
控制器基类,提供会话管理和事务处理。
from certflow.controllers import BaseController
# 使用上下文管理器(推荐)
with BaseController() as controller:
# 执行数据库操作
result = controller.session.query(SalePlan).all()
controller.commit()
# 手动管理
controller = BaseController()
try:
result = controller.session.query(SalePlan).all()
controller.commit()
finally:
controller.close()
CertificateController¶
合格证控制器。
from certflow.controllers import CertificateController
controller = CertificateController(session)
# 批量生成合格证
result = controller.generate_certificates_for_sale_plans([1, 2, 3])
print(f"生成成功: {result['generated']}/{result['total']}")
# 批量打印
result = controller.batch_print_certificates(
certificate_ids=[1, 2, 3],
printer_name="HP LaserJet",
copies=2
)
# 标记刻印
result = controller.mark_as_engraved([1, 2, 3])
# 查询
certs = controller.get_certificates_by_status("待打印")
certs = controller.get_certificates_by_product("阀门A")
# 统计
stats = controller.get_print_statistics(days=30)
处理器模块¶
ExcelHandler¶
Excel文件处理器。
from certflow.handlers import ExcelHandler
# 读取Excel
df = ExcelHandler.read_excel(
file_path="sales.xlsx",
sheet_name=0,
header_row=1, # 第2行作为表头
skiprows=0
)
# 读取多级表头
df = ExcelHandler.read_excel_with_multi_header(
file_path="sales.xlsx",
header_rows=[0, 1],
separator="_"
)
# 自动检测表头行
df_raw = pd.read_excel("sales.xlsx", header=None)
header_row = ExcelHandler.detect_header_row(
df_raw,
keywords=["产品型号", "订货单位"],
max_rows=10
)
# 清洗DataFrame
df = ExcelHandler.clean_dataframe(df)
# 验证并重命名列
df = ExcelHandler.validate_columns(
df,
required_columns={},
use_aliases=True,
alias_mapping=COLUMN_ALIASES
)
DataCleaner¶
数据清洗器。
from certflow.handlers import DataCleaner
# 清洗销售计划数据
df_clean = DataCleaner.clean_sale_plan(df)
# 校验单条数据
is_valid, message = DataCleaner.validate_data(row)
IDGenerator¶
编号生成器。
from certflow.handlers import IDGenerator
# 生成合格证编号
cert_no = IDGenerator.generate_certificate_no(prefix="CERT", sequence=5)
# 生成唯一键(基于MD5)
unique_key = IDGenerator.generate_unique_key(data, keys=["product_model", "order_no"])
# 生成可读唯一键(用于调试)
readable = IDGenerator.generate_unique_key_readable(data, keys=["product_model"])
# 批量生成唯一键
data_list = IDGenerator.generate_batch_unique_keys(data_list, keys=["product_model"])
# 规范化空值
normalized = IDGenerator.normalize_empty_values(data, keys=["product_model"])
ReportGenerator¶
PDF报告生成器。
from certflow.handlers import ReportGenerator
generator = ReportGenerator(output_dir="output/reports")
# 生成试压报告
filepath = generator.generate_pressure_test_report(
data=test_data,
language="zh",
records_per_page=6
)
# 生成材质报告
filepath = generator.generate_material_certificate(
data=material_data,
material_type="steel",
language="zh"
)
# 生成质保书
filepath = generator.generate_quality_certificate(
data=quality_data,
language="zh"
)
Sorter¶
多键排序器。
from certflow.handlers import Sorter
# 多键排序
sorted_data = Sorter.multi_key_sort(
data,
sort_keys=["product_model", "specification"],
keep_original_order=True
)
# 按排序键分组
groups = Sorter.group_by_sort_key(sorted_data)
# 恢复原始顺序
original_data = Sorter.restore_original_order(sorted_data)
ExcelStyler¶
Excel样式读取器。
from certflow.handlers import ExcelStyler
# 读取带样式的Excel
data, bg_colors, font_colors, comments, statuses = ExcelStyler.read_with_styles(
file_path="sales.xlsx",
sheet_name=0,
include_styles=True,
include_comments=True
)
# 获取所有批注
comments = ExcelStyler.get_all_comments("sales.xlsx")
# 获取批注汇总表
df = ExcelStyler.get_comments_summary("sales.xlsx")
视图模块¶
ImportConfigDialog¶
导入配置对话框。
from certflow.views import ImportConfigDialog
dialog = ImportConfigDialog(file_path, parent)
dialog.config_confirmed.connect(on_config_confirmed)
def on_config_confirmed(config_params):
print(f"表头行: {config_params['header_row']}")
print(f"列映射: {config_params['column_mapping']}")
dialog.exec()
QueryView¶
销售计划查询视图。
from certflow.views import QueryView
view = QueryView(session)
view.show()
# 连接信号(需自定义)
view.data_selected.connect(on_data_selected)
CertificateNumberView¶
合格证编号生成视图。
from certflow.views import CertificateNumberView
view = CertificateNumberView(session)
view.show()
工具模块¶
DatabaseManager¶
数据库管理器。
from certflow.utils import DatabaseManager
# 创建管理器
db = DatabaseManager(db_path="database/certflow.db")
# 初始化数据库(创建表)
db.init_db(create_tables=True)
# 获取会话
session = db.get_session()
# 执行查询
results = session.query(SalePlan).all()
# 关闭连接
db.close()
LoggerManager / setup_logger¶
日志系统。
from certflow.utils.logger import setup_logger, get_logger
# 初始化日志(应用启动时调用一次)
setup_logger(
log_path="logs/certflow.log",
console_level="INFO",
file_level="DEBUG"
)
# 获取日志实例
logger = get_logger()
logger.debug("调试信息")
logger.info("一般信息")
logger.warning("警告信息")
logger.error("错误信息")
# 动态调整级别
from certflow.utils.logger import _logger_manager
_logger_manager.set_console_level("DEBUG")
数据模型¶
SalePlan 模型¶
from certflow.models import SalePlan
# 创建实例
plan = SalePlan(
product_model="阀门A",
customer="某某公司",
quantity=10,
sales_order_no="SO-001"
)
# 访问属性
print(plan.product_model) # "阀门A"
print(plan.customer) # "某某公司"
print(plan.unique_key) # 自动生成UUID
Certificate 模型¶
from certflow.models import Certificate
cert = Certificate(
certificate_no="CERT-001",
sale_plan_id=100,
unique_key="abc123",
product_model="阀门A",
status="待打印"
)
异常处理¶
from sqlalchemy.exc import SQLAlchemyError
from pydantic import ValidationError
try:
result = service.import_from_excel_with_config(config)
except FileNotFoundError as e:
logger.error(f"文件不存在: {e}")
QMessageBox.critical(self, "错误", f"文件不存在: {e}")
except ValidationError as e:
logger.error(f"配置验证失败: {e}")
QMessageBox.warning(self, "配置错误", str(e))
except SQLAlchemyError as e:
logger.error(f"数据库错误: {e}")
session.rollback()
QMessageBox.critical(self, "数据库错误", str(e))
except Exception as e:
logger.exception(f"未知错误: {e}")
QMessageBox.critical(self, "错误", f"操作失败: {e}")
钩子函数¶
导入完成钩子¶
def on_import_completed(result: Dict[str, Any]) -> None:
"""导入完成后的回调"""
print(f"新增 {result['new_count']} 条记录")
# 在SalePlanService中注册
service.on_import_completed = on_import_completed
配置变更钩子¶
def on_config_reloaded() -> None:
"""配置重载后的回调"""
print("配置已更新")
# 在settings模块中
reload_config()
使用示例¶
完整导入流程¶
from certflow.utils.database import DatabaseManager
from certflow.services import SalePlanService
from certflow.utils.logger import setup_logger
# 1. 初始化日志
setup_logger()
# 2. 初始化数据库
db = DatabaseManager()
db.init_db(create_tables=True)
session = db.get_session()
# 3. 创建服务
service = SalePlanService(session)
# 4. 导入数据
config = {
"file_path": "销售计划.xlsx",
"sheet_name": "1月",
"header_row": 1,
"data_start_row": 2,
"skip_rows": 0,
"column_mapping": {
"产品型号": "product_model",
"订单号": "sales_order_no",
"数量": "quantity"
}
}
result = service.import_from_excel_with_config(config)
# 5. 查看结果
print(f"导入完成: 新增{result['new_count']}条, 重复{result['duplicate_count']}条")
查询与导出¶
from certflow.services import QueryService
import pandas as pd
# 创建查询服务
query_service = QueryService(session)
# 执行查询
filters = {"product_model": "阀门A", "supply_type": "自制"}
result = query_service.search(filters, page=1, page_size=100)
# 导出到Excel
data = [{
"产品型号": r.product_model,
"订单号": r.sales_order_no,
"客户": r.customer,
"数量": r.quantity
} for r in result["results"]]
df = pd.DataFrame(data)
df.to_excel("导出结果.xlsx", index=False)