// 功能描述:定义用气统计的服务端事实模型;版本:1.0.0。 class UsagePoint { const UsagePoint({required this.date, required this.usage}); final DateTime date; final double usage; factory UsagePoint.fromJson(Map json) => UsagePoint( date: DateTime.parse(json['date'] as String), usage: (json['usage'] as num).toDouble(), ); } class UsageComposition { const UsageComposition({required this.breakfast, required this.lunch, required this.dinner}); final double breakfast, lunch, dinner; factory UsageComposition.fromJson(Map json) => UsageComposition( breakfast: (json['breakfast'] as num? ?? 0).toDouble(), lunch: (json['lunch'] as num? ?? 0).toDouble(), dinner: (json['dinner'] as num? ?? 0).toDouble(), ); } class UsageStatistics { const UsageStatistics({ required this.available, required this.deviceIdentity, required this.deviceName, required this.deviceCode, required this.period, required this.periodStart, required this.periodEnd, required this.unit, required this.points, required this.totalUsage, required this.averageUsage, required this.composition, required this.source, required this.calcVersion, required this.updatedAt, required this.unavailableReason, }); final bool available; final String deviceIdentity, deviceName, deviceCode, period, unit; final DateTime periodStart, periodEnd; final List points; final double totalUsage, averageUsage; final UsageComposition composition; final String source, calcVersion, unavailableReason; final DateTime? updatedAt; factory UsageStatistics.fromJson(Map json) { final device = json['device'] as Map? ?? const {}; final composition = json['composition'] as Map? ?? const {}; return UsageStatistics( available: json['available'] == true, deviceIdentity: device['identity'] as String? ?? '', deviceName: device['name'] as String? ?? '', deviceCode: device['code'] as String? ?? '', period: json['period'] as String? ?? 'month', periodStart: DateTime.parse(json['period_start'] as String), periodEnd: DateTime.parse(json['period_end'] as String), unit: json['unit'] as String? ?? 'kg', points: (json['points'] as List? ?? const []) .map((item) => UsagePoint.fromJson(item as Map)) .toList(), totalUsage: (json['total_usage'] as num? ?? 0).toDouble(), averageUsage: (json['average_usage'] as num? ?? 0).toDouble(), composition: UsageComposition.fromJson(composition), source: json['source'] as String? ?? '', calcVersion: json['calc_version'] as String? ?? '', updatedAt: DateTime.tryParse(json['updated_at']?.toString() ?? '')?.toLocal(), unavailableReason: json['unavailable_reason'] as String? ?? '', ); } }