Commit 099ad97174bea62e6f9c1813324b938887d83287

Authored by 云中非
2 parents 2ac0685a 9c674bc3

Merge branch 'master' into 20221221

@@ -17,6 +17,15 @@ public class HomeDeviceInfoDTO { @@ -17,6 +17,15 @@ public class HomeDeviceInfoDTO {
17 @ApiModelProperty("未激活设备数量") 17 @ApiModelProperty("未激活设备数量")
18 private Integer inActive; 18 private Integer inActive;
19 19
  20 + @ApiModelProperty("未激活设备数量")
  21 + private Integer gateWay;
  22 +
  23 + @ApiModelProperty("未激活设备数量")
  24 + private Integer directConnection;
  25 +
  26 + @ApiModelProperty("未激活设备数量")
  27 + private Integer sensor;
  28 +
20 @ApiModelProperty("今日新增设备数量") 29 @ApiModelProperty("今日新增设备数量")
21 private Integer todayAdd; 30 private Integer todayAdd;
22 31
@@ -26,6 +35,8 @@ public class HomeDeviceInfoDTO { @@ -26,6 +35,8 @@ public class HomeDeviceInfoDTO {
26 this.offLine = defaultValue; 35 this.offLine = defaultValue;
27 this.inActive = defaultValue; 36 this.inActive = defaultValue;
28 this.todayAdd = defaultValue; 37 this.todayAdd = defaultValue;
  38 + this.gateWay = defaultValue;
  39 + this.directConnection = defaultValue;
  40 + this.sensor = defaultValue;
29 } 41 }
30 -  
31 } 42 }
@@ -19,6 +19,9 @@ public class HomePageLeftTopDTO { @@ -19,6 +19,9 @@ public class HomePageLeftTopDTO {
19 @ApiModelProperty("客户统计") 19 @ApiModelProperty("客户统计")
20 private BaseHomePageTop customerInfo; 20 private BaseHomePageTop customerInfo;
21 21
  22 + @ApiModelProperty("产品统计")
  23 + private BaseHomePageTop productInfo;
  24 +
22 @ApiModelProperty("消息统计") 25 @ApiModelProperty("消息统计")
23 private HomePageTopMessage messageInfo; 26 private HomePageTopMessage messageInfo;
24 } 27 }
@@ -224,7 +224,7 @@ public class TkDeviceProfileServiceImpl @@ -224,7 +224,7 @@ public class TkDeviceProfileServiceImpl
224 baseMapper.selectList( 224 baseMapper.selectList(
225 new LambdaQueryWrapper<TkDeviceProfileEntity>() 225 new LambdaQueryWrapper<TkDeviceProfileEntity>()
226 .eq(TkDeviceProfileEntity::getTenantId, tenantId) 226 .eq(TkDeviceProfileEntity::getTenantId, tenantId)
227 - .eq(null !=deviceType,TkDeviceProfileEntity::getDeviceType,deviceType) 227 + .eq(null != deviceType, TkDeviceProfileEntity::getDeviceType, deviceType)
228 .in(TkDeviceProfileEntity::getId, deviceProfileIds)); 228 .in(TkDeviceProfileEntity::getId, deviceProfileIds));
229 if (null != entities && !entities.isEmpty()) { 229 if (null != entities && !entities.isEmpty()) {
230 return entities.stream() 230 return entities.stream()
@@ -252,4 +252,18 @@ public class TkDeviceProfileServiceImpl @@ -252,4 +252,18 @@ public class TkDeviceProfileServiceImpl
252 .map(obj -> obj.getDTO(DeviceProfileDTO.class)) 252 .map(obj -> obj.getDTO(DeviceProfileDTO.class))
253 .collect(Collectors.toList()); 253 .collect(Collectors.toList());
254 } 254 }
  255 +
  256 + @Override
  257 + public List<DeviceProfileDTO> findDeviceProfile(String tenantId) {
  258 + List<TkDeviceProfileEntity> entityList =
  259 + baseMapper.selectList(
  260 + new LambdaQueryWrapper<TkDeviceProfileEntity>()
  261 + .eq(TkDeviceProfileEntity::getTenantId, tenantId));
  262 + if (null != entityList && !entityList.isEmpty()) {
  263 + return entityList.stream()
  264 + .map(obj -> obj.getDTO(DeviceProfileDTO.class))
  265 + .collect(Collectors.toList());
  266 + }
  267 + return null;
  268 + }
255 } 269 }
@@ -31,6 +31,7 @@ import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper; @@ -31,6 +31,7 @@ import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper;
31 import org.thingsboard.server.dao.yunteng.mapper.UserMapper; 31 import org.thingsboard.server.dao.yunteng.mapper.UserMapper;
32 import org.thingsboard.server.dao.yunteng.mapper.TkAlarmMapper; 32 import org.thingsboard.server.dao.yunteng.mapper.TkAlarmMapper;
33 import org.thingsboard.server.dao.yunteng.service.HomePageService; 33 import org.thingsboard.server.dao.yunteng.service.HomePageService;
  34 +import org.thingsboard.server.dao.yunteng.service.TkDeviceProfileService;
34 import org.thingsboard.server.dao.yunteng.service.TkTenantService; 35 import org.thingsboard.server.dao.yunteng.service.TkTenantService;
35 import org.thingsboard.server.dao.yunteng.service.TkUserService; 36 import org.thingsboard.server.dao.yunteng.service.TkUserService;
36 37
@@ -42,694 +43,856 @@ import java.util.*; @@ -42,694 +43,856 @@ import java.util.*;
42 import java.util.concurrent.CompletableFuture; 43 import java.util.concurrent.CompletableFuture;
43 import java.util.concurrent.ExecutionException; 44 import java.util.concurrent.ExecutionException;
44 import java.util.concurrent.atomic.AtomicInteger; 45 import java.util.concurrent.atomic.AtomicInteger;
  46 +import java.util.concurrent.atomic.AtomicReference;
