From d85744aba4019661588c197904cbd6ddddd0f2ec Mon Sep 17 00:00:00 2001 From: liutao <790864623@qq.com> Date: Wed, 22 Apr 2026 11:57:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/device/DeviceController.java | 8 ++ .../iot/service/device/DeviceService.java | 2 + .../iot/service/device/DeviceServiceImpl.java | 82 ++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index edf0fe2b0..12182bddc 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -239,6 +239,14 @@ public class DeviceController { return success(deviceContactModelDO); } + @GetMapping("/singleDeviceFrom") + @Operation(summary = "单设备查看") +// @PreAuthorize("@ss.hasPermission('iot:device:query')") + public CommonResult>> singleDeviceFrom(@RequestParam("deviceId") Long deviceId) throws JsonProcessingException { + List> deviceContactModelDO=deviceService.singleDeviceFrom(deviceId); + return success(deviceContactModelDO); + } + @GetMapping("/historyRecord") @Operation(summary = "历史记录查询") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index d53c62e34..f7152b7c2 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -157,4 +157,6 @@ public interface DeviceService { PageResult getAvailableDevicePage(DevicePageReqVO pageReqVO); + + List> singleDeviceFrom(Long deviceId); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index b435468d8..c92b01c84 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -64,12 +64,12 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.sql.Timestamp; import java.text.SimpleDateFormat; -import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; @@ -974,6 +974,85 @@ public class DeviceServiceImpl implements DeviceService { return resultMap; } + @Override + public List> singleDeviceFrom(Long deviceId) { + Map>> resultMap = new LinkedHashMap<>(); + List> resultList = new ArrayList<>(); + List records = deviceContactModelMapper.selectList(Wrappers.lambdaQuery() + .eq(DeviceContactModelDO::getDeviceId,deviceId) + .orderByDesc(DeviceContactModelDO::getId)); + + if (records == null || records.isEmpty()) { + return resultList; + } + + try { + // 获取最新一行数据 + Map latestRow = tdengineService.newSelectLatestRow(deviceId); + if (latestRow == null || latestRow.isEmpty()) { + return resultList; + } + + // 属性类型映射 + Map idToNameMap = deviceAttributeTypeMapper.selectList() + .stream() + .collect(Collectors.toMap( + DeviceAttributeTypeDO::getId, + DeviceAttributeTypeDO::getName + )); + Map attributeTypeCache = new HashMap<>(); + + // 遍历 records 填充数据 + for (DeviceContactModelDO record : records) { + + String attributeCode = record.getAttributeCode(); + if (attributeCode == null) continue; + + Object rawValue = latestRow.get(attributeCode); + + Object finalValue = DataTypeParseUtil.parse(rawValue, record.getDataType()); + + record.setAddressValue(finalValue); + + // 属性类型名称 + String attributeTypeName = "其他"; + Object typeObj = record.getAttributeType(); + if (typeObj != null) { + String typeStr = typeObj.toString(); + try { + Long typeId = Long.parseLong(typeStr); + attributeTypeName = attributeTypeCache.computeIfAbsent(typeId, + k -> idToNameMap.getOrDefault(typeId, typeStr)); + } catch (NumberFormatException e) { + attributeTypeName = typeStr; + } + } + + Map simplifiedData = new HashMap<>(); + simplifiedData.put("value", record.getAddressValue()); + simplifiedData.put("label", record.getAttributeName()); + simplifiedData.put("prop", "parpmeter_" + record.getId()); + resultMap.computeIfAbsent(attributeTypeName, k -> new ArrayList<>()).add(simplifiedData); + } + if (!resultMap.isEmpty()) { + AtomicInteger a= new AtomicInteger(0); + resultMap.forEach((key, value) -> { + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("id", a.incrementAndGet()); + objectObjectHashMap.put("title", key); + objectObjectHashMap.put("items", value); + resultList.add(objectObjectHashMap); + }); + + } + + } catch (Exception e) { + log.warn("处理设备 {} 最新数据时异常: {}", deviceId, e.getMessage()); + } + + return resultList; + } + @Override public PageResult> historyRecord( @@ -1746,6 +1825,7 @@ public class DeviceServiceImpl implements DeviceService { return new PageResult<>(availableDeviceList, page.getTotal()); } + /** * 按时间区间查询设备整体开机率、稼动率日趋势。 * 按天复用 deviceOperationPage 统计单设备数据后求平均。