Files
ai_english/client/lib/features/speaking/models/conversation.dart
2025-11-17 13:39:05 +08:00

155 lines
4.0 KiB
Dart

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<String, dynamic>? 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<String, dynamic> 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<String, dynamic>?,
);
}
Map<String, dynamic> 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<ConversationMessage> messages;
final ConversationStatus status;
final DateTime startTime;
final DateTime? endTime;
final int totalDuration; // 总时长(秒)
final Map<String, dynamic>? 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<String, dynamic> json) {
return Conversation(
id: json['id'] as String,
taskId: json['taskId'] as String,
userId: json['userId'] as String,
messages: (json['messages'] as List<dynamic>)
.map((e) => ConversationMessage.fromJson(e as Map<String, dynamic>))
.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<String, dynamic>?,
);
}
Map<String, dynamic> 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<ConversationMessage>? messages,
ConversationStatus? status,
DateTime? startTime,
DateTime? endTime,
int? totalDuration,
Map<String, dynamic>? 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,
);
}
}