diff --git a/apps/desktop/src-tauri/src/business/services/template_matching_result_service.rs b/apps/desktop/src-tauri/src/business/services/template_matching_result_service.rs index bb541ae..3d49a84 100644 --- a/apps/desktop/src-tauri/src/business/services/template_matching_result_service.rs +++ b/apps/desktop/src-tauri/src/business/services/template_matching_result_service.rs @@ -201,6 +201,21 @@ impl TemplateMatchingResultService { Ok(self.repository.soft_delete(result_id)?) } + /// 软删除匹配结果并重置资源使用状态 + pub async fn soft_delete_matching_result_with_usage_reset( + &self, + result_id: &str, + material_usage_repo: Arc + ) -> Result<(bool, u32)> { + // 先删除使用记录并重置资源状态 + let deleted_usage_records = material_usage_repo.delete_usage_records_by_matching_results(&[result_id.to_string()])?; + + // 再软删除匹配结果 + let deleted_result = self.soft_delete_matching_result(result_id).await?; + + Ok((deleted_result, deleted_usage_records)) + } + /// 批量删除匹配结果 pub async fn batch_delete_matching_results(&self, result_ids: &[String]) -> Result { let mut deleted_count = 0; diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 386544a..3593fb9 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -233,6 +233,7 @@ pub fn run() { commands::template_matching_result_commands::list_matching_results, commands::template_matching_result_commands::delete_matching_result, commands::template_matching_result_commands::soft_delete_matching_result, + commands::template_matching_result_commands::soft_delete_matching_result_with_usage_reset, commands::template_matching_result_commands::batch_delete_matching_results, commands::template_matching_result_commands::batch_soft_delete_matching_results, commands::template_matching_result_commands::batch_delete_matching_results_with_usage_reset, diff --git a/apps/desktop/src-tauri/src/presentation/commands/template_matching_result_commands.rs b/apps/desktop/src-tauri/src/presentation/commands/template_matching_result_commands.rs index d4baf96..2872678 100644 --- a/apps/desktop/src-tauri/src/presentation/commands/template_matching_result_commands.rs +++ b/apps/desktop/src-tauri/src/presentation/commands/template_matching_result_commands.rs @@ -153,6 +153,21 @@ pub async fn soft_delete_matching_result( .map_err(|e| e.to_string()) } +/// 软删除匹配结果并重置资源使用状态 +#[command] +pub async fn soft_delete_matching_result_with_usage_reset( + result_id: String, + database: State<'_, Arc>, +) -> Result<(bool, u32), String> { + let repository = Arc::new(TemplateMatchingResultRepository::new(database.inner().clone())); + let material_usage_repo = Arc::new(crate::data::repositories::material_usage_repository::MaterialUsageRepository::new(database.inner().clone())); + let service = TemplateMatchingResultService::new(repository); + + service.soft_delete_matching_result_with_usage_reset(&result_id, material_usage_repo) + .await + .map_err(|e| e.to_string()) +} + /// 批量删除匹配结果 #[command] pub async fn batch_delete_matching_results( diff --git a/apps/desktop/src/components/TemplateMatchingResultManager.tsx b/apps/desktop/src/components/TemplateMatchingResultManager.tsx index 3f210c4..e720cb8 100644 --- a/apps/desktop/src/components/TemplateMatchingResultManager.tsx +++ b/apps/desktop/src/components/TemplateMatchingResultManager.tsx @@ -116,10 +116,13 @@ export const TemplateMatchingResultManager: React.FC { try { - await invoke('soft_delete_matching_result', { + const [deletedResult, deletedUsageRecords] = await invoke<[boolean, number]>('soft_delete_matching_result_with_usage_reset', { resultId: result.id, }); + console.log(`删除结果: ${deletedResult ? '成功' : '失败'},重置 ${deletedUsageRecords} 条使用记录`); + success(`成功删除匹配结果,重置 ${deletedUsageRecords} 条使用记录`); + // 重新加载列表 await loadResults(); await loadStatistics(); diff --git a/apps/desktop/src/components/template/TemplateDetailModal.tsx b/apps/desktop/src/components/template/TemplateDetailModal.tsx index 2796a10..7522460 100644 --- a/apps/desktop/src/components/template/TemplateDetailModal.tsx +++ b/apps/desktop/src/components/template/TemplateDetailModal.tsx @@ -15,7 +15,7 @@ export const TemplateDetailModal: React.FC = ({ onClose, onTemplateUpdated, }) => { - const [activeTab, setActiveTab] = useState<'overview' | 'materials' | 'tracks'>('overview'); + const [activeTab, setActiveTab] = useState<'overview' | 'materials' | 'tracks'>('tracks'); const [expandedSections, setExpandedSections] = useState>({}); const [expandedMaterials, setExpandedMaterials] = useState>({}); const [expandedSegments, setExpandedSegments] = useState>({});