| 
					
				 | 
			
			
				@@ -1,15 +1,23 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.usky.demo.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSONArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.baomidou.mybatisplus.core.toolkit.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.baomidou.mybatisplus.core.toolkit.Wrappers; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.usky.demo.domain.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.usky.demo.mapper.QueryInfluxdbDataMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.usky.demo.service.DmpDeviceService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.usky.demo.service.DmpProductService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.usky.demo.service.QueryInfluxdbDataService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.usky.common.mybatis.core.AbstractCrudService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.usky.demo.service.rocketmq.MyProducer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.usky.demo.service.utils.TsdbUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.usky.demo.service.vo.DeviceMapVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.usky.demo.service.vo.ProductMapVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.influxdb.dto.QueryResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.cache.annotation.Cacheable; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.annotation.Resource; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -30,41 +38,93 @@ import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInfluxdbDataMapper, QueryInfluxdbData> implements QueryInfluxdbDataService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private TsdbUtils tsdbUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private DmpProductService dmpProductService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private DmpDeviceService dmpDeviceService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private MyProducer myProducer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public Map<String,Object> sendDeviceData(DeviceDataWriteVO writeVO){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String,Object> rec_map = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        DeviceDataInfoVO dataInfo = new DeviceDataInfoVO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String,Object> metrics = writeVO.getMetrics(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String,String> tags = writeVO.getTags(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(metrics.size() > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Map<String,Object> mp = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for(Map.Entry<String,Object> map:metrics.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                mp.put(map.getKey(),map.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataInfo.setMetrics(mp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if(tags != null && tags.size() > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                mp.clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for(Map.Entry<String,String> map:tags.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    mp.put(map.getKey(),map.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                dataInfo.setTags(mp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                dataInfo.setTags(new HashMap<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//    public Map<String,Object> sendDeviceData(DeviceDataWriteVO writeVO){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        Map<String,Object> rec_map = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        DeviceDataInfoVO dataInfo = new DeviceDataInfoVO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        Map<String,Object> metrics = writeVO.getMetrics(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        Map<String,String> tags = writeVO.getTags(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if(metrics.size() > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            Map<String,Object> mp = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            for(Map.Entry<String,Object> map:metrics.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                mp.put(map.getKey(),map.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            dataInfo.setMetrics(mp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            if(tags != null && tags.size() > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                mp.clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                for(Map.Entry<String,String> map:tags.entrySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    mp.put(map.getKey(),map.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                dataInfo.setTags(mp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                dataInfo.setTags(new HashMap<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            dataInfo.setProduct_code(writeVO.getProductCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            dataInfo.setDevice_id(writeVO.getDeviceId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            dataInfo.setTimestamp(writeVO.getTimestamp()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            myProducer.sendMessage("data-collector", JSONArray.toJSON(dataInfo).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        rec_map.put("code",200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        rec_map.put("message","操作成功!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        return rec_map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Cacheable(cacheNames = "productList",sync = true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public Map<String, ProductMapVO> getProductMap(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String,ProductMapVO> productMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LambdaQueryWrapper<DmpProduct> queryWrapper = Wrappers.lambdaQuery(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        queryWrapper.eq(DmpProduct::getDeleteFlag,0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .orderByDesc(DmpProduct::getId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DmpProduct> list = dmpProductService.list(queryWrapper); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(CollectionUtils.isNotEmpty(list)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (int i = 0; i < list.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String productCode = list.get(i).getProductCode(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ProductMapVO mapVO = new ProductMapVO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setProductId(list.get(i).getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setProductCode(list.get(i).getProductCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setCreatedBy(list.get(i).getCreatedBy()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setTenantId(list.get(i).getTenantId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setDeviceType(list.get(i).getDeviceType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                productMap.put(productCode,mapVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataInfo.setProduct_code(writeVO.getProductCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataInfo.setDevice_id(writeVO.getDeviceId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataInfo.setTimestamp(writeVO.getTimestamp()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            myProducer.sendMessage("data-collector", JSONArray.toJSON(dataInfo).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return productMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Cacheable(cacheNames = "deviceList",sync = true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public Map<String, DeviceMapVO> getDeviceMap(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String,DeviceMapVO> deviceMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LambdaQueryWrapper<DmpDevice> queryWrapper = Wrappers.lambdaQuery(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        queryWrapper.eq(DmpDevice::getDeleteFlag,0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .orderByDesc(DmpDevice::getId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DmpDevice> list = dmpDeviceService.list(queryWrapper); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(CollectionUtils.isNotEmpty(list)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (int i = 0; i < list.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String deviceId = list.get(i).getDeviceId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DeviceMapVO mapVO = new DeviceMapVO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setProductCode(list.get(i).getProductCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setDeviceId(list.get(i).getDeviceId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setDeviceUuid(list.get(i).getDeviceUuid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                mapVO.setDeviceStatus(list.get(i).getServiceStatus()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                deviceMap.put(deviceId,mapVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        rec_map.put("code",200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        rec_map.put("message","操作成功!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return rec_map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return deviceMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -180,4 +240,118 @@ public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInflu 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return list; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public LastResultVO queryOuterLastDeviceData(String productCode, String deviceId){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String tableName = productCode + "_" + deviceId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Map<String, Object>> metrics = tsdbUtils.fetchRecords(query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LastResultVO resultVO = new LastResultVO(deviceId,metrics); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return resultVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<LastResultVO> queryOuterLastDeviceData(LastRequestVO requestVO){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<LastResultVO> result = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String productCode = requestVO.getProductCode(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> deviceIds = requestVO.getDeviceId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(CollectionUtils.isNotEmpty(deviceIds)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (int i = 0; i < deviceIds.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String tableName = productCode + "_" + deviceIds.get(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<Map<String, Object>> metrics = tsdbUtils.fetchRecords(query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                LastResultVO resultVO = new LastResultVO(deviceIds.get(i),metrics); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                result.add(resultVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public HistoryResultVO queryOuterHistoryDeviceData(String productCode,String deviceId,String startTime,String endTime){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<MetricVO> metricList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String tableName = productCode + "_" + deviceId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QueryResult queryResult = tsdbUtils.query(query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(queryResult.getResults().get(0).getSeries() != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<String> fields = queryResult.getResults().get(0).getSeries().get(0).getColumns(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(CollectionUtils.isNotEmpty(fields)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String fieldQuery = "SELECT *::field FROM \""+tableName+"\" where time >= '"+startTime+"' and time <= '"+endTime+"' tz('Asia/Shanghai')"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<Map<String,Object>> metircs = tsdbUtils.fetchRecords(fieldQuery); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(CollectionUtils.isNotEmpty(metircs)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (int j = 0; j < fields.size(); j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        List<Map<String,Object>> metircItems = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(!"time".equals(fields.get(j))){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (int k = 0; k < metircs.size(); k++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                String field = fields.get(j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                Map<String,Object> map = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                map.put("timestamp",metircs.get(k).get("time")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                map.put("value",metircs.get(k).get(field)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                metircItems.add(map); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            MetricVO metricVO = new MetricVO(fields.get(j),metircItems); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            metricList.add(metricVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        HistoryResultVO resultVO = new HistoryResultVO(deviceId,metricList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return resultVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<HistoryResultVO> queryOuterHistoryDeviceData(HistoryRequestVO requestVO){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<HistoryResultVO> list = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String productCode = requestVO.getProductCode(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> deviceIds = requestVO.getDeviceId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String startTime = requestVO.getStartTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String endTime = requestVO.getEndTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int i = 0; i < deviceIds.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<MetricVO> metricList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String tableName = productCode + "_" + deviceIds.get(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            QueryResult queryResult = tsdbUtils.query(query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(queryResult.getResults().get(0).getSeries() != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<String> fields = queryResult.getResults().get(0).getSeries().get(0).getColumns(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(CollectionUtils.isNotEmpty(fields)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    String fieldQuery = "SELECT *::field FROM \""+tableName+"\" where time >= '"+startTime+"' and time <= '"+endTime+"' tz('Asia/Shanghai')"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<Map<String,Object>> metircs = tsdbUtils.fetchRecords(fieldQuery); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(CollectionUtils.isNotEmpty(metircs)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (int j = 0; j < fields.size(); j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            List<Map<String,Object>> metircItems = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if(!"time".equals(fields.get(j))){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                for (int k = 0; k < metircs.size(); k++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    String field = fields.get(j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    Map<String,Object> map = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    map.put("timestamp",metircs.get(k).get("time")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    map.put("value",metircs.get(k).get(field)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    metircItems.add(map); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                MetricVO metricVO = new MetricVO(fields.get(j),metircItems); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                metricList.add(metricVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            HistoryResultVO resultVO = new HistoryResultVO(deviceIds.get(i),metricList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            list.add(resultVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return list; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |