- Add MaterialsToBeDeletedDAO for managing material deletion records by MaterialCode - Add MaterialValidationResult dataclass for enhanced validation results - Add CheckboxTreeview component with selectable checkbox functionality - Refactor material validation UI with new columns: select, material name, code, spec, model, manager - Add double-click to edit manager name functionality - Add select all/deselect all buttons - Add confirm deletion button to write selected records to database - Prioritize MaterialsToBeDeleted.ManagerName over type-based matching when displaying - Export results to Excel with selection state Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
7.0 KiB
7.0 KiB
物料校验功能重构实现总结
实现概述
本文档总结了物料校验功能的重构实现,包括新增的 DAO、扩展的校验逻辑和重构的 UI 界面。
实现的文件
1. 新建文件
db/materials_to_be_deleted_records_dao.py
新增的 DAO 类,用于操作 MaterialsToBeDeleted 表(按 MaterialCode 精确匹配)。
主要功能:
upsert_material()- 使用 MERGE 语句插入或更新单条记录upsert_batch()- 批量插入或更新记录get_all_material_codes()- 获取所有 MaterialCode(返回 Set 用于快速查找)get_all_records()- 获取所有记录get_record_by_material_code()- 按 MaterialCode 查询单条记录get_materials_by_manager()- 按负责人查询delete_by_material_code()- 删除指定记录delete_by_manager()- 删除指定负责人的所有记录delete_by_material_codes()- 批量删除material_exists()- 检查 MaterialCode 是否存在count_all()- 统计记录数count_by_manager()- 统计指定负责人的记录数get_statistics()- 获取综合统计信息
关键特性:
- 使用 SQL Server MERGE 语句实现原子性的 upsert 操作
- 自动记录 CreateTime 和 UpdateTime
- 参数验证和错误处理
- 批量操作支持
2. 修改文件
utils/material_status_validator.py
扩展了物料校验器,新增完整记录模式的支持。
新增内容:
-
数据结构
MaterialValidationResult@dataclass class MaterialValidationResult: material_name: str material_code: str specification: Optional[str] = None model: Optional[str] = None manager_name: Optional[str] = None is_marked_for_deletion: bool = False matched_type_keyword: Optional[str] = None -
新增方法
match_materials_detailed()- 从
DiscreteMaterialPlanData完整记录进行匹配 - 同时匹配
MaterialsTypeToBeDeleted(按 MaterialName)和MaterialsToBeDeleted(按 MaterialCode) - 返回
MaterialValidationResult对象列表
- 从
-
新增方法
validate_from_database_enhanced()- 支持全表模式和过滤模式
- 返回完整的物料记录信息
- 导出的 Excel 包含:材料名称、材料代码、规格、型号、负责人、已标记删除、匹配的关键词
gui/material_validation_tab.py
完全重构的 UI 界面,支持新的数据结构和交互方式。
主要变更:
-
新增
CheckboxTreeview组件- 自定义 Treeview,支持 checkbox 列
- 使用 Unicode 字符
☐(未选中)和☑(选中) - 支持点击切换、全选/取消全选
- 自动同步 checkbox 状态
-
修改表格结构
- 旧列:材料名称、匹配的MaterialName、负责人、匹配状态
- 新列:选择、材料名称、材料代码、规格、型号、负责人
-
可编辑单元格
- 双击"负责人"单元格弹出编辑对话框
- 使用
simpledialog.askstring进行编辑 - 实时更新 UI 和日志
-
新增按钮
- 全选按钮:选中所有记录
- 取消全选按钮:取消选中所有记录
- 确认删除按钮:将选中记录写入数据库
-
确认删除流程
1. 验证是否有选中记录 2. 收集 MaterialCode 和 ManagerName 3. 验证 ManagerName 不为空 4. 显示确认对话框 5. 后台线程执行数据库操作 6. 完成后更新 UI 状态 -
加载结果时设置 checkbox 状态
- 从
MaterialsToBeDeleted表获取已标记的 MaterialCode - 自动设置对应记录的 checkbox 为选中状态
- 从
表关系说明
两个易混淆的表
| 表名 | 用途 | 匹配规则 | 字段 | DAO 类 |
|---|---|---|---|---|
MaterialsTypeToBeDeleted |
物料类型表(已有) | MaterialName 包含匹配 | MaterialName, ManagerName | MaterialsTypeToBeDeletedDAO |
MaterialsToBeDeleted |
物料记录表(新建) | MaterialCode 精确匹配 | ID, MaterialCode, ManagerName | MaterialsToBeDeletedDAO |
数据流程
ProductionID (总排号)
↓
[productionContractData].[26年压力表合同数据].[生产订单号] (SourceNumber)
↓
[dbo].[DiscreteMaterialPlanData].[SourceNumber]
↓
MaterialName, MaterialCode, Specification, Model
↓
匹配 [dbo].[MaterialsTypeToBeDeleted] (MaterialName 包含匹配) → 负责人
匹配 [dbo].[MaterialsToBeDeleted] (MaterialCode 精确匹配) → 已标记删除
使用说明
1. 数据库全表校验
- 选择"数据库 - 全表校验"模式
- 点击"开始校验"
- 等待校验完成,结果会显示在表格中
- 已标记删除的记录会自动勾选 checkbox
2. ProductionID 过滤校验
- 选择"数据库 - ProductionID 过滤"模式
- 选择 ProductionID.txt 文件
- 点击"开始校验"
- 等待校验完成
3. 编辑负责人
- 双击表格中的"负责人"单元格
- 在弹出对话框中输入新的负责人姓名
- 点击确定保存
4. 确认删除
- 勾选要删除的记录(使用 checkbox)
- 可以使用"全选"或"取消全选"按钮
- 点击"确认删除"按钮
- 确认对话框中查看要删除的记录数
- 点击"是"执行删除
- 等待后台操作完成
错误处理
数据库错误
- 所有 DAO 方法都包含 try-except 错误处理
- 错误信息会打印到控制台
- UI 会显示错误消息框
输入验证
- MaterialCode 不能为空
- ManagerName 不能为空(确认删除前验证)
- 负责人姓名长度限制(最大 50 字符)
事务处理
- 使用 SQL Server MERGE 语句的原子性
- 要么全部成功,要么全部失败
- 批量操作时逐条处理,记录成功和失败数量
测试建议
功能测试
- 全表校验: 验证所有记录正确显示
- 过滤校验: 使用 ProductionID 文件,验证过滤逻辑
- Checkbox 操作: 测试全选、取消全选、单独选择
- 编辑负责人: 双击单元格编辑,验证数据更新
- 确认删除: 选中记录点击确认删除,验证数据库写入
- 重新加载: 刷新数据,验证 checkbox 状态保持
边界测试
- 空结果集: 数据库无记录时的处理
- ManagerName 为空: 确认删除时的验证
- MaterialCode 为空: 是否正确过滤
- 大数据集: 1000+ 条记录的性能
- 网络中断: 数据库连接失败的处理
注意事项
-
表名混淆
MaterialsTypeToBeDeleted- 按材料名称模糊匹配MaterialsToBeDeleted- 按材料代码精确匹配
-
Unicode Checkbox
- 使用
☐和☑字符模拟 checkbox - 不同操作系统/字体可能显示不一致
- 使用
-
线程安全
- 数据库操作在后台线程执行
- UI 更新必须使用
after()回调到主线程
-
SQL Server 限制
- MERGE 语法兼容性
- 参数数量限制(批量操作时分批处理)
-
向后兼容
- 保留原有的校验方法(
validate_from_database) - 新增增强方法(
validate_from_database_enhanced) - 不破坏现有功能
- 保留原有的校验方法(