73 lines
2.2 KiB
Dart
73 lines
2.2 KiB
Dart
|
|
import 'package:dio/dio.dart';
|
||
|
|
|
||
|
|
import '../models/theme_group.dart';
|
||
|
|
import '../models/theme_template.dart';
|
||
|
|
import 'api_client.dart';
|
||
|
|
|
||
|
|
/// 主题模板服务:对接 web 后台 /theme/themetemplate/* 与 /theme/page/* 接口。
|
||
|
|
class ThemeService {
|
||
|
|
ThemeService({Dio? dio}) : _dio = dio ?? ApiClient.instance.dio;
|
||
|
|
|
||
|
|
final Dio _dio;
|
||
|
|
|
||
|
|
/// 获取全部启用的主题模板。
|
||
|
|
///
|
||
|
|
/// GET /theme/themetemplate/all?status=ENABLED
|
||
|
|
Future<List<ThemeTemplate>> getThemeTemplateAll() async {
|
||
|
|
final response = await _dio.get<dynamic>(
|
||
|
|
'/theme/themetemplate/all',
|
||
|
|
queryParameters: const {'status': 'ENABLED'},
|
||
|
|
);
|
||
|
|
final list = _extractList(response.data);
|
||
|
|
return list
|
||
|
|
.whereType<Map<String, dynamic>>()
|
||
|
|
.map(ThemeTemplate.fromJson)
|
||
|
|
.where((t) => t.id.isNotEmpty && t.isEnabled)
|
||
|
|
.toList();
|
||
|
|
}
|
||
|
|
|
||
|
|
/// 查询门店下各设备分组的主题预览列表(界面配置)。
|
||
|
|
///
|
||
|
|
/// GET /theme/page/org/{orgId}/photos
|
||
|
|
Future<List<ThemeGroup>> getStoreThemeGroups(String orgId) async {
|
||
|
|
final response = await _dio.get<dynamic>(
|
||
|
|
'/theme/page/org/$orgId/photos',
|
||
|
|
);
|
||
|
|
final data = response.data;
|
||
|
|
if (data is List) {
|
||
|
|
return data
|
||
|
|
.whereType<Map<String, dynamic>>()
|
||
|
|
.map(ThemeGroup.fromJson)
|
||
|
|
.where((g) => g.groupId > 0)
|
||
|
|
.toList();
|
||
|
|
}
|
||
|
|
if (data is Map<String, dynamic>) {
|
||
|
|
final code = data['code'];
|
||
|
|
final isSuccess = code == null || code == 200 || code == 0;
|
||
|
|
if (!isSuccess) return [];
|
||
|
|
final list = data['data'] ?? data['list'];
|
||
|
|
if (list is List) {
|
||
|
|
return list
|
||
|
|
.whereType<Map<String, dynamic>>()
|
||
|
|
.map(ThemeGroup.fromJson)
|
||
|
|
.where((g) => g.groupId > 0)
|
||
|
|
.toList();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
|
||
|
|
/// 兼容列表响应的三种形态:
|
||
|
|
/// `{list: [...]}` / `{data: [...]}` / 直接数组。
|
||
|
|
static List<dynamic> _extractList(dynamic data) {
|
||
|
|
if (data is List) return data;
|
||
|
|
if (data is Map<String, dynamic>) {
|
||
|
|
final list = data['list'];
|
||
|
|
if (list is List) return list;
|
||
|
|
final innerData = data['data'];
|
||
|
|
if (innerData is List) return innerData;
|
||
|
|
}
|
||
|
|
return const <dynamic>[];
|
||
|
|
}
|
||
|
|
}
|