Commit 099ad97174bea62e6f9c1813324b938887d83287

Authored by 云中非
2 parents 2ac0685a 9c674bc3

Merge branch 'master' into 20221221

... ... @@ -17,6 +17,15 @@ public class HomeDeviceInfoDTO {
17 17 @ApiModelProperty("未激活设备数量")
18 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 29 @ApiModelProperty("今日新增设备数量")
21 30 private Integer todayAdd;
22 31
... ... @@ -26,6 +35,8 @@ public class HomeDeviceInfoDTO {
26 35 this.offLine = defaultValue;
27 36 this.inActive = defaultValue;
28 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 19 @ApiModelProperty("客户统计")
20 20 private BaseHomePageTop customerInfo;
21 21
  22 + @ApiModelProperty("产品统计")
  23 + private BaseHomePageTop productInfo;
  24 +
22 25 @ApiModelProperty("消息统计")
23 26 private HomePageTopMessage messageInfo;
24 27 }
... ...
... ... @@ -224,7 +224,7 @@ public class TkDeviceProfileServiceImpl
224 224 baseMapper.selectList(
225 225 new LambdaQueryWrapper<TkDeviceProfileEntity>()
226 226 .eq(TkDeviceProfileEntity::getTenantId, tenantId)
227   - .eq(null !=deviceType,TkDeviceProfileEntity::getDeviceType,deviceType)
  227 + .eq(null != deviceType, TkDeviceProfileEntity::getDeviceType, deviceType)
228 228 .in(TkDeviceProfileEntity::getId, deviceProfileIds));
229 229 if (null != entities && !entities.isEmpty()) {
230 230 return entities.stream()
... ... @@ -252,4 +252,18 @@ public class TkDeviceProfileServiceImpl
252 252 .map(obj -> obj.getDTO(DeviceProfileDTO.class))
253 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 31 import org.thingsboard.server.dao.yunteng.mapper.UserMapper;
32 32 import org.thingsboard.server.dao.yunteng.mapper.TkAlarmMapper;
33 33 import org.thingsboard.server.dao.yunteng.service.HomePageService;
  34 +import org.thingsboard.server.dao.yunteng.service.TkDeviceProfileService;
34 35 import org.thingsboard.server.dao.yunteng.service.TkTenantService;
35 36 import org.thingsboard.server.dao.yunteng.service.TkUserService;
36 37
... ... @@ -42,694 +43,856 @@ import java.util.*;
42 43 import java.util.concurrent.CompletableFuture;
43 44 import java.util.concurrent.ExecutionException;
44 45 import java.util.concurrent.atomic.AtomicInteger;
  46 +import java.util.concurrent.atomic.AtomicReference;
45 47 import java.util.stream.Collectors;
46 48
47 49 @Service
48 50 @RequiredArgsConstructor
49 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 452 if (tsValues != null && !tsValues.isEmpty()) {
393   - return tsValues;
  453 + return tsValues;
394 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 480 if (transportMessage != null && !transportMessage.isEmpty()) {
415   - return transportMessage;
  481 + return transportMessage;
416 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 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 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 1 package org.thingsboard.server.dao.yunteng.service;
2 2
3 3 import org.springframework.web.context.request.async.DeferredResult;
  4 +import org.thingsboard.server.common.data.id.CustomerId;
4 5 import org.thingsboard.server.common.data.id.EntityId;
5 6 import org.thingsboard.server.common.data.id.TenantId;
6 7 import org.thingsboard.server.common.data.query.TsValue;
... ...
... ... @@ -31,6 +31,7 @@ public interface TkDeviceProfileService extends BaseService<TkDeviceProfileEntit
31 31
32 32 List<DeviceProfileDTO> findDeviceProfileByIds(String tenantId, List<String> ids);
33 33
  34 + List<DeviceProfileDTO> findDeviceProfile(String tenantId);
34 35 /** 验证表单数据有效性 */
35 36 boolean validateFormData(DeviceProfileDTO ytDeviceProfileDTO);
36 37
... ...
... ... @@ -181,6 +181,7 @@
181 181 ifd.tenant_id,
182 182 ifd.organization_id,
183 183 ifd.create_time,
  184 + ifd.device_type,
184 185 ifdp.NAME AS profile_name,
185 186 io.NAME AS organization_name,
186 187 A.bool_v status,
... ...