diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java index 304be03c..7373a4ae 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java @@ -1314,48 +1314,51 @@ public class DeviceServiceImpl implements DeviceService /** * 监控设备信息,并对设备进行校准 + * FIXME 存在问题:数据量大时,处理较慢,会造成数据不一致,导致频繁关闭设备 + * 应该考虑实时获取设备数据,采用同步方式进行校准 + * 或者考虑有针对性的对设备进行校准 */ @Override public void monitor(List deviceIds) { - DeviceQuery query = new DeviceQuery(); - query.setDeviceIds(deviceIds); - List deviceList = this.selectSmDeviceList(query); - if (CollectionUtils.isEmptyElement(deviceList)) { - return; - } - this.pullDeviceInfoList(deviceList, IotConstants.ONLINE_TYPE_GET); - - for (DeviceVO device : deviceList) { - try { - scheduledExecutorService.schedule(() -> { - // 若物联网设备的时长或者电量小于当前设备数据库的值,则执行一次同步(开启) - // 一般情况下,物联网设备的值会大于或等于当前数据库的值 - long deviceSeconds = device.getRemainTime() == null ? 0 : device.getRemainTime().longValue(); - if (device.getSurplusSecondsDb() > deviceSeconds) { - this.syncTime(device.getDeviceId(), LocalDateTime.now(), "设备监控-同步时长"); - } - if (device.getSurplusEleDb().compareTo(device.getSurplusEle()) > 0) { - this.syncEle(device.getDeviceId(), "设备监控-同步电量"); - } - - // 若当前设备数据库的时长并且电量<=0,且在这之后用户没有发open命令,则执行一次同步(关闭) - boolean hasOpen = DeviceUserOperaType.OPEN.getType().equals(device.getUserOperaType()); // 是否开启过 - LocalDateTime lastOperaTime = device.getUserOperaTime(); // 上次开启的时间 - BigDecimal lastOperaEle = device.getUserOperaEle(); // 上次开启的总用电量 - - boolean hasOpenAfterExpireTime = hasOpen && lastOperaTime != null && lastOperaTime.isAfter(device.getExpireTime()); // 是否在时间结束后开启 - boolean hasTime = device.getSurplusSecondsDb() > 0; // 剩余时间 - boolean hasOpenAfterExpireEle = hasOpen && lastOperaEle != null && lastOperaEle.compareTo(device.getExpireEle()) > 0; // 是否在结束电量后开启 - boolean hasEle = device.getSurplusEleDb().compareTo(BigDecimal.ZERO) > 0; // 剩余电量 - if (!hasTime && !hasEle && !hasOpenAfterExpireTime && !hasOpenAfterExpireEle) { - this.switchDevice(device, DevicePowerStatus.OFF, "设备监控-发现异常未关闭设备"); - } - },0, TimeUnit.SECONDS); - - } catch (Exception e) { - log.error("监控设备{}出错:{}", device.getDeviceNo(), e.getMessage()); - } - } +// DeviceQuery query = new DeviceQuery(); +// query.setDeviceIds(deviceIds); +// List deviceList = this.selectSmDeviceList(query); +// if (CollectionUtils.isEmptyElement(deviceList)) { +// return; +// } +// this.pullDeviceInfoList(deviceList, IotConstants.ONLINE_TYPE_GET); +// +// for (DeviceVO device : deviceList) { +// try { +// scheduledExecutorService.schedule(() -> { +// // 若物联网设备的时长或者电量小于当前设备数据库的值,则执行一次同步(开启) +// // 一般情况下,物联网设备的值会大于或等于当前数据库的值 +// long deviceSeconds = device.getRemainTime() == null ? 0 : device.getRemainTime().longValue(); +// if (device.getSurplusSecondsDb() > deviceSeconds) { +// this.syncTime(device.getDeviceId(), LocalDateTime.now(), "设备监控-同步时长"); +// } +// if (device.getSurplusEleDb().compareTo(device.getSurplusEle()) > 0) { +// this.syncEle(device.getDeviceId(), "设备监控-同步电量"); +// } +// +// // 若当前设备数据库的时长并且电量<=0,且在这之后用户没有发open命令,则执行一次同步(关闭) +// boolean hasOpen = DeviceUserOperaType.OPEN.getType().equals(device.getUserOperaType()); // 是否开启过 +// LocalDateTime lastOperaTime = device.getUserOperaTime(); // 上次开启的时间 +// BigDecimal lastOperaEle = device.getUserOperaEle(); // 上次开启的总用电量 +// +// boolean hasOpenAfterExpireTime = hasOpen && lastOperaTime != null && lastOperaTime.isAfter(device.getExpireTime()); // 是否在时间结束后开启 +// boolean hasTime = device.getSurplusSecondsDb() > 0; // 剩余时间 +// boolean hasOpenAfterExpireEle = hasOpen && lastOperaEle != null && lastOperaEle.compareTo(device.getExpireEle()) > 0; // 是否在结束电量后开启 +// boolean hasEle = device.getSurplusEleDb().compareTo(BigDecimal.ZERO) > 0; // 剩余电量 +// if (!hasTime && !hasEle && !hasOpenAfterExpireTime && !hasOpenAfterExpireEle) { +// this.switchDevice(device, DevicePowerStatus.OFF, "设备监控-发现异常未关闭设备"); +// } +// },0, TimeUnit.SECONDS); +// +// } catch (Exception e) { +// log.error("监控设备{}出错:{}", device.getDeviceNo(), e.getMessage()); +// } +// } } /** diff --git a/smart-switch-web/src/main/resources/application-druid-test.yml b/smart-switch-web/src/main/resources/application-druid-test.yml deleted file mode 100644 index 17a9fbb4..00000000 --- a/smart-switch-web/src/main/resources/application-druid-test.yml +++ /dev/null @@ -1,61 +0,0 @@ -# 数据源配置 -spring: - datasource: - type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - druid: - # 主库数据源 - master: - url: jdbc:mysql://106.75.233.135:3306/smart-switch-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: root - password: 9671e015b05b3f11 - # 从库数据源 - slave: - # 从数据源开关/默认关闭 - enabled: false - url: - username: - password: - # 初始连接数 - initialSize: 5 - # 最小连接池数量 - minIdle: 10 - # 最大连接池数量 - maxActive: 20 - # 配置获取连接等待超时的时间 - maxWait: 60000 - # 配置连接超时时间 - connectTimeout: 30000 - # 配置网络超时时间 - socketTimeout: 60000 - # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - timeBetweenEvictionRunsMillis: 60000 - # 配置一个连接在池中最小生存的时间,单位是毫秒 - minEvictableIdleTimeMillis: 300000 - # 配置一个连接在池中最大生存的时间,单位是毫秒 - maxEvictableIdleTimeMillis: 900000 - # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - webStatFilter: - enabled: true - statViewServlet: - enabled: true - # 设置白名单,不填则允许所有访问 - allow: - url-pattern: /druid/* - # 控制台管理用户名和密码 - login-username: ruoyi - login-password: 123456 - filter: - stat: - enabled: true - # 慢SQL记录 - log-slow-sql: true - slow-sql-millis: 1000 - merge-sql: true - wall: - config: - multi-statement-allow: true