From c9e07666778afb1f68700cad0131d89abdcb17e4 Mon Sep 17 00:00:00 2001 From: zhugongping Date: Fri, 10 Apr 2026 08:54:40 +0800 Subject: [PATCH] =?UTF-8?q?20260409=EF=BC=9A=E6=A0=B9=E6=8D=AE=E7=BB=8F?= =?UTF-8?q?=E7=BA=AC=E5=BA=A6=E8=8E=B7=E5=8F=96=E8=AF=A6=E7=BB=86=E5=9C=B0?= =?UTF-8?q?=E5=9D=80bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/consumer/DeviceStatusConsumer.java | 1 + .../http/map/GaodeLocationService.java | 53 ++++++++++++++++--- .../iot/service/impl/DeviceServiceImpl.java | 7 +-- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DeviceStatusConsumer.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DeviceStatusConsumer.java index b465291d..4a794907 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DeviceStatusConsumer.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DeviceStatusConsumer.java @@ -89,6 +89,7 @@ public class DeviceStatusConsumer { } } /*更新设备状态*/ + device.setProtocolCode(product.getProtocolCode()); deviceCache.updateDeviceStatusCache(statusBo, device); //处理影子模式值 this.handlerShadow(device, status); diff --git a/fastbee-plugs/fastbee-http/src/main/java/com/fastbee/http/map/GaodeLocationService.java b/fastbee-plugs/fastbee-http/src/main/java/com/fastbee/http/map/GaodeLocationService.java index d9743955..d4bcbdd2 100644 --- a/fastbee-plugs/fastbee-http/src/main/java/com/fastbee/http/map/GaodeLocationService.java +++ b/fastbee-plugs/fastbee-http/src/main/java/com/fastbee/http/map/GaodeLocationService.java @@ -135,7 +135,7 @@ public class GaodeLocationService implements ILocationService { return null; } if (StringUtils.isBlank(gaodeAK)) { - log.warn("高德逆地理编码:未配置 map.gaode_key"); + log.warn("高德逆地理编码:未配置 map.gaode_ak"); return null; } double lng = coordinate.getLongitude().doubleValue(); @@ -172,18 +172,60 @@ public class GaodeLocationService implements ILocationService { info.setTown(ac.getString("township")); JSONObject streetNumber = ac.getJSONObject("streetNumber"); if (streetNumber != null) { - info.setStreet(streetNumber.getString("street")); - info.setStreetNumber(streetNumber.getString("number")); + info.setStreet(gaodeTextField(streetNumber, "street")); + info.setStreetNumber(gaodeTextField(streetNumber, "number")); } JSONObject building = ac.getJSONObject("building"); if (building != null) { - info.setBuilding(building.getString("name")); + info.setBuilding(gaodeTextField(building, "name")); } } return info; } + /** + * 高德部分字段在数据缺失时为 JSON 数组(含空数组 {@code []}),直接 {@link JSONObject#getString(String)} 会得到字面量 {@code "[]"}。 + * 本方法仅返回有意义的非空文本,否则返回 {@code null}。 + */ + private static String gaodeTextField(JSONObject obj, String key) { + if (obj == null || key == null) { + return ""; + } + return gaodeTextValue(obj.get(key)); + } + + private static String gaodeTextValue(Object v) { + if (v == null) { + return ""; + } + if (v instanceof String) { + String s = (String) v; + return StringUtils.isNotBlank(s) && !"[]".equals(s.trim()) ? s : ""; + } + if (v instanceof JSONArray) { + JSONArray arr = (JSONArray) v; + if (arr.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(); + for (Object el : arr) { + if (el instanceof String) { + String part = (String) el; + if (StringUtils.isNotBlank(part)) { + if (sb.length() > 0) { + sb.append(','); + } + sb.append(part); + } + } + } + return sb.length() > 0 ? sb.toString() : ""; + } + String s = String.valueOf(v); + return StringUtils.isNotBlank(s) && !"[]".equals(s) ? s : ""; + } + /** * 直辖市等场景下 city 可能为空数组,需回退到省名等。 */ @@ -200,8 +242,7 @@ public class GaodeLocationService implements ILocationService { return arr.getString(0); } } - String province = ac.getString("province"); - return StringUtils.isNotBlank(province) ? province : null; + return gaodeTextField(ac, "province"); } /** diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java index 2b3311ab..9c1af438 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -1100,7 +1100,7 @@ public class DeviceServiceImpl implements IDeviceService { // 随机经纬度和地址 //SysUser user = getLoginUser().getUser(); device.setNetworkIp(sysUser.getLoginIp()); - device.setTransport(product.getTransport()); // 便于Modbus设备LBS定位 + //device.setProtocolCode(product.getProtocolCode()); // 新建时无经纬度 setLocation(sysUser.getLoginIp(), device); deviceMapper.insertDevice(device); // 处理modbus产品 @@ -1639,10 +1639,11 @@ public class DeviceServiceImpl implements IDeviceService { ILocationService service = locationServiceFactory.getLocationService(); // Modbus设备采用LBS定位(从设备获取经纬度) - if (/*Objects.equals(1, device.getLocationWay()) && */FastBeeConstant.PROTOCOL.ModbusRtu.equals(device.getTransport())) { + if (/*Objects.equals(1, device.getLocationWay()) && */FastBeeConstant.PROTOCOL.ModbusRtu.equals(device.getProtocolCode())) { log.info("Modbus设备采用LBS定位{}", device.getSerialNumber()); // 将经纬度转换为地址编码 networkAddress - if (StringUtils.isEmpty(device.getNetworkAddress()) && device.getLongitude() != null && device.getLatitude() != null) { + if ((StringUtils.isEmpty(device.getNetworkAddress()) || "未知地址".equals(device.getNetworkAddress())) && + device.getLongitude() != null && device.getLatitude() != null) { Coordinate platformCoordinate = service.convertPlatformCoordinateFromWgs84(new Coordinate(device.getLongitude(), device.getLatitude())); AddressInfo addressInfo = service.getAddressByCoordinate(platformCoordinate); String networkAddress = StringUtils.isEmpty(addressInfo.getBuilding()) ? addressInfo.getFormattedAddress() : addressInfo.getBuilding();