|
@@ -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);
|
|
|
}
|
|
|
|
|
|
}
|