Commit 9edbf48fa2c6ff5051cdb0bf0693b7d929707303

Authored by 云中非
1 parent 4881c9b1

refactor: 获取实体运行数据接口优化

@@ -44,524 +44,565 @@ import java.util.stream.Collectors; @@ -44,524 +44,565 @@ import java.util.stream.Collectors;
44 @RequiredArgsConstructor 44 @RequiredArgsConstructor
45 public class HomePageServiceImpl implements HomePageService { 45 public class HomePageServiceImpl implements HomePageService {
46 46
47 - private final DeviceMapper deviceMapper;  
48 -  
49 - private final YtTenantService tenantService;  
50 -  
51 - private final UserMapper userMapper;  
52 -  
53 - private final EntityService entityService;  
54 -  
55 - private final ApiUsageStateService apiUsageStateService;  
56 -  
57 - private final TimeseriesService timeseriesService;  
58 -  
59 - private final YtUserService ytUserService;  
60 -  
61 - @Override  
62 - public HomePageLeftTopDTO getHomePageLeftTopInfo(  
63 - boolean isPtSysAdmin,  
64 - boolean isPtAdmin,  
65 - boolean isTenantAdmin,  
66 - String tenantId,  
67 - String currentUserId)  
68 - 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 =  
94 - LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN)  
95 - .toInstant(ZoneOffset.of("+8"))  
96 - .toEpochMilli();  
97 - List<BaseHomePageTop> baseHomePageTopList =  
98 - deviceMapper.findDeviceMessageInfo(startTs, customerId);  
99 - if (baseHomePageTopList.size() > FastIotConstants.MagicNumber.ZERO) {  
100 - messageInfo.setMessageCount(baseHomePageTopList.get(0).getSumCount());  
101 - messageInfo.setTodayMessageAdd(baseHomePageTopList.get(0).getTodayAdd()); 47 + private final DeviceMapper deviceMapper;
  48 +
  49 + private final YtTenantService tenantService;
  50 +
  51 + private final UserMapper userMapper;
  52 +
  53 + private final EntityService entityService;
  54 +
  55 + private final ApiUsageStateService apiUsageStateService;
  56 +
  57 + private final TimeseriesService timeseriesService;
  58 +
  59 + private final YtUserService ytUserService;
  60 +
  61 + @Override
  62 + public HomePageLeftTopDTO getHomePageLeftTopInfo(
  63 + boolean isPtSysAdmin,
  64 + boolean isPtAdmin,
  65 + boolean isTenantAdmin,
  66 + String tenantId,
  67 + String currentUserId)
  68 + 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 =
  94 + LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN)
  95 + .toInstant(ZoneOffset.of("+8"))
  96 + .toEpochMilli();
  97 + List<BaseHomePageTop> baseHomePageTopList =
  98 + deviceMapper.findDeviceMessageInfo(startTs, customerId);
  99 + if (baseHomePageTopList.size() > FastIotConstants.MagicNumber.ZERO) {
  100 + messageInfo.setMessageCount(baseHomePageTopList.get(0).getSumCount());
  101 + messageInfo.setTodayMessageAdd(baseHomePageTopList.get(0).getTodayAdd());
  102 + }
  103 + List<BaseHomePageTop> alarmList =
  104 + deviceMapper.findDeviceAlarmInfoByCustomer(startTs, customerId);
  105 + if (alarmList.size() > FastIotConstants.MagicNumber.ZERO) {
  106 + alarm.setSumCount(alarmList.get(0).getSumCount());
  107 + alarm.setTodayAdd(alarmList.get(0).getTodayAdd());
  108 + }
  109 + }
102 } 110 }
103 - List<BaseHomePageTop> alarmList =  
104 - deviceMapper.findDeviceAlarmInfoByCustomer(startTs, customerId);  
105 - if (alarmList.size() > FastIotConstants.MagicNumber.ZERO) {  
106 - alarm.setSumCount(alarmList.get(0).getSumCount());  
107 - alarm.setTodayAdd(alarmList.get(0).getTodayAdd()); 111 + deviceList = deviceMapper.findDevices(queryMap);
  112 + homeDeviceInfo = new HomeDeviceInfoDTO(FastIotConstants.MagicNumber.ZERO);
  113 + if (null != deviceList) {
  114 + setDeviceInfoData(deviceList, homeDeviceInfo);
108 } 115 }
109 - } 116 + homePageLeftTopDTO.setDeviceInfo(homeDeviceInfo);
  117 + homePageLeftTopDTO.setMessageInfo(messageInfo);
  118 + homePageLeftTopDTO.setAlarmInfo(alarm);
  119 + return homePageLeftTopDTO;
