enum MessageType { user, ai, system; } enum ConversationStatus { active, paused, completed, cancelled; String get displayName { switch (this) { case ConversationStatus.active: return '进行中'; case ConversationStatus.paused: return '已暂停'; case ConversationStatus.completed: return '已完成'; case ConversationStatus.cancelled: return '已取消'; } } } class ConversationMessage { final String id; final String content; final MessageType type; final DateTime timestamp; final String? audioUrl; final double? confidence; // 语音识别置信度 final Map? metadata; const ConversationMessage({ required this.id, required this.content, required this.type, required this.timestamp, this.audioUrl, this.confidence, this.metadata, }); factory ConversationMessage.fromJson(Map json) { return ConversationMessage( id: json['id'] as String, content: json['content'] as String, type: MessageType.values.firstWhere( (e) => e.name == json['type'], orElse: () => MessageType.user, ), timestamp: DateTime.parse(json['timestamp'] as String), audioUrl: json['audioUrl'] as String?, confidence: json['confidence'] as double?, metadata: json['metadata'] as Map?, ); } Map toJson() { return { 'id': id, 'content': content, 'type': type.name, 'timestamp': timestamp.toIso8601String(), 'audioUrl': audioUrl, 'confidence': confidence, 'metadata': metadata, }; } } class Conversation { final String id; final String taskId; final String userId; final List messages; final ConversationStatus status; final DateTime startTime; final DateTime? endTime; final int totalDuration; // 总时长(秒) final Map? settings; const Conversation({ required this.id, required this.taskId, required this.userId, required this.messages, required this.status, required this.startTime, this.endTime, required this.totalDuration, this.settings, }); factory Conversation.fromJson(Map json) { return Conversation( id: json['id'] as String, taskId: json['taskId'] as String, userId: json['userId'] as String, messages: (json['messages'] as List) .map((e) => ConversationMessage.fromJson(e as Map)) .toList(), status: ConversationStatus.values.firstWhere( (e) => e.name == json['status'], orElse: () => ConversationStatus.active, ), startTime: DateTime.parse(json['startTime'] as String), endTime: json['endTime'] != null ? DateTime.parse(json['endTime'] as String) : null, totalDuration: json['totalDuration'] as int, settings: json['settings'] as Map?, ); } Map toJson() { return { 'id': id, 'taskId': taskId, 'userId': userId, 'messages': messages.map((e) => e.toJson()).toList(), 'status': status.name, 'startTime': startTime.toIso8601String(), 'endTime': endTime?.toIso8601String(), 'totalDuration': totalDuration, 'settings': settings, }; } Conversation copyWith({ String? id, String? taskId, String? userId, List? messages, ConversationStatus? status, DateTime? startTime, DateTime? endTime, int? totalDuration, Map? settings, }) { return Conversation( id: id ?? this.id, taskId: taskId ?? this.taskId, userId: userId ?? this.userId, messages: messages ?? this.messages, status: status ?? this.status, startTime: startTime ?? this.startTime, endTime: endTime ?? this.endTime, totalDuration: totalDuration ?? this.totalDuration, settings: settings ?? this.settings, ); } }