系统架构¶
1. 技术栈¶
层 |
技术 |
版本 |
|---|---|---|
GUI 框架 |
PySide6 (Qt6) |
>= 6.5.0 |
ORM |
SQLAlchemy |
>= 2.0.0 |
数据处理 |
pandas / openpyxl / python-calamine |
- |
PDF 生成 |
reportlab / pypdf |
- |
日志 |
loguru |
>= 0.7.0 |
配置 |
PyYAML + pydantic |
- |
CLI |
click |
>= 8.0 |
打包 |
PyInstaller / Nuitka |
- |
包管理 |
uv |
- |
2. 分层架构¶
┌─────────────────────────────────────────────┐
│ views/ GUI 视图层(PySide6 QWidget) │
│ widgets/ 可复用控件 │
├─────────────────────────────────────────────┤
│ controllers/ 控制器层(业务编排) │
│ actions/ action 注册表(统一派发) │
│ handlers/ 事件处理器 / 文件处理器 │
├─────────────────────────────────────────────┤
│ services/ 服务层(业务逻辑,无 Qt 依赖) │
│ services/printer/ 打印子系统 │
├─────────────────────────────────────────────┤
│ models/ 数据模型(SQLAlchemy ORM) │
│ config/ 配置加载(pydantic 模型) │
│ utils/ 工具函数 │
└─────────────────────────────────────────────┘
层纯度门禁:scripts/check_layer_purity.py 强制约束依赖方向(views → controllers → services → models),禁止反向引用。
3. 启动流程(main.py)¶
main()
├── 读取 config.yaml → debug_modules 黑名单
├── setup_logger(debug_modules)
├── check_data_sources() # 销售计划路径/基线库检查(仅 warning)
├── StatusInference.init_from_config()
├── 高 DPI 适配
├── QApplication(sys.argv)
├── init_database_manager()
│ ├── setup_webdav_config() # 从 .env 读坚果云配置
│ ├── DatabaseManager(webdav_config)
│ ├── db_manager.init_db(create_tables=True, sync_from_webdav=...)
│ ├── _maybe_seed_base_data(db_manager) # 空库播种基础字典
│ └── db_manager.warn_if_base_data_empty()
├── session = db_manager.get_session()
├── BaseController.set_shared_db_manager(db_manager)
├── 读取 print/printer/templates 配置
├── SettingsController() # 主题/语言/自动保存
├── MainWindow(session, config, db_manager, settings_controller)
└── app.exec() # Qt 事件循环
4. 应用装配(bootstrap.py)¶
AppContext 收口"数据库管理器从哪来、会话从哪来、Service 如何构造":
build_context(db_manager=None) -> AppContext— 工厂入口get_default_context() -> AppContext— 进程内惰性单例context.get_service(ServiceCls, *args)— 以当前会话为首个参数构造 Servicecontext.close()— 释放资源
消除原先散落在 BaseController 里的隐式 DatabaseManager() 兜底。
5. 模块清单¶
5.1 controllers/(17 个)¶
控制器 |
职责 |
|---|---|
|
基类,持有共享 db_manager |
|
销售计划导入编排 |
|
查询、字段编辑、批量操作 |
|
合格证生成/预览 |
|
打印队列管理 |
|
打印机选择与状态 |
|
报告生成 |
|
导出(Excel/Access) |
|
扫描枪输入 |
|
校正队列 |
|
打印历史 |
|
系统设置(主题/语言) |
|
BOM 物料维护 |
|
材质牌号维护 |
|
型号参数映射维护 |
|
口径映射维护 |
5.2 services/(46 个,含 printer/ 子包)¶
核心服务见 04-operator-guide.md 各子流程文档。
5.3 views/(42 个)¶
视图 |
职责 |
|---|---|
|
主窗口,导航栏 + StackedWidget |
|
导入流程 |
|
查询 |
|
校正队列 |
|
打印 |
|
报告 |
|
导出 |
|
历史 |
|
扫描 |
|
设置 |
|
基础字典维护(4 个) |
|
视图基类(11 个) |
5.4 handlers/(12 个)¶
文件 I/O 与事件处理:Excel 读写、CSV 导出、模板处理、扫描处理、排序、保存、数据清理、报告生成、发货导出。
5.5 actions/¶
registry.py — 统一 action 注册表,将工具栏/右键菜单/导航按钮的派发收敛为单一信源(dispatch(view, action_name, item))。
6. 数据库四库模型¶
start.sh 阶段10 定义:
库 |
路径 |
用途 |
Git 管理 |
|---|---|---|---|
A 主库 |
|
生产数据 |
gitignore |
B 调试库 |
|
本脚本使用 |
gitignore |
C 本地基线 |
|
私有基线(含真实数据) |
gitignore |
D 匿名基线 |
|
脱敏模板 |
Git LFS |
基线源选择策略:C 优先 → D 回退。LFS 拉取策略:仅当 C 不存在且 B 需重建时才拉取 D 真实内容。
7. CI/CD¶
ci/ 目录含 16 个 yml + 1 个 txt,覆盖:
环境搭建(Linux apt 依赖 / Windows / macOS)
依赖同步(uv sync 各 group)
层纯度门禁
pytest(offscreen 后端)
ruff lint
pyright / mypy 类型检查
覆盖率上报
8. 打包¶
scripts/builder/ 提供构建脚本:
入口:
src/certflow/main.py输出:
dist/CertFlow配置:
scripts/builder/build_config.yaml工具:PyInstaller(默认)/ Nuitka(备选)