import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:o2oa_all_platform/pages/home/apps/index.dart'; import '../models/index.dart'; import '../services/index.dart'; import '../utils/index.dart'; import '../widgets/index.dart'; import 'x_attendance_assemble_control.dart'; /// ///中心服务 /// class ProgramCenterService extends GetxService { static ProgramCenterService get to => Get.find(); // 内存中放置 后续使用 AppStyle? _appStyle; AppStyle? get appStyle { if (_appStyle == null) { String style = SharedPreferenceService.to .getString(SharedPreferenceService.appStyleSpKey); OLogger.d("当前服务器的appStyle: $style"); if (style.isNotEmpty) { _appStyle = AppStyle.fromJson(O2Utils.parseStringToJson(style)); } } return _appStyle; } String baseUrl() { var centerUrl = O2ApiManager.instance.getCenterBaseUrl(); if (centerUrl == null || centerUrl.isEmpty) { return ''; } return centerUrl; } /// 执行脚本 /// [scriptName] 脚本名称 /// [body] 传入参数 Future executeScript(String scriptName, Map body) async { try { ApiResponse response = await O2HttpClient.instance.post('${baseUrl()}jaxrs/invoke/$scriptName/execute', body); if (response.isSuccess()) { final value = ScriptExecuteResponse.fromJson(response.data); return value.value; } } catch (err, stackTrace) { OLogger.e('执行脚本失败', err, stackTrace); } return null; } /// 连接O2OA center服务器 Future loadCenterServerOnline() async { var unit = O2ApiManager.instance.o2CloudServer; if (unit == null) { return false; } if (baseUrl().isEmpty) { return false; } try { var url = "${baseUrl()}jaxrs/distribute/webserver/assemble/source/${unit.centerHost}"; ApiResponse response = await O2HttpClient.instance.get(url, needToken: false); if (response.data == null) { return false; } var dataJson = json.encode(response.data); OLogger.i("获取到服务器信息完成, $dataJson"); await O2ApiManager.instance.putCenterServerJson2SP(dataJson); return true; } catch (err, stackTrace) { OLogger.e('连接服务器失败', err, stackTrace); return false; } } /// /// 在线获取移动app相关的配置 /// Future loadCurrentStyle() async { try { ApiResponse response = await O2HttpClient.instance .get('${baseUrl()}jaxrs/appstyle/current/style', needToken: false); if (response.isSuccess()) { AppStyle appStyle = AppStyle.fromJson(response.data); _appStyle = appStyle; final needGrey = SharedPreferenceService.to.getBool(SharedPreferenceService.appStyleNeedGreyKey, defaultValue: false); final newNeedGrey = appStyle.needGray ?? false; if (needGrey != newNeedGrey) { OLogger.d('全局黑白的变化 ............'); await SharedPreferenceService.to.putBool(SharedPreferenceService.appStyleNeedGreyKey, newNeedGrey); EventBus().emit(EventBus.greyColorChangeGlobalMsg); // 发送通知 重建 ui } _storeAppStyle2SP(appStyle); OLogger.d("请求完成,获取到appstyle!"); return appStyle; } } catch (err, stackTrace) { OLogger.e('获取appStyle失败', err, stackTrace); } return null; } /// /// 把appStyle对象存储存储到sp /// Future _storeAppStyle2SP(AppStyle appStyle) async { String jsonAppStyle = json.encode(appStyle.toJson()); await SharedPreferenceService.to .putString(SharedPreferenceService.appStyleSpKey, jsonAppStyle); } /// /// 原生应用列表 /// List getCurrentNativeAppList() { var list = appStyle?.nativeAppList ?? []; List ret = list .map((e) { O2NativeAppEnum? appEnum = _getO2NativeWithKey(e.key); if (appEnum == null) { return null; } if (e.enable == false) { return null; } AppFrontData data = AppFrontData( name: appEnum.name, displayName: e.displayName, key: appEnum.key, type: O2AppTypeEnum.native, nativeEnum: appEnum); return data; }) .where((element) => element != null) .toList(); // && !AttendanceAssembleControlService.to.isV2() 暂时显示旧版打卡 后面版本将隐藏旧打卡 if (ret.firstWhereOrNull((element) => element != null && element.key == O2NativeAppEnum.attendance.key) != null && !AttendanceAssembleControlService.to.closeOldAttendance()) { ret.add(AppFrontData( name: O2NativeAppEnum.attendanceOld.name, key: O2NativeAppEnum.attendanceOld.key, type: O2AppTypeEnum.native, nativeEnum: O2NativeAppEnum.attendanceOld)); } return ret; } /// /// 门户应用 /// List getCurrentPortalAppList() { var list = appStyle?.portalList ?? []; return list .map((e) { String? portalId = e.id; String? name = e.name; if (portalId == null || name == null) { return null; } AppFrontData data = AppFrontData( name: name, key: portalId, type: O2AppTypeEnum.portal, portalId: portalId); return data; }) .where((element) => element != null) .toList(); } O2NativeAppEnum? _getO2NativeWithKey(String? key) { if (key == null) { return null; } switch (key) { case "task": return O2NativeAppEnum.task; case "taskcompleted": return O2NativeAppEnum.taskcompleted; case "read": return O2NativeAppEnum.read; case "readcompleted": return O2NativeAppEnum.readcompleted; case "bbs": return O2NativeAppEnum.bbs; case "calendar": return O2NativeAppEnum.calendar; case "cms": return O2NativeAppEnum.cms; case "meeting": return O2NativeAppEnum.meeting; case "mindMap": return O2NativeAppEnum.mindMap; case "attendance": return O2NativeAppEnum.attendance; case "yunpan": return O2NativeAppEnum.yunpan; default: return null; } } /// /// 是否显示系统消息 /// bool isShowSystemMessage() { if (appStyle != null) { return appStyle?.systemMessageSwitch ?? true; } return true; } /// /// 简易模式 /// bool isSimpleMode() { if (appStyle != null) { return appStyle?.simpleMode ?? false; } return false; } /// 推广页invoke脚本 String promotionPageScript() { if (appStyle != null) { return appStyle?.promotionPageScript ?? ''; } return ''; } /// 语音助手invoke脚本 String speechScript() { if (appStyle != null) { return appStyle?.speechScript ?? ''; } return ''; } /// 扩展参数 Map extendParam() { if (appStyle != null) { return appStyle?.extendParam ?? {}; } return {}; } /// 首页tab 门户 扩展参数 ExtendParamHomeTabPortal? getExtendParamHomeTabPortal(String key) { final p = extendParam(); if (p[key] != null) { return ExtendParamHomeTabPortal.fromJson(p[key]); } return null; } /// 首页居中,如果居中页面个数就固定了 5 个。appIndexPages无效了 bool isIndexCentered() { if (appStyle != null) { return appStyle?.indexCentered ?? false; } return false; } /// 首页信息中心 过滤条件 List indexFilterCmsCategoryList () { return appStyle?.cmsCategoryFilterList ?? []; } /// 首页办公中心 过滤条件 List indexFilterProcessList () { return appStyle?.processFilterList ?? []; } /// 首页页面列表 List appIndexPages() { return appStyle?.appIndexPages ?? []; } /// /// 首页是显示门户还是默认的 /// String? homeIndexPage() { if (appStyle != null && appStyle?.indexType == 'portal' && appStyle?.indexPortal?.isNotEmpty == true) { return appStyle!.indexPortal!; } return null; } ///启动 logo图 Widget aboutLogoImageView() { return _commonAppImageView('launch_logo', 48, 48, 'icon_settings_about.png'); } ///启动 logo图 Widget launchLogoImageView() { return _commonAppImageView('launch_logo', 128, 128, 'icon_settings_about.png'); } /// ///首页底部Home focus 图 Widget homeFocusImageView() { return _commonAppImageView('index_bottom_menu_logo_focus', 48, 48, 'index_bottom_bar_selected.png'); } /// ///首页底部Home blur 图 Widget homeBlurImageView() { return _commonAppImageView('index_bottom_menu_logo_blur', 48, 48, 'index_bottom_bar_unselected.png'); } ///登录页头像 图 Widget loginAvatarImageView() { return _commonAppImageView('login_avatar', 76, 76, 'login_avatar.png'); } /// 应用页面 图片 375 Widget appPageImageView() { return _commonAppImageView('application_top', 375, 195, 'application_top.png'); } ///流程图标 图 // Uint8List? getProcessDefaultImage() { // return _getServerBase64Image('process_default'); // } ///关于 图 Widget setupAboutImageView() { return _commonAppImageView('setup_about_logo', 22, 22, 'icon_settings_about.png'); } Widget _commonAppImageView(String keyName, double width, double height, String defaultAssetImage) { if (appStyle != null && appStyle!.images != null) { final element = appStyle?.images?.firstWhere((e) => e.name == keyName); if (element != null) { final webUrl = O2ApiManager.instance.webBaseUrl(); if (element.path?.isNotEmpty == true && webUrl?.isNotEmpty == true) { final url = '$webUrl/${element.path!}'; return Image.network( url, width: width, height: height, fit: BoxFit.fill, ); } else if (element.value?.isNotEmpty == true) { return Image.memory( base64Decode(element.value!), width: width, height: height, fit: BoxFit.fill, ); } } } return AssetsImageView( defaultAssetImage, width: width, height: height, fit: BoxFit.fill, ); } }