From 949111d420e4c8eb02271744ef5afb977f2a768d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Wed, 25 Dec 2024 18:00:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/constant/IotConstants.java | 5 + .../java/com/ruoyi/iot/domain/ListData.java | 20 ++ .../iot/domain/response/ListResponse.java | 15 ++ .../com/ruoyi/iot/service/IotService.java | 1 + .../iot/service/impl/IotServiceImpl.java | 139 +++++++----- .../ruoyi/ss/device/domain/vo/DeviceVO.java | 13 +- .../ss/device/service/DeviceService.java | 2 + .../service/impl/DeviceServiceImpl.java | 200 +++++++++++------- .../user/service/impl/UserValidatorImpl.java | 2 +- .../com/ruoyi/task/device/DeviceTask.java | 7 +- .../web/controller/ss/SmDeviceController.java | 1 + 11 files changed, 265 insertions(+), 140 deletions(-) create mode 100644 smart-switch-service/src/main/java/com/ruoyi/iot/domain/ListData.java create mode 100644 smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/ListResponse.java diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java index bb4b212f..14e3827e 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java @@ -44,6 +44,11 @@ public class IotConstants { */ public static final String ADDS_DEVICE_DETAIL = "/device/detail"; + /** + * 设备列表 + */ + public static final String ADDS_DEVICE_LIST = "/device/list"; + /** * 添加设备 */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/ListData.java b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/ListData.java new file mode 100644 index 00000000..05c78ec0 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/ListData.java @@ -0,0 +1,20 @@ +package com.ruoyi.iot.domain; + +import lombok.Data; + +import java.util.List; + +/** + * @author wjh + * 2024/12/25 + */ +@Data +public class ListData { + + Integer limit; + + Integer offset; + + List list; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/ListResponse.java b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/ListResponse.java new file mode 100644 index 00000000..a0421bd1 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/ListResponse.java @@ -0,0 +1,15 @@ +package com.ruoyi.iot.domain.response; + +import com.ruoyi.iot.domain.ListData; +import lombok.Data; + +/** + * @author wjh + * 2024/12/25 + */ +@Data +public class ListResponse extends BaseResponse{ + + private ListData data; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java index 55fcb264..8e395dbc 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java @@ -10,6 +10,7 @@ import com.ruoyi.ss.device.domain.enums.DeviceOnlineStatus; import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * @author wjh diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java index b2ad2efe..1a207ff3 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java @@ -13,18 +13,13 @@ import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.oneNet.Token; import com.ruoyi.iot.domain.*; -import com.ruoyi.iot.domain.response.CommandResponse; -import com.ruoyi.iot.domain.response.CurrentDataPointResponse; -import com.ruoyi.iot.domain.response.DetailResponse; -import com.ruoyi.iot.domain.response.HistoryDataPointResponse; +import com.ruoyi.iot.domain.response.*; import com.ruoyi.iot.enums.IotHttpStatus; import com.ruoyi.iot.interfaces.IotDevice; import com.ruoyi.iot.service.IotConverter; import com.ruoyi.iot.service.IotService; import com.ruoyi.ss.commandLog.service.ICommandLogService; import com.ruoyi.ss.device.domain.enums.DeviceOnlineStatus; -import com.ruoyi.ss.device.service.DeviceService; - import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -33,10 +28,13 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * @author wjh @@ -75,8 +73,6 @@ public class IotServiceImpl implements IotService { @Autowired private ICommandLogService commandLogService; - @Autowired - private DeviceService deviceService; // 查询OneNet设备在线状态 @Override @@ -102,14 +98,14 @@ public class IotServiceImpl implements IotService { if (device == null || StringUtils.isBlank(device.getProductId())) { return status; } - // 优先使用mac1判断 - if (StringUtils.hasText(device.iotMac1())) { - status = this.getOnlineStatus(device.iotMac1(), device.getProductId()); - } - // 若还是离线,则判断mac2是否在线 - if (status == DeviceOnlineStatus.OFFLINE && StringUtils.hasText(device.iotMac2())) { + // 优先使用mac2判断 + if (StringUtils.hasText(device.iotMac2())) { status = this.getOnlineStatus(device.iotMac2(), device.getProductId()); } + // 若还是离线,则判断mac1是否在线 + if (status == DeviceOnlineStatus.OFFLINE && StringUtils.hasText(device.iotMac1())) { + status = this.getOnlineStatus(device.iotMac1(), device.getProductId()); + } return status; } @@ -134,17 +130,17 @@ public class IotServiceImpl implements IotService { return result; } - // 尝试用mac1通电 + // 尝试用mac2通电 try { - result = this.open(device.iotMac1(), device.getProductId(), reason); + result = this.open(device.iotMac2(), device.getProductId(), reason); if (!result) { - log.error("mac1通电失败:{}", device.iotMac1()); - throw new ServiceException("mac1通电失败"); + log.error("mac2通电失败:{}", device.iotMac2()); + throw new ServiceException("mac2通电失败"); } } catch (Exception e) { - log.info("mac1通电失败,尝试用mac2通电"); - if (!StringUtils.isAnyBlank(device.iotMac2(), device.getProductId())) { - result = this.open(device.iotMac2(), device.getProductId(), reason); + log.info("mac2通电失败,尝试用mac1通电"); + if (!StringUtils.isAnyBlank(device.iotMac1(), device.getProductId())) { + result = this.open(device.iotMac1(), device.getProductId(), reason); } else { throw e; } @@ -174,16 +170,16 @@ public class IotServiceImpl implements IotService { return result; } - // 尝试用mac1断电 + // 尝试用mac2断电 try { - result = this.close(device.iotMac1(), device.getProductId(), reason); + result = this.close(device.iotMac2(), device.getProductId(), reason); if (!result) { - throw new ServiceException("mac1断电失败"); + throw new ServiceException("mac2断电失败"); } } catch (Exception e) { - log.info("mac1断电失败:{},尝试用mac2断电", e.getMessage()); - if (!StringUtils.isAnyBlank(device.iotMac2(), device.getProductId())) { - result = this.close(device.iotMac2(), device.getProductId(), reason); + log.info("mac2断电失败:{},尝试用mac1断电", e.getMessage()); + if (!StringUtils.isAnyBlank(device.iotMac1(), device.getProductId())) { + result = this.close(device.iotMac1(), device.getProductId(), reason); } else { throw e; } @@ -218,12 +214,12 @@ public class IotServiceImpl implements IotService { ServiceUtil.assertion(device == null || vxs == null, "设备或参数为空"); CommandResponse res = null; - if (StringUtils.hasText(device.iotMac1())) { - res = this.setVxs(device.iotMac1(), vxs, device.getProductId(), reason); - } - if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac2())) { + if (StringUtils.hasText(device.iotMac2())) { res = this.setVxs(device.iotMac2(), vxs, device.getProductId(), reason); } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = this.setVxs(device.iotMac1(), vxs, device.getProductId(), reason); + } return res; } @@ -232,12 +228,12 @@ public class IotServiceImpl implements IotService { public CommandResponse uploadData(IotDevice device, String reason) { ServiceUtil.assertion(device == null || StringUtils.isBlank(device.getProductId()), "设备为空"); CommandResponse res = null; - if (StringUtils.hasText(device.iotMac1())) { - res = this.uploadData(device.iotMac1(), device.getProductId(), reason); - } - if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac2())) { + if (StringUtils.hasText(device.iotMac2())) { res = this.uploadData(device.iotMac2(), device.getProductId(), reason); } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = this.uploadData(device.iotMac1(), device.getProductId(), reason); + } return res; } @@ -258,6 +254,10 @@ public class IotServiceImpl implements IotService { // 获取当前设备数据点信息 public List getCurrentDataPoint(List deviceNames, String productId) { + deviceNames = deviceNames.stream().filter(StringUtils::hasText).collect(Collectors.toList()); + if (CollectionUtils.isEmptyElement(deviceNames)) { + return Collections.emptyList(); + } String param = "device_name=" + String.join(",", deviceNames) + "&product_id=" + productId; String sendUrl = iotHost+ IotConstants.ADDS_CURRENT_DATAPOINTS + "?" + param; @@ -291,7 +291,6 @@ public class IotServiceImpl implements IotService { String param = "device_name=" + deviceName + "&product_id=" + productId; String token = Token.getToken(); -// log.info("IOT获取到Authorization:【{}】",token); String result = HttpUtils.sendGetWithToken(sendUrl, param, token); if (!StringUtils.hasText(result)) { @@ -307,6 +306,33 @@ public class IotServiceImpl implements IotService { return response.getData(); } + /** + * 获取设备列表 + * + * @param deviceName 设备名称过滤 + * @param productId 产品ID + * @return 设备列表 + */ + private List getDeviceList(String deviceName, String productId) { + String sendUrl = iotHost + IotConstants.ADDS_DEVICE_LIST; + String param = "device_name=" + deviceName + "&product_id=" + productId + "&offset=0&limit=100"; + String token = Token.getToken(); + String res = HttpUtils.sendGetWithToken(sendUrl, param, token); + if (!StringUtils.hasText(res)) { + log.error("与OneNet通信异常"); + return Collections.emptyList(); + } + ListResponse response = JSONObject.parseObject(res, ListResponse.class); + if (!IotHttpStatus.SUCCESS.getCode().equals(response.getCode())) { + log.error("获取当前设备数据点信息出错:{}", response.getMsg()); + return Collections.emptyList(); + } + if (response.getData() == null) { + return Collections.emptyList(); + } + return response.getData().getList(); + } + /** * 设置剩余时长 * @@ -330,12 +356,12 @@ public class IotServiceImpl implements IotService { } CommandResponse res = null; - if (StringUtils.hasText(device.iotMac1())) { - res = this.setTime(device.iotMac1(), seconds, device.getProductId(), reason); - } - if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac2())) { + if (StringUtils.hasText(device.iotMac2())) { res = this.setTime(device.iotMac2(), seconds, device.getProductId(), reason); } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = this.setTime(device.iotMac1(), seconds, device.getProductId(), reason); + } return res; } @@ -354,12 +380,12 @@ public class IotServiceImpl implements IotService { } CommandResponse res = null; - if (StringUtils.hasText(device.iotMac1())) { - res = this.addEle(device.iotMac1(), ele, device.getProductId(), reason); - } - if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac2())) { + if (StringUtils.hasText(device.iotMac2())) { res = this.addEle(device.iotMac2(), ele, device.getProductId(), reason); } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = this.addEle(device.iotMac1(), ele, device.getProductId(), reason); + } return res; } @@ -378,12 +404,12 @@ public class IotServiceImpl implements IotService { } CommandResponse res = null; - if (StringUtils.hasText(device.iotMac1())) { - res = this.setEle(device.iotMac1(), ele, device.getProductId(), reason); - } - if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac2())) { + if (StringUtils.hasText(device.iotMac2())) { res = this.setEle(device.iotMac2(), ele, device.getProductId(), reason); } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = this.setEle(device.iotMac1(), ele, device.getProductId(), reason); + } return res; } @@ -537,12 +563,12 @@ public class IotServiceImpl implements IotService { public CommandResponse setWifi(IotDevice device, String wifiName, String wifiPwd, String reason) { CommandResponse res = null; - if (StringUtils.hasText(device.iotMac1())) { - res = this.setWifi(device.iotMac1(), device.getProductId(), wifiName, wifiPwd, reason); - } - if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac2())) { + if (StringUtils.hasText(device.iotMac2())) { res = this.setWifi(device.iotMac2(), device.getProductId(), wifiName, wifiPwd, reason); } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = this.setWifi(device.iotMac1(), device.getProductId(), wifiName, wifiPwd, reason); + } return res; } @@ -615,9 +641,12 @@ public class IotServiceImpl implements IotService { if (device == null || StringUtils.isBlank(device.getProductId())) { return null; } - CommandResponse res = reboot(device.iotMac1(), device.getProductId(), reason); - if (res == null || !res.isSuccess()) { - return reboot(device.iotMac2(), device.getProductId(), reason); + CommandResponse res = null; + if (StringUtils.hasText(device.iotMac2())) { + res = reboot(device.iotMac2(), device.getProductId(), reason); + } + if ((res == null || !res.isSuccess()) && StringUtils.hasText(device.iotMac1())) { + res = reboot(device.iotMac1(), device.getProductId(), reason); } return res; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java index bded3c20..e830ee42 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java @@ -12,6 +12,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; +import java.time.Duration; +import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; @@ -122,7 +124,7 @@ public class DeviceVO extends Device implements IotDevice { return getModelProductId(); } - // 获取数据库剩余电量 + // 获取数据库剩余电量(度) public BigDecimal getSurplusEleDb() { if (getExpireEle() == null) { return BigDecimal.ZERO; @@ -132,4 +134,13 @@ public class DeviceVO extends Device implements IotDevice { } return getExpireEle().subtract(getTotalElectriQuantity()); } + + // 获取数据库剩余时长(秒) + public long getSurplusSecondsDb() { + if (getExpireTime() == null) { + return 0; + } + Duration between = Duration.between(LocalDateTime.now(), getExpireTime()); + return between.getSeconds(); + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java index c9dca633..50bc0636 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java @@ -434,4 +434,6 @@ public interface DeviceService * 同步电量 */ CommandResponse syncEle(Long deviceId, String reason); + + void monitor(List deviceIds); } 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 37fadaa7..123b4b98 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 @@ -790,16 +790,10 @@ public class DeviceServiceImpl implements DeviceService LocalDateTime now = LocalDateTime.now(); for (DeviceVO device : list) { - if (StringUtils.hasText(device.getMac())) { - String status = iotService.getOnlineStatus(device).getStatus(); -// log.info("device: {} {} online status is {}", device.getDeviceId(), device.getMac(), status); - device.setOnlineStatus(status); - if (DeviceOnlineStatus.ONLINE.getStatus().equals(status)) { - device.setLastOnlineTime(now); - } - } else { - device.setOnlineStatus(DeviceOnlineStatus.OFFLINE.getStatus()); - log.info("device {} mac is empty", device.getDeviceId()); + String status = iotService.getOnlineStatus(device).getStatus(); + device.setOnlineStatus(status); + if (DeviceOnlineStatus.ONLINE.getStatus().equals(status)) { + device.setLastOnlineTime(now); } } int i = deviceMapper.batchUpdateOnlineStatus(list); @@ -937,90 +931,90 @@ public class DeviceServiceImpl implements DeviceService for (Map.Entry> entry : group.entrySet()) { - List iotList = iotService.getDeviceInfo(entry.getValue(), entry.getKey()); + // 批量获取设备信息 + List groupDeviceList = entry.getValue(); + String productId = entry.getKey(); + List iotList = iotService.getDeviceInfo(groupDeviceList, productId); - for (DeviceVO device : list) { - try { - if (StringUtils.isAnyBlank(device.getMac(), device.getModelProductId())) { - continue; - } - // 获取数据点信息 - IotDeviceInfo deviceInfo = iotList.stream() - .filter(item -> Objects.equals(device.getMac(), item.getMac()) || Objects.equals(device.getMac2(), item.getMac())) - .findFirst().orElse(null); + // 构造更新设备信息 + for (DeviceVO device : groupDeviceList) { + // 获取数据点信息 + IotDeviceInfo deviceInfo = iotList.stream() + .filter(item -> Objects.equals(device.getMac(), item.getMac()) || Objects.equals(device.getMac2(), item.getMac())) + .findFirst().orElse(null); - // 更新设备信息 - device.setDeviceId(device.getDeviceId()); - if (deviceInfo != null) { - device.setLastPullTime(deviceInfo.getAt()); - device.setPowerStatus(deviceInfo.getS()); - device.setRemainTime(deviceInfo.getTime()); - device.setRealTimePower(deviceInfo.getP()); - device.setVoltage(deviceInfo.getV()); - device.setElectricity(deviceInfo.getA()); - device.setVersion(deviceInfo.getVersion()); - device.setVxs(deviceInfo.getVxs()); + // 更新设备信息 + device.setDeviceId(device.getDeviceId()); + if (deviceInfo != null) { + device.setLastPullTime(deviceInfo.getAt()); + device.setPowerStatus(deviceInfo.getS()); + device.setRemainTime(deviceInfo.getTime()); + device.setRealTimePower(deviceInfo.getP()); + device.setVoltage(deviceInfo.getV()); + device.setElectricity(deviceInfo.getA()); + device.setVersion(deviceInfo.getVersion()); + device.setVxs(deviceInfo.getVxs()); - // 总用电量 - if (deviceInfo.getW() != null) { - // 若有数据点中的值大于数据库中的值,则更新 - if (deviceInfo.getW().compareTo(device.getTotalElectriQuantity()) >= 0) { - device.setTotalElectriQuantity(deviceInfo.getW()); - } - // 若数据点小于数据库中的值,则发命令恢复物联网设备的总用电量 - else { - scheduledExecutorService.schedule(() -> { - String reason = "拉取设备信息时,恢复总用电量,数据库值:" + device.getTotalElectriQuantity() + ",OneNet值:" + deviceInfo.getW(); - iotService.setTotalEle(device, device.getTotalElectriQuantity().multiply(new BigDecimal(1000)), reason); - }, 0, TimeUnit.SECONDS); - } - } - - // 是否有WIFI - if (ModelTag.hasTag(device.getModelTags(), ModelTag.WIFI)) { - device.setWifi(deviceInfo.getWifi()); - } - - // 是否有电量 - if (ModelTag.hasTag(device.getModelTags(), ModelTag.ELE)) { - device.setSurplusEle(deviceInfo.getM()); - } else { - device.setSurplusEle(BigDecimal.ZERO); - } + // 判断是否支持WIFI,支持则更新 + if (ModelTag.hasTag(device.getModelTags(), ModelTag.WIFI)) { + device.setWifi(deviceInfo.getWifi()); } - // 判断设备是否正在使用 - // 若开关开启,则正在使用 - boolean hasOpen = DevicePowerStatus.ON.getStatus().equals(device.getPowerStatus()); - // 若设备有正在使用中的订单,则正在使用 - boolean hasUsingBill = device.getUsingBillCount() != null && device.getUsingBillCount() > 0; - if (hasOpen || hasUsingBill) { - device.setStatus(DeviceStatus.USING.getStatus()); + // 判断是否支持电量,支持则更新 + if (ModelTag.hasTag(device.getModelTags(), ModelTag.ELE)) { + device.setSurplusEle(deviceInfo.getM()); } else { - device.setStatus(DeviceStatus.NORMAL.getStatus()); + device.setSurplusEle(BigDecimal.ZERO); } - // 是否在线 - String onlineStatus1 = iotService.getOnlineStatus(device.getMac(), device.getProductId(), onlineType).getStatus(); - String onlineStatus2 = iotService.getOnlineStatus(device.getMac2(), device.getProductId(), onlineType).getStatus(); - device.setOnlineStatus1(onlineStatus1); - device.setOnlineStatus2(onlineStatus2); - if (DeviceOnlineStatus.ONLINE.getStatus().equals(onlineStatus1) || DeviceOnlineStatus.ONLINE.getStatus().equals(onlineStatus2)) { - device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); - device.setLastOnlineTime(now); - } else { - device.setOnlineStatus(DeviceOnlineStatus.OFFLINE.getStatus()); + // 总用电量 + if (deviceInfo.getW() != null) { + // 若有数据点中的值大于数据库中的值,则更新 + if (deviceInfo.getW().compareTo(device.getTotalElectriQuantity()) >= 0) { + device.setTotalElectriQuantity(deviceInfo.getW()); + } + // 若数据点小于数据库中的值,则发命令恢复物联网设备的总用电量 + else { + scheduledExecutorService.schedule(() -> { + String reason = "拉取设备信息时,恢复总用电量,数据库值:" + device.getTotalElectriQuantity() + ",OneNet值:" + deviceInfo.getW(); + iotService.setTotalEle(device, device.getTotalElectriQuantity().multiply(new BigDecimal(1000)), reason); + }, 0, TimeUnit.SECONDS); + } } - - // 异步更新 - scheduledExecutorService.schedule(() -> { - this.updateIotInfo(device); - }, 0, TimeUnit.SECONDS); - } catch (Exception e) { - log.error("更新设备信息失败,deviceId:{}, {}", device.getDeviceId(), e.getMessage()); } + + // 判断设备是否正在使用 + // 若开关开启,则正在使用 + boolean hasOpen = DevicePowerStatus.ON.getStatus().equals(device.getPowerStatus()); + // 若设备有正在使用中的订单,则正在使用 + boolean hasUsingBill = device.getUsingBillCount() != null && device.getUsingBillCount() > 0; + if (hasOpen || hasUsingBill) { + device.setStatus(DeviceStatus.USING.getStatus()); + } else { + device.setStatus(DeviceStatus.NORMAL.getStatus()); + } + } } + + // 异步更新设备信息 + for (DeviceVO device : list) { + scheduledExecutorService.schedule(() -> { + // 是否在线 + String onlineStatus1 = iotService.getOnlineStatus(device.getMac(), device.getProductId(), onlineType).getStatus(); + String onlineStatus2 = iotService.getOnlineStatus(device.getMac2(), device.getProductId(), onlineType).getStatus(); + device.setOnlineStatus1(onlineStatus1); + device.setOnlineStatus2(onlineStatus2); + if (DeviceOnlineStatus.ONLINE.getStatus().equals(onlineStatus1) || DeviceOnlineStatus.ONLINE.getStatus().equals(onlineStatus2)) { + device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); + device.setLastOnlineTime(now); + } else { + device.setOnlineStatus(DeviceOnlineStatus.OFFLINE.getStatus()); + } + // 更新数据库 + this.updateIotInfo(device); + }, 0, TimeUnit.SECONDS); + } } /** @@ -1314,6 +1308,48 @@ public class DeviceServiceImpl implements DeviceService return iotService.setEle(device, device.getSurplusEleDb(), reason); } + // 监控设备信息,并对设备进行校准 + @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(), "设备监控-同步电量"); + } + // TODO 若当前设备数据库的时长或者电量<=0,且在这之后用户没有发open命令,则执行一次同步(关闭) + if (device.getSurplusSecondsDb() <= 0) { + // TODO + } + if (device.getSurplusEle().compareTo(device.getSurplusEleDb()) <= 0) { + // TODO + } + },0, TimeUnit.SECONDS); + + } catch (Exception e) { + log.error("监控设备{}出错:{}", device.getDeviceNo(), e.getMessage()); + } + } + + + + } + /** * 设备是否已经被绑定 * diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/UserValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/UserValidatorImpl.java index 09a2a054..870ab9c4 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/UserValidatorImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/UserValidatorImpl.java @@ -107,7 +107,7 @@ public class UserValidatorImpl extends BaseValidator implements UserValidator { query.setEqPhonenumber(mobile); query.setExcludeUserId(userId); int repeatCount = userService.selectCount(query); - ServiceUtil.assertion(repeatCount > 0, "当前手机号已被绑定"); + ServiceUtil.assertion(repeatCount > 0, "当前手机号已被其他用户绑定,请尝试使用其他手机号"); } @Override diff --git a/smart-switch-service/src/main/java/com/ruoyi/task/device/DeviceTask.java b/smart-switch-service/src/main/java/com/ruoyi/task/device/DeviceTask.java index 3bf504a0..9375e1b5 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/task/device/DeviceTask.java +++ b/smart-switch-service/src/main/java/com/ruoyi/task/device/DeviceTask.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component; public class DeviceTask { @Autowired - private DeviceService smDeviceService; + private DeviceService deviceService; @Autowired private ISmMeterReadingRecordService smMeterReadingRecordService; @@ -30,4 +30,9 @@ public class DeviceTask { Thread.sleep(3000); // 睡眠3秒,防止quartz重复调度 } + // 设备监控 + public void monitor() { + deviceService.monitor(null); + } + } diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java index d3294f82..42c26562 100644 --- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java +++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java @@ -53,6 +53,7 @@ public class SmDeviceController extends BaseController { startPage(); List list = deviceService.selectSmDeviceList(smDevice); + deviceService.pullDeviceInfoList(list, IotConstants.ONLINE_TYPE_GET); deviceAssembler.assembleRealServiceRate(list); return getDataTable(list); }