From bac30413399001fd1bf5e506fe5dbb983de30c4f 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, 14 May 2025 09:32:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/MathUtils.java | 3 ++ .../common/utils/map/GpsCoordinateUtils.java | 10 ++++++- .../service/impl/DeviceIotServiceImpl.java | 3 +- .../ruoyi/bst/device/utils/DeviceUtil.java | 30 +++++++++++-------- .../order/service/impl/OrderServiceImpl.java | 2 +- 5 files changed, 31 insertions(+), 17 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 a577090..19a6912 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 @@ -35,6 +35,9 @@ public class MathUtils { */ public static BigDecimal subtractDecimal(BigDecimal a, BigDecimal ...values) { BigDecimal result = a; + if (result == null) { + result = BigDecimal.ZERO; + } for (BigDecimal value : values) { if (value != null) { result = result.subtract(value); diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/map/GpsCoordinateUtils.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/map/GpsCoordinateUtils.java index e2b3a71..07b89ee 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/map/GpsCoordinateUtils.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/map/GpsCoordinateUtils.java @@ -34,6 +34,14 @@ public class GpsCoordinateUtils { return new double[]{retLat, retLon}; } + /** + * 地球坐标系 WGS-84 to 火星坐标系 GCJ-02 + */ + public static List calWGS84toGCJ02(BigDecimal lon, BigDecimal lat) { + double[] gcj = calWGS84toGCJ02(lat.doubleValue(), lon.doubleValue()); + return Arrays.asList(BigDecimal.valueOf(gcj[1]), BigDecimal.valueOf(gcj[0])); + } + /** * 地球坐标系 WGS-84 to 百度坐标系 BD-09 * @@ -846,7 +854,7 @@ public class GpsCoordinateUtils { doubles = calWGS84toGCJ02(la.doubleValue(), lo.doubleValue()); } - return Arrays.asList(new BigDecimal(doubles[0]), new BigDecimal(doubles[1])); + return Arrays.asList(new BigDecimal(doubles[1]), new BigDecimal(doubles[0])); } public static String[] getDecimalPart(BigDecimal number) { 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 a8a8122..8916db1 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 @@ -454,8 +454,7 @@ public class DeviceIotServiceImpl implements DeviceIotService { ServiceUtil.assertion(device == null, "设备不存在"); // 更新设备信息 - DeviceUtil.setIotSysInfo(device, dto.getSys(), LocalDateTime.now(), true, false); - device.setLocationType(DeviceLocationType.PHONE.getCode()); + DeviceUtil.setIotSysInfo(device, dto.getSys(), LocalDateTime.now(), true, DeviceLocationType.PHONE); int rows = this.updateIot(device); // 创建定位日志 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 24b5f73..7635086 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 @@ -2,6 +2,7 @@ package com.ruoyi.bst.device.utils; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; import com.ruoyi.bst.device.domain.DeviceVO; @@ -16,7 +17,7 @@ import com.ruoyi.iot.util.BatUtil; public class DeviceUtil { public static void setIotSysInfo(DeviceVO device, IotDeviceSysInfo sys, LocalDateTime at, boolean setNull) { - setIotSysInfo(device, sys, at, setNull, true); + setIotSysInfo(device, sys, at, setNull, DeviceLocationType.DEVICE); } /** @@ -27,7 +28,7 @@ public class DeviceUtil { * @param setNull 若定位不正常,是否设置为空 * @param convertLocation 是否转换经纬度坐标系 */ - public static void setIotSysInfo(DeviceVO device, IotDeviceSysInfo sys, LocalDateTime at, boolean setNull, boolean convertLocation) { + public static void setIotSysInfo(DeviceVO device, IotDeviceSysInfo sys, LocalDateTime at, boolean setNull, DeviceLocationType locationType) { if (device == null || sys == null) { return; } @@ -35,18 +36,21 @@ public class DeviceUtil { // 转换经纬度坐标系并赋值 // 只有定位是正常的才认为是有获取到定位 if (DeviceUtil.validLocation(sys.getLon(), sys.getLat())) { - if (convertLocation) { - List coordinates = GpsCoordinateUtils.coordinateConvert(sys.getLon(), sys.getLat()); - if (coordinates != null && coordinates.size() >= 2) { - device.setLongitude(coordinates.get(1)); - device.setLatitude(coordinates.get(0)); - } - } else { - device.setLongitude(sys.getLon()); - device.setLatitude(sys.getLat()); + List coordinates = null; + + // 转换坐标 + if (locationType == DeviceLocationType.DEVICE) { + coordinates = GpsCoordinateUtils.coordinateConvert(sys.getLon(), sys.getLat()); + } else if (locationType == DeviceLocationType.PHONE) { + coordinates = Arrays.asList(sys.getLon(), sys.getLat()); + } + + if (coordinates != null && coordinates.size() >= 2) { + device.setLongitude(coordinates.get(0)); + device.setLatitude(coordinates.get(1)); + device.setLastLocationTime(at); + device.setLocationType(locationType.getCode()); } - device.setLastLocationTime(at); - device.setLocationType(DeviceLocationType.DEVICE.getCode()); } else if (setNull) { device.setLongitude(null); device.setLatitude(null); 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 00ebac6..6531534 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 @@ -493,7 +493,7 @@ public class OrderServiceImpl implements OrderService { // 转为定位日志 LocationLog locationLog = locationLogConverter.toPo(device); if (locationLog == null) { - log.error("转换定位日志失败: {}", device.getMac()); + log.error("通过手机定位转换定位日志失败: {}", device.getMac()); return; } // 暂存到Redis缓存