///会议模块用量统计的模型类 const int asrStatusProcessing = 0; // 处理中 const int asrStatusFailed = 1; // 处理失败 const int asrStatusCompleted = 2; // 已完成 // 会议音频文件转文字单次数据 class MeetingAsrRecord { String id; // 本次ASR唯一标识 int meetingId; // 会议记录ID String taskId; // 云端任务ID int audioSeconds; // 音频总时长(秒) int fileSizeBytes; // 音频文件大小(字节) String language; // ASR语言 int submitTimestamp; // 提交时间戳(毫秒) int status; // 状态: 0-处理中, 1-处理失败, 2-已完成 int transcriptBytes; // 转写后的字节数(utf8) int completeTimestamp; // 完成时间戳(毫秒) MeetingAsrRecord({ required this.id, required this.meetingId, required this.taskId, required this.audioSeconds, required this.fileSizeBytes, required this.language, required this.submitTimestamp, required this.status, required this.transcriptBytes, required this.completeTimestamp, }); Map toJson() => { 'id': id, 'meetingId': meetingId, 'taskId': taskId, 'audioSeconds': audioSeconds, 'fileSizeBytes': fileSizeBytes, 'language': language, 'submitTimestamp': submitTimestamp, 'status': status, 'transcriptBytes': transcriptBytes, 'completeTimestamp': completeTimestamp, }; factory MeetingAsrRecord.fromJson(Map json) { return MeetingAsrRecord( id: json['id'] ?? '', meetingId: json['meetingId'] ?? 0, taskId: json['taskId'] ?? '', audioSeconds: json['audioSeconds'] ?? 0, fileSizeBytes: json['fileSizeBytes'] ?? 0, language: json['language'] ?? '', submitTimestamp: json['submitTimestamp'] ?? 0, status: json['status'] ?? 0, transcriptBytes: json['transcriptBytes'] ?? 0, completeTimestamp: json['completeTimestamp'] ?? 0, ); } } // 会议音频文件转文字单日统计 class MeetingAsrDailyStats { String date; // 日期字符串: YYYY-MM-DD String userId; // 用户ID List items; // 当天所有单次ASR MeetingAsrDailyStats({ required this.date, required this.userId, required this.items, }); // 计算型聚合,不冗余存储 int get asrCalls => items.length; int get audioSecondsTotal => items.fold(0, (s, r) => s + r.audioSeconds); int get audioBytesTotal => items.fold(0, (s, r) => s + r.fileSizeBytes); int get transcriptBytesTotal => items.fold(0, (s, r) => s + r.transcriptBytes); Map toJson() => { 'date': date, 'userId': userId, 'items': items.map((e) => e.toJson()).toList(), }; factory MeetingAsrDailyStats.fromJson(Map json) { final list = (json['items'] as List? ?? []) .map((e) => MeetingAsrRecord.fromJson(Map.from(e))) .toList(); return MeetingAsrDailyStats( date: json['date'] ?? '', userId: json['userId'] ?? 'anonymous', items: list, ); } } // 会议音频文件转文字历史统计(所有的用量) class MeetingAsrHistoryStats { String userId; // 用户ID int allAsrCalls; // 所有ASR调用次数 int allAudioSeconds; // 所有音频总时长(秒) int allAudioFileBytes; // 所有音频文件大小(字节) int allTranscriptBytes; // 所有转写后的字节数(utf8) MeetingAsrHistoryStats({ required this.userId, required this.allAsrCalls, required this.allAudioSeconds, required this.allAudioFileBytes, required this.allTranscriptBytes, }); }