Files
CloudHome-Ops/lib/models/store_config.dart

60 lines
2.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// 门店配置(到期时间 / 禁用状态等)。
///
/// 对应后端 `GET /device/storeConfig/info/{orgId}`,与 Web 后台「门店配置」弹窗
/// 同源(参考 screen-front `src/api/device.ts` 的 `getStoreConfig`)。
///
/// 重要:组织树 `/sys/org/tree` 与通用门店列表接口(`myStores` / `listByLoginOrg`)
/// 通常**不返回** `expireTime`;移动端门店的到期时间必须由此端点补全,
/// 否则会恒为「无到期时间」。
class StoreConfig {
const StoreConfig({
this.expireTime,
this.mediaVolume,
this.disabled = false,
});
/// 到期时间(null 表示不限/未设置)。
final DateTime? expireTime;
/// 媒体区域音量(0-100,null 表示未设置)。
final int? mediaVolume;
/// 是否禁用(后端用 bool 或 '1'/0)。
final bool disabled;
factory StoreConfig.fromJson(Map<String, dynamic> json) {
final rawDisabled = json['disabled'];
final disabled = rawDisabled == true ||
(rawDisabled is num && rawDisabled != 0) ||
(rawDisabled is String && rawDisabled == '1');
return StoreConfig(
expireTime: _parseDateTime(
json['expireTime'] ?? json['expire_time'] ?? json['expiredTime'],
),
mediaVolume: _parseInt(json['mediaVolume'] ?? json['media_volume']),
disabled: disabled,
);
}
/// 空配置(接口异常/无数据时的占位)。
static StoreConfig empty() => const StoreConfig();
/// 兼容 `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'));
}
/// 兼容 int / num / String 的整数解析(null 安全)。
static int? _parseInt(dynamic value) {
if (value == null) return null;
if (value is int) return value;
final text = value.toString().trim();
if (text.isEmpty) return null;
return int.tryParse(text);
}
}