diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java index d9ec3eda..8ff18684 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -1026,24 +1026,12 @@ public class DeviceServiceImpl implements IDeviceService { if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } - List serialNumberList; - SysUser user = getLoginUser().getUser(); - if (null != user.getDept()) { - Long tenantId = user.getDept().getDeptUserId(); - serialNumberList = list.stream().filter(d -> tenantId.equals(d.getTenantId())) - .map(DeviceShortOutput::getSerialNumber).collect(Collectors.toList()); - } else { - serialNumberList = list.stream().map(DeviceShortOutput::getSerialNumber).collect(Collectors.toList()); + Integer entrance = null == device ? null : device.getEntrance(); + // 未处理告警数(alertCount)只有详情,根据产品查询设备详情 entrance=4 + if (Integer.valueOf(4).equals(entrance)) { + fillAlertCount(list); } - if (!CollectionUtils.isEmpty(serialNumberList)) { - List alist = alertLogService.selectDeviceAlertCount(serialNumberList); - for (DeviceAlertCount item : alist) { - list.stream() - .filter(it -> Objects.equals(it.getSerialNumber(), item.getSerialNumber())) - .forEach(it -> it.setAlertCount(item)); - } - } - fillShortListLatestReportTime(list, device.getEntrance()); + fillShortListLatestReportTime(list, entrance); long took = System.currentTimeMillis() - startTime; if (took > 1000L) { log.warn("selectDeviceShortList took: {}", took); @@ -1051,6 +1039,39 @@ public class DeviceServiceImpl implements IDeviceService { return list; } + /** + * 回填设备未处理告警数(DeviceShortOutput#alertCount)。 + *

+ * 只统计当前登录用户自己租户的设备:存在部门时按 dept.deptUserId 过滤, + * 因此「查询下级机构」带出来的下级机构设备不会带告警徽标。 + */ + private void fillAlertCount(List list) { + SysUser user = getLoginUser().getUser(); + Long deptUserId = null != user.getDept() ? user.getDept().getDeptUserId() : null; + List serialNumberList = list.stream() + .filter(d -> null == deptUserId || deptUserId.equals(d.getTenantId())) + .map(DeviceShortOutput::getSerialNumber) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(serialNumberList)) { + return; + } + List alertCountList = alertLogService.selectDeviceAlertCount(serialNumberList); + if (CollectionUtils.isEmpty(alertCountList)) { + return; + } + // 先按 serialNumber 建索引再回填,避免原先的嵌套 stream 匹配(O(设备数 × 告警行数)) + Map alertCountMap = new HashMap<>(alertCountList.size()); + for (DeviceAlertCount item : alertCountList) { + alertCountMap.put(item.getSerialNumber(), item); + } + for (DeviceShortOutput row : list) { + DeviceAlertCount alertCount = alertCountMap.get(row.getSerialNumber()); + if (null != alertCount) { + row.setAlertCount(alertCount); + } + } + } + /** * 查询当前用户可见设备统计(与 shortList 相同范围) */