45 import java.util.stream.Collectors; 47 import java.util.stream.Collectors;
46 48
47 @Service 49 @Service
48 @RequiredArgsConstructor 50 @RequiredArgsConstructor
49 public class TkHomePageServiceImpl implements HomePageService { 51 public class TkHomePageServiceImpl implements HomePageService {
50 52
51 - private final DeviceMapper deviceMapper;  
52 -  
53 - private final TkTenantService tenantService;  
54 -  
55 - private final UserMapper userMapper;  
56 -  
57 - private final EntityService entityService;  
58 -  
59 - private final ApiUsageStateService apiUsageStateService;  
60 -  
61 - private final TimeseriesService timeseriesService;  
62 -  
63 - private final TkUserService tkUserService;  
64 -  
65 - private final TkAlarmMapper ytJpaAarmDao;  
66 -  
67 - @Override  
68 - public HomePageLeftTopDTO getHomePageLeftTopInfo(boolean isPtSysAdmin, boolean isPtAdmin, boolean isTenantAdmin, String tenantId, String currentUserId) throws ExecutionException, InterruptedException {  
69 - // 如果当前用户是超级管理员或平台管理员,查询所有的设备数量、租户数量、客户数量  
70 - // 如果当前用户是租户管理员,查询租户下的所有设备、告警、消息量  
71 - // 如果当前用户是客户,查询客户可以查看的设备、告警、消息量  
72 - HomePageLeftTopDTO homePageLeftTopDTO = new HomePageLeftTopDTO();  
73 - HomeDeviceInfoDTO homeDeviceInfo;  
74 - LocalDateTime nowTime = LocalDateTime.now();  
75 - LocalDateTime startTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MIN);  
76 - LocalDateTime endTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MAX);  
77 - HomePageTopMessage messageInfo = new HomePageTopMessage(FastIotConstants.MagicNumber.ZERO);  
78 - BaseHomePageTop alarm = new BaseHomePageTop(FastIotConstants.MagicNumber.ZERO);  
79 - Map<String, Object> queryMap = new HashMap<>();  
80 - List<DeviceDTO> deviceList;  
81 - if (isPtSysAdmin || isPtAdmin) {  
82 - setTenantInfoData(homePageLeftTopDTO, startTime, endTime);  
83 - setCustomerInfoData(homePageLeftTopDTO, startTime, endTime);  
84 - } else if (isTenantAdmin) {  
85 - queryMap.put("tenantId", tenantId);  
86 - setAlarmAndMessageInfo(tenantId, messageInfo, alarm);  
87 -  
88 - } else {  
89 - String customerId = userMapper.findCustomerIdByUserId(currentUserId);  
90 - if (StringUtils.isNotEmpty(customerId)) {  
91 - // 查询customerId  
92 - queryMap.put("customerId", customerId);  
93 - long startTs = startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();  
94 - List<BaseHomePageTop> baseHomePageTopList = deviceMapper.findDeviceMessageInfo(startTs, customerId);  
95 - if (baseHomePageTopList.size() > FastIotConstants.MagicNumber.ZERO) {  
96 - messageInfo.setMessageCount(baseHomePageTopList.get(0).getSumCount());  
97 - messageInfo.setTodayMessageAdd(baseHomePageTopList.get(0).getTodayAdd());  
98 - }  
99 - List<BaseHomePageTop> alarmList = deviceMapper.findDeviceAlarmInfoByCustomer(startTs, customerId);  
100 - if (alarmList.size() > FastIotConstants.MagicNumber.ZERO) {  
101 - alarm.setSumCount(alarmList.get(0).getSumCount());  
102 - alarm.setTodayAdd(alarmList.get(0).getTodayAdd());  
103 - }  
104 - } 53 + private final DeviceMapper deviceMapper;
  54 +
  55 + private final TkTenantService tenantService;
  56 +
  57 + private final UserMapper userMapper;
  58 +
  59 + private final EntityService entityService;
  60 +
  61 + private final ApiUsageStateService apiUsageStateService;
  62 +
  63 + private final TimeseriesService timeseriesService;
  64 +
  65 + private final TkUserService tkUserService;
  66 +
  67 + private final TkAlarmMapper ytJpaAarmDao;
  68 +
  69 + private final TkDeviceProfileService tkDeviceProfileService;
  70 +
  71 + @Override
  72 + public HomePageLeftTopDTO getHomePageLeftTopInfo(
  73 + boolean isPtSysAdmin,
  74 + boolean isPtAdmin,
  75 + boolean isTenantAdmin,
  76 + String tenantId,
  77 + String currentUserId)
  78 + throws ExecutionException, InterruptedException {
  79 + // 如果当前用户是超级管理员或平台管理员,查询所有的设备数量、租户数量、客户数量
  80 + // 如果当前用户是租户管理员,查询租户下的所有设备、告警、消息量
  81 + // 如果当前用户是客户,查询客户可以查看的设备、告警、消息量
  82 + HomePageLeftTopDTO homePageLeftTopDTO = new HomePageLeftTopDTO();
  83 + HomeDeviceInfoDTO homeDeviceInfo;
  84 + LocalDateTime nowTime = LocalDateTime.now();
  85 + LocalDateTime startTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MIN);
  86 + LocalDateTime endTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MAX);
  87 + HomePageTopMessage messageInfo = new HomePageTopMessage(FastIotConstants.MagicNumber.ZERO);
  88 + BaseHomePageTop alarm = new BaseHomePageTop(FastIotConstants.MagicNumber.ZERO);
  89 + BaseHomePageTop product = new BaseHomePageTop(FastIotConstants.MagicNumber.ZERO);
  90 + Map<String, Object> queryMap = new HashMap<>();
  91 + String customerId = null;
  92 + List<DeviceDTO> deviceList;
  93 + if (isPtSysAdmin || isPtAdmin) {
  94 + setTenantInfoData(homePageLeftTopDTO, startTime, endTime);
  95 + setCustomerInfoData(homePageLeftTopDTO, startTime, endTime);
  96 + } else if (isTenantAdmin) {
  97 + queryMap.put("tenantId", tenantId);
  98 + setAlarmAndMessageInfo(tenantId, messageInfo, alarm);
  99 +
  100 + } else {
  101 + customerId = userMapper.findCustomerIdByUserId(currentUserId);
  102 + if (StringUtils.isNotEmpty(customerId)) {
  103 + // 查询customerId
  104 + queryMap.put("customerId", customerId);
  105 + long startTs = startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  106 + List<BaseHomePageTop> baseHomePageTopList =
  107 + deviceMapper.findDeviceMessageInfo(startTs, customerId);
  108 + if (baseHomePageTopList.size() > FastIotConstants.MagicNumber.ZERO) {
  109 + messageInfo.setMessageCount(baseHomePageTopList.get(0).getSumCount());
  110 + messageInfo.setTodayMessageAdd(baseHomePageTopList.get(0).getTodayAdd());
105 } 111 }
106 - deviceList = deviceMapper.findDevices(queryMap);  
107 - homeDeviceInfo = new HomeDeviceInfoDTO(FastIotConstants.MagicNumber.ZERO);  
108 - if (null != deviceList) {  
109 - setDeviceInfoData(deviceList, homeDeviceInfo); 112 + List<BaseHomePageTop> alarmList =
  113 + deviceMapper.findDeviceAlarmInfoByCustomer(startTs, customerId);
  114 + if (alarmList.size() > FastIotConstants.MagicNumber.ZERO) {
  115 + alarm.setSumCount(alarmList.get(0).getSumCount());
  116 + alarm.setTodayAdd(alarmList.get(0).getTodayAdd());
110 } 117 }
111 - homePageLeftTopDTO.setDeviceInfo(homeDeviceInfo);  
112 - homePageLeftTopDTO.setMessageInfo(messageInfo);  
113 - homePageLeftTopDTO.setAlarmInfo(alarm);  
114 - return homePageLeftTopDTO; 118 + }
115 } 119 }
116 -  
117 - @Override  
118 - public HomePageAppDTO app(Boolean login,boolean isPtSysAdmin, boolean isPtAdmin, boolean isTenantAdmin, EntityId tenantId, EntityId customerId) {  
119 - /**  
120 - * 如果当前用户是超级管理员或平台管理员,查询所有的租户数量、客户、设备  
121 - * 如果当前用户是租户管理员,查询租户下的所有 客户、设备、告警、消息量  
122 - * 如果当前用户是客户,查询客户可以查看的 设备、告警、消息量  
123 - */  
124 - LocalDateTime nowTime = LocalDateTime.now();  
125 - LocalDateTime startTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MIN);  
126 - LocalDateTime endTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MAX);  
127 - EntityId entityId = customerId;  
128 - if(isPtSysAdmin || isPtAdmin){  
129 - entityId = null;  
130 - }else if(isTenantAdmin){  
131 - entityId = tenantId;  
132 - }  
133 -  
134 - Map<String, Object> totalFilter = buildCountFilter(entityId,null,null);  
135 - Map<String, Object> todayFilter = buildCountFilter(entityId,startTime,endTime);  
136 -  
137 - HomePageAppDTO app = new HomePageAppDTO();  
138 -  
139 - if (!isPtSysAdmin && !isPtAdmin ) {  
140 - app.setTotalAlarm(getAlarmInfo(totalFilter));  
141 - app.setTodayAlarm(getAlarmInfo(todayFilter));  
142 - }  
143 - if(login){  
144 - return app;  
145 - }  
146 -  
147 - if (isPtSysAdmin || isPtAdmin) {  
148 - List<TenantDTO> tenants = getTenantInfo();  
149 - AtomicInteger totalExpired = new AtomicInteger();  
150 - AtomicInteger totalNormal = new AtomicInteger();  
151 - int todayAdd = (int) tenants.stream().filter(tenant -> {  
152 - if(tenant.getTenantExpireTime()==null || tenant.getTenantExpireTime().isAfter(nowTime)){  
153 - totalNormal.getAndIncrement();  
154 - }else{  
155 - totalExpired.getAndIncrement();  
156 - }  
157 - return tenant.getCreateTime().isAfter(startTime) && tenant.getCreateTime().isBefore(endTime);  
158 - }).count();  
159 -  
160 - TenantStatisticsDTO today = new TenantStatisticsDTO(0);  
161 - today.setTotal(todayAdd);  
162 - app.setTodayTenant(today);  
163 -  
164 - TenantStatisticsDTO total = new TenantStatisticsDTO(0);  
165 - total.setTotal(tenants.size());  
166 - total.setExpired(totalExpired.get());  
167 - total.setNormal(totalNormal.get());  
168 - app.setTotalTenant(total);  
169 - }  
170 -  
171 - if (isPtSysAdmin || isPtAdmin || isTenantAdmin) {  
172 - List<UserDetailsDTO> customers = getCustomerInfo(totalFilter);  
173 - AtomicInteger totalExpired = new AtomicInteger();  
174 - AtomicInteger totalNormal = new AtomicInteger();  
175 - AtomicInteger totalActivity = new AtomicInteger();  
176 - int todayAdd = (int) customers.stream().filter(customer -> {  
177 - if(customer.isEnabled()  
178 - && (customer.getAccountExpireTime() == null|| customer.getAccountExpireTime().isAfter(nowTime))  
179 - && customer.getTenant().isEnabled()  
180 - && (customer.getTenant().getTenantExpireTime() == null|| customer.getTenant().getTenantExpireTime().isAfter(nowTime))  
181 - ){  
182 - totalNormal.getAndIncrement();  
183 - }else{  
184 - totalExpired.getAndIncrement();  
185 - }  
186 - if(customer.getUpdateTime() != null && endTime.isAfter(customer.getUpdateTime()) && startTime.isBefore(customer.getUpdateTime())){  
187 - totalActivity.incrementAndGet();  
188 - }  
189 -  
190 - return customer.getCreateTime().isAfter(startTime) && customer.getCreateTime().isBefore(endTime);  
191 - }).count();  
192 -  
193 - CustomerStatisticsDTO today = new CustomerStatisticsDTO(0);  
194 - today.setTotal(todayAdd);  
195 - CustomerStatisticsDTO total = new CustomerStatisticsDTO(0);  
196 - total.setTotal(customers.size());  
197 - total.setLoginUse(totalActivity.get());  
198 - total.setNormal(totalNormal.get());  
199 - total.setCancellation(totalExpired.get());  
200 - app.setTotalCustomer(total);  
201 - app.setTodayCustomer(today);  
202 - }  
203 -  
204 -  
205 -  
206 - if (!isPtSysAdmin && !isPtAdmin ) {  
207 - app.setTotalMsg(getFlowStatistics(totalFilter));  
208 - app.setTodayMsg(getFlowStatistics(todayFilter)); 120 + deviceList = deviceMapper.findDevices(queryMap);
  121 + homeDeviceInfo = new HomeDeviceInfoDTO(FastIotConstants.MagicNumber.ZERO);
  122 + if (null != deviceList) {
  123 + setDeviceInfoData(deviceList, homeDeviceInfo);
  124 + }
  125 + if (!isPtSysAdmin && !isPtAdmin) {
  126 + List<DeviceProfileDTO> deviceProfileDTOList = null;
  127 + if (isTenantAdmin) {
  128 + deviceProfileDTOList = tkDeviceProfileService.findDeviceProfile(tenantId);
  129 +
  130 + } else {
  131 + if (StringUtils.isNotEmpty(customerId)) {
  132 + deviceProfileDTOList =
  133 + tkDeviceProfileService.findCustomerDeviceProfiles(
  134 + tenantId, new CustomerId(UUID.fromString(customerId)), null);
209 } 135 }
210 -  
211 - List<DeviceDTO> devices = getDeviceInfo(todayFilter);  
212 - AtomicInteger totalOnline = new AtomicInteger();  
213 - AtomicInteger totalOffline = new AtomicInteger();  
214 - AtomicInteger totalinactive = new AtomicInteger();  
215 - int todayAdd = (int) devices.stream().filter(device -> {  
216 - switch (device.getDeviceState()){  
217 - case ONLINE:  
218 - totalOnline.incrementAndGet();  
219 - break;  
220 - case OFFLINE:  
221 - totalOffline.incrementAndGet();  
222 - break;  
223 - case INACTIVE:  
224 - totalinactive.incrementAndGet();  
225 - break;  
226 - }  
227 -  
228 - return device.getCreateTime().isAfter(startTime) && device.getCreateTime().isBefore(endTime);  
229 - }).count();  
230 - DeviceStatisticsDTO today = new DeviceStatisticsDTO(0);  
231 - today.setTotal(todayAdd);  
232 - DeviceStatisticsDTO total = new DeviceStatisticsDTO(0);  
233 - total.setTotal(devices.size());  
234 - total.setInActive(totalinactive.get());  
235 - total.setOffLine(totalOffline.get());  
236 - total.setOnLine(totalOnline.get());  
237 - app.setTotalDevice(total);  
238 - app.setTodayDevice(today);  
239 -  
240 -  
241 - return app; 136 + }
  137 + int todayAdd = 0;
  138 + if (!deviceProfileDTOList.isEmpty()) {
  139 + todayAdd =
  140 + (int)
  141 + deviceProfileDTOList.stream()
  142 + .filter(
  143 + item ->
  144 + item.getCreateTime().isBefore(startTime)
  145 + && item.getCreateTime().isAfter(endTime))
  146 + .count();
  147 + }
  148 + product.setSumCount(deviceProfileDTOList.size());
  149 + product.setTodayAdd(todayAdd);
  150 + homePageLeftTopDTO.setProductInfo(product);
242 } 151 }
  152 + homePageLeftTopDTO.setDeviceInfo(homeDeviceInfo);
  153 + homePageLeftTopDTO.setMessageInfo(messageInfo);
  154 + homePageLeftTopDTO.setAlarmInfo(alarm);
  155 + return homePageLeftTopDTO;
  156 + }
  157 +
  158 + @Override
  159 + public HomePageAppDTO app(
  160 + Boolean login,
  161 + boolean isPtSysAdmin,
  162 + boolean isPtAdmin,
  163 + boolean isTenantAdmin,
  164 + EntityId tenantId,
  165 + EntityId customerId) {
243 /** 166 /**
244 - * 获取当前用户权限下的租户信息  
245 - *  
246 - * @return 167 + * 如果当前用户是超级管理员或平台管理员,查询所有的租户数量、客户、设备 如果当前用户是租户管理员,查询租户下的所有 客户、设备、告警、消息量 如果当前用户是客户,查询客户可以查看的
  168 + * 设备、告警、消息量
247 */ 169 */
248 - private List<TenantDTO> getTenantInfo() {  
249 - List<TenantDTO> tenants = tenantService.getAllTenant();  
250 - return tenants; 170 + LocalDateTime nowTime = LocalDateTime.now();
  171 + LocalDateTime startTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MIN);
  172 + LocalDateTime endTime = LocalDateTime.of(nowTime.toLocalDate(), LocalTime.MAX);
  173 + EntityId entityId = customerId;
  174 + if (isPtSysAdmin || isPtAdmin) {
  175 + entityId = null;
  176 + } else if (isTenantAdmin) {
  177 + entityId = tenantId;
251 } 178 }
252 179
  180 + Map<String, Object> totalFilter = buildCountFilter(entityId, null, null);
  181 + Map<String, Object> todayFilter = buildCountFilter(entityId, startTime, endTime);
