feat: add database-driven material validation with multi-mode support
This commit enhances the material validation functionality to support database-driven workflows alongside the existing Excel-based approach. ## New Features ### DAO Layer - Add ProductionContractDataDAO for querying production contract data - Add MaterialsToBeDeletedDAO with full CRUD operations - Enhance DiscreteMaterialPlanDAO with query_all(), query_by_source_numbers(), and get_unique_material_names() methods ### Validation Modes Support for 4 validation modes in MaterialValidationTab: 1. Database Full - Query all materials from DiscreteMaterialPlanData 2. Database Filtered - Query by ProductionID.txt file 3. Excel Existing - Validate from existing Excel file 4. Excel Full - Complete workflow with ERP extraction ### Configuration - Add ValidationConfig dataclass with data_source, batch_size, match_mode, enable_crud_operations, and default_manager fields - Update ConfigLoader to support validation configuration - Add validation settings section in SettingsTab GUI ### Query Chain Implementation of full query chain: ProductionID.txt (总排号) → productionContractData (生产订单号) → DiscreteMaterialPlanData (SourceNumber) → MaterialName → MaterialsToBeDeleted comparison ## Backward Compatibility All existing Excel-based validation methods remain unchanged, ensuring no breaking changes for existing workflows. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -57,9 +57,12 @@ class SettingsTab(ttk.Frame):
|
||||
# 处理配置组
|
||||
self._create_extraction_group(scrollable_frame)
|
||||
|
||||
# 校验配置组
|
||||
self._create_validation_group(scrollable_frame)
|
||||
|
||||
# 按钮区域
|
||||
button_frame = ttk.Frame(scrollable_frame)
|
||||
button_frame.grid(row=5, column=0, columnspan=2, pady=20, sticky="ew")
|
||||
button_frame.grid(row=6, column=0, columnspan=2, pady=20, sticky="ew")
|
||||
|
||||
ttk.Button(
|
||||
button_frame, text="测试 ERP 连接", command=self.test_erp_connection
|
||||
@@ -224,6 +227,63 @@ class SettingsTab(ttk.Frame):
|
||||
group, text="保存到数据库 (同时写入 SQL Server)", variable=self.enable_db_persistence_var
|
||||
).grid(row=4, column=0, columnspan=2, sticky="w", pady=5)
|
||||
|
||||
def _create_validation_group(self, parent):
|
||||
"""创建物料校验配置组"""
|
||||
group = ttk.LabelFrame(parent, text="物料校验设置", padding=10)
|
||||
group.grid(row=4, column=0, columnspan=2, pady=10, padx=10, sticky="ew")
|
||||
|
||||
# 数据源选择
|
||||
ttk.Label(group, text="默认数据源:").grid(row=0, column=0, sticky="w", pady=5)
|
||||
self.validation_data_source_var = tk.StringVar()
|
||||
data_source_combo = ttk.Combobox(
|
||||
group,
|
||||
textvariable=self.validation_data_source_var,
|
||||
values=["database_full", "database_filtered", "excel_existing", "excel_full"],
|
||||
state="readonly",
|
||||
width=30,
|
||||
)
|
||||
data_source_combo.grid(row=0, column=1, sticky="w", pady=5)
|
||||
|
||||
# 使用数据库
|
||||
self.validation_use_database_var = tk.BooleanVar()
|
||||
ttk.Checkbutton(
|
||||
group, text="使用数据库作为数据源", variable=self.validation_use_database_var
|
||||
).grid(row=1, column=0, columnspan=2, sticky="w", pady=5)
|
||||
|
||||
# 批次大小
|
||||
ttk.Label(group, text="数据库批次大小:").grid(row=2, column=0, sticky="w", pady=5)
|
||||
self.validation_batch_size_var = tk.IntVar(value=2000)
|
||||
ttk.Spinbox(
|
||||
group, from_=100, to=2000, textvariable=self.validation_batch_size_var, width=10
|
||||
).grid(row=2, column=1, sticky="w", pady=5)
|
||||
|
||||
# 匹配模式
|
||||
ttk.Label(group, text="匹配模式:").grid(row=3, column=0, sticky="w", pady=5)
|
||||
self.validation_match_mode_var = tk.StringVar()
|
||||
match_mode_combo = ttk.Combobox(
|
||||
group,
|
||||
textvariable=self.validation_match_mode_var,
|
||||
values=["substring", "exact"],
|
||||
state="readonly",
|
||||
width=30,
|
||||
)
|
||||
match_mode_combo.grid(row=3, column=1, sticky="w", pady=5)
|
||||
|
||||
# CRUD 操作
|
||||
self.validation_enable_crud_var = tk.BooleanVar()
|
||||
ttk.Checkbutton(
|
||||
group, text="启用 CRUD 操作(管理待删除物料)", variable=self.validation_enable_crud_var
|
||||
).grid(row=4, column=0, columnspan=2, sticky="w", pady=5)
|
||||
|
||||
# 默认负责人
|
||||
ttk.Label(group, text="默认负责人:").grid(row=5, column=0, sticky="w", pady=5)
|
||||
self.validation_default_manager_var = tk.StringVar()
|
||||
ttk.Entry(group, textvariable=self.validation_default_manager_var, width=30).grid(
|
||||
row=5, column=1, sticky="w", pady=5
|
||||
)
|
||||
|
||||
group.columnconfigure(1, weight=1)
|
||||
|
||||
def load_settings(self):
|
||||
"""从配置加载设置到界面"""
|
||||
# ERP 设置
|
||||
@@ -255,6 +315,14 @@ class SettingsTab(ttk.Frame):
|
||||
self.merge_batches_var.set(self.config.get("extraction.merge_batches", True))
|
||||
self.enable_db_persistence_var.set(self.config.get("extraction.enable_db_persistence", False))
|
||||
|
||||
# 校验设置
|
||||
self.validation_data_source_var.set(self.config.get("validation.data_source", "database_full"))
|
||||
self.validation_use_database_var.set(self.config.get("validation.use_database", True))
|
||||
self.validation_batch_size_var.set(self.config.get("validation.batch_size", 2000))
|
||||
self.validation_match_mode_var.set(self.config.get("validation.match_mode", "substring"))
|
||||
self.validation_enable_crud_var.set(self.config.get("validation.enable_crud_operations", False))
|
||||
self.validation_default_manager_var.set(self.config.get("validation.default_manager", ""))
|
||||
|
||||
def save_settings(self):
|
||||
"""保存界面设置到配置"""
|
||||
# ERP 设置
|
||||
@@ -284,6 +352,14 @@ class SettingsTab(ttk.Frame):
|
||||
self.config.set("extraction.merge_batches", self.merge_batches_var.get())
|
||||
self.config.set("extraction.enable_db_persistence", self.enable_db_persistence_var.get())
|
||||
|
||||
# 校验设置
|
||||
self.config.set("validation.data_source", self.validation_data_source_var.get())
|
||||
self.config.set("validation.use_database", self.validation_use_database_var.get())
|
||||
self.config.set("validation.batch_size", self.validation_batch_size_var.get())
|
||||
self.config.set("validation.match_mode", self.validation_match_mode_var.get())
|
||||
self.config.set("validation.enable_crud_operations", self.validation_enable_crud_var.get())
|
||||
self.config.set("validation.default_manager", self.validation_default_manager_var.get())
|
||||
|
||||
# 保存到文件
|
||||
if self.config.save():
|
||||
messagebox.showinfo("成功", "设置已保存")
|
||||
|
||||
Reference in New Issue
Block a user