From 1737566245b5f3aac37b4994283d913b5823f276 Mon Sep 17 00:00:00 2001 From: lzh Date: Fri, 26 Dec 2025 18:25:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E5=8F=AA=E4=BE=9D?= =?UTF-8?q?=E6=8D=AEdeviceName=E6=9F=A5=E8=AF=A2=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=88=E6=9A=82=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E5=90=8E=E7=BB=AD=E8=B0=83=E6=95=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/api/device/IoTDeviceApiImpl.java | 18 ++++++++++++++++-- .../iot/service/device/IotDeviceService.java | 13 +++++++++++++ .../service/device/IotDeviceServiceImpl.java | 7 +++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/api/device/IoTDeviceApiImpl.java b/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/api/device/IoTDeviceApiImpl.java index 1cbec9f..c1fed62 100644 --- a/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/api/device/IoTDeviceApiImpl.java +++ b/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/api/device/IoTDeviceApiImpl.java @@ -47,8 +47,22 @@ public class IoTDeviceApiImpl implements IotDeviceCommonApi { @PostMapping(RpcConstants.RPC_API_PREFIX + "/iot/device/get") // 特殊:方便调用,暂时使用 POST,实际更推荐 GET @PermitAll public CommonResult getDevice(@RequestBody IotDeviceGetReqDTO getReqDTO) { - IotDeviceDO device = getReqDTO.getId() != null ? deviceService.getDeviceFromCache(getReqDTO.getId()) - : deviceService.getDeviceFromCache(getReqDTO.getProductKey(), getReqDTO.getDeviceName()); + IotDeviceDO device; + + // 查询优先级:id > (productKey + deviceName) > deviceName + if (getReqDTO.getId() != null) { + // 通过设备 ID 查询 + device = deviceService.getDeviceFromCache(getReqDTO.getId()); + } else if (getReqDTO.getProductKey() != null && getReqDTO.getDeviceName() != null) { + // 通过 productKey + deviceName 查询 + device = deviceService.getDeviceFromCache(getReqDTO.getProductKey(), getReqDTO.getDeviceName()); + } else if (getReqDTO.getDeviceName() != null) { + // 仅通过 deviceName 查询(用于 JT808 等协议,终端手机号应该是全局唯一的) + device = deviceService.getDeviceFromCacheByDeviceName(getReqDTO.getDeviceName()); + } else { + device = null; + } + return success(BeanUtils.toBean(device, IotDeviceRespDTO.class, deviceDTO -> { IotProductDO product = productService.getProductFromCache(deviceDTO.getProductId()); if (product != null) { diff --git a/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceService.java b/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceService.java index 2fde82a..3f35e0f 100644 --- a/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceService.java +++ b/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceService.java @@ -131,6 +131,19 @@ public interface IotDeviceService { */ IotDeviceDO getDeviceFromCache(String productKey, String deviceName); + /** + * 【缓存】根据设备名称获得设备信息(仅通过设备名称查询) + *

+ * 注意:该方法会忽略租户信息,所以调用时,需要确认会不会有跨租户访问的风险!!! + *

+ * 此方法主要用于 JT808 等协议,设备在注册时只知道终端手机号(deviceName), + * 不知道 productKey。对于 JT808 协议,终端手机号应该是全局唯一的。 + * + * @param deviceName 设备名称(如 JT808 的终端手机号) + * @return 设备信息,未找到返回 null + */ + IotDeviceDO getDeviceFromCacheByDeviceName(String deviceName); + /** * 获得设备分页 * diff --git a/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceServiceImpl.java b/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceServiceImpl.java index df1157f..5c00ca8 100644 --- a/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceServiceImpl.java +++ b/viewshanghai-module-iot/viewshanghai-module-iot-biz/src/main/java/com/viewshanghai/module/iot/service/device/IotDeviceServiceImpl.java @@ -259,6 +259,13 @@ public class IotDeviceServiceImpl implements IotDeviceService { return deviceMapper.selectByProductKeyAndDeviceName(productKey, deviceName); } + @Override + @Cacheable(value = RedisKeyConstants.DEVICE, key = "'deviceName_' + #deviceName", unless = "#result == null") + @TenantIgnore // 忽略租户信息,用于 JT808 等协议,终端手机号应该是全局唯一的 + public IotDeviceDO getDeviceFromCacheByDeviceName(String deviceName) { + return deviceMapper.selectByDeviceName(deviceName); + } + @Override public PageResult getDevicePage(IotDevicePageReqVO pageReqVO) { return deviceMapper.selectPage(pageReqVO);