数据库设计¶
CertFlow-PySide6 数据库 Schema 设计文档。
概述¶
数据库: SQLite
ORM: SQLAlchemy
字符编码: UTF-8
时区: 本地时间(通过
datetime.now())
ER 图¶
┌─────────────────────┐ ┌─────────────────────┐
│ sale_plans │ │ certificates │
├─────────────────────┤ ├─────────────────────┤
│ id (PK) │────<│ sale_plan_id (FK) │
│ unique_key (UK) │ │ id (PK) │
│ product_model │ │ certificate_no (UK) │
│ sales_order_no │ │ product_model │
│ customer │ │ status │
│ quantity │ │ print_time │
│ ... │ │ is_engraved │
└─────────────────────┘ └─────────────────────┘
│ │
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ print_logs │ │ auto_number_rules │
├─────────────────────┤ ├─────────────────────┤
│ id (PK) │ │ id (PK) │
│ certificate_id (FK) │ │ code (UK) │
│ certificate_no │ │ name │
│ print_type │ │ prefix │
│ status │ │ date_format │
│ print_time │ │ serial_length │
└─────────────────────┘ └─────────────────────┘
│
│
▼
┌─────────────────────┐
│ auto_number_counters│
├─────────────────────┤
│ id (PK) │
│ rule_code (FK) │
│ group_key │
│ current_serial │
│ reset_date │
└─────────────────────┘
表结构详细说明¶
1. sale_plans - 销售计划表¶
存储从Excel导入的销售计划原始数据,是系统核心数据表。
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
id |
INTEGER |
PK, AUTOINCREMENT |
主键ID |
unique_key |
VARCHAR(36) |
NOT NULL, UNIQUE |
唯一键(UUID格式) |
original_order |
INTEGER |
DEFAULT 0 |
原始顺序(保持Excel行顺序) |
sort_group |
VARCHAR(200) |
排序分组 |
|
created_at |
DATETIME |
DEFAULT NOW |
创建时间 |
updated_at |
DATETIME |
ON UPDATE |
更新时间 |
source_file |
VARCHAR(200) |
源文件路径 |
|
source_sheet |
VARCHAR(50) |
来源工作表名称 |
|
import_batch_id |
VARCHAR(50) |
导入批次ID |
|
import_date |
DATETIME |
DEFAULT NOW |
导入时间 |
contract_no |
VARCHAR(100) |
合同号 |
|
sales_order_no |
VARCHAR(100) |
销售订单号 |
|
production_order_no |
VARCHAR(100) |
生产令号 |
|
plan_no |
VARCHAR(100) |
计划单号 |
|
plan_date |
VARCHAR(50) |
计划日期 |
|
planned_delivery_date |
VARCHAR(50) |
计划交货期 |
|
contract_delivery_date |
VARCHAR(50) |
合同交货期 |
|
customer |
VARCHAR(200) |
订货单位 |
|
project_name |
VARCHAR(200) |
项目名称 |
|
project_unit |
VARCHAR(200) |
项目单位 |
|
product_name |
VARCHAR(200) |
产品名称 |
|
product_model |
VARCHAR(200) |
NOT NULL |
产品型号 |
product_spec |
VARCHAR(200) |
产品规格 |
|
quantity |
INTEGER |
DEFAULT 1 |
数量 |
weight |
FLOAT |
DEFAULT 0.0 |
重量 |
category |
VARCHAR(100) |
种类 |
|
unit_price |
FLOAT |
DEFAULT 0.0 |
单价 |
total_price |
FLOAT |
DEFAULT 0.0 |
总价 |
business_dept |
VARCHAR(100) |
业务归口 |
|
affiliated_dept |
VARCHAR(100) |
隶属部门 |
|
payment_method |
VARCHAR(100) |
付款方式 |
|
supply_type |
VARCHAR(50) |
供货类型 |
|
tech_requirements |
TEXT |
技术要求 |
|
equipment_code |
VARCHAR(200) |
设备位号 |
|
product_code |
VARCHAR(100) |
产品编号 |
|
production_status |
VARCHAR(50) |
DEFAULT '待生产' |
生产进度 |
execution_status |
VARCHAR(50) |
DEFAULT '' |
执行情况 |
certificate_remarks |
TEXT |
合格证备注 |
|
sales_plan_remarks |
TEXT |
销售计划备注 |
|
order_no |
VARCHAR(50) |
订单号(兼容旧代码) |
|
specification |
VARCHAR(100) |
规格(兼容旧代码) |
|
material |
VARCHAR(100) |
材质(兼容旧代码) |
|
certificate_number |
VARCHAR(50) |
合格证编号 |
|
format_status |
VARCHAR(50) |
DEFAULT '' |
根据格式识别的状态 |
font_colors |
TEXT |
DEFAULT '{}' |
字体颜色JSON |
background_colors |
TEXT |
DEFAULT '{}' |
背景色JSON |
comments |
TEXT |
DEFAULT '[]' |
批注JSON |
2. certificates - 合格证表¶
存储合格证的核心信息。
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
id |
INTEGER |
PK, AUTOINCREMENT |
主键ID |
certificate_no |
VARCHAR(50) |
NOT NULL, UNIQUE |
合格证编号 |
sale_plan_id |
INTEGER |
NOT NULL |
关联销售计划ID |
unique_key |
VARCHAR(36) |
NOT NULL |
关联唯一键 |
product_model |
VARCHAR(100) |
产品型号(冗余) |
|
order_no |
VARCHAR(50) |
订单号(冗余) |
|
customer |
VARCHAR(100) |
客户名称(冗余) |
|
print_time |
DATETIME |
打印时间 |
|
print_log |
TEXT |
打印日志JSON |
|
printer_name |
VARCHAR(100) |
打印机名称 |
|
is_engraved |
BOOLEAN |
DEFAULT FALSE |
是否已刻印 |
engraved_time |
DATETIME |
刻印时间 |
|
electronic_image_path |
VARCHAR(200) |
电子版图片路径 |
|
electronic_generated_time |
DATETIME |
电子版生成时间 |
|
status |
VARCHAR(20) |
DEFAULT '待打印' |
状态 |
created_at |
DATETIME |
DEFAULT NOW |
创建时间 |
状态枚举:
待打印: 已生成编号,尚未打印已打印: 已打印合格证已刻印: 铭牌已刻印完成
3. print_logs - 打印日志表¶
记录每次打印操作的详细信息。
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
id |
INTEGER |
PK, AUTOINCREMENT |
主键ID |
certificate_id |
INTEGER |
NOT NULL |
关联合格证ID |
certificate_no |
VARCHAR(50) |
合格证编号 |
|
print_type |
VARCHAR(20) |
打印类型 |
|
print_time |
DATETIME |
DEFAULT NOW |
打印时间 |
printer_name |
VARCHAR(100) |
打印机名称 |
|
copies |
INTEGER |
DEFAULT 1 |
打印份数 |
status |
VARCHAR(20) |
打印状态 |
|
error_message |
TEXT |
错误信息 |
|
content_summary |
TEXT |
打印内容摘要 |
打印类型枚举:
certificate: 合格证nameplate: 铭牌report: 报告
4. report_templates - 报告模板表¶
存储报告模板的配置信息。
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
id |
INTEGER |
PK, AUTOINCREMENT |
主键ID |
name |
VARCHAR(100) |
NOT NULL |
模板名称 |
language |
VARCHAR(10) |
DEFAULT 'zh' |
语言(zh/en) |
record_per_page |
INTEGER |
DEFAULT 5 |
每页记录数 |
template_file |
VARCHAR(200) |
模板文件路径 |
|
merge_cells_config |
TEXT |
合并单元格配置JSON |
|
is_active |
BOOLEAN |
DEFAULT TRUE |
是否启用 |
style_config |
TEXT |
样式配置JSON |
5. auto_number_rules - 自动编号规则表¶
存储自动编号的规则定义。
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
id |
INTEGER |
PK, AUTOINCREMENT |
主键ID |
name |
VARCHAR(100) |
NOT NULL |
规则名称 |
code |
VARCHAR(50) |
NOT NULL, UNIQUE |
规则编码 |
prefix |
VARCHAR(50) |
前缀 |
|
suffix |
VARCHAR(50) |
后缀 |
|
date_format |
VARCHAR(20) |
DEFAULT '%Y%m%d' |
日期格式 |
serial_length |
INTEGER |
DEFAULT 4 |
流水号长度 |
separator |
VARCHAR(10) |
DEFAULT '-' |
分隔符 |
include_date |
BOOLEAN |
DEFAULT TRUE |
是否包含日期 |
include_serial |
BOOLEAN |
DEFAULT TRUE |
是否包含流水号 |
include_prefix |
BOOLEAN |
DEFAULT TRUE |
是否包含前缀 |
include_suffix |
BOOLEAN |
DEFAULT FALSE |
是否包含后缀 |
group_fields |
VARCHAR(200) |
分组字段 |
|
reset_type |
VARCHAR(20) |
DEFAULT 'never' |
重置类型 |
is_active |
BOOLEAN |
DEFAULT TRUE |
是否启用 |
description |
TEXT |
规则描述 |
|
created_at |
DATETIME |
DEFAULT NOW |
创建时间 |
updated_at |
DATETIME |
ON UPDATE |
更新时间 |
重置类型枚举:
never: 永不重置daily: 每日重置monthly: 每月重置yearly: 每年重置
6. auto_number_counters - 自动编号计数器表¶
存储自动编号的计数器值。
字段 |
类型 |
约束 |
说明 |
|---|---|---|---|
id |
INTEGER |
PK, AUTOINCREMENT |
主键ID |
rule_code |
VARCHAR(50) |
NOT NULL |
规则编码 |
group_key |
VARCHAR(200) |
分组键 |
|
current_serial |
INTEGER |
DEFAULT 0 |
当前流水号 |
reset_date |
VARCHAR(20) |
重置日期 |
|
created_at |
DATETIME |
DEFAULT NOW |
创建时间 |
updated_at |
DATETIME |
ON UPDATE |
更新时间 |
索引设计¶
sale_plans 表索引¶
索引名 |
字段 |
用途 |
|---|---|---|
idx_sale_plan_sales_order_no |
sales_order_no |
订单号查询 |
idx_sale_plan_production_order_no |
production_order_no |
生产令号查询 |
idx_sale_plan_product_model |
product_model |
产品型号查询 |
idx_sale_plan_customer |
customer |
客户查询 |
idx_sale_plan_production_status |
production_status |
生产状态筛选 |
idx_sale_plan_plan_date |
plan_date |
日期范围查询 |
idx_sale_plan_unique_key |
unique_key |
唯一键查询 |
idx_sale_plan_plan_no |
plan_no |
计划单号查询 |
idx_sale_plan_project_name |
project_name |
项目名称查询 |
idx_sale_plan_supply_type |
supply_type |
供货方式筛选 |
idx_sale_plan_execution_status |
execution_status |
执行状态筛选 |
idx_sale_plan_business_dept |
business_dept |
业务部门筛选 |
idx_sale_plan_certificate_number |
certificate_number |
合格证编号查询 |
idx_sale_plan_model_status |
product_model, production_status |
复合条件查询 |
idx_sale_plan_order_model |
sales_order_no, product_model |
复合条件查询 |
idx_sale_plan_customer_date |
customer, plan_date |
复合条件查询 |
idx_sale_plan_model_customer |
product_model, customer |
复合条件查询 |
certificates 表索引¶
索引名 |
字段 |
用途 |
|---|---|---|
idx_certificate_no |
certificate_no |
编号查询 |
idx_certificate_sale_plan_id |
sale_plan_id |
关联查询 |
idx_certificate_status |
status |
状态筛选 |
print_logs 表索引¶
索引名 |
字段 |
用途 |
|---|---|---|
idx_print_log_certificate_id |
certificate_id |
关联查询 |
idx_print_log_time |
print_time |
时间范围查询 |
auto_number 相关索引¶
表 |
索引名 |
字段 |
用途 |
|---|---|---|---|
auto_number_rules |
idx_auto_number_rule_code |
code |
编码查询 |
auto_number_rules |
idx_auto_number_rule_active |
is_active |
启用状态筛选 |
auto_number_rules |
idx_auto_number_rule_code_active |
code, is_active |
复合条件查询 |
auto_number_counters |
idx_counter_rule_group |
rule_code, group_key |
计数器查询 |
auto_number_counters |
idx_counter_rule_code |
rule_code |
规则查询 |
数据迁移策略¶
自动补齐缺失列¶
DatabaseManager._migrate_missing_columns() 方法会自动检测并补齐:
对比模型定义与实际数据库列
对缺失列执行
ALTER TABLE ADD COLUMN支持默认值和可空约束
迁移注意事项¶
仅添加列,不删除或修改现有列
不支持设置外键约束和唯一约束
新增列后需手动更新应用代码
查询优化建议¶
使用索引字段进行筛选: 优先使用有索引的字段作为查询条件
**避免SELECT ***: 只查询需要的字段
分页查询: 使用
offset和limit进行分页批量操作: 使用
bulk_insert和bulk_update提高性能连接池: 生产环境配置合适的连接池大小
待补充¶
完整 ER 图(可视化)
数据字典导出工具
数据库备份策略
性能测试报告