From 1b6ef3cc2803467a56f75050058f3aab6313c0f0 Mon Sep 17 00:00:00 2001 From: huguanghan Date: Wed, 8 Jan 2025 16:15:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E6=A8=A1=E5=9E=8B,=E7=89=A9=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=B1=9E=E6=80=A7=E7=BC=93=E5=AD=98=E5=88=B7=E6=96=B0?= =?UTF-8?q?,deviceEventCommand=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cache/domain/IotFieldInfoCache.java | 3 ++ .../modules/cache/service/IotModelCache.java | 9 ++++ .../cache/service/impl/IotModelCacheImpl.java | 42 +++++++++++++++++++ .../service/impl/SysIotModelServiceImpl.java | 17 ++++++++ .../node/command/DeviceEventCommand.java | 23 +++++----- 5 files changed, 82 insertions(+), 12 deletions(-) diff --git a/das/src/main/java/com/das/modules/cache/domain/IotFieldInfoCache.java b/das/src/main/java/com/das/modules/cache/domain/IotFieldInfoCache.java index 5aa11e2e..a815a885 100644 --- a/das/src/main/java/com/das/modules/cache/domain/IotFieldInfoCache.java +++ b/das/src/main/java/com/das/modules/cache/domain/IotFieldInfoCache.java @@ -1,5 +1,6 @@ package com.das.modules.cache.domain; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; @Data @@ -10,6 +11,8 @@ public class IotFieldInfoCache { private Integer porder; private Integer highspeed; private String datatype; + private Integer level; + private String stateDesc; public boolean isHighSpeed() { return highspeed.equals(1) && attributeType.equals(138); diff --git a/das/src/main/java/com/das/modules/cache/service/IotModelCache.java b/das/src/main/java/com/das/modules/cache/service/IotModelCache.java index 315538f3..0bc32e6d 100644 --- a/das/src/main/java/com/das/modules/cache/service/IotModelCache.java +++ b/das/src/main/java/com/das/modules/cache/service/IotModelCache.java @@ -1,7 +1,16 @@ package com.das.modules.cache.service; +import com.das.modules.cache.domain.IotFieldInfoCache; +import com.das.modules.equipment.entity.SysIotModel; +import com.das.modules.equipment.entity.SysIotModelField; + public interface IotModelCache { public boolean isHighSpeed(Long modelId, String attr); public boolean isLowSpeed(Long modelId, String attr); public boolean isCalculate(Long modelId, String attr); + void refreshIotFieldCache(SysIotModelField sysIotModelField); + void removeIotFieldCache(Long modelId, String attributeCode); + void refreshIotModelInfoIdMap(SysIotModel sysIotModel); + void removeIotModelInfoIdMap(Long modelId); + IotFieldInfoCache getIotFiledCache(Long modelId,String attr); } diff --git a/das/src/main/java/com/das/modules/cache/service/impl/IotModelCacheImpl.java b/das/src/main/java/com/das/modules/cache/service/impl/IotModelCacheImpl.java index fa302467..449fb3fe 100644 --- a/das/src/main/java/com/das/modules/cache/service/impl/IotModelCacheImpl.java +++ b/das/src/main/java/com/das/modules/cache/service/impl/IotModelCacheImpl.java @@ -3,6 +3,8 @@ package com.das.modules.cache.service.impl; import com.das.modules.cache.domain.IotFieldInfoCache; import com.das.modules.cache.domain.IotModelInfoCache; import com.das.modules.cache.service.IotModelCache; +import com.das.modules.equipment.entity.SysIotModel; +import com.das.modules.equipment.entity.SysIotModelField; import com.das.modules.equipment.mapper.SysIotModelMapper; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; @@ -38,6 +40,8 @@ public class IotModelCacheImpl implements IotModelCache { fieldInfoCache.setAttributeType(item.getAttributeType()); fieldInfoCache.setHighspeed(item.getHighSpeed()); fieldInfoCache.setDatatype(item.getDataType()); + fieldInfoCache.setLevel(item.getLevel()); + fieldInfoCache.setStateDesc(item.getStateDesc()); iotFieldsMap.put(String.format("%d_%s", k, item.getAttributeCode()), fieldInfoCache); }); }); @@ -75,4 +79,42 @@ public class IotModelCacheImpl implements IotModelCache { } return fieldInfoCache.isCalculate(); } + + @Override + public void refreshIotFieldCache(SysIotModelField sysIotModelField) { + IotFieldInfoCache fieldInfoCache = new IotFieldInfoCache(); + fieldInfoCache.setAttributeCode(sysIotModelField.getAttributeCode()); + fieldInfoCache.setPorder(sysIotModelField.getPorder()); + fieldInfoCache.setAttributeName(sysIotModelField.getAttributeName()); + fieldInfoCache.setAttributeType(sysIotModelField.getAttributeType()); + fieldInfoCache.setHighspeed(sysIotModelField.getHighSpeed()); + fieldInfoCache.setDatatype(sysIotModelField.getDataType()); + fieldInfoCache.setLevel(sysIotModelField.getLevel()); + fieldInfoCache.setStateDesc(sysIotModelField.getStateDesc()); + iotFieldsMap.put(String.format("%d_%s", sysIotModelField.getIotModelId(), sysIotModelField.getAttributeCode()), fieldInfoCache); + } + + @Override + public void removeIotFieldCache(Long modelId, String attributeCode){ + iotFieldsMap.remove(String.format("%d_%s", modelId, attributeCode)); + } + + + @Override + public void refreshIotModelInfoIdMap(SysIotModel sysIotModel){ + IotModelInfoCache info = new IotModelInfoCache(); + info.setIotModelId(sysIotModel.getId()); + info.setIodModelCode(sysIotModel.getIotModelCode()); + iotModelInfoIdMap.put(sysIotModel.getId(), info); + } + + @Override + public void removeIotModelInfoIdMap(Long modelId) { + iotModelInfoIdMap.remove(modelId); + } + + @Override + public IotFieldInfoCache getIotFiledCache(Long modelId, String attr) { + return iotFieldsMap.get(String.format("%d_%s", modelId, attr)); + } } diff --git a/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java b/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java index 7e0a3b6c..29087a52 100644 --- a/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java +++ b/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java @@ -10,6 +10,7 @@ import com.das.common.config.SessionUtil; import com.das.common.exceptions.ServiceException; import com.das.common.utils.*; import com.das.modules.auth.domain.vo.SysUserVo; +import com.das.modules.cache.service.CacheService; import com.das.modules.data.service.impl.DataServiceImpl; import com.das.modules.equipment.domain.dto.SysIotModelDto; import com.das.modules.equipment.domain.dto.SysIotModelFieldDto; @@ -65,6 +66,9 @@ public class SysIotModelServiceImpl implements SysIotModelService { @Autowired SysRecordLogService sysRecordLogService; + @Autowired + CacheService cacheService; + public SysIotModelVo creatSysIotModel(SysIotModelDto sysIotModelDto) { SysIotModel sysIotModel = new SysIotModel(); BeanCopyUtils.copy(sysIotModelDto, sysIotModel); @@ -81,7 +85,9 @@ public class SysIotModelServiceImpl implements SysIotModelService { sysIotModel.setRevision(1); sysIotModelMapper.insert(sysIotModel); + //刷新缓存 addModelCache(sysIotModel); + cacheService.getIotModelCache().refreshIotModelInfoIdMap(sysIotModel); SysIotModelVo sysIotModelVo = new SysIotModelVo(); BeanCopyUtils.copy(sysIotModel, sysIotModelVo); sysIotModelVo.setIotModelCode(sysIotModelDto.getIotModelCode()); @@ -119,6 +125,8 @@ public class SysIotModelServiceImpl implements SysIotModelService { throw new RuntimeException("该物模型下面有类型,不能删除"); } sysIotModelMapper.deleteById(sysIotModelDto.getId()); + //刷新缓存 + cacheService.getIotModelCache().removeIotModelInfoIdMap(sysIotModelDto.getId()); deleteModelCache(sysIotModelDto.getId()); } @@ -184,6 +192,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { sysIotModelFieldMapper.insert(sysIotModelField); //新增物模型属性缓存 + cacheService.getIotModelCache().refreshIotFieldCache(sysIotModelField); addModelFieldCache(sysIotModelField); SysIotModelFieldVo sysIotModelFieldVo = new SysIotModelFieldVo(); BeanCopyUtils.copy(sysIotModelField, sysIotModelFieldVo); @@ -216,6 +225,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { if (!oldSysIotField.getAttributeCode().equals(sysIotModelField.getAttributeCode()) || !oldSysIotField.getDataType().equals(sysIotModelField.getDataType()) || Objects.equals(oldSysIotField.getHighSpeed(), sysIotModelField.getHighSpeed())) { //更新td表结构 updateTDStableOrColumn(sysIotModelField, oldSysIotField); + cacheService.getIotModelCache().refreshIotFieldCache(sysIotModelField); updateModelFieldCache(sysIotModelField, oldSysIotField); } sysIotModelFieldMapper.updateById(sysIotModelField); @@ -232,6 +242,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { sysIotModelFieldMapper.deleteById(sysIotModelFieldDto.getId()); //删除物模型属性缓存 + cacheService.getIotModelCache().removeIotFieldCache(sysIotModelField.getIotModelId(), sysIotModelField.getAttributeCode()); deleteModelFieldCache(sysIotModelField); } @@ -488,6 +499,10 @@ public class SysIotModelServiceImpl implements SysIotModelService { } //新增pg数据库 sysIotModelFieldMapper.insertBatch(sysIotModelFieldList); + //刷新缓存 + for (SysIotModelField item : sysIotModelFieldList){ + cacheService.getIotModelCache().refreshIotFieldCache(item); + } } if (CollectionUtils.isNotEmpty(updateSysIotModelFieldList)) { for (SysIotModelField item : updateSysIotModelFieldList) { @@ -496,6 +511,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { if (!oldSysIotField.getAttributeCode().equals(item.getAttributeCode()) && oldSysIotField.getDataType().equals(item.getDataType()) && Objects.equals(oldSysIotField.getHighSpeed(), item.getHighSpeed())) { //更新td表结构 updateTDStableOrColumn(item, oldSysIotField); + cacheService.getIotModelCache().refreshIotFieldCache(item); updateModelFieldCache(item, oldSysIotField); } } @@ -509,6 +525,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { for (SysIotModelField item : delSysIotModelFieldList) { deleteTDStableOrColumn(item); sysIotModelFieldMapper.deleteById(item); + cacheService.getIotModelCache().removeIotFieldCache(item.getIotModelId(), item.getAttributeCode()); deleteModelFieldCache(item); } } diff --git a/das/src/main/java/com/das/modules/node/command/DeviceEventCommand.java b/das/src/main/java/com/das/modules/node/command/DeviceEventCommand.java index 3598a7c9..e8de4c2e 100644 --- a/das/src/main/java/com/das/modules/node/command/DeviceEventCommand.java +++ b/das/src/main/java/com/das/modules/node/command/DeviceEventCommand.java @@ -1,17 +1,17 @@ package com.das.modules.node.command; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.das.common.exceptions.ServiceException; import com.das.common.utils.AdminRedisTemplate; import com.das.common.utils.StringUtils; import com.das.modules.cache.domain.DeviceInfoCache; +import com.das.modules.cache.domain.IotFieldInfoCache; import com.das.modules.cache.service.CacheService; import com.das.modules.data.domain.DeviceEventInfo; import com.das.modules.data.service.TDEngineService; -import com.das.modules.data.service.impl.DataServiceImpl; import com.das.modules.node.constant.NodeConstant; import com.das.modules.node.domain.bo.TerminalMessage; import com.das.modules.node.domain.vo.DeviceEventVo; -import com.das.modules.node.service.NodeMessageService; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -29,9 +29,6 @@ public class DeviceEventCommand implements BaseCommand{ @Autowired AdminRedisTemplate adminRedisTemplate; - @Autowired - private DataServiceImpl dataService; - @Autowired TDEngineService tdEngineService; @@ -72,18 +69,20 @@ public class DeviceEventCommand implements BaseCommand{ deviceEventInfo.setDeviceCode(deviceInfoCache.getDeviceCode()); deviceEventInfo.setFirstTriggeredCode(firstTriggeredCode); String eventType = getEventType(item.getEventType()); - String model = dataService.deviceModelMap.get(item.getDeviceId()); - if (StringUtils.isEmpty(model)) { + Long iotModelId = deviceInfoCache.getIotModelId(); + if (iotModelId == null) { log.debug("未查询到物模型code,设备id:{}", item.getDeviceId()); } - String fieldName = dataService.fieldCodeNameMap.get(model).get(item.getAttrCode()); - if (StringUtils.isEmpty(fieldName)) { - log.debug("未查询到物模型属性code,设备id:{}", item.getDeviceId()); + IotFieldInfoCache iotFiledCache = cacheService.getIotModelCache().getIotFiledCache(iotModelId, item.getAttrCode()); + if (iotFiledCache == null) { + log.debug("未查询到物模型属性,设备id:{},属性AttrCode:{}", item.getDeviceId(),item.getAttrCode()); + throw new ServiceException("未查询到物模型属性,设备id:"+item.getDeviceId()+",属性AttrCode:"+item.getAttrCode()); } + String fieldName = iotFiledCache.getAttributeName(); deviceEventInfo.setEventType(item.getEventType()); deviceEventInfo.setConfirmed(0); if (!StringUtils.isEmpty(eventType) && eventType.equals("遥信变位")) { - String stateDesc = dataService.stateDescMap.get(model).get(item.getAttrCode()); + String stateDesc = iotFiledCache.getStateDesc(); if (item.getAttrValue().equals(0)) { deviceEventInfo.setEventText(item.getAttrCode() + fieldName + " 复归"); if (StringUtils.isNotEmpty(stateDesc)) { @@ -97,7 +96,7 @@ public class DeviceEventCommand implements BaseCommand{ List descList = Arrays.stream(stateDesc.split("\\|")).toList(); deviceEventInfo.setEventText(item.getAttrCode() + fieldName + descList.get(1)); } - Integer level = dataService.eventLevelMap.get(model).get(item.getAttrCode()); + Integer level = iotFiledCache.getLevel(); log.debug("level:{}", level); log.debug("fieldname{}", fieldName); deviceEventInfo.setEventLevel(level == null ? 0 : level);