110 } 120 }
111 - deviceList = deviceMapper.findDevices(queryMap);  
112 - homeDeviceInfo = new HomeDeviceInfoDTO(FastIotConstants.MagicNumber.ZERO);  
113 - if (null != deviceList) {  
114 - setDeviceInfoData(deviceList, homeDeviceInfo); 121 +
  122 + @Override
  123 + public YtPageData<TenantDTO> getHomePageRightInfo(Map<String, Object> queryMap) {
  124 + return tenantService.getCurrentMonthExpireTenantPage(queryMap);
115 } 125 }
116 - homePageLeftTopDTO.setDeviceInfo(homeDeviceInfo);  
117 - homePageLeftTopDTO.setMessageInfo(messageInfo);  
118 - homePageLeftTopDTO.setAlarmInfo(alarm);  
119 - return homePageLeftTopDTO;  
120 - }  
121 -  
122 - @Override  
123 - public YtPageData<TenantDTO> getHomePageRightInfo(Map<String, Object> queryMap) {  
124 - return tenantService.getCurrentMonthExpireTenantPage(queryMap);  
125 - }  
126 -  
127 - @Override  
128 - public DeferredResult<List<TsValue>> getHomePageLeftBottomInfo(  
129 - String customerId,  
130 - long startTs,  
131 - long endTs,  
132 - long interval,  
133 - TrendType trend,  
134 - boolean isCustomer) {  
135 - List<CompletableFuture<TsValue>> futures = new ArrayList<>();  
136 - interval = interval < 7200000 ? 7200000 : interval;  
137 - long stepTs = startTs;  
138 - while (stepTs < endTs) {  
139 - long tempStartTs = stepTs;  
140 - long tempEndTs = stepTs + interval;  
141 - long ts = tempStartTs + (tempEndTs - tempStartTs) / 2;  
142 - LocalDateTime startTime =  
143 - LocalDateTime.ofEpochSecond(tempStartTs / 1000, 0, ZoneOffset.ofHours(8));  
144 - LocalDateTime endTime =  
145 - LocalDateTime.ofEpochSecond(tempEndTs / 1000, 0, ZoneOffset.ofHours(8));  
146 - CompletableFuture<TsValue> tsValueCompletableFuture = null;  
147 - //客户查询的是告警统计 消息统计  
148 - if (isCustomer) {  
149 - if (trend == TrendType.CUSTOMER_ALARM_STATISTICAL) {  
150 - tsValueCompletableFuture =  
151 - findDeviceInfoByTs(  
152 - customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_ALARM_STATISTICAL);  
153 - }  
154 - if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {  
155 - tsValueCompletableFuture =  
156 - findDeviceInfoByTs(  
157 - customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_MESSAGE_STATISTICAL); 126 +
  127 + @Override
  128 + public DeferredResult<List<TsValue>> getHomePageLeftBottomInfo(
  129 + String customerId,
  130 + long startTs,
  131 + long endTs,
  132 + long interval,
  133 + TrendType trend,
  134 + boolean isCustomer) {
  135 + List<CompletableFuture<TsValue>> futures = new ArrayList<>();
  136 + interval = interval < 7200000 ? 7200000 : interval;
  137 + long stepTs = startTs;
  138 + while (stepTs < endTs) {
  139 + long tempStartTs = stepTs;
  140 + long tempEndTs = stepTs + interval;
  141 + long ts = tempStartTs + (tempEndTs - tempStartTs) / 2;
  142 + LocalDateTime startTime =
  143 + LocalDateTime.ofEpochSecond(tempStartTs / 1000, 0, ZoneOffset.ofHours(8));
  144 + LocalDateTime endTime =
  145 + LocalDateTime.ofEpochSecond(tempEndTs / 1000, 0, ZoneOffset.ofHours(8));
  146 + CompletableFuture<TsValue> tsValueCompletableFuture = null;
  147 + //客户查询的是告警统计 消息统计
  148 + if (isCustomer) {
  149 + if (trend == TrendType.CUSTOMER_ALARM_STATISTICAL) {
  150 + tsValueCompletableFuture =
  151 + findDeviceInfoByTs(
  152 + customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_ALARM_STATISTICAL);
  153 + }
  154 + if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {
  155 + tsValueCompletableFuture =
  156 + findDeviceInfoByTs(
  157 + customerId, tempStartTs, tempEndTs, ts, TrendType.CUSTOMER_MESSAGE_STATISTICAL);
  158 + }
  159 + } else {
  160 + if (trend == TrendType.TENANT_TREND) {
  161 + tsValueCompletableFuture = tenantService.findTenantsByTs(startTime, endTime, ts);
  162 + }
  163 + if (trend == TrendType.CUSTOMER_TREND) {
  164 + tsValueCompletableFuture = ytUserService.findUsersAsyncByTs(startTime, endTime, ts);
  165 + }
  166 + }
  167 + futures.add(tsValueCompletableFuture);
  168 + stepTs = tempEndTs;
158 } 169 }
159 - } else {  
160 - if (trend == TrendType.TENANT_TREND) {  
161 - tsValueCompletableFuture = tenantService.findTenantsByTs(startTime, endTime, ts); 170 + final DeferredResult<List<TsValue>> deferredResult = new DeferredResult<>();
  171 + if (futures.size() > FastIotConstants.MagicNumber.ZERO) {
  172 + ListenableFuture<List<TsValue>> listenableFuture =
  173 + Futures.transform(
  174 + setFutures(futures),
  175 + tsValues -> {
  176 + if (tsValues != null && !tsValues.isEmpty()) {
  177 + return tsValues;
  178 + } else {
  179 + return null;
  180 + }
  181 + },
  182 + MoreExecutors.directExecutor());
  183 + Futures.addCallback(
  184 + listenableFuture, getTsValueCallback(deferredResult), MoreExecutors.directExecutor());
162 } 185 }
163 - if (trend == TrendType.CUSTOMER_TREND) {  
164 - tsValueCompletableFuture = ytUserService.findUsersAsyncByTs(startTime, endTime, ts); 186 + return deferredResult;
  187 + }
  188 +
  189 + @Override
  190 + public DeferredResult<List<TenantTransportMessageDTO>> getTop10() {
  191 + List<TenantDTO> tenants = tenantService.getAllTenant();
  192 + List<CompletableFuture<TenantTransportMessageDTO>> futures = new ArrayList<>();
  193 + tenants.forEach(
  194 + tenant -> {
  195 + TenantId tenantId = new TenantId(UUID.fromString(tenant.getTenantId()));
  196 + futures.add(getTransportMessageByTenantId(tenantId, tenant.getName()));
  197 + });
  198 + final DeferredResult<List<TenantTransportMessageDTO>> deferredResult = new DeferredResult<>();
  199 + if (futures.size() > FastIotConstants.MagicNumber.ZERO) {
  200 + ListenableFuture<List<TenantTransportMessageDTO>> listenableFuture =
  201 + Futures.transform(
  202 + settableFuture(futures),
  203 + transportMessage -> {
  204 + if (transportMessage != null && !transportMessage.isEmpty()) {
  205 + return transportMessage;
  206 + } else {
  207 + return null;
  208 + }
  209 + },
  210 + MoreExecutors.directExecutor());
  211 + Futures.addCallback(
  212 + listenableFuture,
  213 + getTransportMessageCallback(deferredResult),
  214 + MoreExecutors.directExecutor());
  215 + } else {
  216 + List<TenantTransportMessageDTO> result = new ArrayList<>();
  217 + deferredResult.setResult(result);
165 } 218 }
166 - }  
167 - futures.add(tsValueCompletableFuture);  
168 - stepTs = tempEndTs; 219 + return deferredResult;
169 } 220 }
170 - final DeferredResult<List<TsValue>> deferredResult = new DeferredResult<>();  
171 - if (futures.size() > FastIotConstants.MagicNumber.ZERO) {  
172 - ListenableFuture<List<TsValue>> listenableFuture =  
173 - Futures.transform(  
174 - setFutures(futures),  
175 - tsValues -> {  
176 - if (tsValues != null && !tsValues.isEmpty()) {  
177 - return tsValues;  
178 - } else {  
179 - return null;  
180 - }  
181 - },  
182 - MoreExecutors.directExecutor());  
183 - Futures.addCallback(  
184 - listenableFuture, getTsValueCallback(deferredResult), MoreExecutors.directExecutor()); 221 +
  222 + @Override
  223 + @Async
  224 + public CompletableFuture<TenantTransportMessageDTO> getTransportMessageByTenantId(
  225 + TenantId tenantId, String tenantName) {
  226 + List<EntityKey> latestValues = new ArrayList<>();
  227 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));
  228 + ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(tenantId);
  229 + PageData<EntityData> pageData = queryEntityData(apiUsageState.getId(), tenantId, null, latestValues);
  230 + Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();
  231 + TenantTransportMessageDTO transportMessage = new TenantTransportMessageDTO();
  232 + latest
  233 + .keySet()
  234 + .forEach(
  235 + item -> {
  236 + if (item.equals(EntityKeyType.TIME_SERIES)) {
  237 + Map<String, TsValue> tsValueMap = latest.get(item);
  238 + tsValueMap
  239 + .keySet()
  240 + .forEach(
  241 + mapKey -> {
  242 + Long value =
  243 + Long.valueOf(
  244 + tsValueMap.get(mapKey).getValue().isEmpty()
  245 + ? FastIotConstants.MagicNumber.ZERO + ""
  246 + : tsValueMap.get(mapKey).getValue());
  247 + if (mapKey.equals("transportMsgCount")) {
  248 + transportMessage.setName(tenantName);
  249 + transportMessage.setCount(value);
  250 + }
  251 + });
  252 + }
  253 + });
  254 + return CompletableFuture.supplyAsync(() -> transportMessage);
185 } 255 }
186 - return deferredResult;  
187 - }  
188 -  
189 - @Override  
190 - public DeferredResult<List<TenantTransportMessageDTO>> getTop10() {  
191 - List<TenantDTO> tenants = tenantService.getAllTenant();  
192 - List<CompletableFuture<TenantTransportMessageDTO>> futures = new ArrayList<>();  
193 - tenants.forEach(  
194 - tenant -> {  
195 - TenantId tenantId = new TenantId(UUID.fromString(tenant.getTenantId()));  
196 - futures.add(getTransportMessageByTenantId(tenantId, tenant.getName()));  
197 - });  
198 - final DeferredResult<List<TenantTransportMessageDTO>> deferredResult = new DeferredResult<>();  
199 - if (futures.size() > FastIotConstants.MagicNumber.ZERO) {  
200 - ListenableFuture<List<TenantTransportMessageDTO>> listenableFuture =  
201 - Futures.transform(  
202 - settableFuture(futures),  
203 - transportMessage -> {  
204 - if (transportMessage != null && !transportMessage.isEmpty()) {  
205 - return transportMessage;  
206 - } else {  
207 - return null;  
208 - }  
209 - },  
210 - MoreExecutors.directExecutor());  
211 - Futures.addCallback(  
212 - listenableFuture,  
213 - getTransportMessageCallback(deferredResult),  
214 - MoreExecutors.directExecutor());  
215 - } else {  
216 - List<TenantTransportMessageDTO> result = new ArrayList<>();  
217 - deferredResult.setResult(result); 256 +
  257 + /**
  258 + * 设置设备相关的数据
  259 + *
  260 + * @param deviceList 拥有的设备
  261 + * @param homeDeviceInfoDTO 首页信息
  262 + */
  263 + private void setDeviceInfoData(List<DeviceDTO> deviceList, HomeDeviceInfoDTO homeDeviceInfoDTO) {
  264 + homeDeviceInfoDTO.setSumCount(deviceList.size());
  265 + deviceList.forEach(
  266 + ytDevice -> {
  267 + int basicNum = FastIotConstants.MagicNumber.ONE;
  268 + ZoneOffset zoneOffset = ZoneOffset.of("+8");
  269 + LocalDateTime todayZeroTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
  270 + if (ytDevice.getCreateTime().atZone(zoneOffset).toInstant().toEpochMilli()
  271 + >= todayZeroTime.toInstant(zoneOffset).toEpochMilli()) {
  272 + homeDeviceInfoDTO.setTodayAdd(homeDeviceInfoDTO.getTodayAdd() + basicNum);
  273 + }
  274 + switch (ytDevice.getDeviceState()) {
  275 + case OFFLINE:
  276 + homeDeviceInfoDTO.setOffLine(homeDeviceInfoDTO.getOffLine() + basicNum);
  277 + break;
  278 + case ONLINE:
  279 + homeDeviceInfoDTO.setOnLine(homeDeviceInfoDTO.getOnLine() + basicNum);
  280 + break;
  281 + case INACTIVE:
  282 + homeDeviceInfoDTO.setInActive(homeDeviceInfoDTO.getInActive() + basicNum);
  283 + break;
  284 + default:
  285 + break;
  286 + }
  287 + });
  288 + }
  289 +
  290 + /**
  291 + * 获取当前用户权限下的租户信息
  292 + * @return
  293 + */
  294 + private List<TenantDTO> getTenantInfo(){
  295 + List<TenantDTO> tenants = tenantService.getAllTenant();
  296 + return tenants;
218 } 297 }
219 - return deferredResult;  
220 - }  
221 -  
222 - @Override  
223 - @Async  
224 - public CompletableFuture<TenantTransportMessageDTO> getTransportMessageByTenantId(  
225 - TenantId tenantId, String tenantName) {  
226 - List<EntityKey> latestValues = new ArrayList<>();  
227 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));  
228 - PageData<EntityData> pageData = queryEntityData(tenantId, null, latestValues);  
229 - Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();  
230 - TenantTransportMessageDTO transportMessage = new TenantTransportMessageDTO();  
231 - latest  
232 - .keySet()  
233 - .forEach(  
234 - item -> {  
235 - if (item.equals(EntityKeyType.TIME_SERIES)) {  
236 - Map<String, TsValue> tsValueMap = latest.get(item);  
237 - tsValueMap  
238 - .keySet()  
239 - .forEach(  
240 - mapKey -> {  
241 - Long value =  
242 - Long.valueOf(  
243 - tsValueMap.get(mapKey).getValue().isEmpty()  
244 - ? FastIotConstants.MagicNumber.ZERO + ""  
245 - : tsValueMap.get(mapKey).getValue());  
246 - if (mapKey.equals("transportMsgCount")) {  
247 - transportMessage.setName(tenantName);  
248 - transportMessage.setCount(value);  
249 - } 298 +
  299 + /**
  300 + * 获取当前用户权限下的客户信息
  301 + * @return
  302 + */
  303 + private List<UserDTO> getCustomerInfo(){
  304 + List<UserDTO> userList = userMapper.getUserCountByRoleType(RoleEnum.CUSTOMER_USER);
  305 + return userList;
  306 + }
  307 + private List<TenantDTO> getApiUsageInfo(){
  308 + List<TenantDTO> tenants = tenantService.getAllTenant();
  309 + return tenants;
  310 + }
  311 + private List<TenantDTO> getDeviceInfo(){
  312 + List<TenantDTO> tenants = tenantService.getAllTenant();
  313 + return tenants;
  314 + }
  315 + private List<TenantDTO> getAlarmInfo(){
  316 + List<TenantDTO> tenants = tenantService.getAllTenant();
  317 + return tenants;
  318 + }
  319 + /**
  320 + * 设置租户返回信息
  321 + *
  322 + * @param homePageLeftTopDTO 首页顶部返回
  323 + * @param startTime 今日开始时间
  324 + * @param endTime 今日结束时间
  325 + */
  326 + private void setTenantInfoData(
  327 + HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {
  328 + List<TenantDTO> tenants = tenantService.getAllTenant();
  329 + int todayAdd =
  330 + (int)
  331 + tenants.stream()
  332 + .filter(
  333 + tenant ->
  334 + tenant.getCreateTime().isAfter(startTime)
  335 + && tenant.getCreateTime().isBefore(endTime))
  336 + .count();
  337 + int sumCount = tenants.size();
  338 + BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);
  339 + homePageLeftTopDTO.setTenantInfo(baseHomePageTop);
  340 + }
  341 +
  342 + /**
  343 + * 设置首页的告警和消息
  344 + *
  345 + * @param tenantId 租户ID
  346 + * @param messageInfo 消息
  347 + * @param alarm 告警
  348 + */
  349 + private void setAlarmAndMessageInfo(
  350 + String tenantId, HomePageTopMessage messageInfo, BaseHomePageTop alarm)
  351 + throws ExecutionException, InterruptedException {
  352 + List<EntityKey> entityFields = new ArrayList<>();
  353 + entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "name"));
  354 + entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "label"));
  355 + entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "additionalInfo"));
  356 + List<EntityKey> latestValues = new ArrayList<>();
  357 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));
  358 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportDataPointsCount"));
  359 + latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "createdAlarmsCount"));
  360 +
  361 + TenantId currentTenantId = new TenantId(UUID.fromString(tenantId));
  362 + ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(currentTenantId);
  363 + PageData<EntityData> pageData = queryEntityData(apiUsageState.getId(), currentTenantId, entityFields, latestValues);
  364 + Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();
  365 + latest
  366 + .keySet()
  367 + .forEach(
  368 + item -> {
  369 + if (item.equals(EntityKeyType.TIME_SERIES)) {
  370 + Map<String, TsValue> tsValueMap = latest.get(item);
  371 + tsValueMap
  372 + .keySet()
  373 + .forEach(
  374 + mapKey -> {
  375 + String tsValue = tsValueMap.get(mapKey).getValue();
  376 + Integer value =
  377 + StringUtils.isEmpty(tsValue)
  378 + ? FastIotConstants.MagicNumber.ZERO
  379 + : Integer.parseInt(tsValue);
  380 + switch (mapKey) {
  381 + case "createdAlarmsCount":
  382 + alarm.setSumCount(value);
  383 + break;
  384 + case "transportMsgCount":
  385 + messageInfo.setMessageCount(value);
  386 + break;
  387 + case "transportDataPointsCount":
  388 + messageInfo.setDataPointsCount(value);
  389 + break;
  390 + default:
  391 + break;
  392 + }
  393 + });
  394 + }
250 }); 395 });
251 - }  
252 - });  
253 - return CompletableFuture.supplyAsync(() -> transportMessage);  
254 - }  
255 -  
256 - /**  
257 - * 设置设备相关的数据  
258 - *  
259 - * @param deviceList 拥有的设备  
260 - * @param homeDeviceInfoDTO 首页信息  
261 - */  
262 - private void setDeviceInfoData(List<DeviceDTO> deviceList, HomeDeviceInfoDTO homeDeviceInfoDTO) {  
263 - homeDeviceInfoDTO.setSumCount(deviceList.size());  
264 - deviceList.forEach(  
265 - ytDevice -> {  
266 - int basicNum = FastIotConstants.MagicNumber.ONE;  
267 - ZoneOffset zoneOffset = ZoneOffset.of("+8");  
268 - LocalDateTime todayZeroTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);  
269 - if (ytDevice.getCreateTime().atZone(zoneOffset).toInstant().toEpochMilli()  
270 - >= todayZeroTime.toInstant(zoneOffset).toEpochMilli()) {  
271 - homeDeviceInfoDTO.setTodayAdd(homeDeviceInfoDTO.getTodayAdd() + basicNum);  
272 - }  
273 - switch (ytDevice.getDeviceState()) {  
274 - case OFFLINE:  
275 - homeDeviceInfoDTO.setOffLine(homeDeviceInfoDTO.getOffLine() + basicNum);  
276 - break;  
277 - case ONLINE:  
278 - homeDeviceInfoDTO.setOnLine(homeDeviceInfoDTO.getOnLine() + basicNum);  
279 - break;  
280 - case INACTIVE:  
281 - homeDeviceInfoDTO.setInActive(homeDeviceInfoDTO.getInActive() + basicNum);  
282 - break;  
283 - default:  
284 - break;  
285 - }  
286 - });  
287 - }  
288 -  
289 - /**  
290 - * 设置租户返回信息  
291 - *  
292 - * @param homePageLeftTopDTO 首页顶部返回  
293 - * @param startTime 今日开始时间  
294 - * @param endTime 今日结束时间  
295 - */  
296 - private void setTenantInfoData(  
297 - HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {  
298 - List<TenantDTO> tenants = tenantService.getAllTenant();  
299 - int todayAdd =  
300 - (int)  
301 - tenants.stream()  
302 - .filter(  
303 - tenant ->  
304 - tenant.getCreateTime().isAfter(startTime)  
305 - && tenant.getCreateTime().isBefore(endTime))  
306 - .count();  
307 - int sumCount = tenants.size();  
308 - BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);  
309 - homePageLeftTopDTO.setTenantInfo(baseHomePageTop);  
310 - }  
311 -  
312 - /**  
313 - * 设置首页的告警和消息  
314 - *  
315 - * @param tenantId 租户ID  
316 - * @param messageInfo 消息  
317 - * @param alarm 告警  
318 - */  
319 - private void setAlarmAndMessageInfo(  
320 - String tenantId, HomePageTopMessage messageInfo, BaseHomePageTop alarm)  
321 - throws ExecutionException, InterruptedException {  
322 - List<EntityKey> entityFields = new ArrayList<>();  
323 - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "name"));  
324 - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "label"));  
325 - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, "additionalInfo"));  
326 - List<EntityKey> latestValues = new ArrayList<>();  
327 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportMsgCount"));  
328 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "transportDataPointsCount"));  
329 - latestValues.add(new EntityKey(EntityKeyType.TIME_SERIES, "createdAlarmsCount"));  
330 -  
331 - TenantId currentTenantId = new TenantId(UUID.fromString(tenantId));  
332 - ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(currentTenantId);  
333 - PageData<EntityData> pageData = queryEntityData(currentTenantId, entityFields, latestValues);  
334 - Map<EntityKeyType, Map<String, TsValue>> latest = pageData.getData().get(0).getLatest();  
335 - latest  
336 - .keySet()  
337 - .forEach(  
338 - item -> {  
339 - if (item.equals(EntityKeyType.TIME_SERIES)) {  
340 - Map<String, TsValue> tsValueMap = latest.get(item);  
341 - tsValueMap  
342 - .keySet()  
343 - .forEach(  
344 - mapKey -> {  
345 - String tsValue = tsValueMap.get(mapKey).getValue();  
346 - Integer value =  
347 - StringUtils.isEmpty(tsValue)  
348 - ? FastIotConstants.MagicNumber.ZERO  
349 - : Integer.parseInt(tsValue);  
350 - switch (mapKey) {  
351 - case "createdAlarmsCount":  
352 - alarm.setSumCount(value);  
353 - break;  
354 - case "transportMsgCount":  
355 - messageInfo.setMessageCount(value);  
356 - break;  
357 - case "transportDataPointsCount":  
358 - messageInfo.setDataPointsCount(value);  
359 - break; 396 +
  397 + // 查询今日数据
  398 + setTodayAlarmAndMessageInfo(currentTenantId, apiUsageState, messageInfo, alarm);
  399 + }
  400 +
  401 + /**
  402 + * 设置今日告警和今日消息
  403 + *
  404 + * @param currentTenantId 当前租户
  405 + * @param apiUsageState api调用统计
  406 + * @param messageInfo 消息
  407 + * @param alarm 告警
  408 + * @throws ExecutionException 异常
  409 + * @throws InterruptedException 异常
  410 + */
  411 + private void setTodayAlarmAndMessageInfo(
  412 + TenantId currentTenantId,
  413 + ApiUsageState apiUsageState,
  414 + HomePageTopMessage messageInfo,
  415 + BaseHomePageTop alarm)
  416 + throws ExecutionException, InterruptedException {
  417 + List<ReadTsKvQuery> queries = new ArrayList<>();
  418 + long startTs =
  419 + LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN)
  420 + .toInstant(ZoneOffset.of("+8"))
  421 + .toEpochMilli();
  422 + long endTs = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
  423 + int interval = 7200000;
  424 + int limit = (int) ((endTs - startTs) / interval) + FastIotConstants.MagicNumber.ONE;
  425 + queries.add(
  426 + new BaseReadTsKvQuery(
  427 + "transportMsgCountHourly", startTs, endTs, interval, limit, Aggregation.SUM));
  428 + queries.add(
  429 + new BaseReadTsKvQuery(
  430 + "transportDataPointsCountHourly", startTs, endTs, interval, limit, Aggregation.SUM));
  431 + queries.add(
  432 + new BaseReadTsKvQuery(
  433 + "createdAlarmsCountHourly", startTs, endTs, interval, limit, Aggregation.SUM));
  434 + List<TsKvEntry> tsKv =
  435 + timeseriesService.findAll(currentTenantId, apiUsageState.getId(), queries).get();
  436 + tsKv.forEach(
  437 + tsKvEntry -> {
  438 + if (tsKvEntry.getLongValue().isPresent()) {
  439 + int count = tsKvEntry.getLongValue().get().intValue();
  440 + switch (tsKvEntry.getKey()) {
  441 + case "transportMsgCountHourly":
  442 + messageInfo.setTodayMessageAdd(count + messageInfo.getTodayMessageAdd());
  443 + break;
  444 + case "transportDataPointsCountHourly":
  445 + messageInfo.setTodayDataPointsAdd(count + messageInfo.getTodayDataPointsAdd());
  446 + break;
  447 + case "createdAlarmsCountHourly":
  448 + alarm.setTodayAdd(count + alarm.getTodayAdd());
  449 + break;
360 default: 450 default:
361 - break;  
362 - }  
363 - });  
364 - }  
365 - });  
366 -  
367 - // 查询今日数据  
368 - setTodayAlarmAndMessageInfo(currentTenantId, apiUsageState, messageInfo, alarm);  
369 - }  
370 -  
371 - /**  
372 - * 设置今日告警和今日消息  
373 - *  
374 - * @param currentTenantId 当前租户  
375 - * @param apiUsageState api调用统计  
376 - * @param messageInfo 消息  
377 - * @param alarm 告警  
378 - * @throws ExecutionException 异常  
379 - * @throws InterruptedException 异常  
380 - */  
381 - private void setTodayAlarmAndMessageInfo(  
382 - TenantId currentTenantId,  
383 - ApiUsageState apiUsageState,  
384 - HomePageTopMessage messageInfo,  
385 - BaseHomePageTop alarm)  
386 - throws ExecutionException, InterruptedException {  
387 - List<ReadTsKvQuery> queries = new ArrayList<>();  
388 - long startTs =  
389 - LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN)  
390 - .toInstant(ZoneOffset.of("+8"))  
391 - .toEpochMilli();  
392 - long endTs = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();  
393 - int interval = 7200000;  
394 - int limit = (int) ((endTs - startTs) / interval) + FastIotConstants.MagicNumber.ONE;  
395 - queries.add(  
396 - new BaseReadTsKvQuery(  
397 - "transportMsgCountHourly", startTs, endTs, interval, limit, Aggregation.SUM));  
398 - queries.add(  
399 - new BaseReadTsKvQuery(  
400 - "transportDataPointsCountHourly", startTs, endTs, interval, limit, Aggregation.SUM));  
401 - queries.add(  
402 - new BaseReadTsKvQuery(  
403 - "createdAlarmsCountHourly", startTs, endTs, interval, limit, Aggregation.SUM));  
404 - List<TsKvEntry> tsKv =  
405 - timeseriesService.findAll(currentTenantId, apiUsageState.getId(), queries).get();  
406 - tsKv.forEach(  
407 - tsKvEntry -> {  
408 - if (tsKvEntry.getLongValue().isPresent()) {  
409 - int count = tsKvEntry.getLongValue().get().intValue();  
410 - switch (tsKvEntry.getKey()) {  
411 - case "transportMsgCountHourly":  
412 - messageInfo.setTodayMessageAdd(count + messageInfo.getTodayMessageAdd());  
413 - break;  
414 - case "transportDataPointsCountHourly":  
415 - messageInfo.setTodayDataPointsAdd(count + messageInfo.getTodayDataPointsAdd());  
416 - break;  
417 - case "createdAlarmsCountHourly":  
418 - alarm.setTodayAdd(count + alarm.getTodayAdd());  
419 - break;  
420 - default:  
421 - break; 451 + break;
  452 + }
  453 + }
  454 + });
  455 + }
  456 +
  457 + /**
  458 + * 查询实体的运行数据
  459 + * @param entityId 实体ID,例如:设备、用户、流量统计等
  460 + * @param currentTenantId 租户ID
  461 + * @param entityFields 查询的实体字段
  462 + * @param latestValues 查询的运行数据字段,例如:遥测数据、操作记录等。
  463 + * @return
  464 + */
  465 + private PageData<EntityData> queryEntityData(EntityId entityId,TenantId currentTenantId, List<EntityKey> entityFields, List<EntityKey> latestValues) {
  466 + CustomerId customerId = new CustomerId(EntityId.NULL_UUID);
  467 +
  468 + EntityKey key = new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime");
  469 + EntityDataSortOrder sortOrder =
  470 + new EntityDataSortOrder(key, EntityDataSortOrder.Direction.DESC);
  471 +
  472 + EntityDataPageLink pageLink =
  473 + new EntityDataPageLink(
  474 + FastIotConstants.MagicNumber.ONE, FastIotConstants.MagicNumber.ZERO, null, sortOrder);
  475 +
  476 + SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
  477 + singleEntityFilter.setSingleEntity(entityId);
  478 +
  479 + EntityDataQuery query =
  480 + new EntityDataQuery(singleEntityFilter, pageLink, entityFields, latestValues, null);
  481 +
  482 + return entityService.findEntityDataByQuery(currentTenantId, customerId, query);
  483 + }
  484 +
  485 + /**
  486 + * 设置客户返回信息
  487 + *
  488 + * @param homePageLeftTopDTO 首页顶部返回
  489 + * @param startTime 今日开始时间
  490 + * @param endTime 今日结束时间
  491 + */
  492 + private void setCustomerInfoData(
  493 + HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {
  494 + List<UserDTO> userList = userMapper.getUserCountByRoleType(RoleEnum.CUSTOMER_USER);
  495 + int sumCount = userList != null ? userList.size() : FastIotConstants.MagicNumber.ZERO;
  496 +
  497 + int todayAdd = FastIotConstants.MagicNumber.ZERO;
  498 + if (userList != null && userList.size() > FastIotConstants.MagicNumber.ZERO) {
  499 + todayAdd +=
  500 + userList.stream()
  501 + .filter(
  502 + userDTO ->
  503 + userDTO.getCreateTime().isAfter(startTime)
  504 + && userDTO.getCreateTime().isBefore(endTime))
  505 + .count();
  506 + }
  507 + BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);
  508 + homePageLeftTopDTO.setCustomerInfo(baseHomePageTop);
  509 + }
  510 +
  511 + private SettableFuture<List<TsValue>> setFutures(List<CompletableFuture<TsValue>> tsFutures) {
  512 + SettableFuture<List<TsValue>> listenableFuture = SettableFuture.create();
  513 + CompletableFuture<List<TsValue>> entities =
  514 + CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()]))
  515 + .thenApply(
  516 + v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));
  517 + entities.whenComplete(
  518 + (tsValues, throwable) -> {
  519 + if (throwable != null) {
  520 + listenableFuture.setException(throwable);
  521 + } else {
  522 + listenableFuture.set(tsValues);
  523 + }
  524 + });
  525 + return listenableFuture;
  526 + }
  527 +
  528 + private SettableFuture<List<TenantTransportMessageDTO>> settableFuture(
  529 + List<CompletableFuture<TenantTransportMessageDTO>> tsFutures) {
  530 + SettableFuture<List<TenantTransportMessageDTO>> listenableFuture = SettableFuture.create();
  531 + CompletableFuture<List<TenantTransportMessageDTO>> entities =
  532 + CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()]))
  533 + .thenApply(
  534 + v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));
  535 + entities.whenComplete(
  536 + (tsValues, throwable) -> {
  537 + if (throwable != null) {
  538 + listenableFuture.setException(throwable);
  539 + } else {
  540 + listenableFuture.set(tsValues);
  541 + }
  542 + });
  543 + return listenableFuture;
  544 + }
  545 +
  546 + private FutureCallback<List<TsValue>> getTsValueCallback(
  547 + final DeferredResult<List<TsValue>> response) {
  548 + return new FutureCallback<>() {
  549 + @Override
  550 + public void onSuccess(@Nullable List<TsValue> tsValues) {
  551 + response.setResult(tsValues);
  552 + }
  553 +
  554 + @Override
  555 + public void onFailure(Throwable throwable) {
  556 + response.setResult(null);
422 } 557 }
423 - }  
424 - });  
425 - }  
426 -  
427 - private PageData<EntityData> queryEntityData(  
428 - TenantId currentTenantId, List<EntityKey> entityFields, List<EntityKey> latestValues) {  
429 - CustomerId customerId = new CustomerId(EntityId.NULL_UUID);  
430 - EntityKey key = new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime");  
431 - EntityDataSortOrder sortOrder =  
432 - new EntityDataSortOrder(key, EntityDataSortOrder.Direction.DESC);  
433 - EntityDataPageLink pageLink =  
434 - new EntityDataPageLink(  
435 - FastIotConstants.MagicNumber.ONE, FastIotConstants.MagicNumber.ZERO, null, sortOrder);  
436 - SingleEntityFilter singleEntityFilter = new SingleEntityFilter();  
437 - ApiUsageState apiUsageState = apiUsageStateService.findTenantApiUsageState(currentTenantId);  
438 - singleEntityFilter.setSingleEntity(apiUsageState.getId());  
439 -  
440 - EntityDataQuery query =  
441 - new EntityDataQuery(singleEntityFilter, pageLink, entityFields, latestValues, null);  
442 - return entityService.findEntityDataByQuery(currentTenantId, customerId, query);  
443 - }  
444 - /**  
445 - * 设置客户返回信息  
446 - *  
447 - * @param homePageLeftTopDTO 首页顶部返回  
448 - * @param startTime 今日开始时间  
449 - * @param endTime 今日结束时间  
450 - */  
451 - private void setCustomerInfoData(  
452 - HomePageLeftTopDTO homePageLeftTopDTO, LocalDateTime startTime, LocalDateTime endTime) {  
453 - List<UserDTO> userList = userMapper.getUserCountByRoleType(RoleEnum.CUSTOMER_USER);  
454 - int sumCount = userList != null ? userList.size() : FastIotConstants.MagicNumber.ZERO;  
455 -  
456 - int todayAdd = FastIotConstants.MagicNumber.ZERO;  
457 - if (userList != null && userList.size() > FastIotConstants.MagicNumber.ZERO) {  
458 - todayAdd +=  
459 - userList.stream()  
460 - .filter(  
461 - userDTO ->  
462 - userDTO.getCreateTime().isAfter(startTime)  
463 - && userDTO.getCreateTime().isBefore(endTime))  
464 - .count(); 558 + };
465 } 559 }
466 - BaseHomePageTop baseHomePageTop = new BaseHomePageTop(sumCount, todayAdd);  
467 - homePageLeftTopDTO.setCustomerInfo(baseHomePageTop);  
468 - }  
469 -  
470 - private SettableFuture<List<TsValue>> setFutures(List<CompletableFuture<TsValue>> tsFutures) {  
471 - SettableFuture<List<TsValue>> listenableFuture = SettableFuture.create();  
472 - CompletableFuture<List<TsValue>> entities =  
473 - CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()]))  
474 - .thenApply(  
475 - v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));  
476 - entities.whenComplete(  
477 - (tsValues, throwable) -> {  
478 - if (throwable != null) {  
479 - listenableFuture.setException(throwable);  
480 - } else {  
481 - listenableFuture.set(tsValues);  
482 - }  
483 - });  
484 - return listenableFuture;  
485 - }  
486 -  
487 - private SettableFuture<List<TenantTransportMessageDTO>> settableFuture(  
488 - List<CompletableFuture<TenantTransportMessageDTO>> tsFutures) {  
489 - SettableFuture<List<TenantTransportMessageDTO>> listenableFuture = SettableFuture.create();  
490 - CompletableFuture<List<TenantTransportMessageDTO>> entities =  
491 - CompletableFuture.allOf(tsFutures.toArray(new CompletableFuture[tsFutures.size()]))  
492 - .thenApply(  
493 - v -> tsFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()));  
494 - entities.whenComplete(  
495 - (tsValues, throwable) -> {  
496 - if (throwable != null) {  
497 - listenableFuture.setException(throwable);  
498 - } else {  
499 - listenableFuture.set(tsValues);  
500 - }  
501 - });  
502 - return listenableFuture;  
503 - }  
504 -  
505 - private FutureCallback<List<TsValue>> getTsValueCallback(  
506 - final DeferredResult<List<TsValue>> response) {  
507 - return new FutureCallback<>() {  
508 - @Override  
509 - public void onSuccess(@Nullable List<TsValue> tsValues) {  
510 - response.setResult(tsValues);  
511 - }  
512 -  
513 - @Override  
514 - public void onFailure(Throwable throwable) {  
515 - response.setResult(null);  
516 - }  
517 - };  
518 - }  
519 -  
520 - private FutureCallback<List<TenantTransportMessageDTO>> getTransportMessageCallback(  
521 - final DeferredResult<List<TenantTransportMessageDTO>> response) {  
522 - return new FutureCallback<>() {  
523 - @Override  
524 - public void onSuccess(@Nullable List<TenantTransportMessageDTO> values) {  
525 - // sort  
526 - if (null != values && values.size() > FastIotConstants.MagicNumber.ZERO) {  
527 - int length = values.size() - FastIotConstants.MagicNumber.ONE;  
528 - for (int i = FastIotConstants.MagicNumber.ZERO; i < length; i++) {  
529 - for (int j = FastIotConstants.MagicNumber.ZERO; j < length - i; j++) {  
530 - if (values.get(j).getCount()  
531 - < values.get(j + FastIotConstants.MagicNumber.ONE).getCount()) {  
532 - String name = values.get(j).getName();  
533 - Long count = values.get(j).getCount();  
534 - values.get(j).setName(values.get(j + FastIotConstants.MagicNumber.ONE).getName());  
535 - values.get(j).setCount(values.get(j + FastIotConstants.MagicNumber.ONE).getCount());  
536 - values.get(j + FastIotConstants.MagicNumber.ONE).setName(name);  
537 - values.get(j + FastIotConstants.MagicNumber.ONE).setCount(count);  
538 - } 560 +
  561 + private FutureCallback<List<TenantTransportMessageDTO>> getTransportMessageCallback(
  562 + final DeferredResult<List<TenantTransportMessageDTO>> response) {
  563 + return new FutureCallback<>() {
  564 + @Override
  565 + public void onSuccess(@Nullable List<TenantTransportMessageDTO> values) {
  566 + // sort
  567 + if (null != values && values.size() > FastIotConstants.MagicNumber.ZERO) {
  568 + int length = values.size() - FastIotConstants.MagicNumber.ONE;
  569 + for (int i = FastIotConstants.MagicNumber.ZERO; i < length; i++) {
  570 + for (int j = FastIotConstants.MagicNumber.ZERO; j < length - i; j++) {
  571 + if (values.get(j).getCount()
  572 + < values.get(j + FastIotConstants.MagicNumber.ONE).getCount()) {
  573 + String name = values.get(j).getName();
  574 + Long count = values.get(j).getCount();
  575 + values.get(j).setName(values.get(j + FastIotConstants.MagicNumber.ONE).getName());
  576 + values.get(j).setCount(values.get(j + FastIotConstants.MagicNumber.ONE).getCount());
  577 + values.get(j + FastIotConstants.MagicNumber.ONE).setName(name);
  578 + values.get(j + FastIotConstants.MagicNumber.ONE).setCount(count);
  579 + }
  580 + }
  581 + }
  582 + values =
  583 + values.size() > FastIotConstants.MagicNumber.TEN
  584 + ? values.subList(
  585 + FastIotConstants.MagicNumber.ZERO, FastIotConstants.MagicNumber.TEN)
  586 + : values;
  587 + }
  588 + response.setResult(values);
  589 + }
  590 +
  591 + @Override
  592 + public void onFailure(Throwable throwable) {
  593 + response.setResult(null);
539 } 594 }
540 - }  
541 - values =  
542 - values.size() > FastIotConstants.MagicNumber.TEN  
543 - ? values.subList(  
544 - FastIotConstants.MagicNumber.ZERO, FastIotConstants.MagicNumber.TEN)  
545 - : values; 595 + };
  596 + }
  597 +
  598 + private CompletableFuture<TsValue> findDeviceInfoByTs(
  599 + String customerId, Long startTs, Long endTs, long ts, TrendType trend) {
  600 + Integer value;
  601 + if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {
  602 + value = deviceMapper.findDeviceMessageInfoByTs(customerId, startTs, endTs);
  603 + } else {
  604 + value = deviceMapper.findDeviceAlarmInfoByCreatedTime(customerId, startTs, endTs);
546 } 605 }
547 - response.setResult(values);  
548 - }  
549 -  
550 - @Override  
551 - public void onFailure(Throwable throwable) {  
552 - response.setResult(null);  
553 - }  
554 - };  
555 - }  
556 -  
557 - private CompletableFuture<TsValue> findDeviceInfoByTs(  
558 - String customerId, Long startTs, Long endTs, long ts, TrendType trend) {  
559 - Integer value;  
560 - if (trend == TrendType.CUSTOMER_MESSAGE_STATISTICAL) {  
561 - value = deviceMapper.findDeviceMessageInfoByTs(customerId, startTs, endTs);  
562 - } else {  
563 - value = deviceMapper.findDeviceAlarmInfoByCreatedTime(customerId, startTs, endTs); 606 + return CompletableFuture.supplyAsync(() -> new TsValue(ts, String.valueOf(value)));
564 } 607 }
565 - return CompletableFuture.supplyAsync(() -> new TsValue(ts, String.valueOf(value)));  
566 - }  
567 } 608 }