95 lines
2.6 KiB
Dart
95 lines
2.6 KiB
Dart
|
|
/// 门店分组下的主题页面(对应 web 后台 /theme/page/org/{orgId}/photos)。
|
|||
|
|
class ThemePage {
|
|||
|
|
const ThemePage({
|
|||
|
|
required this.themeId,
|
|||
|
|
required this.name,
|
|||
|
|
this.themePhoto,
|
|||
|
|
this.active = false,
|
|||
|
|
this.orderNo,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
/// 主题 ID(tv_theme.id)。
|
|||
|
|
final int themeId;
|
|||
|
|
|
|||
|
|
/// 主题名称。
|
|||
|
|
final String name;
|
|||
|
|
|
|||
|
|
/// 主题预览图 URL。
|
|||
|
|
final String? themePhoto;
|
|||
|
|
|
|||
|
|
/// 是否为当前分组激活主题。
|
|||
|
|
final bool active;
|
|||
|
|
|
|||
|
|
/// 排序号。
|
|||
|
|
final int? orderNo;
|
|||
|
|
|
|||
|
|
factory ThemePage.fromJson(Map<String, dynamic> json) {
|
|||
|
|
final rawActive = json['active'];
|
|||
|
|
return ThemePage(
|
|||
|
|
themeId: (json['themeId'] ?? json['theme_id'] ?? json['id'] ?? 0) as int,
|
|||
|
|
name: (json['name'] ?? json['themeName'] ?? '')?.toString() ?? '',
|
|||
|
|
themePhoto: (json['themePhoto'] ?? json['theme_photo'])?.toString(),
|
|||
|
|
active: rawActive == true ||
|
|||
|
|
(rawActive is num && rawActive.toInt() == 1) ||
|
|||
|
|
(rawActive is String && rawActive.toLowerCase() == 'true'),
|
|||
|
|
orderNo: (json['orderNo'] ?? json['order_no']) is num
|
|||
|
|
? ((json['orderNo'] ?? json['order_no']) as num).toInt()
|
|||
|
|
: null,
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 门店设备分组及其主题列表(界面配置)。
|
|||
|
|
class ThemeGroup {
|
|||
|
|
const ThemeGroup({
|
|||
|
|
required this.groupId,
|
|||
|
|
required this.groupName,
|
|||
|
|
required this.themes,
|
|||
|
|
this.themeLimit = 6,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
/// 设备分组 ID。
|
|||
|
|
final int groupId;
|
|||
|
|
|
|||
|
|
/// 设备分组名称。
|
|||
|
|
final String groupName;
|
|||
|
|
|
|||
|
|
/// 分组下主题数量上限。
|
|||
|
|
final int themeLimit;
|
|||
|
|
|
|||
|
|
/// 分组下已添加的主题列表。
|
|||
|
|
final List<ThemePage> themes;
|
|||
|
|
|
|||
|
|
factory ThemeGroup.fromJson(Map<String, dynamic> json) {
|
|||
|
|
final themesRaw = json['themes'];
|
|||
|
|
final themes = themesRaw is List
|
|||
|
|
? themesRaw
|
|||
|
|
.whereType<Map<String, dynamic>>()
|
|||
|
|
.map(ThemePage.fromJson)
|
|||
|
|
.where((t) => t.themeId > 0)
|
|||
|
|
.toList()
|
|||
|
|
: <ThemePage>[];
|
|||
|
|
themes.sort((a, b) => (a.orderNo ?? 0).compareTo(b.orderNo ?? 0));
|
|||
|
|
|
|||
|
|
final rawLimit = json['themeLimit'] ?? json['theme_limit'];
|
|||
|
|
final themeLimit = rawLimit is num && rawLimit.toInt() > 0
|
|||
|
|
? rawLimit.toInt()
|
|||
|
|
: 6;
|
|||
|
|
|
|||
|
|
return ThemeGroup(
|
|||
|
|
groupId: (json['groupId'] ?? json['group_id'] ?? 0) as int,
|
|||
|
|
groupName: (json['groupName'] ?? json['group_name'] ?? '')?.toString() ??
|
|||
|
|
'未命名分组',
|
|||
|
|
themeLimit: themeLimit,
|
|||
|
|
themes: themes,
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 当前激活的主题名称(空表示未激活任何主题)。
|
|||
|
|
String? get activeThemeName {
|
|||
|
|
final active = themes.where((t) => t.active).toList();
|
|||
|
|
if (active.isEmpty) return null;
|
|||
|
|
return active.first.name;
|
|||
|
|
}
|
|||
|
|
}
|