diff --git a/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/dto/DataArrayLiteDto.java b/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/dto/DataArrayLiteDto.java new file mode 100644 index 0000000..6d5ba2b --- /dev/null +++ b/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/dto/DataArrayLiteDto.java @@ -0,0 +1,15 @@ +package com.njcn.stat.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author 徐扬 + */ +@Data +public class DataArrayLiteDto implements Serializable { + private String name; + private String influxDbName; + private String phase; +} \ No newline at end of file diff --git a/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/enums/StatResponseEnum.java b/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/enums/StatResponseEnum.java index b86c968..d0d3e18 100644 --- a/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/enums/StatResponseEnum.java +++ b/iot-analysis/analysis-stat/stat-api/src/main/java/com/njcn/stat/enums/StatResponseEnum.java @@ -21,7 +21,7 @@ public enum StatResponseEnum { DICT_NULL("A10002","字典数据为空"), LINE_NULL("A10002","监测点为空"), - ARRAY_DATA_NOT_MATCH("A10003","上送数据与模板匹配失败"), + ARRAY_DATA_NOT_MATCH("A10003","上送数据个数与模板指标个数不一致"), ; diff --git a/iot-analysis/analysis-stat/stat-boot/src/main/java/com/njcn/stat/service/impl/StatServiceImpl.java b/iot-analysis/analysis-stat/stat-boot/src/main/java/com/njcn/stat/service/impl/StatServiceImpl.java index 5eb31ad..37ca96b 100644 --- a/iot-analysis/analysis-stat/stat-boot/src/main/java/com/njcn/stat/service/impl/StatServiceImpl.java +++ b/iot-analysis/analysis-stat/stat-boot/src/main/java/com/njcn/stat/service/impl/StatServiceImpl.java @@ -25,6 +25,7 @@ import com.njcn.influx.utils.InfluxDbUtils; import com.njcn.mq.message.AppAutoDataMessage; import com.njcn.redis.pojo.enums.AppRedisKey; import com.njcn.redis.utils.RedisUtil; +import com.njcn.stat.dto.DataArrayLiteDto; import com.njcn.stat.enums.StatResponseEnum; import com.njcn.stat.service.IStatService; import com.njcn.system.enums.DicDataEnum; @@ -66,9 +67,9 @@ public class StatServiceImpl implements IStatService { private final CsCommunicateFeignClient csCommunicateFeignClient; // 本地缓存:模板数据变更极少,60分钟过期足够,最大缓存50000条 - private final Cache> modelCache = Caffeine.newBuilder() - .maximumSize(50000) + private final Cache> modelCache = Caffeine.newBuilder() .expireAfterWrite(60, TimeUnit.MINUTES) + .softValues() .build(); @Override @@ -123,21 +124,22 @@ public class StatServiceImpl implements IStatService { Map map = new Gson().fromJson(String.valueOf(redisUtil.getObjectByKey(AppRedisKey.ELE_EPD_PQD)), Map.class); List recordList = new ArrayList<>(); for (AppAutoDataMessage.DataArray item : list) { + log.info("{}-->处理分钟数据", po.getNdid()); switch (item.getDataAttr()) { case 1: - log.info("{}-->处理最大值", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); + //log.info("{}-->处理最大值", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); dataArrayParam.setStatMethod("max"); break; case 2: - log.info("{}-->处理最小值", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); + //log.info("{}-->处理最小值", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); dataArrayParam.setStatMethod("min"); break; case 3: - log.info("{}-->处理avg", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); + //log.info("{}-->处理avg", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); dataArrayParam.setStatMethod("avg"); break; case 4: - log.info("{}-->处理cp95", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); + //log.info("{}-->处理cp95", po.getNdid() + appAutoDataMessage.getDid() + appAutoDataMessage.getMsg().getClDid()); dataArrayParam.setStatMethod("cp95"); break; default: @@ -146,14 +148,7 @@ public class StatServiceImpl implements IStatService { boolean flag = Objects.equals(DicDataEnum.DEV_CLD.getCode(), code) && Objects.equals(po.getDevAccessMethod(), "CLD"); int clDid = flag?1:appAutoDataMessage.getMsg().getClDid(); String key = AppRedisKey.DEV_MODEL.concat(dataArrayParam.getId() + dataArrayParam.getDid() + clDid + dataArrayParam.getIdx()); -// Object object = redisUtil.getObjectByKey(key); -// List dataArrayList; -// if (Objects.isNull(object)){ -// dataArrayList = saveModelData(dataArrayParam,key); -// } else { -// dataArrayList = objectToList(object); -// } - List dataArrayList = getModelData(dataArrayParam, key); + List dataArrayList = getModelData(dataArrayParam, key); List result = assembleData(lineId,dataArrayList,item,appAutoDataMessage.getMsg().getClDid(),dataArrayParam.getStatMethod(),po.getProcess(),code,po.getDevAccessMethod(),map); recordList.addAll(result); //获取时间 @@ -184,7 +179,6 @@ public class StatServiceImpl implements IStatService { csCommunicateFeignClient.insertion(dto); } } - System.gc(); } @Override @@ -237,14 +231,7 @@ public class StatServiceImpl implements IStatService { boolean flag = Objects.equals(DicDataEnum.DEV_CLD.getCode(), code) && Objects.equals(po.getDevAccessMethod(), "CLD"); int clDid = flag?1:appAutoDataMessage.getMsg().getClDid(); String key = AppRedisKey.DEV_MODEL.concat(dataArrayParam.getId() + dataArrayParam.getDid() + clDid + dataArrayParam.getIdx()); -// Object object = redisUtil.getObjectByKey(key); -// List dataArrayList; -// if (Objects.isNull(object)){ -// dataArrayList = saveModelData(dataArrayParam,key); -// } else { -// dataArrayList = objectToList(object); -// } - List dataArrayList = getModelData(dataArrayParam, key); + List dataArrayList = getModelData(dataArrayParam, key); List result = assembleDdData(lineId,dataArrayList,item,appAutoDataMessage.getMsg().getClDid(),code,po.getDevAccessMethod(),map); recordList.addAll(result); //获取时间 @@ -275,10 +262,8 @@ public class StatServiceImpl implements IStatService { csCommunicateFeignClient.insertion(dto); } } - System.gc(); } - /** * 清理本地模板缓存(由Redis Pub/Sub通知触发) */ @@ -287,23 +272,10 @@ public class StatServiceImpl implements IStatService { modelCache.invalidateAll(); } - /** - * 缓存设备模板信息 - */ - public List saveModelData(DataArrayParam dataArrayParam,String key) { - List dataArrayList = dataArrayFeignClient.findListByParam(dataArrayParam).getData(); - if (CollectionUtil.isEmpty(dataArrayList)){ - throw new BusinessException(StatResponseEnum.DATA_ARRAY_NULL); - } - redisUtil.saveByKey(key,dataArrayList); - return dataArrayList; - } - - /** * influxDB数据组装 */ - public List assembleData(String lineId,List dataArrayList,AppAutoDataMessage.DataArray item,Integer clDid,String statMethod,Integer process,String devType,String accessMethod, Map map) { + public List assembleData(String lineId,List dataArrayList,AppAutoDataMessage.DataArray item,Integer clDid,String statMethod,Integer process,String devType,String accessMethod, Map map) { List records = new ArrayList(); List floats = PubUtils.byteArrayToFloatList(Base64.getDecoder().decode(item.getData())); if (CollectionUtil.isEmpty(floats)){ @@ -363,7 +335,7 @@ public class StatServiceImpl implements IStatService { * 电度influxDB数据组装 * 电度数据15分钟入库一次 */ - public List assembleDdData(String lineId,List dataArrayList,AppAutoDataMessage.DataArray item,Integer clDid,String devType,String accessMethod, Map map) { + public List assembleDdData(String lineId,List dataArrayList,AppAutoDataMessage.DataArray item,Integer clDid,String devType,String accessMethod, Map map) { List records = new ArrayList(); List floats = PubUtils.byteArrayToFloatList(Base64.getDecoder().decode(item.getData())); if (CollectionUtil.isEmpty(floats)){ @@ -404,29 +376,23 @@ public class StatServiceImpl implements IStatService { return records; } - public List objectToList(Object object) { - List urlList = new ArrayList<>(); - if (object != null) { - if (object instanceof ArrayList) { - for (Object o : (List) object) { - urlList.add((CsDataArray) o); - } - } - } - return urlList; - } - - /** - * 获取设备模板信息(本地缓存优先) - */ - public List getModelData(DataArrayParam dataArrayParam, String key) { - List dataArrayList = modelCache.getIfPresent(key); + public List getModelData(DataArrayParam dataArrayParam, String key) { + List result = new ArrayList<>(); + List dataArrayList = modelCache.getIfPresent(key); if (CollectionUtil.isEmpty(dataArrayList)) { - dataArrayList = dataArrayFeignClient.findListByParam(dataArrayParam).getData(); - if (CollectionUtil.isEmpty(dataArrayList)){ + List data = dataArrayFeignClient.findListByParam(dataArrayParam).getData(); + if (CollectionUtil.isEmpty(data)){ throw new BusinessException(StatResponseEnum.DATA_ARRAY_NULL); + } else { + data.forEach(item->{ + DataArrayLiteDto dataArrayLiteDto = new DataArrayLiteDto(); + dataArrayLiteDto.setName(item.getName()); + dataArrayLiteDto.setInfluxDbName(item.getInfluxDbName()); + dataArrayLiteDto.setPhase(item.getPhase()); + result.add(dataArrayLiteDto); + }); } - modelCache.put(key, dataArrayList); + modelCache.put(key, result); } return dataArrayList; }