253 182
  183 + HomePageAppDTO app = new HomePageAppDTO();
254 184
255 - /**  
256 - * 统计数据的过滤参数  
257 - * @param entityId 实体ID,例如:租户ID、客户ID  
258 - * @param startTime 数据开始时间  
259 - * @param endTime 数据结束时间  
260 - * @return  
261 - */  
262 - private Map<String, Object> buildCountFilter(EntityId entityId,LocalDateTime startTime,LocalDateTime endTime){  
263 - Map<String, Object> filter = new HashMap<>();  
264 - if(entityId != null){  
265 - String idStr = entityId.getId().toString();  
266 - switch (entityId.getEntityType()){  
267 - case TENANT:  
268 - filter.put("tenantId", idStr);  
269 - break;  
270 - case CUSTOMER:  
271 - filter.put("customerId", idStr);  
272 - break;  
273 - default:  
274 - }  
275 - }  
276 - if(startTime !=null){  
277 - filter.put("startTime", startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());  
278 - }  
279 - if(endTime !=null){  
280 - filter.put("startTime", endTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());  
281 - }  
282 -  
283 - return filter; 185 + if (!isPtSysAdmin && !isPtAdmin) {
  186 + app.setTotalAlarm(getAlarmInfo(totalFilter));
  187 + app.setTodayAlarm(getAlarmInfo(todayFilter));
284 } 188 }
285 - /**  
286 - * 获取当前用户权限下的客户信息  
287 - *  
288 - * @return  
289 - */  
290 - private List<UserDetailsDTO> getCustomerInfo(Map<String, Object> filter) {  
291 - List<UserDetailsDTO> userList = userMapper.findCustomers(filter);  
292 - return userList; 189 + if (login) {
  190 + return app;
293 } 191 }
294 - /**  
295 - * 查询实体ID的设备  
296 - * @param filter 数据过滤参数  
297 - * @return  
298 - */  
299 - private List<DeviceDTO> getDeviceInfo(Map<String, Object> filter) {  
300 - List<DeviceDTO> deviceDTOS = deviceMapper.findDevices(filter);;  
301 - return deviceDTOS; 192 +
  193 + if (isPtSysAdmin || isPtAdmin) {
  194 + List<TenantDTO> tenants = tenantService.getAllTenant();
  195 + AtomicInteger totalExpired = new AtomicInteger();
  196 + AtomicInteger totalNormal = new AtomicInteger();
  197 + int todayAdd =
  198 + (int)
  199 + tenants.stream()
  200 + .filter(
  201 + tenant -> {
  202 + if (tenant.getTenantExpireTime() == null
  203 + || tenant.getTenantExpireTime().isAfter(nowTime)) {
  204 + totalNormal.getAndIncrement();
  205 + } else {
  206 + totalExpired.getAndIncrement();
  207 + }
  208 + return tenant.getCreateTime().isAfter(startTime)
  209 + && tenant.getCreateTime().isBefore(endTime);
  210 + })
  211 + .count();
  212 +
  213 + TenantStatisticsDTO today = new TenantStatisticsDTO(0);
  214 + today.setTotal(todayAdd);
  215 + app.setTodayTenant(today);
  216 +
  217 + TenantStatisticsDTO total = new TenantStatisticsDTO(0);
  218 + total.setTotal(tenants.size());
  219 + total.setExpired(totalExpired.get());
  220 + total.setNormal(totalNormal.get());
  221 + app.setTotalTenant(total);
302 } 222 }
303 223
304 - /**  
305 - * 统计实体的告警信息  
306 - * @param filter 数据过滤参数  
307 - * @return  
308 - */  
309 - private AlarmStatisticsDTO getAlarmInfo(Map<String, Object> filter) {  
310 - List<AggregationDTO> alarms = ytJpaAarmDao.countAlarms(filter);  
311 - AlarmStatisticsDTO statistics = new AlarmStatisticsDTO(0);  
312 - int totalActived = 0;  
313 - int total = 0;  
314 - for(AggregationDTO item:alarms){  
315 - AlarmStatus status = AlarmStatus.valueOf(item.getKey());  
316 - total += item.getValue();  
317 - switch (status){  
318 - case CLEARED_UNACK:  
319 - statistics.setClearedUnack(item.getValue());  
320 - break;  
321 - case CLEARED_ACK:  
322 - statistics.setClearedAck(item.getValue());  
323 - break;  
324 - case ACTIVE_ACK:  
325 - totalActived +=item.getValue();  
326 - break;  
327 - case ACTIVE_UNACK:  
328 - totalActived +=item.getValue();  
329 - break; 224 + if (isPtSysAdmin || isPtAdmin || isTenantAdmin) {
  225 + List<UserDetailsDTO> customers = getCustomerInfo(totalFilter);
  226 + AtomicInteger totalExpired = new AtomicInteger();
  227 + AtomicInteger totalNormal = new AtomicInteger();
  228 + AtomicInteger totalActivity = new AtomicInteger();
  229 + int todayAdd =
  230 + (int)
  231 + customers.stream()
  232 + .filter(
  233 + customer -> {
  234 + if (customer.isEnabled()
  235 + && (customer.getAccountExpireTime() == null
  236 + || customer.getAccountExpireTime().isAfter(nowTime))
  237 + && customer.getTenant().isEnabled()
  238 + && (customer.getTenant().getTenantExpireTime() == null
  239 + || customer.getTenant().getTenantExpireTime().isAfter(nowTime))) {
  240 + totalNormal.getAndIncrement();
  241 + } else {
  242 + totalExpired.getAndIncrement();
  243 + }
  244 + if (customer.getUpdateTime() != null
  245 + && endTime.isAfter(customer.getUpdateTime())
  246 + && startTime.isBefore(customer.getUpdateTime())) {
  247 + totalActivity.incrementAndGet();
  248 + }
330 249
331 - }  
332 - }  
333 - statistics.setTotal(total);  
334 - statistics.setActivedAlarm(totalActived);  
335 - return statistics; 250 + return customer.getCreateTime().isAfter(startTime)
  251 + && customer.getCreateTime().isBefore(endTime);
  252 + })
  253 + .count();
  254 +
  255 + CustomerStatisticsDTO today = new CustomerStatisticsDTO(0);
  256 + today.setTotal(todayAdd);
  257 + CustomerStatisticsDTO total = new CustomerStatisticsDTO(0);
  258 + total.setTotal(customers.size());
  259 + total.setLoginUse(totalActivity.get());
  260 + total.setNormal(totalNormal.get());
  261 + total.setCancellation(totalExpired.get());
  262 + app.setTotalCustomer(total);
  263 + app.setTodayCustomer(today);
336 } 264 }
337 265
338 - /**  
339 - * 获取实体的流量统计信息  
340 - * @param filter 数据过滤参数  
341 - * @return  
342 - */  
343 - private FlowStatisticsDTO getFlowStatistics(Map<String, Object> filter) {  
344 - FlowStatisticsDTO flow = new FlowStatisticsDTO(0);  
345 - flow.setMessage(deviceMapper.countMsgs(filter));  
346 - flow.setDataPoints(deviceMapper.countDataPoints(filter));  
347 - return flow; 266 + if (!isPtSysAdmin && !isPtAdmin) {
  267 + app.setTotalMsg(getFlowStatistics(totalFilter));
  268 + app.setTodayMsg(getFlowStatistics(todayFilter));
348 } 269 }
349 270
350 -  
351 -  
352 -  
353 - @Override  
354 - public TkPageData<TenantDTO> getHomePageRightInfo(Map<String, Object> queryMap) {  
355 - return tenantService.getCurrentMonthExpireTenantPage(queryMap); 271 + List<DeviceDTO> devices = getDeviceInfo(todayFilter);
  272 + AtomicInteger totalOnline = new AtomicInteger();
  273 + AtomicInteger totalOffline = new AtomicInteger();
  274 + AtomicInteger totalinactive = new AtomicInteger();
  275 + int todayAdd =
  276 + (int)
  277 + devices.stream()
  278 + .filter(
  279 + device -> {
  280 + switch (device.getDeviceState()) {
  281 + case ONLINE:
  282 + totalOnline.incrementAndGet();
  283 + break;
  284 + case OFFLINE:
  285 + totalOffline.incrementAndGet();
  286 + break;
  287 + case INACTIVE:
  288 + totalinactive.incrementAndGet();
  289 + break;
  290 + }
  291 +
  292 + return device.getCreateTime().isAfter(startTime)
  293 + && device.getCreateTime().isBefore(endTime);
  294 + })
  295 + .count();
  296 + DeviceStatisticsDTO today = new DeviceStatisticsDTO(0);
  297 + today.setTotal(todayAdd);
  298 + DeviceStatisticsDTO total = new DeviceStatisticsDTO(0);
  299 + total.setTotal(devices.size());
  300 + total.setInActive(totalinactive.get());
  301 + total.setOffLine(totalOffline.get());
  302 + total.setOnLine(totalOnline.get());
  303 + app.setTotalDevice(total);
  304 + app.setTodayDevice(today);
  305 +
  306 + return app;
  307 + }
  308 +
  309 + /**
  310 + * 统计数据的过滤参数
  311 + *
  312 + * @param entityId 实体ID,例如:租户ID、客户ID
  313 + * @param startTime 数据开始时间
  314 + * @param endTime 数据结束时间
  315 + */
  316 + private Map<String, Object> buildCountFilter(
  317 + EntityId entityId, LocalDateTime startTime, LocalDateTime endTime) {
  318 + Map<String, Object> filter = new HashMap<>();
  319 + if (entityId != null) {
  320 + String idStr = entityId.getId().toString();
  321 + switch (entityId.getEntityType()) {
  322 + case TENANT:
  323 + filter.put("tenantId", idStr);
  324 + break;
  325 + case CUSTOMER:
  326 + filter.put("customerId", idStr);
  327 + break;
  328 + default:
  329 + }
  330 + }
  331 + if (startTime != null) {
  332 + filter.put("startTime", startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
  333 + }
  334 + if (endTime != null) {
  335 + filter.put("startTime", endTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
356 } 336 }
357 337
358 - @Override  
359 - public DeferredResult<List<TsValue>> getHomePageLeftBottomInfo(String customerId, long startTs, long endTs, long interval, TrendType trend, boolean isCustomer) {  
360 - List<CompletableFuture<TsValue>> futures = new ArrayList<>();  
361 - interval = interval < 7200000 ? 7200000 : interval;  
362 - long stepTs = startTs;  
363 - while (stepTs < endTs) {  
364 - long tempStartTs = stepTs;  
365 - long tempEndTs = stepTs + interval;  
366 - long ts = tempStartTs + (tempEndTs - tempStartTs) / 2;  
367 - LocalDateTime startTime = LocalDateTime.ofEpochSecond(tempStartTs / 1000, 0, ZoneOffset.ofHours(8));  
368 - LocalDateTime endTime = LocalDateTime.ofEpochSecond(tempEndTs / 1000, 0, ZoneOffset.ofHours(8));  
369 - CompletableFuture<TsValue> tsValueCompletableFuture = null;  
370 - //客户查询的是告警统计 消息统计  
371 - if (isCustomer) {  
372 - if (trend == TrendType.CUSTOMER_ALARM_STATISTICAL) {  
373 - tsValueCompletableFuture = findDeviceInfoByTs(customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_ALARM_STATISTICAL);  
374 - }  
375 - if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {  
376 - tsValueCompletableFuture = findDeviceInfoByTs(customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_MESSAGE_STATISTICAL);  
377 - }  
378 - } else {  
379 - if (trend == TrendType.TENANT_TREND) {  
380 - tsValueCompletableFuture = tenantService.findTenantsByTs(startTime, endTime, ts);  
381 - }  
382 - if (trend == TrendType.CUSTOMER_TREND) {  
383 - tsValueCompletableFuture = tkUserService.findUsersAsyncByTs(startTime, endTime, ts);  
384 - }  
385 - }  
386 - futures.add(tsValueCompletableFuture);  
387 - stepTs = tempEndTs; 338 + return filter;
  339 + }
  340 + /** 获取当前用户权限下的客户信息 */
  341 + private List<UserDetailsDTO> getCustomerInfo(Map<String, Object> filter) {
  342 + return userMapper.findCustomers(filter);
  343 + }
  344 + /**
  345 + * 查询实体ID的设备
  346 + *
  347 + * @param filter 数据过滤参数
  348 + */
  349 + private List<DeviceDTO> getDeviceInfo(Map<String, Object> filter) {
  350 + return deviceMapper.findDevices(filter);
  351 + }
  352 +
  353 + /**
  354 + * 统计实体的告警信息
  355 + *
  356 + * @param filter 数据过滤参数
  357 + */
  358 + private AlarmStatisticsDTO getAlarmInfo(Map<String, Object> filter) {
  359 + List<AggregationDTO> alarms = ytJpaAarmDao.countAlarms(filter);
  360 + AlarmStatisticsDTO statistics = new AlarmStatisticsDTO(0);
  361 + int totalActived = 0;
  362 + int total = 0;
  363 + for (AggregationDTO item : alarms) {
  364 + AlarmStatus status = AlarmStatus.valueOf(item.getKey());
  365 + total += item.getValue();
  366 + switch (status) {
  367 + case CLEARED_UNACK:
  368 + statistics.setClearedUnack(item.getValue());
  369 + break;
  370 + case CLEARED_ACK:
  371 + statistics.setClearedAck(item.getValue());
  372 + break;
  373 + case ACTIVE_ACK:
  374 + totalActived += item.getValue();
  375 + break;
  376 + case ACTIVE_UNACK:
  377 + totalActived += item.getValue();
  378 + break;
  379 + }
  380 + }
  381 + statistics.setTotal(total);
  382 + statistics.setActivedAlarm(totalActived);
  383 + return statistics;
  384 + }
  385 +
  386 + /**
  387 + * 获取实体的流量统计信息
  388 + *
  389 + * @param filter 数据过滤参数
  390 + */
  391 + private FlowStatisticsDTO getFlowStatistics(Map<String, Object> filter) {
  392 + FlowStatisticsDTO flow = new FlowStatisticsDTO(0);
  393 + flow.setMessage(deviceMapper.countMsgs(filter));
  394 + flow.setDataPoints(deviceMapper.countDataPoints(filter));
  395 + return flow;
  396 + }
  397 +
  398 + @Override
  399 + public TkPageData<TenantDTO> getHomePageRightInfo(Map<String, Object> queryMap) {
  400 + return tenantService.getCurrentMonthExpireTenantPage(queryMap);
  401 + }
  402 +
  403 + @Override
  404 + public DeferredResult<List<TsValue>> getHomePageLeftBottomInfo(
  405 + String customerId,
  406 + long startTs,
  407 + long endTs,
  408 + long interval,
  409 + TrendType trend,
  410 + boolean isCustomer) {
  411 + List<CompletableFuture<TsValue>> futures = new ArrayList<>();
  412 + interval = interval < 7200000 ? 7200000 : interval;
  413 + long stepTs = startTs;
  414 + while (stepTs < endTs) {
  415 + long tempStartTs = stepTs;
  416 + long tempEndTs = stepTs + interval;
  417 + long ts = tempStartTs + (tempEndTs - tempStartTs) / 2;
  418 + LocalDateTime startTime =
  419 + LocalDateTime.ofEpochSecond(tempStartTs / 1000, 0, ZoneOffset.ofHours(8));
  420 + LocalDateTime endTime =
  421 + LocalDateTime.ofEpochSecond(tempEndTs / 1000, 0, ZoneOffset.ofHours(8));
  422 + CompletableFuture<TsValue> tsValueCompletableFuture = null;
  423 + // 客户查询的是告警统计 消息统计
  424 + if (isCustomer) {
  425 + if (trend == TrendType.CUSTOMER_ALARM_STATISTICAL) {
  426 + tsValueCompletableFuture =
  427 + findDeviceInfoByTs(
  428 + customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_ALARM_STATISTICAL);
388 } 429 }
389 - final DeferredResult<List<TsValue>> deferredResult = new DeferredResult<>();  
390 - if (futures.size() > FastIotConstants.MagicNumber.ZERO) {  
391 - ListenableFuture<List<TsValue>> listenableFuture = Futures.transform(setFutures(futures), tsValues -> { 430 + if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {
  431 + tsValueCompletableFuture =
  432 + findDeviceInfoByTs(
  433 + customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_MESSAGE_STATISTICAL);
  434 + }
  435 + } else {
  436 + if (trend == TrendType.TENANT_TREND) {
  437 + tsValueCompletableFuture = tenantService.findTenantsByTs(startTime, endTime, ts);
  438 + }
  439 + if (trend == TrendType.CUSTOMER_TREND) {
  440 + tsValueCompletableFuture = tkUserService.findUsersAsyncByTs(startTime, endTime, ts);
  441 + }
  442 + }
  443 + futures.add(tsValueCompletableFuture);
  444 + stepTs = tempEndTs;
  445 + }
  446 + final DeferredResult<List<TsValue>> deferredResult = new DeferredResult<>();
  447 + if (futures.size() > FastIotConstants.MagicNumber.ZERO) {
  448 + ListenableFuture<List<TsValue>> listenableFuture =
  449 + Futures.transform(
  450 + setFutures(futures),
  451 + tsValues -> {
392 if (tsValues != null && !tsValues.isEmpty()) { 452 if (tsValues != null && !tsValues.isEmpty()) {
393 - return tsValues; 453 + return tsValues;
394 } else { 454 } else {
395 - return null; 455 + return null;
396 } 456 }
397 - }, MoreExecutors.directExecutor());  
398 - Futures.addCallback(listenableFuture, getTsValueCallback(deferredResult), MoreExecutors.directExecutor());  
399 - }  
400 - return deferredResult; 457 + },
  458 + MoreExecutors.directExecutor());
  459 + Futures.addCallback(
  460 + listenableFuture, getTsValueCallback(deferredResult), MoreExecutors.directExecutor());
401 } 461 }
402 -  
403 - @Override  
404 - public DeferredResult<List<TenantTransportMessageDTO>> getTop10() {  
405 - List<TenantDTO> tenants = tenantService.getAllTenant();  
406 - List<CompletableFuture<TenantTransportMessageDTO>> futures = new ArrayList<>();  
407 - tenants.forEach(tenant -> {  
408 - TenantId tenantId = TenantId.fromUUID(UUID.fromString(tenant.getTenantId()));  
409 - futures.add(getTransportMessageByTenantId(tenantId, tenant.getName())); 462 + return deferredResult;
  463 + }
  464 +
  465 + @Override
  466 + public DeferredResult<List<TenantTransportMessageDTO>> getTop10() {
  467 + List<TenantDTO> tenants = tenantService.getAllTenant();
  468 + List<CompletableFuture<TenantTransportMessageDTO>> futures = new ArrayList<>();
  469 + tenants.forEach(
  470 + tenant -> {
  471 + TenantId tenantId = TenantId.fromUUID(UUID.fromString(tenant.getTenantId()));
  472 + futures.add(getTransportMessageByTenantId(tenantId, tenant.getName()));
410 }); 473 });
411 - final DeferredResult<List<TenantTransportMessageDTO>> deferredResult = new DeferredResult<>();  
412 - if (futures.size() > FastIotConstants.MagicNumber.ZERO) {  
413 - ListenableFuture<List<TenantTransportMessageDTO>> listenableFuture = Futures.transform(settableFuture(futures), transportMessage -> { 474 + final DeferredResult<List<TenantTransportMessageDTO>> deferredResult = new DeferredResult<>();
  475 + if (futures.size() > FastIotConstants.MagicNumber.ZERO) {
  476 + ListenableFuture<List<TenantTransportMessageDTO>> listenableFuture =
  477 + Futures.transform(
  478 + settableFuture(futures),
  479 + transportMessage -> {
414 if (transportMessage != null && !transportMessage.isEmpty()) { 480 if (transportMessage != null && !transportMessage.isEmpty()) {
415 - return transportMessage; 481 + return transportMessage;
416 } else { 482 } else {
417 - return null; 483 + return null;
418 } 484 }
419 - }, MoreExecutors.directExecutor());  
420 - Futures.addCallback(listenableFuture, getTransportMessageCallback(deferredResult), MoreExecutors.directExecutor());  
421 - } else {  
422 - List<TenantTransportMessageDTO> result = new ArrayList<>();  
423 - deferredResult.setResult(result);  
424 - }  
425 - return deferredResult; 485 + },
  486 + MoreExecutors.directExecutor());
  487 + Futures.addCallback(
  488 + listenableFuture,
  489 + getTransportMessageCallback(deferredResult),
  490 + MoreExecutors.directExecutor());
  491 + } else {
  492 + List<TenantTransportMessageDTO> result = new ArrayList<>();
  493 + deferredResult.setResult(result);
426 } 494 }
427 -  
428 - @Override  
429 - @Async  
430 - public CompletableFuture<TenantTransportMessageDTO> getTransportMessageByTenantId(TenantId tenantId, String tenantName) {  
431 - List<EntityKey> latestValues = new ArrayList<>();  
432 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));  
433 - ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(tenantId);  
434 - PageData<EntityData> pageData = queryEntityData(apiUsageState.getId(), tenantId, null, latestValues);  
435 - Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();  
436 - TenantTransportMessageDTO transportMessage = new TenantTransportMessageDTO();  
437 - latest.keySet().forEach(item -> {  
438 - if (item.equals(EntityKeyType.TIME_SERIES)) { 495 + return deferredResult;
  496 + }
  497 +
  498 + @Override
  499 + @Async
  500 + public CompletableFuture<TenantTransportMessageDTO> getTransportMessageByTenantId(
  501 + TenantId tenantId, String tenantName) {
  502 + List<EntityKey> latestValues = new ArrayList<>();
  503 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));
  504 + ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(tenantId);
  505 + PageData<EntityData> pageData =
  506 + queryEntityData(apiUsageState.getId(), tenantId, null, latestValues);
  507 + Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();
  508 + TenantTransportMessageDTO transportMessage = new TenantTransportMessageDTO();
  509 + latest
  510 + .keySet()
  511 + .forEach(
  512 + item -> {
  513 + if (item.equals(EntityKeyType.TIME_SERIES)) {
439 Map<String, TsValue> tsValueMap = latest.get(item); 514 Map<String, TsValue> tsValueMap = latest.get(item);
440 - tsValueMap.keySet().forEach(mapKey -> {  
441 - Long value = Long.valueOf(tsValueMap.get(mapKey).getValue().isEmpty() ? FastIotConstants.MagicNumber.ZERO + "" : tsValueMap.get(mapKey).getValue());  
442 - if (mapKey.equals("transportMsgCount")) {  
443 - transportMessage.setName(tenantName);  
444 - transportMessage.setCount(value);  
445 - }  
446 - });  
447 - }  
448 - });  
449 - return CompletableFuture.supplyAsync(() -> transportMessage);  
450 - }  
451 -  
452 - /**  
453 - * 设置设备相关的数据  
454 - *  
455 - * @param deviceList 拥有的设备  
456 - * @param homeDeviceInfoDTO 首页信息  
457 - */  
458 - private void setDeviceInfoData(List<DeviceDTO> deviceList, HomeDeviceInfoDTO homeDeviceInfoDTO) {  
459 - homeDeviceInfoDTO.setSumCount(deviceList.size());  
460 - deviceList.forEach(ytDevice -> {  
461 - int basicNum = FastIotConstants.MagicNumber.ONE;  
462 - ZoneOffset zoneOffset = ZoneOffset.of("+8");  
463 - LocalDateTime todayZeroTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);  
464 - if (ytDevice.getCreateTime().atZone(zoneOffset).toInstant().toEpochMilli() >= todayZeroTime.toInstant(zoneOffset).toEpochMilli()) {  
465 - homeDeviceInfoDTO.setTodayAdd(homeDeviceInfoDTO.getTodayAdd() + basicNum);  
466 - }  
467 - switch (ytDevice.getDeviceState()) {  
468 - case OFFLINE:  
469 - homeDeviceInfoDTO.setOffLine(homeDeviceInfoDTO.getOffLine() + basicNum);  
470 - break;  
471 - case ONLINE:  
472 - homeDeviceInfoDTO.setOnLine(homeDeviceInfoDTO.getOnLine() + basicNum);  
473 - break;  
474 - case INACTIVE:  
475 - homeDeviceInfoDTO.setInActive(homeDeviceInfoDTO.getInActive() + basicNum);  
476 - break;  
477 - default:  
478 - break;  
479 - } 515 + tsValueMap
  516 + .keySet()
  517 + .forEach(
  518 + mapKey -> {
  519 + Long value =
  520 + Long.valueOf(
  521 + tsValueMap.get(mapKey).getValue().isEmpty()
  522 + ? FastIotConstants.MagicNumber.ZERO + ""
  523 + : tsValueMap.get(mapKey).getValue());
  524 + if (mapKey.equals("transportMsgCount")) {
  525 + transportMessage.setName(tenantName);
  526 + transportMessage.setCount(value);
  527 + }
  528 + });
  529 + }
  530 + });
  531 + return CompletableFuture.supplyAsync(() -> transportMessage);
  532 + }
  533 +
  534 + /**
  535 + * 设置设备相关的数据
  536 + *
  537 + * @param deviceList 拥有的设备
  538 + * @param homeDeviceInfoDTO 首页信息
  539 + */
  540 + private void setDeviceInfoData(List<DeviceDTO> deviceList, HomeDeviceInfoDTO homeDeviceInfoDTO) {
  541 + homeDeviceInfoDTO.setSumCount(deviceList.size());
  542 + int defaultValue = FastIotConstants.MagicNumber.ZERO;
  543 + AtomicReference<Integer> gateWay = new AtomicReference<>(defaultValue);
  544 + AtomicReference<Integer> directConnection = new AtomicReference<>(defaultValue);
  545 + AtomicReference<Integer> sensor = new AtomicReference<>(defaultValue);
  546 + deviceList.forEach(
  547 + device -> {
  548 + int basicNum = FastIotConstants.MagicNumber.ONE;
  549 + ZoneOffset zoneOffset = ZoneOffset.of("+8");
  550 + LocalDateTime todayZeroTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
  551 + if (device.getCreateTime().atZone(zoneOffset).toInstant().toEpochMilli()
  552 + >= todayZeroTime.toInstant(zoneOffset).toEpochMilli()) {
  553 + homeDeviceInfoDTO.setTodayAdd(homeDeviceInfoDTO.getTodayAdd() + basicNum);
  554 + }
  555 + switch (device.getDeviceState()) {
  556 + case OFFLINE:
  557 + homeDeviceInfoDTO.setOffLine(homeDeviceInfoDTO.getOffLine() + basicNum);
  558 + break;
  559 + case ONLINE:
  560 + homeDeviceInfoDTO.setOnLine(homeDeviceInfoDTO.getOnLine() + basicNum);
  561 + break;
  562 + case INACTIVE:
  563 + homeDeviceInfoDTO.setInActive(homeDeviceInfoDTO.getInActive() + basicNum);
  564 + break;
  565 + default:
  566 + break;
  567 + }
  568 + switch (device.getDeviceType()) {
  569 + case GATEWAY:
  570 + gateWay.getAndSet(gateWay.get() + 1);
  571 + break;
  572 + case DIRECT_CONNECTION:
  573 + directConnection.getAndSet(directConnection.get() + 1);
  574 + break;
  575 + case SENSOR:
  576 + sensor.getAndSet(sensor.get() + 1);
  577 + break;
  578 + default:
  579 + break;
  580 + }
480 }); 581 });
481 - }  
482 -  
483 -  
484 -  
485 - /**  
486 - * 设置租户返回信息  
487 - *  
488 - * @param homePageLeftTopDTO 首页顶部返回  
489 - * @param startTime 今日开始时间  
490 - * @param endTime 今日结束时间  
491 - */  
492 - private void setTenantInfoData(HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {  
493 - List<TenantDTO> tenants = tenantService.getAllTenant();  
494 - int todayAdd = (int) tenants.stream().filter(tenant -> tenant.getCreateTime().isAfter(startTime) && tenant.getCreateTime().isBefore(endTime)).count();  
495 - int sumCount = tenants.size();  
496 - BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);  
497 - homePageLeftTopDTO.setTenantInfo(baseHomePageTop);  
498 - }  
499 -  
500 - /**  
501 - * 设置首页的告警和消息  
502 - *  
503 - * @param tenantId 租户ID  
504 - * @param messageInfo 消息  
505 - * @param alarm 告警  
506 - */  
507 - private void setAlarmAndMessageInfo(String tenantId, HomePageTopMessage messageInfo, BaseHomePageTop alarm) throws ExecutionException, InterruptedException {  
508 - List<EntityKey> entityFields = new ArrayList<>();  
509 - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "name"));  
510 - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "label"));  
511 - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "additionalInfo"));  
512 - List<EntityKey> latestValues = new ArrayList<>();  
513 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));  
514 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportDataPointsCount"));  
515 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "createdAlarmsCount"));  
516 -  
517 - TenantId currentTenantId = TenantId.fromUUID(UUID.fromString(tenantId));  
518 - ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(currentTenantId);  
519 - PageData<EntityData> pageData = queryEntityData(apiUsageState.getId(), currentTenantId, entityFields, latestValues);  
520 - Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();  
521 - latest.keySet().forEach(item -> {  
522 - if (item.equals(EntityKeyType.TIME_SERIES)) { 582 + homeDeviceInfoDTO.setGateWay(gateWay.get());
  583 + homeDeviceInfoDTO.setDirectConnection(directConnection.get());
  584 + homeDeviceInfoDTO.setSensor(sensor.get());
  585 + }
  586 +
  587 + /**
  588 + * 设置租户返回信息
  589 + *
  590 + * @param homePageLeftTopDTO 首页顶部返回
  591 + * @param startTime 今日开始时间
  592 + * @param endTime 今日结束时间
  593 + */
  594 + private void setTenantInfoData(
  595 + HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {
  596 + List<TenantDTO> tenants = tenantService.getAllTenant();
  597 + int todayAdd =
  598 + (int)
  599 + tenants.stream()
  600 + .filter(
  601 + tenant ->
  602 + tenant.getCreateTime().isAfter(startTime)
  603 + && tenant.getCreateTime().isBefore(endTime))
  604 + .count();
  605 + int sumCount = tenants.size();
  606 + BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);
  607 + homePageLeftTopDTO.setTenantInfo(baseHomePageTop);
  608 + }
  609 +
  610 + /**
  611 + * 设置首页的告警和消息
  612 + *
  613 + * @param tenantId 租户ID
  614 + * @param messageInfo 消息
  615 + * @param alarm 告警
  616 + */
  617 + private void setAlarmAndMessageInfo(
  618 + String tenantId, HomePageTopMessage messageInfo, BaseHomePageTop alarm)
  619 + throws ExecutionException, InterruptedException {
  620 + List<EntityKey> entityFields = new ArrayList<>();
  621 + entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "name"));
  622 + entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "label"));
  623 + entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "additionalInfo"));
  624 + List<EntityKey> latestValues = new ArrayList<>();
  625 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));
  626 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportDataPointsCount"));
  627 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "createdAlarmsCount"));
  628 +
  629 + TenantId currentTenantId = TenantId.fromUUID(UUID.fromString(tenantId));
  630 + ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(currentTenantId);
  631 + PageData<EntityData> pageData =
  632 + queryEntityData(apiUsageState.getId(), currentTenantId, entityFields, latestValues);
  633 + Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();
  634 + latest
  635 + .keySet()
  636 + .forEach(
  637 + item -> {
  638 + if (item.equals(EntityKeyType.TIME_SERIES)) {
523 Map<String, TsValue> tsValueMap = latest.get(item); 639 Map<String, TsValue> tsValueMap = latest.get(item);
524 - tsValueMap.keySet().forEach(mapKey -> {  
525 - String tsValue = tsValueMap.get(mapKey).getValue();  
526 - Integer value = StringUtils.isEmpty(tsValue) ? FastIotConstants.MagicNumber.ZERO : Integer.parseInt(tsValue);  
527 - switch (mapKey) {  
528 - case "createdAlarmsCount":  
529 - alarm.setSumCount(value);  
530 - break;  
531 - case "transportMsgCount":  
532 - messageInfo.setMessageCount(value);  
533 - break;  
534 - case "transportDataPointsCount":  
535 - messageInfo.setDataPointsCount(value);  
536 - break;  
537 - default:  
538 - break;  
539 - }  
540 - });  
541 - }  
542 - });  
543 -  
544 - // 查询今日数据  
545 - setTodayAlarmAndMessageInfo(currentTenantId, apiUsageState.getId(), messageInfo, alarm);  
546 - }  
547 -  
548 - /**  
549 - * 设置今日告警和今日消息  
550 - *  
551 - * @param currentTenantId 当前租户  
552 - * @param apiUsageState api调用统计  
553 - * @param messageInfo 消息  
554 - * @param alarm 告警  
555 - * @throws ExecutionException 异常  
556 - * @throws InterruptedException 异常  
557 - */  
558 - private void setTodayAlarmAndMessageInfo(TenantId currentTenantId, EntityId apiUsageState, HomePageTopMessage messageInfo, BaseHomePageTop alarm) throws ExecutionException, InterruptedException {  
559 - Map<String, Aggregation> queries = new HashMap<>();  
560 - queries.put("transportMsgCountHourly", Aggregation.SUM);  
561 - queries.put("transportDataPointsCountHourly", Aggregation.SUM);  
562 - queries.put("createdAlarmsCountHourly", Aggregation.SUM);  
563 -  
564 - List<TsKvEntry> tsKv = queryEntityTimeseries(apiUsageState, currentTenantId, queries);  
565 - tsKv.forEach(tsKvEntry -> {  
566 - if (tsKvEntry.getLongValue().isPresent()) {  
567 - int count = tsKvEntry.getLongValue().get().intValue();  
568 - switch (tsKvEntry.getKey()) {  
569 - case "transportMsgCountHourly":  
570 - messageInfo.setTodayMessageAdd(count + messageInfo.getTodayMessageAdd());  
571 - break;  
572 - case "transportDataPointsCountHourly":  
573 - messageInfo.setTodayDataPointsAdd(count + messageInfo.getTodayDataPointsAdd());  
574 - break;  
575 - case "createdAlarmsCountHourly":  
576 - alarm.setTodayAdd(count + alarm.getTodayAdd());  
577 - break;  
578 - default:  
579 - break;  
580 - } 640 + tsValueMap
  641 + .keySet()
  642 + .forEach(
  643 + mapKey -> {
  644 + String tsValue = tsValueMap.get(mapKey).getValue();
  645 + Integer value =
  646 + StringUtils.isEmpty(tsValue)
  647 + ? FastIotConstants.MagicNumber.ZERO
  648 + : Integer.parseInt(tsValue);
  649 + switch (mapKey) {
  650 + case "createdAlarmsCount":
  651 + alarm.setSumCount(value);
  652 + break;
  653 + case "transportMsgCount":
  654 + messageInfo.setMessageCount(value);
  655 + break;
  656 + case "transportDataPointsCount":
  657 + messageInfo.setDataPointsCount(value);
  658 + break;
  659 + default:
  660 + break;
  661 + }
  662 + });
  663 + }
  664 + });
  665 +
  666 + // 查询今日数据
  667 + setTodayAlarmAndMessageInfo(currentTenantId, apiUsageState.getId(), messageInfo, alarm);
  668 + }
  669 +
  670 + /**
  671 + * 设置今日告警和今日消息
  672 + *
  673 + * @param currentTenantId 当前租户
  674 + * @param apiUsageState api调用统计
  675 + * @param messageInfo 消息
  676 + * @param alarm 告警
  677 + * @throws ExecutionException 异常
  678 + * @throws InterruptedException 异常
  679 + */
  680 + private void setTodayAlarmAndMessageInfo(
  681 + TenantId currentTenantId,
  682 + EntityId apiUsageState,
  683 + HomePageTopMessage messageInfo,
  684 + BaseHomePageTop alarm)
  685 + throws ExecutionException, InterruptedException {
  686 + Map<String, Aggregation> queries = new HashMap<>();
  687 + queries.put("transportMsgCountHourly", Aggregation.SUM);
  688 + queries.put("transportDataPointsCountHourly", Aggregation.SUM);
  689 + queries.put("createdAlarmsCountHourly", Aggregation.SUM);
  690 +
  691 + List<TsKvEntry> tsKv = queryEntityTimeseries(apiUsageState, currentTenantId, queries);
  692 + tsKv.forEach(
  693 + tsKvEntry -> {
  694 + if (tsKvEntry.getLongValue().isPresent()) {
  695 + int count = tsKvEntry.getLongValue().get().intValue();
  696 + switch (tsKvEntry.getKey()) {
  697 + case "transportMsgCountHourly":
  698 + messageInfo.setTodayMessageAdd(count + messageInfo.getTodayMessageAdd());
  699 + break;
  700 + case "transportDataPointsCountHourly":
  701 + messageInfo.setTodayDataPointsAdd(count + messageInfo.getTodayDataPointsAdd());
  702 + break;
  703 + case "createdAlarmsCountHourly":
  704 + alarm.setTodayAdd(count + alarm.getTodayAdd());
  705 + break;
  706 + default:
  707 + break;
581 } 708 }
  709 + }
582 }); 710 });
  711 + }
  712 +
  713 + /**
  714 + * 查询实体的运行数据
  715 + *
  716 + * @param entityId 实体ID,例如:设备、用户、流量统计等
  717 + * @param currentTenantId 租户ID
  718 + * @param entityFields 查询的实体字段
  719 + * @param latestValues 查询的运行数据字段,例如:遥测数据、操作记录等。
  720 + * @return
  721 + */
  722 + private PageData<EntityData> queryEntityData(
  723 + EntityId entityId,
  724 + TenantId currentTenantId,
  725 + List<EntityKey> entityFields,
  726 + List<EntityKey> latestValues) {
  727 + CustomerId customerId = new CustomerId(EntityId.NULL_UUID);
  728 +
  729 + EntityKey key = new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime");
  730 + EntityDataSortOrder sortOrder =
  731 + new EntityDataSortOrder(key, EntityDataSortOrder.Direction.DESC);
  732 +
  733 + EntityDataPageLink pageLink =
  734 + new EntityDataPageLink(
  735 + FastIotConstants.MagicNumber.ONE, FastIotConstants.MagicNumber.ZERO, null, sortOrder);
  736 +
  737 + SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
  738 + singleEntityFilter.setSingleEntity(entityId);
  739 +
  740 + EntityDataQuery query =
  741 + new EntityDataQuery(singleEntityFilter, pageLink, entityFields, latestValues, null);
  742 +
  743 + return entityService.findEntityDataByQuery(currentTenantId, customerId, query);
  744 + }
  745 +
  746 + /**
  747 + * 查询实体当天遥测数据的统计信息
  748 + *
  749 + * @param entityId 实体ID,例如:设备、用户、流量统计等
  750 + * @param currentTenantId 租户ID
  751 + * @param statics 统计内容,包括需要统计的指标名、数据聚合的算法 统计的时间区间、数据聚合的时间窗口、
  752 + * @return
  753 + * @throws ExecutionException
  754 + * @throws InterruptedException
  755 + */
  756 + private List<TsKvEntry> queryEntityTimeseries(
  757 + EntityId entityId, TenantId currentTenantId, Map<String, Aggregation> statics)
  758 + throws ExecutionException, InterruptedException {
  759 + long startTs =
  760 + LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN)
  761 + .toInstant(ZoneOffset.of("+8"))
  762 + .toEpochMilli();
  763 + long endTs = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
  764 + int interval = 7200000;
  765 + int limit = (int) ((endTs - startTs) / interval) + FastIotConstants.MagicNumber.ONE;
  766 +
  767 + List<ReadTsKvQuery> queries = new ArrayList<>();
  768 + for (String key : statics.keySet()) {
  769 + queries.add(new BaseReadTsKvQuery(key, startTs, endTs, interval, limit, statics.get(key)));
583 } 770 }
584 -  
585 - /**  
586 - * 查询实体的运行数据  
587 - *  
588 - * @param entityId 实体ID,例如:设备、用户、流量统计等  
589 - * @param currentTenantId 租户ID  
590 - * @param entityFields 查询的实体字段  
591 - * @param latestValues 查询的运行数据字段,例如:遥测数据、操作记录等。  
592 - * @return  
593 - */  
594 - private PageData<EntityData> queryEntityData(EntityId entityId, TenantId currentTenantId, List<EntityKey> entityFields, List<EntityKey> latestValues) {  
595 - CustomerId customerId = new CustomerId(EntityId.NULL_UUID);  
596 -  
597 - EntityKey key = new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime");  
598 - EntityDataSortOrder sortOrder = new EntityDataSortOrder(key, EntityDataSortOrder.Direction.DESC);  
599 -  
600 - EntityDataPageLink pageLink = new EntityDataPageLink(FastIotConstants.MagicNumber.ONE, FastIotConstants.MagicNumber.ZERO, null, sortOrder);  
601 -  
602 - SingleEntityFilter singleEntityFilter = new SingleEntityFilter();  
603 - singleEntityFilter.setSingleEntity(entityId);  
604 -  
605 - EntityDataQuery query = new EntityDataQuery(singleEntityFilter, pageLink, entityFields, latestValues, null);  
606 -  
607 - return entityService.findEntityDataByQuery(currentTenantId, customerId, query);  
608 - }  
609 -  
610 - /**  
611 - * 查询实体当天遥测数据的统计信息  
612 - *  
613 - * @param entityId 实体ID,例如:设备、用户、流量统计等  
614 - * @param currentTenantId 租户ID  
615 - * @param statics 统计内容,包括需要统计的指标名、数据聚合的算法  
616 - * 统计的时间区间、数据聚合的时间窗口、  
617 - * @return  
618 - * @throws ExecutionException  
619 - * @throws InterruptedException  
620 - */  
621 - private List<TsKvEntry> queryEntityTimeseries(EntityId entityId, TenantId currentTenantId, Map<String, Aggregation> statics) throws ExecutionException, InterruptedException {  
622 - long startTs = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN).toInstant(ZoneOffset.of("+8")).toEpochMilli();  
623 - long endTs = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();  
624 - int interval = 7200000;  
625 - int limit = (int) ((endTs - startTs) / interval) + FastIotConstants.MagicNumber.ONE;  
626 -  
627 - List<ReadTsKvQuery> queries = new ArrayList<>();  
628 - for (String key : statics.keySet()) {  
629 - queries.add(new BaseReadTsKvQuery(key, startTs, endTs, interval, limit, statics.get(key)));  
630 - }  
631 - List<TsKvEntry> tsKv = timeseriesService.findAll(currentTenantId, entityId, queries).get();  
632 - return tsKv; 771 + List<TsKvEntry> tsKv = timeseriesService.findAll(currentTenantId, entityId, queries).get();
  772 + return tsKv;
  773 + }
  774 +
  775 + /**
  776 + * 设置客户返回信息
  777 + *
  778 + * @param homePageLeftTopDTO 首页顶部返回
  779 + * @param startTime 今日开始时间
  780 + * @param endTime 今日结束时间
  781 + */
  782 + private void setCustomerInfoData(
  783 + HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {
  784 + List<UserDTO> userList = userMapper.getUserCountByRoleType(RoleEnum.CUSTOMER_USER);
  785 + int sumCount = userList != null ? userList.size() : FastIotConstants.MagicNumber.ZERO;
  786 +
  787 + int todayAdd = FastIotConstants.MagicNumber.ZERO;
  788 + if (userList != null && userList.size() > FastIotConstants.MagicNumber.ZERO) {
  789 + todayAdd +=
  790 + userList.stream()
  791 + .filter(
  792 + userDTO ->
  793 + userDTO.getCreateTime().isAfter(startTime)
  794 + && userDTO.getCreateTime().isBefore(endTime))
  795 + .count();
633 } 796 }
634 -  
635 - /**  
636 - * 设置客户返回信息  
637 - *  
638 - * @param homePageLeftTopDTO 首页顶部返回  
639 - * @param startTime 今日开始时间  
640 - * @param endTime 今日结束时间  
641 - */  
642 - private void setCustomerInfoData(HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {  
643 - List<UserDTO> userList = userMapper.getUserCountByRoleType(RoleEnum.CUSTOMER_USER);  
644 - int sumCount = userList != null ? userList.size() : FastIotConstants.MagicNumber.ZERO;  
645 -  
646 - int todayAdd = FastIotConstants.MagicNumber.ZERO;  
647 - if (userList != null && userList.size() > FastIotConstants.MagicNumber.ZERO) {  
648 - todayAdd += userList.stream().filter(userDTO -> userDTO.getCreateTime().isAfter(startTime) && userDTO.getCreateTime().isBefore(endTime)).count();  
649 - }  
650 - BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);  
651 - homePageLeftTopDTO.setCustomerInfo(baseHomePageTop);  
652 - }  
653 -  
654 - private SettableFuture<List<TsValue>> setFutures(List<CompletableFuture<TsValue>> tsFutures) {  
655 - SettableFuture<List<TsValue>> listenableFuture = SettableFuture.create();  
656 - CompletableFuture<List<TsValue>> entities = CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()])).thenApply(v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));  
657 - entities.whenComplete((tsValues, throwable) -> {  
658 - if (throwable != null) {  
659 - listenableFuture.setException(throwable);  
660 - } else {  
661 - listenableFuture.set(tsValues);  
662 - } 797 + BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);
  798 + homePageLeftTopDTO.setCustomerInfo(baseHomePageTop);
  799 + }
  800 +
  801 + private SettableFuture<List<TsValue>> setFutures(List<CompletableFuture<TsValue>> tsFutures) {
  802 + SettableFuture<List<TsValue>> listenableFuture = SettableFuture.create();
  803 + CompletableFuture<List<TsValue>> entities =
  804 + CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()]))
  805 + .thenApply(
  806 + v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));
  807 + entities.whenComplete(
  808 + (tsValues, throwable) -> {
  809 + if (throwable != null) {
  810 + listenableFuture.setException(throwable);
  811 + } else {
  812 + listenableFuture.set(tsValues);
  813 + }
663 }); 814 });
664 - return listenableFuture;  
665 - }  
666 -  
667 - private SettableFuture<List<TenantTransportMessageDTO>> settableFuture(List<CompletableFuture<TenantTransportMessageDTO>> tsFutures) {  
668 - SettableFuture<List<TenantTransportMessageDTO>> listenableFuture = SettableFuture.create();  
669 - CompletableFuture<List<TenantTransportMessageDTO>> entities = CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()])).thenApply(v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));  
670 - entities.whenComplete((tsValues, throwable) -> {  
671 - if (throwable != null) {  
672 - listenableFuture.setException(throwable);  
673 - } else {  
674 - listenableFuture.set(tsValues);  
675 - } 815 + return listenableFuture;
  816 + }
  817 +
  818 + private SettableFuture<List<TenantTransportMessageDTO>> settableFuture(
  819 + List<CompletableFuture<TenantTransportMessageDTO>> tsFutures) {
  820 + SettableFuture<List<TenantTransportMessageDTO>> listenableFuture = SettableFuture.create();
  821 + CompletableFuture<List<TenantTransportMessageDTO>> entities =
  822 + CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()]))
  823 + .thenApply(
  824 + v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));
  825 + entities.whenComplete(
  826 + (tsValues, throwable) -> {
  827 + if (throwable != null) {
  828 + listenableFuture.setException(throwable);
  829 + } else {
  830 + listenableFuture.set(tsValues);
  831 + }
676 }); 832 });
677 - return listenableFuture;  
678 - }  
679 -  
680 - private FutureCallback<List<TsValue>> getTsValueCallback(final DeferredResult<List<TsValue>> response) {  
681 - return new FutureCallback<>() {  
682 - @Override  
683 - public void onSuccess(@Nullable List<TsValue> tsValues) {  
684 - response.setResult(tsValues);  
685 - }  
686 -  
687 - @Override  
688 - public void onFailure(Throwable throwable) {  
689 - response.setResult(null);  
690 - }  
691 - };  
692 - }  
693 -  
694 - private FutureCallback<List<TenantTransportMessageDTO>> getTransportMessageCallback(final DeferredResult<List<TenantTransportMessageDTO>> response) {  
695 - return new FutureCallback<>() {  
696 - @Override  
697 - public void onSuccess(@Nullable List<TenantTransportMessageDTO> values) {  
698 - // sort  
699 - if (null != values && values.size() > FastIotConstants.MagicNumber.ZERO) {  
700 - int length = values.size() - FastIotConstants.MagicNumber.ONE;  
701 - for (int i = FastIotConstants.MagicNumber.ZERO; i < length; i++) {  
702 - for (int j = FastIotConstants.MagicNumber.ZERO; j < length - i; j++) {  
703 - if (values.get(j).getCount() < values.get(j + FastIotConstants.MagicNumber.ONE).getCount()) {  
704 - String name = values.get(j).getName();  
705 - Long count = values.get(j).getCount();  
706 - values.get(j).setName(values.get(j + FastIotConstants.MagicNumber.ONE).getName());  
707 - values.get(j).setCount(values.get(j + FastIotConstants.MagicNumber.ONE).getCount());  
708 - values.get(j + FastIotConstants.MagicNumber.ONE).setName(name);  
709 - values.get(j + FastIotConstants.MagicNumber.ONE).setCount(count);  
710 - }  
711 - }  
712 - }  
713 - values = values.size() > FastIotConstants.MagicNumber.TEN ? values.subList(FastIotConstants.MagicNumber.ZERO, FastIotConstants.MagicNumber.TEN) : values;  
714 - }  
715 - response.setResult(values);  
716 - }  
717 -  
718 - @Override  
719 - public void onFailure(Throwable throwable) {  
720 - response.setResult(null); 833 + return listenableFuture;
  834 + }
  835 +
  836 + private FutureCallback<List<TsValue>> getTsValueCallback(
  837 + final DeferredResult<List<TsValue>> response) {
  838 + return new FutureCallback<>() {
  839 + @Override
  840 + public void onSuccess(@Nullable List<TsValue> tsValues) {
  841 + response.setResult(tsValues);
  842 + }
  843 +
  844 + @Override
  845 + public void onFailure(Throwable throwable) {
  846 + response.setResult(null);
  847 + }
  848 + };
  849 + }
  850 +
  851 + private FutureCallback<List<TenantTransportMessageDTO>> getTransportMessageCallback(
  852 + final DeferredResult<List<TenantTransportMessageDTO>> response) {
  853 + return new FutureCallback<>() {
  854 + @Override
  855 + public void onSuccess(@Nullable List<TenantTransportMessageDTO> values) {
  856 + // sort
  857 + if (null != values && values.size() > FastIotConstants.MagicNumber.ZERO) {
  858 + int length = values.size() - FastIotConstants.MagicNumber.ONE;
  859 + for (int i = FastIotConstants.MagicNumber.ZERO; i < length; i++) {
  860 + for (int j = FastIotConstants.MagicNumber.ZERO; j < length - i; j++) {
  861 + if (values.get(j).getCount()
  862 + < values.get(j + FastIotConstants.MagicNumber.ONE).getCount()) {
  863 + String name = values.get(j).getName();
  864 + Long count = values.get(j).getCount();
  865 + values.get(j).setName(values.get(j + FastIotConstants.MagicNumber.ONE).getName());
  866 + values.get(j).setCount(values.get(j + FastIotConstants.MagicNumber.ONE).getCount());
  867 + values.get(j + FastIotConstants.MagicNumber.ONE).setName(name);
  868 + values.get(j + FastIotConstants.MagicNumber.ONE).setCount(count);
  869 + }
721 } 870 }
722 - };  
723 - }  
724 -  
725 - private CompletableFuture<TsValue> findDeviceInfoByTs(String customerId, Long startTs, Long endTs, long ts, TrendType trend) {  
726 - Integer value;  
727 - if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {  
728 - value = deviceMapper.findDeviceMessageInfoByTs(customerId, startTs, endTs);  
729 - } else {  
730 - value = deviceMapper.findDeviceAlarmInfoByCreatedTime(customerId, startTs, endTs); 871 + }
  872 + values =
  873 + values.size() > FastIotConstants.MagicNumber.TEN
  874 + ? values.subList(
  875 + FastIotConstants.MagicNumber.ZERO, FastIotConstants.MagicNumber.TEN)
  876 + : values;
731 } 877 }
732 - return CompletableFuture.supplyAsync(() -> new TsValue(ts, String.valueOf(value))); 878 + response.setResult(values);
  879 + }
  880 +
  881 + @Override
  882 + public void onFailure(Throwable throwable) {
  883 + response.setResult(null);
  884 + }
  885 + };
  886 + }
  887 +
  888 + private CompletableFuture<TsValue> findDeviceInfoByTs(
  889 + String customerId, Long startTs, Long endTs, long ts, TrendType trend) {
  890 + Integer value;
  891 + if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {
  892 + value = deviceMapper.findDeviceMessageInfoByTs(customerId, startTs, endTs);
  893 + } else {
  894 + value = deviceMapper.findDeviceAlarmInfoByCreatedTime(customerId, startTs, endTs);
733 } 895 }
734 - 896 + return CompletableFuture.supplyAsync(() -> new TsValue(ts, String.valueOf(value)));
  897 + }
