소스 검색

负载分析接口调整优化

fuyuchuan 6 일 전
부모
커밋
8c0ef8aa93

+ 2 - 2
fiveep-controller/src/main/java/com/bizmatics/controller/web/SiteController.java

@@ -178,8 +178,8 @@ public class SiteController {
      */
     @GetMapping("siteLoadAnalysis")
     public ApiResult<List<SiteLoadAnalysisVO>> siteLoadAnalysis(@RequestParam(value = "siteId") Integer siteId,
-                                                                @RequestParam(value = "startTime", required = false) String startTime,
-                                                                @RequestParam(value = "endTime", required = false) String endTime) {
+                                                                    @RequestParam(value = "startTime", required = false) String startTime,
+                                                                    @RequestParam(value = "endTime", required = false) String endTime) {
         return ApiResult.success(siteService.siteLoadAnalysis(siteId, startTime, endTime));
     }
 }

+ 50 - 44
fiveep-service/src/main/java/com/bizmatics/service/impl/SiteServiceImpl.java

@@ -380,6 +380,8 @@ public class SiteServiceImpl extends AbstractCrudService<SiteMapper, Site> imple
                                                      String startTime,
                                                      String endTime) {
 
+        SiteLoadAnalysisVO siteRow = new SiteLoadAnalysisVO();
+
         /* ---------- 1. 站点&动态属性 ---------- */
         Site site = Optional.ofNullable(
                         baseMapper.selectById(siteId))
@@ -387,18 +389,22 @@ public class SiteServiceImpl extends AbstractCrudService<SiteMapper, Site> imple
                     log.warn("站点 {} 不存在", siteId);
                     return null;
                 });
-        if (site == null) return Collections.emptyList();
+        if (site == null) {
+            return Collections.singletonList(siteRow);
+        }
 
         SiteDynamicProperties sdp = siteDynamicPropertiesService.lambdaQuery()
                 .eq(SiteDynamicProperties::getSiteId, siteId)
                 .one();
-        if (sdp == null) log.warn("站点 {} 动态属性缺失", siteId);
+        if (sdp == null) {
+            log.warn("站点 {} 动态属性缺失", siteId);
+        }
 
         /* ---------- 2. 设备 ---------- */
         List<DeviceList> devices = deviceService.deviceList(String.valueOf(siteId));
         if (CollectionUtils.isEmpty(devices)) {
             log.warn("站点 {} 无设备", siteId);
-            return Collections.emptyList();
+            return Collections.singletonList(siteRow);
         }
 
         // 提前过滤并分组
@@ -440,13 +446,10 @@ public class SiteServiceImpl extends AbstractCrudService<SiteMapper, Site> imple
                         (v1, v2) -> v1));
 
         /* ---------- 4. 组装结果 ---------- */
-        List<SiteLoadAnalysisVO> records = new ArrayList<>();
-
-        // 站点首行
-        SiteLoadAnalysisVO siteRow = new SiteLoadAnalysisVO();
+        // 站点根节点
         siteRow.setId(site.getId());
         siteRow.setName(site.getSiteName());
-        siteRow.setRatedCapacity(Double.valueOf(site.getInstalledCapacity()));
+        siteRow.setRatedCapacity(Optional.ofNullable(site.getInstalledCapacity()).map(Double::valueOf).orElse(0.0));
         siteRow.setRatedVoltage(
                 Optional.ofNullable(sdp)
                         .map(SiteDynamicProperties::getVoltageLevel)
@@ -454,42 +457,8 @@ public class SiteServiceImpl extends AbstractCrudService<SiteMapper, Site> imple
                         .map(v -> Double.parseDouble(v) / 1000.0)
                         .orElse(0.0));
         siteRow.setDataTime(site.getCreateTime());
