diff --git a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java index 372bc72..d94a2d6 100644 --- a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java +++ b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java @@ -13,10 +13,7 @@ import com.dongjian.dashboard.back.common.Constants; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicLong; @@ -56,25 +53,46 @@ public class DataSourceInterceptor implements HandlerInterceptor { } public long getTopCompanyId(String companyId) { - - String sql="SELECT " - + " bcom.id, bcom.parent_id parentId" - + " FROM data_center_aeon_admin.basic_company bcom " - + " WHERE bcom.flag != 1 and bcom.id = " + companyId; - - AtomicLong parentId = new AtomicLong(0); - AtomicLong id = new AtomicLong(0); - jdbcTemplate.query(sql,rs -> { - parentId.set(rs.getLong("parentId")); - id.set(rs.getLong("id")); - }); - //Recursive logic - if (1 == parentId.get() || -1 == parentId.get()) { - return id.get(); - } else { - return getTopCompanyId(parentId.get()+""); - } - } + + if (StringUtils.isBlank(companyId)) { + throw new IllegalArgumentException("companyId不能为空"); + } + + return getTopCompanyIdInternal(Long.parseLong(companyId), new HashSet<>()); + } + + private long getTopCompanyIdInternal(Long companyId, Set visited) { + + // 防止循环引用 + if (!visited.add(companyId)) { + throw new IllegalStateException("检测到公司父子结构循环,companyId=" + companyId); + } + + String sql = """ + SELECT id, parent_id + FROM data_center_aeon_admin.basic_company + WHERE flag != 1 AND id = ? + """; + + List> result = jdbcTemplate.queryForList(sql, companyId); + + if (result.isEmpty()) { + throw new IllegalStateException("公司不存在,companyId=" + companyId); + } + + Map row = result.get(0); + + Long parentId = row.get("parent_id") == null + ? null + : ((Number) row.get("parent_id")).longValue(); + + // 顶级企业 + if (parentId == null || parentId == 1 || parentId == -1) { + return companyId; + } + + return getTopCompanyIdInternal(parentId, visited); + } /** * 获取所有的一级企业 diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/FavoritedDeviceMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/FavoritedDeviceMapperExt.xml index 6ea7168..c0b6462 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/FavoritedDeviceMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/FavoritedDeviceMapperExt.xml @@ -20,7 +20,9 @@ WHERE dinfo.flag != 1 AND basic_monitoring_asset.flag != 1 AND basic_space.flag != 1 AND basic_floor.flag != 1 AND basic_building.flag != 1 - AND basic_building.building_id = #{buildingId} + + AND basic_building.building_id = #{buildingId} + AND dinfo.company_id IN #{item} and ty.device_category_id in diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml index f7d00bf..f5f8838 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml @@ -67,7 +67,7 @@ mpc.company_id, mpc.thumbnail_normal_base64, mpc.thumbnail_alarm_base64, - mpc.thumbnail_dis_base64, + mpc.`name`, mpc.remark FROM diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryMapperExt.xml index 26edaf6..96b6ea4 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryMapperExt.xml @@ -24,6 +24,7 @@ mpc.company_id, mpc.thumbnail_normal_base64, mpc.thumbnail_alarm_base64, + mpc.thumbnail_dis_base64, mpc.class_name AS `name` FROM basic_asset_class_big mpc diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml index a6d2fcd..47bb0d8 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml @@ -26,7 +26,7 @@ WHERE bbuilding.company_id = #{companyId} AND bbuilding.flag = 0 AND basic_floor.flag = 0 AND basic_space.flag = 0 - AND basic_monitoring_asset.flag = 0 AND dinfo.flag = 0 AND basic_asset_class_big.flag = 0 + AND basic_monitoring_asset.flag = 0 AND dinfo.flag = 0 AND ah.confirm_status = 0 AND ah.handle_status = 1 diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java index 1547679..6f87cd2 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java @@ -200,7 +200,12 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService Object cacheLastValue = redisUtil.HGet(redisKey, lineDataSearchParams.getDeviceId().toLowerCase()); if (null != cacheLastValue) { try { - LatestValueBO latestValueBO = objectMapper.readValue(JSONObject.toJSONString(cacheLastValue), LatestValueBO.class); + String value = cacheLastValue.toString(); + // 如果是被双引号包住的 JSON(双层 JSON) + if (value.startsWith("\"")) { + value = objectMapper.readValue(value, String.class); + } + LatestValueBO latestValueBO = objectMapper.readValue(value, LatestValueBO.class); String dateFormatted = Instant.ofEpochMilli(latestValueBO.getUpdateTs()) .atZone(Constants.ZONE_TOKYO) .format(Constants.FORMATTER_YMDHMS); diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java index 494f8fd..b596a78 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java @@ -95,6 +95,12 @@ public class OverviewServiceImpl implements OverviewService { MonitoringPointCategorySearchParams categorySearchParam = new MonitoringPointCategorySearchParams(); categorySearchParam.setCompanyIdList(List.of(companyId)); List categoryList = monitoringPointCategoryMapperExt.getListPage(categorySearchParam); + + List allCategoryIds = categoryList.stream() + .map(MonitoringPointCategoryPageVO::getMonitoringPointCategoryId) + .filter(Objects::nonNull) + .toList(); + //所有楼宇的监测点分类 Map allCategoryParamMap = new HashMap<>(); allCategoryParamMap.put("companyId", companyId); @@ -113,16 +119,17 @@ public class OverviewServiceImpl implements OverviewService { )); Map> notExistingCategoryMap = new HashMap<>(); - existingCategoryMap.forEach((buildingId, existingCategoryIds) -> { - List missingCategoryIds = - categoryList.stream() - .map(MonitoringPointCategoryPageVO::getMonitoringPointCategoryId) - .filter(Objects::nonNull) - .filter(id -> !existingCategoryIds.contains(id)) - .collect(Collectors.toList()); - - notExistingCategoryMap.put(buildingId, missingCategoryIds); - }); + for (OverviewVO building : buildingInfoList) { + Long buildingId = building.getBuildingId(); + Set existingIds = existingCategoryMap.getOrDefault(buildingId, Collections.emptySet()); + List missingIds = new ArrayList<>(); + for (Long categoryId : allCategoryIds) { + if (!existingIds.contains(categoryId)) { + missingIds.add(categoryId); + } + } + notExistingCategoryMap.put(buildingId, missingIds); + } return notExistingCategoryMap; } @@ -189,6 +196,7 @@ public class OverviewServiceImpl implements OverviewService { // 分组监测点分类 List categoryAlarms = buildingInfos.stream() + .filter(dto -> dto.getMonitoringPointCategoryId() != null) .collect(Collectors.groupingBy(OverviewInfo::getMonitoringPointCategoryId)) .entrySet() .stream()