import { invoke } from '@tauri-apps/api/core'; import { AiClassification, CreateAiClassificationRequest, UpdateAiClassificationRequest, AiClassificationQuery, AiClassificationPreview, SortOrderUpdate, ApiResponse, } from '../types/aiClassification'; /** * AI分类服务类 * 遵循前端开发规范的服务层设计,封装与后端的通信逻辑 */ export class AiClassificationService { /** * 创建AI分类 */ static async createClassification(request: CreateAiClassificationRequest): Promise { try { const result = await invoke('create_ai_classification', { request }); return result; } catch (error) { console.error('创建AI分类失败:', error); throw new Error(typeof error === 'string' ? error : '创建AI分类失败'); } } /** * 获取所有AI分类 */ static async getAllClassifications(query?: AiClassificationQuery): Promise { try { const result = await invoke('get_all_ai_classifications', { query }); return result; } catch (error) { console.error('获取AI分类列表失败:', error); throw new Error(typeof error === 'string' ? error : '获取AI分类列表失败'); } } /** * 根据ID获取AI分类 */ static async getClassificationById(id: string): Promise { try { const result = await invoke('get_ai_classification_by_id', { id }); return result; } catch (error) { console.error('获取AI分类详情失败:', error); throw new Error(typeof error === 'string' ? error : '获取AI分类详情失败'); } } /** * 更新AI分类 */ static async updateClassification(id: string, request: UpdateAiClassificationRequest): Promise { try { const result = await invoke('update_ai_classification', { id, request }); return result; } catch (error) { console.error('更新AI分类失败:', error); throw new Error(typeof error === 'string' ? error : '更新AI分类失败'); } } /** * 删除AI分类 */ static async deleteClassification(id: string): Promise { try { const result = await invoke('delete_ai_classification', { id }); return result; } catch (error) { console.error('删除AI分类失败:', error); throw new Error(typeof error === 'string' ? error : '删除AI分类失败'); } } /** * 获取AI分类总数 */ static async getClassificationCount(activeOnly?: boolean): Promise { try { const result = await invoke('get_ai_classification_count', { active_only: activeOnly }); return result; } catch (error) { console.error('获取AI分类总数失败:', error); throw new Error(typeof error === 'string' ? error : '获取AI分类总数失败'); } } /** * 生成AI分类预览 */ static async generatePreview(): Promise { try { const result = await invoke('generate_ai_classification_preview'); return result; } catch (error) { console.error('生成AI分类预览失败:', error); throw new Error(typeof error === 'string' ? error : '生成AI分类预览失败'); } } /** * 批量更新分类排序 */ static async updateSortOrders(updates: SortOrderUpdate[]): Promise { try { // 转换为后端期望的格式 [id, sort_order] const updateTuples: [string, number][] = updates.map(update => [update.id, update.sort_order]); const result = await invoke('update_ai_classification_sort_orders', { updates: updateTuples }); return result; } catch (error) { console.error('批量更新排序失败:', error); throw new Error(typeof error === 'string' ? error : '批量更新排序失败'); } } /** * 切换分类激活状态 */ static async toggleClassificationStatus(id: string): Promise { try { const result = await invoke('toggle_ai_classification_status', { id }); return result; } catch (error) { console.error('切换分类状态失败:', error); throw new Error(typeof error === 'string' ? error : '切换分类状态失败'); } } /** * 验证分类名称是否可用 */ static async validateClassificationName(name: string, excludeId?: string): Promise { try { const result = await invoke('validate_ai_classification_name', { name, exclude_id: excludeId }); return result; } catch (error) { console.error('验证分类名称失败:', error); throw new Error(typeof error === 'string' ? error : '验证分类名称失败'); } } /** * 获取激活的分类列表(用于预览) */ static async getActiveClassifications(): Promise { return this.getAllClassifications({ active_only: true, sort_by: 'sort_order', sort_order: 'ASC', }); } /** * 获取所有分类(包括非激活的) */ static async getAllClassificationsIncludingInactive(): Promise { return this.getAllClassifications({ active_only: false, sort_by: 'sort_order', sort_order: 'ASC', }); } /** * 创建分类并返回包装的响应 */ static async createClassificationSafe(request: CreateAiClassificationRequest): Promise> { try { const data = await this.createClassification(request); return { data, success: true }; } catch (error) { return { error: error instanceof Error ? error.message : '创建分类失败', success: false }; } } /** * 更新分类并返回包装的响应 */ static async updateClassificationSafe(id: string, request: UpdateAiClassificationRequest): Promise> { try { const data = await this.updateClassification(id, request); return { data, success: true }; } catch (error) { return { error: error instanceof Error ? error.message : '更新分类失败', success: false }; } } /** * 删除分类并返回包装的响应 */ static async deleteClassificationSafe(id: string): Promise> { try { const data = await this.deleteClassification(id); return { data, success: true }; } catch (error) { return { error: error instanceof Error ? error.message : '删除分类失败', success: false }; } } /** * 获取分类列表并返回包装的响应 */ static async getAllClassificationsSafe(query?: AiClassificationQuery): Promise> { try { const data = await this.getAllClassifications(query); return { data, success: true }; } catch (error) { return { error: error instanceof Error ? error.message : '获取分类列表失败', success: false }; } } /** * 生成预览并返回包装的响应 */ static async generatePreviewSafe(): Promise> { try { const data = await this.generatePreview(); return { data, success: true }; } catch (error) { return { error: error instanceof Error ? error.message : '生成预览失败', success: false }; } } /** * 重新排序分类 * 根据新的顺序数组重新设置所有分类的排序顺序 */ static async reorderClassifications(orderedIds: string[]): Promise { const updates: SortOrderUpdate[] = orderedIds.map((id, index) => ({ id, sort_order: index + 1, })); return this.updateSortOrders(updates); } /** * 复制分类 * 创建一个现有分类的副本 */ static async duplicateClassification(id: string): Promise { const original = await this.getClassificationById(id); if (!original) { throw new Error('要复制的分类不存在'); } const request: CreateAiClassificationRequest = { name: `${original.name} (副本)`, prompt_text: original.prompt_text, description: original.description, sort_order: original.sort_order + 1, }; return this.createClassification(request); } /** * 批量删除分类 */ static async deleteMultipleClassifications(ids: string[]): Promise<{ success: string[]; failed: string[] }> { const success: string[] = []; const failed: string[] = []; for (const id of ids) { try { const result = await this.deleteClassification(id); if (result) { success.push(id); } else { failed.push(id); } } catch (error) { failed.push(id); } } return { success, failed }; } /** * 批量切换分类状态 */ static async toggleMultipleClassificationStatus(ids: string[]): Promise { const results: AiClassification[] = []; for (const id of ids) { try { const result = await this.toggleClassificationStatus(id); if (result) { results.push(result); } } catch (error) { console.error(`切换分类 ${id} 状态失败:`, error); } } return results; } }