140 lines
4.4 KiB
Dart
140 lines
4.4 KiB
Dart
import 'package:shared_preferences/shared_preferences.dart';
|
||
|
||
/// 门店扩展字段本地持久化(SharedPreferences 封装)。
|
||
///
|
||
/// 用于「前端先占位」阶段:主题、品牌(启动图/Logo)、省市区归属等
|
||
/// 全部只写本地缓存,不发起真实请求。key 以 `orgId` 隔离,切换组织后互不影响。
|
||
///
|
||
/// TODO(后端): 上述字段后续由 [OrgService.setStoreTheme] /
|
||
/// [OrgService.setStoreBranding] 对接 POST /sys/store/* 覆盖,本地缓存可作为离线兜底。
|
||
class StoreLocalCache {
|
||
StoreLocalCache._();
|
||
|
||
/// 全局单例。
|
||
static final StoreLocalCache instance = StoreLocalCache._();
|
||
|
||
SharedPreferences? _prefs;
|
||
|
||
/// 懒初始化 SharedPreferences(仅在首次访问时调用)。
|
||
Future<SharedPreferences> get _instance async =>
|
||
_prefs ??= await SharedPreferences.getInstance();
|
||
|
||
/// 外部预初始化(在 [main] 中 await,使同步读取可用)。
|
||
Future<void> initialize() async {
|
||
_prefs ??= await SharedPreferences.getInstance();
|
||
}
|
||
|
||
/// 主题 key:`store_theme_$orgId`。
|
||
String _themeKey(String orgId) => 'store_theme_$orgId';
|
||
|
||
/// 品牌 key:`store_branding_$orgId`。
|
||
String _brandingKey(String orgId) => 'store_branding_$orgId';
|
||
|
||
/// 省市区归属 key:`store_region_$orgId`。
|
||
String _regionKey(String orgId) => 'store_region_$orgId';
|
||
|
||
/// 设备绑定关系 key:`device_binding_$deviceId`。
|
||
String _bindingKey(String deviceId) => 'device_binding_$deviceId';
|
||
|
||
/// 保存门店主题。
|
||
Future<void> saveTheme(String orgId, String themeId) async {
|
||
final prefs = await _instance;
|
||
await prefs.setString(_themeKey(orgId), themeId);
|
||
}
|
||
|
||
/// 读取门店主题 id;未设置返回 null。
|
||
Future<String?> getTheme(String orgId) async {
|
||
final prefs = await _instance;
|
||
return prefs.getString(_themeKey(orgId));
|
||
}
|
||
|
||
/// 保存门店品牌(启动图 + Logo 本地路径或远程 URL)。
|
||
Future<void> saveBranding(
|
||
String orgId,
|
||
String splashUrl,
|
||
String logoUrl,
|
||
) async {
|
||
final prefs = await _instance;
|
||
await prefs.setStringList(
|
||
_brandingKey(orgId),
|
||
[splashUrl, logoUrl],
|
||
);
|
||
}
|
||
|
||
/// 读取门店品牌;返回 `[splashUrl, logoUrl]`,未设置时元素为空字符串。
|
||
Future<List<String>> getBranding(String orgId) async {
|
||
final prefs = await _instance;
|
||
final raw = prefs.getStringList(_brandingKey(orgId));
|
||
if (raw == null || raw.length < 2) {
|
||
return const ['', ''];
|
||
}
|
||
return raw;
|
||
}
|
||
|
||
/// 保存门店省市区归属与街道详情。
|
||
Future<void> saveRegion(
|
||
String orgId,
|
||
String provinceCode,
|
||
String cityCode,
|
||
String districtCode,
|
||
String addressDetail,
|
||
) async {
|
||
final prefs = await _instance;
|
||
await prefs.setStringList(
|
||
_regionKey(orgId),
|
||
[provinceCode, cityCode, districtCode, addressDetail],
|
||
);
|
||
}
|
||
|
||
/// 读取门店省市区归属;返回 `[provinceCode, cityCode, districtCode, addressDetail]`
|
||
/// 未设置时元素为空字符串。
|
||
Future<List<String>> getRegion(String orgId) async {
|
||
final prefs = await _instance;
|
||
final raw = prefs.getStringList(_regionKey(orgId));
|
||
if (raw == null || raw.length < 4) {
|
||
return const ['', '', '', ''];
|
||
}
|
||
return raw;
|
||
}
|
||
|
||
/// 保存设备绑定关系(扫码绑定占位)。
|
||
Future<void> saveDeviceBinding(
|
||
String deviceId,
|
||
String storeId,
|
||
String storeName,
|
||
String? groupId,
|
||
) async {
|
||
final prefs = await _instance;
|
||
await prefs.setStringList(
|
||
_bindingKey(deviceId),
|
||
[storeId, storeName, groupId ?? ''],
|
||
);
|
||
}
|
||
|
||
/// 读取设备绑定关系;返回 `[storeId, storeName, groupId]`,
|
||
/// 未设置时元素为空字符串。
|
||
Future<List<String>> getDeviceBinding(String deviceId) async {
|
||
final prefs = await _instance;
|
||
final raw = prefs.getStringList(_bindingKey(deviceId));
|
||
if (raw == null || raw.length < 3) {
|
||
return const ['', '', ''];
|
||
}
|
||
return raw;
|
||
}
|
||
|
||
// ================ 通用 String 存取(用于语言、主题等非门店隔离配置) ================
|
||
|
||
/// 保存字符串。
|
||
Future<void> setString(String key, String value) async {
|
||
final prefs = await _instance;
|
||
await prefs.setString(key, value);
|
||
}
|
||
|
||
/// 读取字符串;不存在返回 null。
|
||
String? getString(String key) {
|
||
final prefs = _prefs;
|
||
if (prefs == null) return null;
|
||
return prefs.getString(key);
|
||
}
|
||
}
|