-        records.add(siteRow);
-
-        // 设备行
-        LocalDateTime finalStart = start;
-        LocalDateTime finalEnd = end;
-        devices.forEach(d -> {
-            SiteLoadAnalysisVO r = new SiteLoadAnalysisVO();
-            r.setId(d.getId());
-            r.setName(d.getDeviceName());
-            r.setCode(d.getDeviceCode());
-            double ratedCap = d.getRatedCurrent() * d.getRatedVoltage();
-            r.setRatedCapacity(ratedCap);
-            r.setRatedVoltage(d.getRatedVoltage());
-
-            double p = Optional.ofNullable(pMap.get(d.getDeviceCode()))
-                    .map(Number::doubleValue)
-                    .orElse(0.0);
-            r.setP(p);
-            r.setLoadRate(ratedCap == 0 ? 0.0 : Arith.div(p, ratedCap, 3));
-
-            // 数据时间(如果有)
-            if (finalStart != null) {
-                htAnalogDataService.getP(deviceCodes, finalStart, finalEnd).stream()
-                        .filter(h -> h.getDeviceName().equals(d.getDeviceCode()))
-                        .findFirst()
-                        .ifPresent(h -> r.setDataTime(h.getDataTime()));
-            } else {
-                rtAnalogDataService.getP(deviceCodes).stream()
-                        .filter(h -> h.getDeviceName().equals(d.getDeviceCode()))
-                        .findFirst()
-                        .ifPresent(h -> r.setDataTime(h.getDataTime()));
-            }
-            records.add(r);
-        });
 
-        /* ---------- 5. 站点总功率&负载率 ---------- */
+        // 汇总功率、负载率用
         double totalP = (typeOneDevices.isEmpty() ? typeOtherDevices : typeOneDevices)
                 .stream()
                 .mapToDouble(d -> Optional.ofNullable(pMap.get(d.getDeviceCode()))
@@ -501,7 +470,44 @@ public class SiteServiceImpl extends AbstractCrudService<SiteMapper, Site> imple
                 ? 0.0
                 : Arith.div(totalP, siteRow.getRatedCapacity(), 3));
 
-        return records;
+        /* --- 构造 children --- */
+        LocalDateTime finalStart = start, finalEnd = end;
+        List<SiteLoadAnalysisVO> children = devices.stream()
+                .map(d -> {
+                    SiteLoadAnalysisVO dev = new SiteLoadAnalysisVO();
+                    dev.setId(d.getId());
+                    dev.setName(d.getDeviceName());
+                    dev.setCode(d.getDeviceCode());
+
+                    double ratedCap = d.getRatedCurrent() * d.getRatedVoltage();
+                    dev.setRatedCapacity(ratedCap);
+                    dev.setRatedVoltage(d.getRatedVoltage());
+
+                    double p = Optional.ofNullable(pMap.get(d.getDeviceCode()))
+                            .map(Number::doubleValue)
+                            .orElse(0.0);
+                    dev.setP(p);
+                    dev.setLoadRate(ratedCap == 0 ? 0.0 : Arith.div(p, ratedCap, 3));
+
+                    // 数据时间
+                    if (finalStart != null) {
+                        htAnalogDataService.getP(deviceCodes, finalStart, finalEnd).stream()
+                                .filter(h -> h.getDeviceName().equals(d.getDeviceCode()))
+                                .findFirst()
+                                .ifPresent(h -> dev.setDataTime(h.getDataTime()));
+                    } else {
+                        rtAnalogDataService.getP(deviceCodes).stream()
+                                .filter(h -> h.getDeviceName().equals(d.getDeviceCode()))
+                                .findFirst()
+                                .ifPresent(h -> dev.setDataTime(h.getDataTime()));
+                    }
+                    return dev;
+                })
+                .collect(Collectors.toList());
+
+        siteRow.setChildren(children);
+
+        return Collections.singletonList(siteRow);
     }
 
 }

+ 6 - 0
fiveep-service/src/main/java/com/bizmatics/service/vo/SiteLoadAnalysisVO.java

@@ -1,11 +1,14 @@
 package com.bizmatics.service.vo;
 
 import com.bizmatics.service.config.CustomerDoubleSerialize;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  *
@@ -60,4 +63,7 @@ public class SiteLoadAnalysisVO {
      * 上报时间
      */
     private LocalDateTime dataTime;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<SiteLoadAnalysisVO> children = new ArrayList<>();
 }