import 'dart:async'; import 'package:common_utils/common_utils.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:forui/forui.dart'; import 'package:get/get.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; class SettingController extends GetxController { static const String _tag = "设置 Controller"; final appC = Get.find(); Rx sysSetting = Rx(null); Rx userSetting = Rx(null); // 全局文字大小 var globalFontSizeC = FRadioSelectGroupController( value: SettingGlobalFontSize.xl3.code, ); // 付款方式 var globalPayTableC = FMultiSelectGroupController( values: {}, ); // 默认付款方式 var defaultGlobalPayTableC = FRadioSelectGroupController(); _initData() { update(["setting"]); } RxList menuList = [ SettingMenu( prefixIcon: FAssets.icons.bookCopy, title: "基本信息", type: SettingMenuType.baseInfo, ), SettingMenu( prefixIcon: FAssets.icons.databaseBackup, title: "资源备份", type: SettingMenuType.backup, ), SettingMenu( prefixIcon: FAssets.icons.refreshCw, title: "同步设置", type: SettingMenuType.syncSetting, ), SettingMenu( prefixIcon: FAssets.icons.japaneseYen, title: "支付设置", type: SettingMenuType.paySetting, ), SettingMenu( prefixIcon: FAssets.icons.scanFace, title: "人脸管理", type: SettingMenuType.faceSetting, ), SettingMenu( prefixIcon: FAssets.icons.shoppingCart, title: "商品管理", type: SettingMenuType.productSetting, ), ].obs; Rx cuurentMenuType = SettingMenuType.baseInfo.obs; late StreamSubscription mqUpdateListen; @override void onInit() async { super.onInit(); await getSetting(); globalFontSizeC.addValueListener((v) { final fontSizeType = SettingGlobalFontSize.values.fromCode( v.first, ); if (fontSizeType == null) return; final appTheme = Get.find(); appTheme.setSizeScalar(fontSizeType); }); globalPayTableC.addValueListener((v) async { List usePayList = []; for (final i in v) { final payType = OrderPayDisplayType.values.fromCode( i, ); if (payType == null) continue; usePayList.add(payType); } usePayList.sort((pren, next) => pren.code.compareTo(next.code)); sysSetting.value?.usePayDisplayType = usePayList; await AppSettingTool.setSysSetting(sysSetting.value!); }); defaultGlobalPayTableC.addValueListener((v) async { final payType = OrderPayDisplayType.values.fromCode( v.first, ); if (payType == null) return; sysSetting.value?.defaultPayDisplayType = payType; await AppSettingTool.setSysSetting(sysSetting.value!); }); mqUpdateListen = appC.mqUpdateEventBus.on().listen( (event) async { if (event == MqtActionEnum.CONFIG) { sysSetting.value = await AppSettingTool.getSysSetting(); } }, ); } @override void onReady() { super.onReady(); _initData(); } @override void onClose() { super.onClose(); globalFontSizeC.dispose(); globalPayTableC.dispose(); defaultGlobalPayTableC.dispose(); mqUpdateListen.cancel(); } void doMenu(SettingMenu v) { if (v.type == cuurentMenuType.value) { return; } cuurentMenuType.value = v.type; menuList.refresh(); } // 同步设置 void syncConfig() async { final isNetwork = AppNetworkTool.isAutoNetworkMsg(); if (!isNetwork) return; EasyLoading.show( status: '同步中...', maskType: EasyLoadingMaskType.black, ); try { final setting = await SyncConfigTool.autoSyncSysInfo(); if (setting != null) sysSetting.value = setting; Toast.success(msg: "同步设备信息成功"); EasyLoading.dismiss(); } catch (e, stack) { Toast.error(msg: "同步设备信息错误"); logger.e("|$_tag|同步设备信息error:|$e|stack:|$stack|"); EasyLoading.dismiss(); } } // 重新连接长链接 void syncMq() async { final isNetwork = AppNetworkTool.isAutoNetworkMsg(); if (!isNetwork) return; EasyLoading.show( status: '同步中...', maskType: EasyLoadingMaskType.black, ); try { await AppMqTool.mqRefresh(); Toast.success(msg: "同步长连接成功"); EasyLoading.dismiss(); } catch (e, stack) { Toast.error(msg: "同步长连接错误"); logger.e("|$_tag|同步长连接error:|$e|stack:|$stack|"); EasyLoading.dismiss(); } } // 同步分类 void syncClassify() async { final isNetwork = AppNetworkTool.isAutoNetworkMsg(); if (!isNetwork) return; EasyLoading.show( status: '同步中...', maskType: EasyLoadingMaskType.black, ); try { await SyncProductTool.syncClassify(); Toast.success(msg: "同步分类成功"); EasyLoading.dismiss(); } catch (e, stack) { Toast.error(msg: "同步分类错误"); logger.e("|$_tag|同步分类error:|$e|stack:|$stack|"); EasyLoading.dismiss(); } } // 同步商品 void syncProduct() async { final isNetwork = AppNetworkTool.isAutoNetworkMsg(); if (!isNetwork) return; EasyLoading.show( status: '同步中...', maskType: EasyLoadingMaskType.black, ); try { await SyncProductTool.syncProduct(); EasyLoading.dismiss(); Toast.success(msg: "同步商品成功"); EasyLoading.dismiss(); } catch (e, stack) { Toast.error(msg: "同步商品错误"); logger.e("|$_tag|同步商品error:|$e|stack:|$stack|"); EasyLoading.dismiss(); } } // 同步离线订单 void syncOfflineOrder() async { final isNetwork = AppNetworkTool.isAutoNetworkMsg(); if (!isNetwork) return; EasyLoading.show( status: '同步中...', maskType: EasyLoadingMaskType.black, ); try { await SyncOrderTool.syncOfflineOrder(); Toast.success(msg: "同步离线订单成功"); EasyLoading.dismiss(); } catch (e) { Toast.error(msg: "同步离线订单错误"); logger.e("|$_tag|同步离线订单error:|$e|"); EasyLoading.dismiss(); } } // 备份sql void backupsSql() async { EasyLoading.show( status: '备份中...', maskType: EasyLoadingMaskType.black, ); try { final bool = await AppFileTool.backupSqlFile(); if (!bool) throw Error(); EasyLoading.dismiss(); Toast.success(msg: "备份中sql成功"); EasyLoading.dismiss(); } catch (e) { Toast.error(msg: "备份中sql失败"); logger.e("|$_tag|备份中sqlerror:|$e|"); EasyLoading.dismiss(); } } // 备份日志 void backupsLog() async { Toast.success(msg: "当前日志为实时备份"); } // sql恢复 Future recoverSql() async { EasyLoading.show( status: '恢复中...', maskType: EasyLoadingMaskType.black, ); try { await AppFileTool.useLastBackDatabase(); EasyLoading.dismiss(); Toast.success(msg: "sql恢复成功"); EasyLoading.dismiss(); } catch (e) { Toast.error(msg: "sql恢复失败"); logger.e("|$_tag|sql恢复失败error:|$e|"); EasyLoading.dismiss(); } } Future getSetting() async { sysSetting.value = await AppSettingTool.getSysSetting(); if (sysSetting.value!.globalFontSize != null) { globalFontSizeC.value = {sysSetting.value!.globalFontSize!.code}; } if (!ObjectUtil.isEmptyList(sysSetting.value!.usePayDisplayType)) { globalPayTableC.value = sysSetting.value!.usePayDisplayType!.map((v) => v.code).toSet(); } if (sysSetting.value!.defaultPayDisplayType != null) { defaultGlobalPayTableC.value = { sysSetting.value!.defaultPayDisplayType!.code }; } } Future checkIsBind() async { final sysSetting = await AppSettingTool.getSysSetting(); final id = sysSetting.serviceMerchantId; if (ObjectUtil.isEmpty(id)) { return false; } return true; } }