735 } 898 }
1 package org.thingsboard.server.dao.yunteng.service; 1 package org.thingsboard.server.dao.yunteng.service;
2 2
3 import org.springframework.web.context.request.async.DeferredResult; 3 import org.springframework.web.context.request.async.DeferredResult;
  4 +import org.thingsboard.server.common.data.id.CustomerId;
4 import org.thingsboard.server.common.data.id.EntityId; 5 import org.thingsboard.server.common.data.id.EntityId;
5 import org.thingsboard.server.common.data.id.TenantId; 6 import org.thingsboard.server.common.data.id.TenantId;
6 import org.thingsboard.server.common.data.query.TsValue; 7 import org.thingsboard.server.common.data.query.TsValue;
@@ -31,6 +31,7 @@ public interface TkDeviceProfileService extends BaseService<TkDeviceProfileEntit @@ -31,6 +31,7 @@ public interface TkDeviceProfileService extends BaseService<TkDeviceProfileEntit
31 31
32 List<DeviceProfileDTO> findDeviceProfileByIds(String tenantId, List<String> ids); 32 List<DeviceProfileDTO> findDeviceProfileByIds(String tenantId, List<String> ids);
33 33
  34 + List<DeviceProfileDTO> findDeviceProfile(String tenantId);
34 /** 验证表单数据有效性 */ 35 /** 验证表单数据有效性 */
35 boolean validateFormData(DeviceProfileDTO ytDeviceProfileDTO); 36 boolean validateFormData(DeviceProfileDTO ytDeviceProfileDTO);
36 37
@@ -181,6 +181,7 @@ @@ -181,6 +181,7 @@
181 ifd.tenant_id, 181 ifd.tenant_id,
182 ifd.organization_id, 182 ifd.organization_id,
183 ifd.create_time, 183 ifd.create_time,
  184 + ifd.device_type,
184 ifdp.NAME AS profile_name, 185 ifdp.NAME AS profile_name,
185 io.NAME AS organization_name, 186 io.NAME AS organization_name,
186 A.bool_v status, 187 A.bool_v status,