From 060ad5338ef4aad636d359dceef4d7aa15e03b28 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Tue, 3 Mar 2026 16:50:39 +0800 Subject: [PATCH] fix:bug --- .../yudao/module/iot/job/DeviceJob.java | 16 +++++- .../DeviceModelAttributeServiceImpl.java | 57 +++++++++---------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/DeviceJob.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/DeviceJob.java index 048c784a7..2861549ac 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/DeviceJob.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/DeviceJob.java @@ -160,7 +160,21 @@ public class DeviceJob implements JobHandler { .last("LIMIT 1") ); - if (pointRulesDO == null || StringUtils.isBlank(pointRulesDO.getFieldRule())) return; + if (pointRulesDO == null || StringUtils.isBlank(pointRulesDO.getFieldRule())){ + return; + } + + if(StringUtils.isBlank(pointRulesDO.getFieldRule())){ + //处理待机中 + DeviceOperationRecordDO record = new DeviceOperationRecordDO(); + record.setDeviceId(deviceId); + record.setRule(DeviceStatusEnum.STANDBY.getCode()); + record.setCreator("1"); + record.setUpdater("1"); + deviceOperationRecordMapper.insert(record); + return; + } + // 解析规则列表 List pointRulesVOList = JSON.parseArray( diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java index 90b8973e9..bf50f9f9c 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java @@ -8,7 +8,9 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; import cn.iocoder.yudao.module.iot.controller.admin.device.enums.JavaToTdengineTypeEnum; import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; import cn.iocoder.yudao.module.iot.dal.mysql.deviceattributetype.DeviceAttributeTypeMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactModelMapper; import cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -16,6 +18,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.validation.ConstraintViolationException; @@ -58,6 +61,10 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; @Resource private DeviceAttributeTypeMapper deviceAttributeTypeMapper; + @Resource + @Lazy + private DeviceContactModelMapper deviceContactModelMapper; + @Resource private ErpProductUnitService productUnitService; @@ -164,6 +171,7 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; @Override public List> operationAnalysisDetails(Long deviceId, Long modelId, String collectionStartTime, String collectionEndTime) { + if (deviceId == null) { throw exception(DEVICE_ID_DOES_NOT_EXIST); } @@ -174,47 +182,37 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; List> resultList = new ArrayList<>(); try { - // 1. 获取最新10条设备数据列表(直接从TDengine获取原始字段) + // 获取最新10条设备数据 List> deviceDataList = tdengineService.newSelectLatestData(deviceId, collectionStartTime, collectionEndTime, 10); - // 2. 获取属性类型映射 - Map idToNameMap = deviceAttributeTypeMapper.selectList() - .stream() - .collect(Collectors.toMap( - DeviceAttributeTypeDO::getId, - DeviceAttributeTypeDO::getName - )); + // 查找 modelId 对应的 attributeCode + DeviceContactModelDO modelDO = deviceContactModelMapper.selectById(modelId); + if (modelDO == null) { + throw exception(POINT_ID_MODEL_NOT_EXISTS); + } + + String attributeCode = modelDO.getAttributeCode(); + if (StringUtils.isBlank(attributeCode)) { + return resultList; + } - // 3. 遍历每个时间点的数据 + // 遍历时间点数据 for (Map deviceData : deviceDataList) { - Timestamp timestamp = (Timestamp) deviceData.get("ts"); // TDengine 时间列 + + Timestamp timestamp = (Timestamp) deviceData.get("ts"); if (timestamp == null) continue; SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); - String formattedTime = sdf.format(timestamp); Map timePointData = new LinkedHashMap<>(); - timePointData.put("collectTime", formattedTime); - - // 遍历所有字段(除 ts 之外) - Map>> groupedData = new LinkedHashMap<>(); - for (Map.Entry entry : deviceData.entrySet()) { - String key = entry.getKey(); - if ("ts".equalsIgnoreCase(key)) continue; // 跳过时间字段 - - Map simplifiedData = new HashMap<>(); - simplifiedData.put("attributeName", key); - simplifiedData.put("addressValue", entry.getValue()); + timePointData.put("collectTime", sdf.format(timestamp)); - // 根据 modelId 或 attributeType 分类,这里暂时按 "其他" 分组 - groupedData.computeIfAbsent("其他", k -> new ArrayList<>()).add(simplifiedData); - } + // modelId 对应的字段 + Object value = deviceData.get(attributeCode); - // 添加属性分组 - for (Map.Entry>> entry : groupedData.entrySet()) { - timePointData.put(entry.getKey(), entry.getValue()); - } + timePointData.put("attributeName", attributeCode); + timePointData.put("addressValue", value); resultList.add(timePointData); } @@ -226,7 +224,6 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; return resultList; } - @Override public List getDeviceModelAttributeList(Long id) {