import { invoke } from '@tauri-apps/api/core'; import { TemplateSegmentWeight, CreateTemplateSegmentWeightRequest, UpdateTemplateSegmentWeightRequest, BatchUpdateTemplateSegmentWeightRequest, } from '../types/template'; import { AiClassification } from '../types/aiClassification'; /** * 模板片段权重配置服务 * 遵循前端开发规范的服务层设计原则 */ export class TemplateSegmentWeightService { /** * 创建模板片段权重配置 */ static async createTemplateSegmentWeight( request: CreateTemplateSegmentWeightRequest ): Promise { return await invoke('create_template_segment_weight', { request }); } /** * 获取模板片段的权重配置(包含默认值) */ static async getSegmentWeightsWithDefaults( templateId: string, trackSegmentId: string ): Promise> { return await invoke('get_segment_weights_with_defaults', { templateId, trackSegmentId, }); } /** * 获取模板片段的AI分类按权重排序 */ static async getClassificationsBySegmentWeight( templateId: string, trackSegmentId: string ): Promise { return await invoke('get_classifications_by_segment_weight', { templateId, trackSegmentId, }); } /** * 批量更新模板片段权重配置 */ static async batchUpdateTemplateSegmentWeights( request: BatchUpdateTemplateSegmentWeightRequest ): Promise { return await invoke('batch_update_template_segment_weights', { request }); } /** * 初始化模板片段的默认权重配置 */ static async initializeDefaultSegmentWeights( templateId: string, trackSegmentId: string ): Promise { return await invoke('initialize_default_segment_weights', { templateId, trackSegmentId, }); } /** * 重置模板片段权重配置为全局默认值 */ static async resetSegmentWeightsToGlobal( templateId: string, trackSegmentId: string ): Promise { return await invoke('reset_segment_weights_to_global', { templateId, trackSegmentId, }); } /** * 获取模板的所有权重配置 */ static async getTemplateWeights(templateId: string): Promise { return await invoke('get_template_weights', { templateId }); } /** * 删除模板的所有权重配置 */ static async deleteTemplateWeights(templateId: string): Promise { return await invoke('delete_template_weights', { templateId }); } /** * 更新单个权重配置 */ static async updateTemplateSegmentWeight( id: string, request: UpdateTemplateSegmentWeightRequest ): Promise { return await invoke('update_template_segment_weight', { id, request }); } /** * 检查模板片段是否有自定义权重配置 */ static async hasCustomSegmentWeights( templateId: string, trackSegmentId: string ): Promise { return await invoke('has_custom_segment_weights', { templateId, trackSegmentId, }); } /** * 获取权重配置的统计信息 */ static async getTemplateWeightStatistics( templateId: string ): Promise> { return await invoke('get_template_weight_statistics', { templateId }); } /** * 批量设置片段权重(便捷方法) */ static async setSegmentWeights( templateId: string, trackSegmentId: string, weights: Record ): Promise { const weightConfigs = Object.entries(weights).map(([aiClassificationId, weight]) => ({ ai_classification_id: aiClassificationId, weight, })); const request: BatchUpdateTemplateSegmentWeightRequest = { template_id: templateId, track_segment_id: trackSegmentId, weights: weightConfigs, }; return await this.batchUpdateTemplateSegmentWeights(request); } /** * 获取片段权重映射(便捷方法) */ static async getSegmentWeightMap( templateId: string, trackSegmentId: string ): Promise> { return await this.getSegmentWeightsWithDefaults(templateId, trackSegmentId); } /** * 复制权重配置到其他片段 */ static async copyWeightsToSegments( sourceTemplateId: string, sourceTrackSegmentId: string, targetSegments: Array<{ templateId: string; trackSegmentId: string }> ): Promise { // 获取源片段的权重配置 const sourceWeights = await this.getSegmentWeightsWithDefaults( sourceTemplateId, sourceTrackSegmentId ); // 批量应用到目标片段 const results = await Promise.all( targetSegments.map(({ templateId, trackSegmentId }) => this.setSegmentWeights(templateId, trackSegmentId, sourceWeights) ) ); return results; } /** * 重置多个片段的权重配置 */ static async resetMultipleSegmentsToGlobal( segments: Array<{ templateId: string; trackSegmentId: string }> ): Promise { const results = await Promise.all( segments.map(({ templateId, trackSegmentId }) => this.resetSegmentWeightsToGlobal(templateId, trackSegmentId) ) ); return results; } /** * 获取指定分类的权重配置(用于按顺序匹配规则) */ static async getSegmentWeightsForCategories( templateId: string, trackSegmentId: string, categoryIds: string[] ): Promise> { return await invoke('get_segment_weights_for_categories', { templateId, trackSegmentId, categoryIds, }); } /** * 获取模板所有片段的权重统计 */ static async getTemplateSegmentWeightSummary(templateId: string): Promise<{ totalSegments: number; segmentsWithCustomWeights: number; averageWeightPerClassification: Record; }> { const [weights, statistics] = await Promise.all([ this.getTemplateWeights(templateId), this.getTemplateWeightStatistics(templateId), ]); // 计算每个分类的平均权重 const weightsByClassification: Record = {}; weights.forEach((weight) => { if (!weightsByClassification[weight.ai_classification_id]) { weightsByClassification[weight.ai_classification_id] = []; } weightsByClassification[weight.ai_classification_id].push(weight.weight); }); const averageWeightPerClassification: Record = {}; Object.entries(weightsByClassification).forEach(([classificationId, weights]) => { const average = weights.reduce((sum, weight) => sum + weight, 0) / weights.length; averageWeightPerClassification[classificationId] = Math.round(average * 100) / 100; }); return { totalSegments: statistics.total_configurations || 0, segmentsWithCustomWeights: statistics.unique_classifications || 0, averageWeightPerClassification, }; } }