Commit 9edbf48fa2c6ff5051cdb0bf0693b7d929707303

Authored by 云中非
1 parent 4881c9b1

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

... ... @@ -44,524 +44,565 @@ import java.util.stream.Collectors;
44 44 @RequiredArgsConstructor
45 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 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 }
... ...