From 0a4bcf40a3615eb9babf912e35c716f88c6a9c42 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: Tue, 29 Apr 2025 14:10:53 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E3=80=81=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/bst/device/domain/DeviceQuery.java | 8 +++ .../bst/device/service/DeviceIotService.java | 8 +++ .../bst/device/service/DeviceService.java | 8 +++ .../service/impl/DeviceIotServiceImpl.java | 52 ++++++++++--------- .../service/impl/DeviceServiceImpl.java | 8 ++- .../ruoyi/bst/device/utils/DeviceUtil.java | 4 +- .../order/service/impl/OrderServiceImpl.java | 11 ++-- .../service/impl/IotReceiveServiceImpl.java | 48 ++++++++++++----- .../iot/service/impl/IotServiceImpl.java | 4 +- .../com/ruoyi/task/device/DeviceTask.java | 27 +++++++++- 10 files changed, 127 insertions(+), 51 deletions(-) diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java index d92a5ff..ce846dc 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java @@ -1,8 +1,11 @@ package com.ruoyi.bst.device.domain; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; +import org.springframework.format.annotation.DateTimeFormat; + import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -47,4 +50,9 @@ public class DeviceQuery extends DeviceVO { @ApiModelProperty("关键词") private String keyword; + + @ApiModelProperty("最后上报时间(结束)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastTimeEnd; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java index 5d9850f..531f752 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java @@ -3,6 +3,7 @@ package com.ruoyi.bst.device.service; import java.util.Collections; import java.util.List; +import com.ruoyi.bst.device.domain.Device; import com.ruoyi.bst.device.domain.DeviceVO; import com.ruoyi.bst.device.domain.enums.DeviceUnLockType; import com.ruoyi.bst.device.domain.vo.DeviceIotVO; @@ -138,4 +139,11 @@ public interface DeviceIotService { */ DeviceIotVO setMusic(DeviceVO device, String music, String reason, boolean requiredIot); + /** + * 更新物联网信息 + * @param device + * @return + */ + int updateIot(Device device); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java index 53d6aed..498e543 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceService.java @@ -202,5 +202,13 @@ public interface DeviceService */ public List listSnByMac(List macList); + /** + * 条件更新 + * @param data + * @param query + * @return + */ + public int updateByQuery(Device data, DeviceQuery query); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java index a250e5f..88cb718 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java @@ -26,7 +26,6 @@ import com.ruoyi.bst.device.utils.DeviceUtil; import com.ruoyi.bst.orderDevice.domain.enums.OrderDeviceStatus; import com.ruoyi.common.constants.ServiceCode; import com.ruoyi.common.core.redis.RedisLock; -import com.ruoyi.common.core.redis.enums.RedisLockKey; import com.ruoyi.common.utils.MathUtils; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.StringUtils; @@ -276,27 +275,27 @@ public class DeviceIotServiceImpl implements DeviceIotService { } // 异步更新数据库 - scheduledExecutorService.schedule(() -> { - for (DeviceVO device : deviceList) { - try { - // 加锁,控制更新频率 - boolean lock = redisLock.lock(RedisLockKey.DEVICE_IOT_REFRESH, device.getMac(), 10); - if (!lock) { - continue; - } + // scheduledExecutorService.schedule(() -> { + // for (DeviceVO device : deviceList) { + // try { + // // 加锁,控制更新频率 + // boolean lock = redisLock.lock(RedisLockKey.DEVICE_IOT_REFRESH, device.getMac(), 10); + // if (!lock) { + // continue; + // } - // 获取在线状态 - if (StringUtils.hasText(onlineType)) { - String onlineStatus = iotService.getOnlineStatus(device, onlineType); - this.setOnlineStatus(device, onlineStatus); - } - // 更新物联网信息 - this.updateIot(device); - } catch (Exception e) { - log.error("更新设备{}物联网信息失败", device.getSn(), e); - } - } - }, 0, TimeUnit.SECONDS); + // // 获取在线状态 + // if (StringUtils.hasText(onlineType)) { + // String onlineStatus = iotService.getOnlineStatus(device, onlineType); + // this.setOnlineStatus(device, onlineStatus); + // } + // // 更新物联网信息 + // this.updateIot(device); + // } catch (Exception e) { + // log.error("更新设备{}物联网信息失败", device.getSn(), e); + // } + // } + // }, 0, TimeUnit.SECONDS); } private void setOnlineStatus(DeviceVO device, String onlineStatus) { @@ -308,11 +307,13 @@ public class DeviceIotServiceImpl implements DeviceIotService { } public int updateIot(Device device) { - if (device == null || device.getId() == null) { + if (device == null) { + return 0; + } + if (StringUtils.isBlank(device.getMac()) || device.getId() == null) { return 0; } Device data = new Device(); - data.setId(device.getId()); data.setVoltage(device.getVoltage()); data.setSignalStrength(device.getSignalStrength()); data.setQuality(device.getQuality()); @@ -326,7 +327,10 @@ public class DeviceIotServiceImpl implements DeviceIotService { data.setOnlineStatus(device.getOnlineStatus()); data.setLastOnlineTime(device.getLastOnlineTime()); data.setSoftwareVersion(device.getSoftwareVersion()); - return deviceMapper.updateDevice(data); + DeviceQuery query = new DeviceQuery(); + query.setId(device.getId()); + query.setMac(device.getMac()); + return deviceMapper.updateByQuery(data, query); } @Override diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java index 916872d..9be4bac 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java @@ -580,6 +580,12 @@ public class DeviceServiceImpl implements DeviceService DeviceQuery query = new DeviceQuery(); query.setMacList(macList); return deviceMapper.selectMacSnList(query); - } + + @Override + public int updateByQuery(Device data, DeviceQuery query) { + return deviceMapper.updateByQuery(data, query); + } + + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java index adacd8d..0f51f8b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java @@ -37,7 +37,8 @@ public class DeviceUtil { } } } - + + device.setLastTime(at); device.setVoltage(sys.getBat()); device.setSignalStrength(sys.getCsq()); device.setQuality(sys.getQ()); @@ -61,7 +62,6 @@ public class DeviceUtil { setIotSysInfo(device, sys, iot.getAt()); } device.setSoftwareVersion(iot.getVer()); - device.setLastTime(iot.getAt()); } /** diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java index 652ee18..9d82327 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java @@ -4,7 +4,6 @@ import java.math.BigDecimal; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; -import java.util.Objects; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -68,7 +67,6 @@ import com.ruoyi.bst.pay.service.PayConverter; import com.ruoyi.bst.pay.service.PayService; import com.ruoyi.bst.refund.domain.enums.RefundType; import com.ruoyi.bst.sms.service.SmsService; -import com.ruoyi.common.core.domain.vo.UserVO; import com.ruoyi.common.core.redis.RedisLock; import com.ruoyi.common.core.redis.enums.RedisLockKey; import com.ruoyi.common.utils.DateUtils; @@ -251,12 +249,11 @@ public class OrderServiceImpl implements OrderService // 校验参数 orderValidator.validate(bo); - // 若设备当前订单未支付,且是当前用户的订单,则将其取消 + // 若设备当前订单未支付,则将其取消 DeviceVO device = bo.getDevice(); - UserVO user = bo.getUser(); - if (device.getOrderId() != null && OrderStatus.WAIT_PAY.getCode().equals(device.getOrderStatus()) && Objects.equals(device.getOrderUserId(), user.getUserId())) { - int cancel = this.cancelOrder(device.getOrderId(), "取消用户重复订单"); - ServiceUtil.assertion(cancel != 1, "取消用户重复订单失败"); + if (device.getOrderId() != null && OrderStatus.WAIT_PAY.getCode().equals(device.getOrderStatus())) { + int cancel = this.cancelOrder(device.getOrderId(), "取消上一个未支付订单"); + ServiceUtil.assertion(cancel != 1, "取消上一个未支付订单失败"); } return transactionTemplate.execute(status -> { diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index 50d9443..a2f0ffe 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -85,16 +85,10 @@ public class IotReceiveServiceImpl implements IotReceiveService { } // 转为设备信息 - log.info("收到sys数据:" + msg.getValue()); + log.info("收到sys数据:{}", msg.getValue()); IotDeviceSysInfo sys = IotUtil.toSysInfo(msg.getValue()); LocalDateTime at = DateUtils.toLocalDateTime(msg.getAt()); - // 0,0定位不处理 - if (MathUtils.equals(sys.getLon(), BigDecimal.ZERO) && MathUtils.equals(sys.getLat(), BigDecimal.ZERO)) { - log.info("设备{}定位异常:{},{},不处理", msg.getDevName(), sys.getLon(), sys.getLat()); - return; - } - // 处理设备定位BUG,若出现BUG则重启设备 int handle = this.handleDeviceLocationBug(device, sys, at); if (handle == 1) { @@ -103,17 +97,19 @@ public class IotReceiveServiceImpl implements IotReceiveService { // 设置设备信息 DeviceUtil.setIotSysInfo(device, sys, at); - device.setLastTime(at); - device.setLastLocationTime(at); - // 卫星数量小于5,不处理设备操作 - if (device.getSatellites() == null || device.getSatellites() < 5) { - log.error("卫星数量小于5,不处理: {}", device.getMac()); - return; + // 更新设备信息 + device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); + device.setLastOnlineTime(at); + int update = deviceIotService.updateIot(device); + if (update != 1) { + log.error("更新设备信息失败: {}", msg.getDevName()); } + // 处理运营区 this.handleArea(device); + // 处理定位日志 this.handleLocationLog(device); } } @@ -147,6 +143,11 @@ public class IotReceiveServiceImpl implements IotReceiveService { if (duration.getSeconds() > 60) { return 0; } + // 0,0定位不处理 + if (MathUtils.equals(sys.getLon(), BigDecimal.ZERO) && MathUtils.equals(sys.getLat(), BigDecimal.ZERO)) { + log.info("设备{}定位异常:{},{},不处理", device.getMac(), sys.getLon(), sys.getLat()); + return 0; + } boolean isOpen = DeviceQuality.OPEN.getCode().equals(sys.getQ()); // 电门是否开启 // 需要在设备未启动的时候做,否则可能有安全问题 if (!isOpen) { @@ -174,6 +175,16 @@ public class IotReceiveServiceImpl implements IotReceiveService { if (duration.getSeconds() > 60) { return; } + // 卫星数量小于5,不处理设备操作 + if (device.getSatellites() == null || device.getSatellites() < 5) { + log.error("卫星数量小于5,不处理: {}", device.getMac()); + return; + } + // 0,0定位不处理 + if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { + log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); + return; + } // 若处理过,则不处理 String key = CacheConstants.DEVICE_AREA_HANDLE_KEY + device.getMac(); Integer isHandle = redisCache.getCacheObject(key); @@ -275,6 +286,17 @@ public class IotReceiveServiceImpl implements IotReceiveService { // 定位日志处理 private void handleLocationLog(DeviceVO device) { + + // 卫星数量小于5,不处理设备操作 + if (device.getSatellites() == null || device.getSatellites() < 5) { + log.error("卫星数量小于5,不处理: {}", device.getMac()); + return; + } + // 0,0定位不处理 + if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { + log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); + return; + } // 转换定位日志 LocationLog po = locationLogConverter.toPo(device); if (po == null) { diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java index afb4d7a..2d38675 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java @@ -280,9 +280,9 @@ public class IotServiceImpl implements IotService { // 记录成功日志 this.addCommandLog(device, command, res.getMsg(), reason, res.getCode(), result); - // 转为在线状态,并缓存结果30秒 + // 转为在线状态,并缓存结果10秒 String status = this.parseToOnlineStatus(res, deviceName, true); - redisCache.setCacheObject(this.getOnlineCacheKey(deviceName), status, 30, TimeUnit.SECONDS); + redisCache.setCacheObject(this.getOnlineCacheKey(deviceName), status, 10, TimeUnit.SECONDS); // 异步更新设备在线状态 scheduledExecutorService.schedule(() -> { int update = deviceService.updateOnlineStatusByMac(deviceName, status); diff --git a/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java b/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java index 23d4027..8efff1b 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java +++ b/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java @@ -1,14 +1,19 @@ package com.ruoyi.task.device; +import java.time.LocalDateTime; +import java.util.ArrayList; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.ruoyi.bst.device.domain.Device; +import com.ruoyi.bst.device.domain.DeviceQuery; import com.ruoyi.bst.device.service.DeviceIotService; +import com.ruoyi.bst.device.service.DeviceService; +import com.ruoyi.iot.service.impl.DeviceOnlineStatus; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; - @Component @Slf4j public class DeviceTask { @@ -16,9 +21,27 @@ public class DeviceTask { @Autowired private DeviceIotService deviceIotService; + @Autowired + private DeviceService deviceService; + // 监控所有设备 public void monitorAll() { deviceIotService.monitor(new ArrayList<>()); } + /** + * 将过久未上报数据的设备设置为离线 + */ + public void monitorOffline(long seconds) { + // 条件:在线且最后上报时间小于当前时间 - seconds秒 + DeviceQuery query = new DeviceQuery(); + query.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); + query.setLastTimeEnd(LocalDateTime.now().plusSeconds(-seconds)); + + Device data = new Device(); + data.setOnlineStatus(DeviceOnlineStatus.OFFLINE.getStatus()); + int update = deviceService.updateByQuery(data, query); + log.info("更新了{}条离线的设备数据", update); + } + } From 0237e225cb8e4148312b92b9429131d46918230c 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: Tue, 29 Apr 2025 14:20:21 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/pay/tm/TmPayService.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/pay/tm/TmPayService.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/pay/tm/TmPayService.java index ebb1182..f7e4f8c 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/pay/tm/TmPayService.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/pay/tm/TmPayService.java @@ -1,5 +1,12 @@ package com.ruoyi.common.pay.tm; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.stereotype.Service; + import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.exception.ServiceException; @@ -14,12 +21,6 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.http.HttpUtils; import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse; -import org.springframework.stereotype.Service; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; /** * 太米支付 @@ -73,7 +74,7 @@ public class TmPayService implements PayApi { ServiceUtil.assertion(refundInfo.getInteger("refundStatus") != 1, "退款失败:%s", refundInfo.getString("refundMessage")); return refundInfo.toJavaObject(RefundInfo.class); } else { - throw new ServiceException("退款失败: " + jsonResponse.getString("errMsg")); + throw new ServiceException("退款" + refundAble.refundAmountYuan() +"元,退款失败: " + jsonResponse.getString("errMsg")); } } throw new ServiceException("退款数据为空"); From d38aba8df3809dd65175a0fae105bd1cf7d85b56 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: Tue, 29 Apr 2025 14:49:29 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=9B=9E=E6=BB=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/bst/refund/service/impl/RefundServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/service/impl/RefundServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/service/impl/RefundServiceImpl.java index 61a77fb..faefdd3 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/refund/service/impl/RefundServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/refund/service/impl/RefundServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.bst.refund.service.impl; import java.util.List; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -160,7 +161,9 @@ public class RefundServiceImpl implements RefundService // 判断是否同步通知,若是则直接处理支付成功 if (channelApiType.getIsRefundSync() != null && channelApiType.getIsRefundSync()) { - this.handleRefundSuccess(refund.getNo()); + scheduledExecutorService.schedule(() -> { + this.handleRefundSuccess(refund.getNo()); + }, 10, TimeUnit.SECONDS); } return insertRefund; From 6f3bb4274247c6de3132841347a1392bd4abcda1 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: Tue, 29 Apr 2025 15:18:24 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/iot/receive/ReceiveController.java | 1 + .../com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java | 7 ++++++- .../src/main/java/com/ruoyi/task/device/DeviceTask.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/receive/ReceiveController.java b/ruoyi-service/src/main/java/com/ruoyi/iot/receive/ReceiveController.java index 62b6dfd..9d57f16 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/receive/ReceiveController.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/receive/ReceiveController.java @@ -65,6 +65,7 @@ public class ReceiveController { ObjBody obj = IotUtil.resolveBody(body, false); if (obj != null){ Object msg = obj.getMsg(); + log.info("收到receive数据:{}", msg); // 接收到msg if (msg instanceof String) { iotReceiveService.handleReceive(JSON.parseObject((String) msg, ReceiveMsg.class)); diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index a2f0ffe..be17f8c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -152,7 +152,12 @@ public class IotReceiveServiceImpl implements IotReceiveService { // 需要在设备未启动的时候做,否则可能有安全问题 if (!isOpen) { // 若当前数据点的上报时间和设备内上次上报的时间不一样,但是定位一样,则重启设备 - log.info("当前定位:{},{},上次定位:{},{}", sys.getLon().setScale(8), sys.getLat().setScale(8), device.getLongitude().setScale(8), device.getLatitude().setScale(8)); + log.info("当前定位:{},{},上次定位:{},{}", + sys.getLon().setScale(8, BigDecimal.ROUND_HALF_UP), + sys.getLat().setScale(8, BigDecimal.ROUND_HALF_UP), + device.getLongitude().setScale(8, BigDecimal.ROUND_HALF_UP), + device.getLatitude().setScale(8, BigDecimal.ROUND_HALF_UP) + ); if (at.isAfter(device.getLastLocationTime()) && MathUtils.equalsFixed(device.getLongitude(), sys.getLon(), 8) && MathUtils.equalsFixed(device.getLatitude(), sys.getLat(), 8)) { String reason = String.format("设备不同时间的两次定位一样,重启设备。新定位:%s,%s,旧定位:%s,%s", sys.getLon(), sys.getLat(), device.getLongitude(), device.getLatitude()); deviceIotService.reboot(device, reason, true); diff --git a/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java b/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java index 8efff1b..67077ca 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java +++ b/ruoyi-web/src/main/java/com/ruoyi/task/device/DeviceTask.java @@ -32,7 +32,7 @@ public class DeviceTask { /** * 将过久未上报数据的设备设置为离线 */ - public void monitorOffline(long seconds) { + public void monitorOffline(Integer seconds) { // 条件:在线且最后上报时间小于当前时间 - seconds秒 DeviceQuery query = new DeviceQuery(); query.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); From 578342ec1495027eb7ac27877d1e503e2fd23428 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: Tue, 29 Apr 2025 16:28:48 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/MathUtils.java | 3 +- .../ruoyi/bst/device/domain/DeviceQuery.java | 8 +++-- .../ruoyi/bst/device/mapper/DeviceMapper.xml | 2 ++ .../service/impl/DeviceIotServiceImpl.java | 34 +++++++------------ .../com/ruoyi/iot/enums/IotHttpStatus.java | 6 ++-- .../service/impl/IotReceiveServiceImpl.java | 31 +++++++++-------- .../main/java/com/ruoyi/iot/util/IotUtil.java | 4 ++- 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java index de6fc18..a36f0c3 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java @@ -1,6 +1,7 @@ package com.ruoyi.common.utils; import java.math.BigDecimal; +import java.math.RoundingMode; /** * @author wjh @@ -160,7 +161,7 @@ public class MathUtils { if (a == null || b == null) { return false; } - return equals(a.setScale(precision, BigDecimal.ROUND_HALF_UP), b.setScale(precision, BigDecimal.ROUND_HALF_UP)); + return equals(a.setScale(precision, RoundingMode.HALF_UP), b.setScale(precision, RoundingMode.HALF_UP)); } // 获取最大值 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java index ce846dc..e129f71 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java @@ -17,7 +17,7 @@ public class DeviceQuery extends DeviceVO { @ApiModelProperty("是否刷新物联网信息") private Boolean refresh; - + @ApiModelProperty("设备ID列表") private List ids; @@ -54,5 +54,9 @@ public class DeviceQuery extends DeviceVO { @ApiModelProperty("最后上报时间(结束)") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime lastTimeEnd; - + + @ApiModelProperty("最后上报时间(起始)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastTimeStart; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml index 1f8c828..f9f9dc9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml @@ -127,6 +127,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bul.user_name like concat('%', #{query.lastUserPhone}, '%') and mch.nick_name like concat('%', #{query.mchName}, '%') and bm.name like concat('%', #{query.modelName}, '%') + and bd.last_location_time <= #{query.lastTimeEnd} + and bd.last_location_time >= #{query.lastTimeStart} and ( bd.sn like concat('%', #{query.keyword}, '%') diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java index 88cb718..882e948 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java @@ -274,28 +274,18 @@ public class DeviceIotServiceImpl implements DeviceIotService { DeviceUtil.setIotInfo(device, iot); } - // 异步更新数据库 - // scheduledExecutorService.schedule(() -> { - // for (DeviceVO device : deviceList) { - // try { - // // 加锁,控制更新频率 - // boolean lock = redisLock.lock(RedisLockKey.DEVICE_IOT_REFRESH, device.getMac(), 10); - // if (!lock) { - // continue; - // } - - // // 获取在线状态 - // if (StringUtils.hasText(onlineType)) { - // String onlineStatus = iotService.getOnlineStatus(device, onlineType); - // this.setOnlineStatus(device, onlineStatus); - // } - // // 更新物联网信息 - // this.updateIot(device); - // } catch (Exception e) { - // log.error("更新设备{}物联网信息失败", device.getSn(), e); - // } - // } - // }, 0, TimeUnit.SECONDS); + // 异步发送命令,强制设备上报数据 + scheduledExecutorService.schedule(() -> { + for (DeviceVO device : deviceList) { + try { + if (onlineType != null) { + iotService.getOnlineStatus(device, onlineType); + } + } catch (Exception e) { + log.error("强制设备{}上报数据失败", device.getSn(), e); + } + } + }, 0, TimeUnit.SECONDS); } private void setOnlineStatus(DeviceVO device, String onlineStatus) { diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java b/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java index 42338cb..4859558 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java @@ -1,12 +1,12 @@ package com.ruoyi.iot.enums; -import lombok.AllArgsConstructor; -import lombok.Getter; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import lombok.AllArgsConstructor; +import lombok.Getter; + /** * @author wjh * 2024/7/11 diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index be17f8c..2be8e9b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.iot.service.impl; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; @@ -83,21 +84,21 @@ public class IotReceiveServiceImpl implements IotReceiveService { if (device == null) { return; } + BigDecimal oldLon = device.getLongitude(); + BigDecimal oldLat = device.getLatitude(); // 转为设备信息 log.info("收到sys数据:{}", msg.getValue()); IotDeviceSysInfo sys = IotUtil.toSysInfo(msg.getValue()); LocalDateTime at = DateUtils.toLocalDateTime(msg.getAt()); + DeviceUtil.setIotSysInfo(device, sys, at); // 处理设备定位BUG,若出现BUG则重启设备 - int handle = this.handleDeviceLocationBug(device, sys, at); + int handle = this.handleDeviceLocationBug(device, at, oldLon, oldLat); if (handle == 1) { return; } - // 设置设备信息 - DeviceUtil.setIotSysInfo(device, sys, at); - // 更新设备信息 device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); device.setLastOnlineTime(at); @@ -134,7 +135,7 @@ public class IotReceiveServiceImpl implements IotReceiveService { * 处理设备定位BUG * @param device */ - private int handleDeviceLocationBug(DeviceVO device, IotDeviceSysInfo sys, LocalDateTime at) { + private int handleDeviceLocationBug(DeviceVO device, LocalDateTime at, BigDecimal oldLon, BigDecimal oldLat) { if (device == null || StringUtils.isBlank(device.getMac()) || device.getLastLocationTime() == null || at == null) { return 0; } @@ -144,22 +145,22 @@ public class IotReceiveServiceImpl implements IotReceiveService { return 0; } // 0,0定位不处理 - if (MathUtils.equals(sys.getLon(), BigDecimal.ZERO) && MathUtils.equals(sys.getLat(), BigDecimal.ZERO)) { - log.info("设备{}定位异常:{},{},不处理", device.getMac(), sys.getLon(), sys.getLat()); + if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { + log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); return 0; } - boolean isOpen = DeviceQuality.OPEN.getCode().equals(sys.getQ()); // 电门是否开启 + boolean isOpen = DeviceQuality.OPEN.getCode().equals(device.getQuality()); // 电门是否开启 // 需要在设备未启动的时候做,否则可能有安全问题 if (!isOpen) { // 若当前数据点的上报时间和设备内上次上报的时间不一样,但是定位一样,则重启设备 - log.info("当前定位:{},{},上次定位:{},{}", - sys.getLon().setScale(8, BigDecimal.ROUND_HALF_UP), - sys.getLat().setScale(8, BigDecimal.ROUND_HALF_UP), - device.getLongitude().setScale(8, BigDecimal.ROUND_HALF_UP), - device.getLatitude().setScale(8, BigDecimal.ROUND_HALF_UP) + log.info("当前定位:{},{},上次定位:{},{}", + device.getLongitude().setScale(8, RoundingMode.HALF_UP), + device.getLatitude().setScale(8, RoundingMode.HALF_UP), + oldLon.setScale(8, RoundingMode.HALF_UP), + oldLat.setScale(8, RoundingMode.HALF_UP) ); - if (at.isAfter(device.getLastLocationTime()) && MathUtils.equalsFixed(device.getLongitude(), sys.getLon(), 8) && MathUtils.equalsFixed(device.getLatitude(), sys.getLat(), 8)) { - String reason = String.format("设备不同时间的两次定位一样,重启设备。新定位:%s,%s,旧定位:%s,%s", sys.getLon(), sys.getLat(), device.getLongitude(), device.getLatitude()); + if (at.isAfter(device.getLastLocationTime()) && MathUtils.equalsFixed(device.getLongitude(), oldLon, 8) && MathUtils.equalsFixed(device.getLatitude(), oldLat, 8)) { + String reason = String.format("设备不同时间的两次定位一样,重启设备。新定位:%s,%s,旧定位:%s,%s", device.getLongitude(), device.getLatitude(), oldLon, oldLat); deviceIotService.reboot(device, reason, true); return 1; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java b/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java index 230b3fd..0abc01b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java @@ -31,6 +31,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.iot.domain.IotDeviceSysInfo; import com.ruoyi.iot.domain.ObjBody; import com.ruoyi.iot.domain.response.CommandResponse; +import com.ruoyi.iot.enums.IotHttpStatus; import lombok.extern.slf4j.Slf4j; @@ -214,7 +215,8 @@ public class IotUtil { if (result == null) { return "未知错误"; } - return result.getMsg(); + IotHttpStatus status = IotHttpStatus.convertByCode(result.getCode()); + return status.getMsg(); } public static IotDeviceSysInfo toSysInfo(Object value) { From 4f63af82147733d2881320e37cfbf0f6a3291131 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: Tue, 29 Apr 2025 18:08:26 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/bst/device/mapper/DeviceMapper.java | 8 ++++++++ .../com/ruoyi/bst/device/mapper/DeviceMapper.xml | 12 ++++++++++++ .../device/service/impl/DeviceIotServiceImpl.java | 6 +++--- .../com/ruoyi/web/app/AppLocationLogController.java | 12 ++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 ruoyi-web/src/main/java/com/ruoyi/web/app/AppLocationLogController.java diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java index a508095..70fe2de 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.java @@ -160,4 +160,12 @@ public interface DeviceMapper */ List selectMacSnList(@Param("query") DeviceQuery query); + /** + * 条件更新(简单版) + * @param data + * @param query + * @return + */ + int updateByQuerySimple(@Param("data") Device data, @Param("query") DeviceQuery query); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml index f9f9dc9..d94eb72 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml @@ -476,4 +476,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + update bst_device bd + + + + + + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java index 882e948..7941c7a 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java @@ -300,7 +300,7 @@ public class DeviceIotServiceImpl implements DeviceIotService { if (device == null) { return 0; } - if (StringUtils.isBlank(device.getMac()) || device.getId() == null) { + if (StringUtils.isBlank(device.getMac()) && device.getId() == null) { return 0; } Device data = new Device(); @@ -319,8 +319,8 @@ public class DeviceIotServiceImpl implements DeviceIotService { data.setSoftwareVersion(device.getSoftwareVersion()); DeviceQuery query = new DeviceQuery(); query.setId(device.getId()); - query.setMac(device.getMac()); - return deviceMapper.updateByQuery(data, query); + query.setEqMac(device.getMac()); + return deviceMapper.updateByQuerySimple(data, query); } @Override diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/app/AppLocationLogController.java b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppLocationLogController.java new file mode 100644 index 0000000..68bfab0 --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppLocationLogController.java @@ -0,0 +1,12 @@ +package com.ruoyi.web.app; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ruoyi.common.core.controller.BaseController; + +@RestController +@RequestMapping("/app/locationLog") +public class AppLocationLogController extends BaseController { + +}