import 'dart:async'; import 'package:mqtt_client/mqtt_client.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; class SyncCheckTool { static const _tag = "自动检查任务"; SyncCheckTool._privateConstructor(); static final SyncCheckTool _instance = SyncCheckTool._privateConstructor(); static SyncCheckTool get instance => _instance; bool _isRunning = false; // ************************************************************************** // 定时器配置 start // ************************************************************************** Duration mqInterval = const Duration(seconds: 60); Duration printInterval = const Duration(seconds: 60 * 10); Duration broadcastInterval = const Duration(seconds: 60 * 2); Duration deviceStatusInterval = const Duration(seconds: 60); Timer? mqTimer; Timer? printTimer; Timer? broadcastTimer; Timer? deviceStatusTimer; // ************************************************************************** // 定时器配置 end // ************************************************************************** void startAll() { if (_isRunning) return; _isRunning = true; checkMq(); checkPrint(); checkBroadcast(); checkDeviceStatus(); } void dispose() { _isRunning = false; mqTimer?.cancel(); mqTimer = null; printTimer?.cancel(); printTimer = null; broadcastTimer?.cancel(); broadcastTimer = null; deviceStatusTimer?.cancel(); deviceStatusTimer = null; } // 检查mq是否可以连接,是否需要重新连接 checkMq() { String logMsg = "检查mq是否可以连接,是否需要重新连接"; final inSeconds = mqInterval.inSeconds; if (mqTimer != null && mqTimer!.isActive) { mqTimer?.cancel(); mqTimer = null; } if (mqTimer != null) { mqTimer?.cancel(); mqTimer = null; } mqTimer = Timer.periodic(mqInterval, (Timer timer) async { final isNetwork = AppNetworkTool.isAutoNetwork(); if (!isNetwork) return; logger.i("|$_tag|$logMsg,$inSeconds秒一次,开始执行"); if (MqManager.state == MqttConnectionState.connected) return; try { AppMqTool.mqRefresh(); } catch (e) { logger.i("|$_tag|$logMsg,$inSeconds秒一次,执行失败,error:$e"); } finally { logger.i("|$_tag|$logMsg,$inSeconds秒一次,执行完成"); } }); } // 定时检查需不要打印 checkPrint() { String logMsg = "定时检查需不要打印"; final inSeconds = printInterval.inSeconds; if (printTimer != null && printTimer!.isActive) { printTimer?.cancel(); printTimer = null; } if (printTimer != null) { printTimer?.cancel(); printTimer = null; } printTimer = Timer.periodic(printInterval, (Timer timer) async { final isNetwork = AppNetworkTool.isAutoNetwork(); if (!isNetwork) return; logger.i("|$_tag|$logMsg,$inSeconds秒一次,开始执行"); try { await SyncPrintTool.doCheckPrint(); await SyncPrintTool.doCheckSync(); } catch (e) { logger.i("|$_tag|$logMsg,$inSeconds秒一次,执行失败,error:$e"); } finally { logger.i("|$_tag|$logMsg,$inSeconds秒一次,执行完成"); } }); } // 定时检查需不要广播 checkBroadcast() { String logMsg = "定时检查需不要广播"; final inSeconds = broadcastInterval.inSeconds; if (broadcastTimer != null && broadcastTimer!.isActive) { broadcastTimer?.cancel(); broadcastTimer = null; } if (broadcastTimer != null) { broadcastTimer?.cancel(); broadcastTimer = null; } broadcastTimer = Timer.periodic(broadcastInterval, (Timer timer) async { final isNetwork = AppNetworkTool.isAutoNetwork(); if (!isNetwork) return; logger.i("|$_tag|$logMsg,$inSeconds秒一次,开始执行"); try { final setting = await AppSettingTool.getSysSetting(); await SyncTakeFoodBroadcastTool.doCheckBroadcast( setting.hourType ?? ProductHourType.TOTAL, ); } catch (e) { logger.i("|$_tag|$logMsg,$inSeconds秒一次,执行失败,error:$e"); } finally { logger.i("|$_tag|$logMsg,$inSeconds秒一次,执行完成"); } }); } /// 设备状态检查不依赖网络,也不会主动开关串口或连接打印机。 void checkDeviceStatus() { final inSeconds = deviceStatusInterval.inSeconds; deviceStatusTimer?.cancel(); deviceStatusTimer = Timer.periodic(deviceStatusInterval, (timer) async { logger.i("|$_tag|检查终端设备状态,$inSeconds秒一次,开始执行"); try { await AppDeviceStatusTool.refreshAll(); } catch (e) { logger.i("|$_tag|检查终端设备状态执行失败,error:$e"); } finally { logger.i("|$_tag|检查终端设备状态执行完成"); } }); } }