/// TV 应用模型。 /// /// 对应后端 /theme/tvapp/* 接口的 TV 应用实体。 class TvApp { const TvApp({ required this.id, required this.appName, required this.packageName, required this.appCategory, required this.iconUrl, required this.orgId, required this.groupId, required this.status, required this.createTime, }); /// 应用 ID。 final String id; /// 应用名称。 final String appName; /// 包名。 final String packageName; /// 应用分类。 final String appCategory; /// 图标地址。 final String iconUrl; /// 组织 ID。 final String orgId; /// 设备分组 ID。 final String groupId; /// 状态(0=正常 1=禁用)。 final int status; /// 创建时间。 final DateTime? createTime; factory TvApp.fromJson(Map json) { return TvApp( id: json['id']?.toString() ?? '', appName: json['appName']?.toString() ?? '', packageName: json['packageName']?.toString() ?? '', appCategory: json['appCategory']?.toString() ?? '', iconUrl: json['iconUrl']?.toString() ?? '', orgId: json['orgId']?.toString() ?? '', groupId: json['groupId']?.toString() ?? '', status: int.tryParse(json['status']?.toString() ?? '0') ?? 0, createTime: _parseDateTime(json['createTime']), ); } /// 兼容 `yyyy-MM-dd HH:mm:ss` 与 ISO 8601 两种时间格式。 static DateTime? _parseDateTime(dynamic value) { if (value == null) return null; final text = value.toString().trim(); if (text.isEmpty) return null; return DateTime.tryParse(text) ?? DateTime.tryParse(text.replaceFirst(' ', 'T')); } Map toJson() { return { 'id': id, 'appName': appName, 'packageName': packageName, 'appCategory': appCategory, 'iconUrl': iconUrl, 'orgId': orgId, 'groupId': groupId, 'status': status, 'createTime': createTime?.toIso8601String(), }; } }