Ver código fonte

响应监测曲线改为单站点查询,并移除 vpp 模块 mock 假数据

Co-authored-by: Cursor <cursoragent@cursor.com>
fuyuchuan 5 dias atrás
pai
commit
9f72d9c776
26 arquivos alterados com 115 adições e 550 exclusões
  1. 2 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/constant/VppTsdbConstants.java
  2. 2 24
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/DrMonitorController.java
  3. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/ResourceController.java
  4. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/SiteController.java
  5. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppDrMonitorService.java
  6. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppResourceBoardService.java
  7. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppResourceOverviewService.java
  8. 2 33
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppBaselineServiceImpl.java
  9. 3 5
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppCapabilityEvalServiceImpl.java
  10. 34 59
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppDrMonitorServiceImpl.java
  11. 11 7
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourceBoardServiceImpl.java
  12. 8 8
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourceOverviewServiceImpl.java
  13. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourcePointServiceImpl.java
  14. 5 11
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResponseMonitorServiceImpl.java
  15. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/AlarmLevelStatVO.java
  16. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/CapabilityLoadCurveVO.java
  17. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DashboardCurveVO.java
  18. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrMonitorCurveVO.java
  19. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/ResponseLoadAnalysisVO.java
  20. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/SiteBaselineVO.java
  21. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/SiteDeclaredCapacityVO.java
  22. 0 112
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppBaselineHelper.java
  23. 1 119
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppCapabilityEvalHelper.java
  24. 0 62
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceMockHelper.java
  25. 30 0
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceTypeHelper.java
  26. 0 92
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResponseMonitorHelper.java

+ 2 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/constant/VppTsdbConstants.java

@@ -36,7 +36,8 @@ public final class VppTsdbConstants {
             "device_status",
             "p",
             "ua",
-            "ia"
+            "ia",
+            "soc"
     );
 
     /** 日发电量(光伏) */

+ 2 - 24
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/DrMonitorController.java

@@ -7,18 +7,13 @@ import com.usky.vpp.service.vo.DrMonitorCurveVO;
 import com.usky.vpp.service.vo.DrMonitorRecordVO;
 import com.usky.vpp.service.vo.DrMonitorSummaryVO;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 需求响应监测(响应记录)
@@ -60,25 +55,8 @@ public class DrMonitorController {
      * <p>baselineDays 传 3 或 5 时按对应周期计算基线负荷;为空则按 5 日基线。</p>
      */
     @GetMapping("/records/curve")
-    public ApiResult<DrMonitorCurveVO> curve(@RequestParam("siteIds") List<Long> siteIds,
+    public ApiResult<DrMonitorCurveVO> curve(@RequestParam("siteId") Long siteId,
                                              @RequestParam(value = "baselineDays", required = false) Integer baselineDays) {
-        return ApiResult.success(drMonitorService.getCurve(siteIds, baselineDays));
+        return ApiResult.success(drMonitorService.getCurve(siteId, baselineDays));
     }
-
-    // private List<Long> parseSiteIds(List<String> raw) {
-    //     if (raw == null || raw.isEmpty()) {
-    //         return Collections.emptyList();
-    //     }
-    //     List<Long> ids = new ArrayList<>();
-    //     for (String item : raw) {
-    //         if (!StringUtils.hasText(item)) {
-    //             continue;
-    //         }
-    //         Arrays.stream(item.split(","))
-    //                 .map(String::trim)
-    //                 .filter(StringUtils::hasText)
-    //                 .forEach(token -> ids.add(Long.parseLong(token)));
-    //     }
-    //     return ids.stream().distinct().collect(Collectors.toList());
-    // }
 }

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/ResourceController.java

@@ -90,7 +90,7 @@ public class ResourceController {
 
 //    /**
 //     * 资源概览 - 实时告警统计
-//     * <p>按紧急/重要/一般统计告警数量,含跳转告警列表路径(模拟数据)。</p>
+//     * <p>按紧急/重要/一般统计告警数量,含跳转告警列表路径。</p>
 //     */
 //    @GetMapping("/overview/alarm-stats")
 //    public ApiResult<List<AlarmLevelStatVO>> resourceOverviewAlarmStats() {

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/SiteController.java

@@ -160,7 +160,7 @@ public class SiteController {
      *   <li>responseDayTypeLabel — 工作日 / 非工作日</li>
      *   <li>referenceDates — 参与计算的典型历史日(yyyy-MM-dd)</li>
      *   <li>correctionFactorK — 日内修正系数 K</li>
-     *   <li>dataSource — tsdb(时序库)/ mock(联调模拟)</li>
+     *   <li>dataSource — tsdb(时序库)</li>
      *   <li>points — 曲线点列表(BaselinePointVO:time、predictedBaselineKw、todayActualKw、yesterdayActualKw)</li>
      * </ul>
      *

+ 2 - 2
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppDrMonitorService.java

@@ -32,8 +32,8 @@ public interface VppDrMonitorService {
      * 折线图:以当天为查询范围,基线负荷复用 getSiteBaseline,实际响应容量复用
      * getSiteDeclaredCapacity,再按可调峰资源点平均
      *
-     * @param siteIds      站点范围
+     * @param siteId       站点 ID(必填)
      * @param baselineDays 基线参考天数,仅支持 3 或 5;为空时按 5 日基线
      */
-    DrMonitorCurveVO getCurve(List<Long> siteIds, Integer baselineDays);
+    DrMonitorCurveVO getCurve(Long siteId, Integer baselineDays);
 }

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppResourceBoardService.java

@@ -12,7 +12,7 @@ import java.util.Map;
 public interface VppResourceBoardService {
 
     /**
-     * 资源看板列表(模拟实时运行数据)
+     * 资源看板列表(TSDB 实时运行数据)
      */
     CommonPage<ResourceBoardItemVO> pageBoard(Map<String, Object> params);
 

+ 2 - 2
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppResourceOverviewService.java

@@ -18,7 +18,7 @@ public interface VppResourceOverviewService {
     List<ResourceTypeStatVO> getTypeStats();
 
     /**
-     * 今日电能概况(总发电量、总用电量、绿电消纳比例,模拟数据
+     * 今日电能概况(总发电量、总用电量、绿电消纳比例,TSDB 今日 eday/epp 汇总
      */
     EnergyTodayVO getEnergyToday();
 
@@ -28,7 +28,7 @@ public interface VppResourceOverviewService {
     ResourceOverviewRealtimeCurveVO getRealtimeCurves(String startTime, String endTime);
 
     /**
-     * 实时告警统计(紧急/重要/一般,含跳转路径,模拟数据
+     * 实时告警统计(紧急/重要/一般,含跳转告警列表路径)
      */
     List<AlarmLevelStatVO> getAlarmStats();
 }

+ 2 - 33
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppBaselineServiceImpl.java

@@ -67,13 +67,13 @@ public class VppBaselineServiceImpl implements VppBaselineService {
      *
      * <p><b>处理流程</b></p>
      * <ol>
-     *   <li>查询站点下 is_control=1 的资源点关联设备 UUID;无设备则返回 mock 数据</li>
+     *   <li>查询站点下 is_support_peak=1 的资源点关联设备 UUID;无设备则返回空曲线</li>
      *   <li>按 Hutool 法定节假日规则判定响应日类型(工作日 / 非工作日),选取典型历史日:
      *       工作日 5 天 / 非工作日 3 天,剔除历史响应日</li>
      *   <li>本模块按典型历史日逐日调用 TSDB {@code queryHistoryDeviceData},聚合计算全天原始基线(10 分钟粒度)</li>
      *   <li>取响应开始时间前连续 2 小时的今日实时负荷(绿色曲线)与同时段原始基线比值,计算修正系数 K(0.7 ~ 1.2)</li>
      *   <li>原始基线 × K 得到预测基线;并查询今日 / 昨日实测曲线</li>
-     *   <li>组装 {@link SiteBaselineVO},dataSource 为 tsdb;TSDB 无数据时降级为 mock</li>
+     *   <li>组装 {@link SiteBaselineVO},dataSource 为 tsdb;无 TSDB 数据时返回空曲线</li>
      * </ol>
      *
      * @param siteId            站点 ID
@@ -269,24 +269,6 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         return result;
     }
 
-    private SiteDeclaredCapacityVO buildMockDeclaredCapacityResult(SiteDeclaredCapacityVO result,
-                                                                 Long siteId,
-                                                                 LocalDate responseDate,
-                                                                 LocalDateTime startTime,
-                                                                 LocalDateTime endTime) {
-        BigDecimal correctionFactorK = VppBaselineHelper.mockCorrectionFactor(siteId, responseDate);
-        result.setReferenceDates(new ArrayList<>());
-        result.setResponseDayType(VppWorkdayHelper.resolveDayType(responseDate));
-        result.setResponseDayTypeLabel(VppWorkdayHelper.resolveDayTypeLabel(responseDate));
-        result.setCorrectionFactorK(correctionFactorK);
-        result.setDeclaredCapacityKw(VppBaselineHelper.mockDeclaredCapacityKw(
-                siteId, responseDate, startTime, endTime, correctionFactorK));
-        result.setPoints(VppBaselineHelper.buildMockDeclaredCapacityPoints(
-                siteId, responseDate, startTime, endTime, correctionFactorK));
-        result.setDataSource("mock");
-        return result;
-    }
-
     private Map<String, BigDecimal> applyCorrection(Map<String, BigDecimal> originalBaselineByTime,
                                                     BigDecimal correctionFactorK) {
         Map<String, BigDecimal> corrected = new TreeMap<>();
@@ -297,19 +279,6 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         return corrected;
     }
 
-    private SiteBaselineVO buildMockResult(SiteBaselineVO result,
-                                           Long siteId,
-                                           LocalDate responseDate,
-                                           LocalDateTime responseStartTime) {
-        result.setReferenceDates(new ArrayList<>());
-        result.setResponseDayType(VppWorkdayHelper.resolveDayType(responseDate));
-        result.setResponseDayTypeLabel(VppWorkdayHelper.resolveDayTypeLabel(responseDate));
-        result.setCorrectionFactorK(VppBaselineHelper.mockCorrectionFactor(siteId, responseDate));
-        result.setPoints(VppBaselineHelper.buildMockBaselinePoints(siteId, responseDate, responseStartTime));
-        result.setDataSource("mock");
-        return result;
-    }
-
     private List<String> listControllableDeviceUuids(Long siteId) {
         List<VppResourcePoint> resources = resourcePointMapper.selectList(
                 new LambdaQueryWrapper<VppResourcePoint>()

+ 3 - 5
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppCapabilityEvalServiceImpl.java

@@ -134,7 +134,7 @@ public class VppCapabilityEvalServiceImpl implements VppCapabilityEvalService {
         curve.setSiteId(siteId);
         curve.setSiteName(site != null ? site.getSiteName() : "全部站点");
         curve.setDate(statDate.format(DATE_FMT));
-        LoadCurveBuildResult buildResult = buildLoadCurvePoints(resources, devices, siteId, statDate);
+        LoadCurveBuildResult buildResult = buildLoadCurvePoints(resources, devices, statDate);
         curve.setPoints(buildResult.points);
         curve.setDataSource(buildResult.dataSource);
         return curve;
@@ -152,7 +152,6 @@ public class VppCapabilityEvalServiceImpl implements VppCapabilityEvalService {
 
     private LoadCurveBuildResult buildLoadCurvePoints(List<VppResourcePoint> resources,
                                                       List<VppDevice> devices,
-                                                      Long siteId,
                                                       LocalDate statDate) {
         List<String> deviceUuids = resolveDeviceUuids(resources, devices);
         if (!deviceUuids.isEmpty()) {
@@ -172,10 +171,9 @@ public class VppCapabilityEvalServiceImpl implements VppCapabilityEvalService {
                         VppCapabilityEvalHelper.buildLoadCurveFromTsdb(actualData, baselineData, statDate, powerMetrics),
                         "tsdb");
             }
+            return new LoadCurveBuildResult(Collections.emptyList(), "tsdb");
         }
-        return new LoadCurveBuildResult(
-                VppCapabilityEvalHelper.buildLoadCurve(resources, devices, siteId, statDate),
-                "mock");
+        return new LoadCurveBuildResult(Collections.emptyList(), null);
     }
 
     @Override

+ 34 - 59
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppDrMonitorServiceImpl.java

@@ -39,13 +39,10 @@ import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -225,22 +222,19 @@ public class VppDrMonitorServiceImpl implements VppDrMonitorService {
     }
 
     @Override
-    public DrMonitorCurveVO getCurve(List<Long> siteIds, Integer baselineDays) {
-        requireSiteIds(siteIds);
+    public DrMonitorCurveVO getCurve(Long siteId, Integer baselineDays) {
+        if (siteId == null) {
+            throw new BusinessException("站点ID不能为空");
+        }
         if (baselineDays != null && baselineDays != 3 && baselineDays != 5) {
             throw new BusinessException("基线负荷仅支持3天或5天维度查询!");
         }
         Integer tenantId = SecurityUtils.getTenantId();
-        List<VppResourcePoint> peakResources = listPeakResources(siteIds, tenantId);
+        List<VppResourcePoint> peakResources = listPeakResources(siteId, tenantId);
         if (peakResources.isEmpty()) {
             throw new BusinessException("所选站点下无可参与调峰的资源点!");
         }
         int resourceCount = peakResources.size();
-        Map<Long, Long> siteResourceCount = new HashMap<>();
-        for (VppResourcePoint resource : peakResources) {
-            siteResourceCount.merge(resource.getSiteId(), 1L, Long::sum);
-        }
-        Set<Long> peakSiteIds = siteResourceCount.keySet();
 
         LocalDate today = LocalDate.now();
         LocalDateTime windowStart = today.atStartOfDay();
@@ -250,59 +244,32 @@ public class VppDrMonitorServiceImpl implements VppDrMonitorService {
         String actualEndTime = windowEnd.format(DATE_TIME_FMT);
         int requiredDays = (baselineDays != null && baselineDays == 3) ? 3 : 5;
 
-        BigDecimal actualSum = BigDecimal.ZERO;
-        for (Long siteId : peakSiteIds) {
-            actualSum = actualSum.add(resolveSiteActualResponseKw(
-                    siteId, responseStartTime, responseEndTime, BigDecimal.ZERO));
-        }
-        BigDecimal actualAvg = avg(actualSum, resourceCount);
-
-        Map<String, BigDecimal> baselineWeighted = new LinkedHashMap<>();
-        Set<String> dataSources = new LinkedHashSet<>();
-        List<Long> usedSiteIds = new ArrayList<>();
+        BigDecimal actualAvg = avg(resolveSiteActualResponseKw(
+                siteId, responseStartTime, responseEndTime, BigDecimal.ZERO), resourceCount);
 
-        for (Map.Entry<Long, Long> entry : siteResourceCount.entrySet()) {
-            Long siteId = entry.getKey();
-            BigDecimal weight = BigDecimal.valueOf(entry.getValue());
-            SiteBaselineVO baseline = baselineService.getSiteBaseline(siteId, responseStartTime, requiredDays, actualEndTime);
-            if (baseline == null || CollectionUtils.isEmpty(baseline.getPoints())) {
-                continue;
-            }
-            usedSiteIds.add(siteId);
-            if (StringUtils.hasText(baseline.getDataSource())) {
-                dataSources.add(baseline.getDataSource());
-            }
-            for (BaselinePointVO point : baseline.getPoints()) {
-                if (!StringUtils.hasText(point.getTime()) || !inCurveWindow(point.getTime(), windowStart, windowEnd)) {
-                    continue;
-                }
-                baselineWeighted.merge(point.getTime(),
-                        nz(point.getPredictedBaselineKw()).multiply(weight), BigDecimal::add);
-            }
-        }
+        SiteBaselineVO baseline = baselineService.getSiteBaseline(
+                siteId, responseStartTime, requiredDays, actualEndTime);
 
-        BigDecimal divisor = BigDecimal.valueOf(resourceCount);
         DrMonitorCurveVO curve = new DrMonitorCurveVO();
         curve.setResponseDate(today.format(DATE_FMT));
-        curve.setSiteIds(usedSiteIds);
+        curve.setSiteId(siteId);
         curve.setActualResponseCapacityKw(actualAvg);
-        if (dataSources.isEmpty()) {
-            curve.setDataSource("mock");
-        } else if (dataSources.size() == 1) {
-            curve.setDataSource(dataSources.iterator().next());
-        } else {
-            curve.setDataSource("mixed");
-        }
-
-        List<String> times = new ArrayList<>(baselineWeighted.keySet());
-        times.sort(Comparator.naturalOrder());
-        for (String time : times) {
-            DrMonitorCurveVO.Point point = new DrMonitorCurveVO.Point();
-            point.setTime(time);
-            point.setBaselineKw(baselineWeighted.getOrDefault(time, BigDecimal.ZERO)
-                    .divide(divisor, SCALE, RoundingMode.HALF_UP));
-            point.setActualResponseCapacityKw(actualAvg);
-            curve.getPoints().add(point);
+        if (baseline != null && StringUtils.hasText(baseline.getDataSource())) {
+            curve.setDataSource(baseline.getDataSource());
+        }
+
+        if (baseline == null || CollectionUtils.isEmpty(baseline.getPoints())) {
+            return curve;
+        }
+        for (BaselinePointVO point : baseline.getPoints()) {
+            if (!StringUtils.hasText(point.getTime()) || !inCurveWindow(point.getTime(), windowStart, windowEnd)) {
+                continue;
+            }
+            DrMonitorCurveVO.Point curvePoint = new DrMonitorCurveVO.Point();
+            curvePoint.setTime(point.getTime());
+            curvePoint.setBaselineKw(nz(point.getPredictedBaselineKw()).setScale(SCALE, RoundingMode.HALF_UP));
+            curvePoint.setActualResponseCapacityKw(actualAvg);
+            curve.getPoints().add(curvePoint);
         }
         return curve;
     }
@@ -373,6 +340,14 @@ public class VppDrMonitorServiceImpl implements VppDrMonitorService {
         }
     }
 
+    private List<VppResourcePoint> listPeakResources(Long siteId, Integer tenantId) {
+        return resourcePointMapper.selectList(new LambdaQueryWrapper<VppResourcePoint>()
+                .eq(VppResourcePoint::getDeleteFlag, VppAuditHelper.NOT_DELETED)
+                .eq(VppResourcePoint::getIsSupportPeak, SUPPORT_PEAK)
+                .eq(VppResourcePoint::getSiteId, siteId)
+                .eq(tenantId != null, VppResourcePoint::getTenantId, tenantId));
+    }
+
     private List<VppResourcePoint> listPeakResources(List<Long> siteIds, Integer tenantId) {
         return resourcePointMapper.selectList(new LambdaQueryWrapper<VppResourcePoint>()
                 .eq(VppResourcePoint::getDeleteFlag, VppAuditHelper.NOT_DELETED)

+ 11 - 7
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourceBoardServiceImpl.java

@@ -17,7 +17,7 @@ import com.usky.vpp.service.VppTsdbQueryService;
 import com.usky.vpp.service.vo.ResourceBoardDetailVO;
 import com.usky.vpp.service.vo.ResourceBoardItemVO;
 import com.usky.vpp.util.VppAuditHelper;
-import com.usky.vpp.util.VppResourceMockHelper;
+import com.usky.vpp.util.VppResourceTypeHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -184,7 +184,7 @@ public class VppResourceBoardServiceImpl implements VppResourceBoardService {
         item.setResourceCode(resource.getResourceCode());
         item.setResourceName(resource.getResourceName());
         item.setResourceType(resource.getResourceType());
-        item.setResourceTypeLabel(VppResourceMockHelper.resourceTypeLabel(resource.getResourceType()));
+        item.setResourceTypeLabel(VppResourceTypeHelper.resourceTypeLabel(resource.getResourceType()));
         item.setSiteId(resource.getSiteId());
         item.setCapacityKw(resource.getCapacityKw());
         if (site != null) {
@@ -193,19 +193,23 @@ public class VppResourceBoardServiceImpl implements VppResourceBoardService {
             item.setCity(site.getCity());
             item.setDistrict(site.getDistrict());
         }
-        applyTsdbMetrics(item, tsdbMetrics);
-        item.setSocPercent(VppResourceMockHelper.mockSocPercent(resource));
-        item.setEvcsChargePowerKw(VppResourceMockHelper.mockEvcsChargePowerKw(resource));
+        applyTsdbMetrics(item, tsdbMetrics, resource.getResourceType());
     }
 
-    private void applyTsdbMetrics(ResourceBoardItemVO item, Map<String, BigDecimal> tsdbMetrics) {
+    private void applyTsdbMetrics(ResourceBoardItemVO item, Map<String, BigDecimal> tsdbMetrics, String resourceType) {
         BigDecimal deviceStatus = getMetric(tsdbMetrics, "device_status");
         boolean abnormal = deviceStatus != null && deviceStatus.compareTo(BigDecimal.ZERO) == 0;
         item.setAbnormal(abnormal);
         item.setRunStatusLabel(resolveRunStatusLabel(deviceStatus));
-        item.setRealtimePowerKw(getMetric(tsdbMetrics, "p"));
+        item.setRealtimePowerKw(getMetric(tsdbMetrics, VppTsdbConstants.METRIC_P));
         item.setVoltageV(getMetric(tsdbMetrics, "ua"));
         item.setCurrentA(getMetric(tsdbMetrics, "ia"));
+        if ("ESS".equalsIgnoreCase(resourceType)) {
+            item.setSocPercent(getMetric(tsdbMetrics, VppTsdbConstants.METRIC_SOC));
+        }
+        if ("EVCS".equalsIgnoreCase(resourceType)) {
+            item.setEvcsChargePowerKw(getMetric(tsdbMetrics, VppTsdbConstants.METRIC_P));
+        }
     }
 
     private Map<String, Map<String, BigDecimal>> loadTsdbMetricsMap(Collection<VppDevice> devices) {

+ 8 - 8
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourceOverviewServiceImpl.java

@@ -17,7 +17,7 @@ import com.usky.vpp.service.vo.ResourceCurveSeriesVO;
 import com.usky.vpp.service.vo.ResourceOverviewRealtimeCurveVO;
 import com.usky.vpp.service.vo.ResourceTypeStatVO;
 import com.usky.vpp.util.VppAuditHelper;
-import com.usky.vpp.util.VppResourceMockHelper;
+import com.usky.vpp.util.VppResourceTypeHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -71,7 +71,7 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
 
     @Override
     public List<AlarmLevelStatVO> getAlarmStats() {
-        return buildAlarmStatsMock();
+        return buildAlarmStats();
     }
 
     @Override
@@ -277,7 +277,7 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
         for (String type : RESOURCE_TYPES) {
             ResourceTypeStatVO stat = new ResourceTypeStatVO();
             stat.setResourceType(type);
-            stat.setResourceTypeLabel(VppResourceMockHelper.resourceTypeLabel(type));
+            stat.setResourceTypeLabel(VppResourceTypeHelper.resourceTypeLabel(type));
             stat.setTotalCount(0L);
             stat.setTotalCapacityKw(BigDecimal.ZERO);
             stat.setTotalAdjustableCapacityKw(BigDecimal.ZERO);
@@ -288,7 +288,7 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
             ResourceTypeStatVO stat = statMap.computeIfAbsent(type, key -> {
                 ResourceTypeStatVO s = new ResourceTypeStatVO();
                 s.setResourceType(key);
-                s.setResourceTypeLabel(VppResourceMockHelper.resourceTypeLabel(key));
+                s.setResourceTypeLabel(VppResourceTypeHelper.resourceTypeLabel(key));
                 s.setTotalCount(0L);
                 s.setTotalCapacityKw(BigDecimal.ZERO);
                 s.setTotalAdjustableCapacityKw(BigDecimal.ZERO);
@@ -442,11 +442,11 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
         return new ArrayList<>(uuids);
     }
 
-    private List<AlarmLevelStatVO> buildAlarmStatsMock() {
+    private List<AlarmLevelStatVO> buildAlarmStats() {
         List<AlarmLevelStatVO> stats = new ArrayList<>();
-        stats.add(buildAlarmStat(1, "紧急", 3L));
-        stats.add(buildAlarmStat(2, "重要", 8L));
-        stats.add(buildAlarmStat(3, "一般", 15L));
+        stats.add(buildAlarmStat(1, "紧急", 0L));
+        stats.add(buildAlarmStat(2, "重要", 0L));
+        stats.add(buildAlarmStat(3, "一般", 0L));
         return stats;
     }
 

+ 2 - 2
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourcePointServiceImpl.java

@@ -16,7 +16,7 @@ import com.usky.vpp.service.vo.ResourcePointListVO;
 import com.usky.vpp.service.vo.ResourcePointRequest;
 import com.usky.vpp.util.VppAuditHelper;
 import com.usky.vpp.util.VppPageHelper;
-import com.usky.vpp.util.VppResourceMockHelper;
+import com.usky.vpp.util.VppResourceTypeHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -178,7 +178,7 @@ public class VppResourcePointServiceImpl implements VppResourcePointService {
             vo.setSiteId(resource.getSiteId());
             vo.setDeviceId(resource.getDeviceId());
             vo.setResourceType(resource.getResourceType());
-            vo.setResourceTypeLabel(VppResourceMockHelper.resourceTypeLabel(resource.getResourceType()));
+            vo.setResourceTypeLabel(VppResourceTypeHelper.resourceTypeLabel(resource.getResourceType()));
             vo.setCapacityKw(resource.getCapacityKw());
             vo.setIsControl(resource.getIsControl());
             vo.setIsSupportPeak(resource.getIsSupportPeak());

+ 5 - 11
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResponseMonitorServiceImpl.java

@@ -27,7 +27,6 @@ import com.usky.vpp.service.vo.ResponseLoadStatRowVO;
 import com.usky.vpp.service.vo.ResponseMonitorTreeNodeVO;
 import com.usky.vpp.util.VppAuditHelper;
 import com.usky.vpp.util.VppBaselineHelper;
-import com.usky.vpp.util.VppCapabilityEvalHelper;
 import com.usky.vpp.util.VppResponseMonitorHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -161,7 +160,7 @@ public class VppResponseMonitorServiceImpl implements VppResponseMonitorService
         BigDecimal declared = VppResponseMonitorHelper.resolveDeclaredCapacity(
                 drContext.event, drContext.participations, drContext.executions);
 
-        CurveBuildResult curve = buildCurve(resources, devices, siteId, statDate, declared, drContext);
+            CurveBuildResult curve = buildCurve(resources, devices, statDate, declared, drContext);
         result.setPoints(curve.points);
         result.setDataSource(curve.dataSource);
         result.setStatistics(VppResponseMonitorHelper.buildStatistics(curve.points, statDate));
@@ -177,13 +176,13 @@ public class VppResponseMonitorServiceImpl implements VppResponseMonitorService
         LocalDate statDate = parseDate(date);
         ResponseCompareVO result = new ResponseCompareVO();
         result.setDate(statDate.format(DATE_FMT));
-        String dataSource = "mock";
+        String dataSource = null;
 
         for (Long siteId : ids) {
             VppSite site = requireSite(siteId);
             List<VppResourcePoint> resources = listSiteResources(siteId);
             List<VppDevice> devices = loadDevices(resources);
-            CurveBuildResult curve = buildCurve(resources, devices, siteId, statDate, BigDecimal.ZERO, DrContext.empty());
+            CurveBuildResult curve = buildCurve(resources, devices, statDate, BigDecimal.ZERO, DrContext.empty());
             if ("tsdb".equals(curve.dataSource)) {
                 dataSource = "tsdb";
             }
@@ -206,15 +205,12 @@ public class VppResponseMonitorServiceImpl implements VppResponseMonitorService
 
     private CurveBuildResult buildCurve(List<VppResourcePoint> resources,
                                         List<VppDevice> devices,
-                                        Long siteId,
                                         LocalDate statDate,
                                         BigDecimal declaredCapacityKw,
                                         DrContext drContext) {
         List<String> deviceUuids = resolveDeviceUuids(resources, devices);
         if (deviceUuids.isEmpty()) {
-            return new CurveBuildResult(
-                    VppResponseMonitorHelper.buildMockCurve(resources, devices, siteId, statDate, declaredCapacityKw),
-                    "mock");
+            return new CurveBuildResult(Collections.emptyList(), null);
         }
 
         // 确定响应时段(有事件用事件时段,无事件用全天)
@@ -246,9 +242,7 @@ public class VppResponseMonitorServiceImpl implements VppResponseMonitorService
                 LocalTime.MIN, LocalTime.of(23, 59, 59),
                 VppBaselineHelper.POWER_METRICS, interval, null);
         if (originalBaseline.isEmpty()) {
-            return new CurveBuildResult(
-                    VppResponseMonitorHelper.buildMockCurve(resources, devices, siteId, statDate, declaredCapacityKw),
-                    "mock");
+            return new CurveBuildResult(Collections.emptyList(), "tsdb");
         }
 
         // 今日实际负荷(全天)

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/AlarmLevelStatVO.java

@@ -3,7 +3,7 @@ package com.usky.vpp.service.vo;
 import lombok.Data;
 
 /**
- * 告警级别统计(模拟数据,可跳转告警列表)
+ * 告警级别统计(可跳转告警列表)
  */
 @Data
 public class AlarmLevelStatVO {

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/CapabilityLoadCurveVO.java

@@ -14,7 +14,7 @@ public class CapabilityLoadCurveVO {
     private String siteName;
     /** 统计日期 yyyy-MM-dd */
     private String date;
-    /** 数据来源:tsdb / mock */
+    /** 数据来源:tsdb */
     private String dataSource;
     private List<CapabilityLoadPointVO> points;
 }

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DashboardCurveVO.java

@@ -14,7 +14,7 @@ public class DashboardCurveVO {
 
     /** 统计日期 yyyy-MM-dd */
     private String statDate;
-    /** 数据来源:tsdb / mock */
+    /** 数据来源:tsdb */
     private String dataSource;
     private List<Point> points = new ArrayList<>();
 

+ 2 - 2
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrMonitorCurveVO.java

@@ -15,9 +15,9 @@ public class DrMonitorCurveVO {
     private Long id;
     private String eventId;
     private String responseDate;
-    /** tsdb / mock / mixed */
+    /** 数据来源:tsdb */
     private String dataSource;
-    private List<Long> siteIds = new ArrayList<>();
+    private Long siteId;
     /** 实际响应容量合计 kW(邀约) */
     private BigDecimal actualResponseCapacityKw = BigDecimal.ZERO;
     private List<Point> points = new ArrayList<>();

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/ResponseLoadAnalysisVO.java

@@ -16,7 +16,7 @@ public class ResponseLoadAnalysisVO {
     private String date;
     private Long eventId;
     private String eventName;
-    /** tsdb / mock */
+    /** tsdb */
     private String dataSource;
     private String granularity = "15m";
     private List<ResponseLoadPointVO> points = new ArrayList<>();

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/SiteBaselineVO.java

@@ -24,7 +24,7 @@ public class SiteBaselineVO {
     private String responseDayType;
     /** 响应日类型中文 */
     private String responseDayTypeLabel;
-    /** 数据来源:tsdb / mock */
+    /** 数据来源:tsdb */
     private String dataSource;
     /** 全天曲线(整点) */
     private List<BaselinePointVO> points;

+ 1 - 1
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/SiteDeclaredCapacityVO.java

@@ -30,7 +30,7 @@ public class SiteDeclaredCapacityVO {
     private String responseDayType;
     /** 响应日类型中文 */
     private String responseDayTypeLabel;
-    /** 数据来源:tsdb / mock */
+    /** 数据来源:tsdb */
     private String dataSource;
     /** 响应时段内各时间点申报容量 */
     private List<DeclaredCapacityPointVO> points;

+ 0 - 112
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppBaselineHelper.java

@@ -238,47 +238,6 @@ public final class VppBaselineHelper {
         return VppCapabilityEvalHelper.hasTsdbPowerData(deviceMetricData, POWER_METRICS);
     }
 
-    public static List<BaselinePointVO> buildMockBaselinePoints(Long siteId,
-                                                                LocalDate responseDate,
-                                                                LocalDateTime responseStartTime) {
-        List<BaselinePointVO> points = new ArrayList<>();
-        long seed = (siteId != null ? siteId : 0L) + responseDate.toEpochDay();
-        for (int minute = 0; minute < 1440; minute += INTERVAL_MINUTES) {
-            LocalTime time = LocalTime.of(minute / 60, minute % 60);
-            String timeKey = time.format(TIME_FMT);
-            double hourFactor = mockHourFactor(time);
-            double noise = 0.9 + pseudoRandom(seed, minute, 0) * 0.2;
-
-            BigDecimal yesterday = scale(BigDecimal.valueOf(900 * hourFactor * noise));
-            BigDecimal original = yesterday.multiply(BigDecimal.valueOf(0.98 + pseudoRandom(seed, minute, 1) * 0.04))
-                    .setScale(2, RoundingMode.HALF_UP);
-            BigDecimal predicted = original.multiply(BigDecimal.valueOf(1.03)).setScale(2, RoundingMode.HALF_UP);
-
-            BaselinePointVO point = new BaselinePointVO();
-            point.setTime(timeKey);
-            point.setPredictedBaselineKw(predicted);
-            point.setYesterdayActualKw(yesterday);
-            if (!responseDate.atTime(time).isAfter(responseStartTime)) {
-                point.setTodayActualKw(scale(original.multiply(BigDecimal.valueOf(1.01 + pseudoRandom(seed, minute, 2) * 0.05))));
-            }
-            points.add(point);
-        }
-        return points;
-    }
-
-    public static BigDecimal mockCorrectionFactor(Long siteId, LocalDate responseDate) {
-        long seed = (siteId != null ? siteId : 0L) + responseDate.toEpochDay();
-        double raw = 0.85 + pseudoRandom(seed, 99, 3) * 0.25;
-        BigDecimal k = BigDecimal.valueOf(raw).setScale(4, RoundingMode.HALF_UP);
-        if (k.compareTo(K_MIN) < 0) {
-            return K_MIN;
-        }
-        if (k.compareTo(K_MAX) > 0) {
-            return K_MAX;
-        }
-        return k;
-    }
-
     public static String formatDate(LocalDate date) {
         return date.format(DATE_FMT);
     }
@@ -359,47 +318,6 @@ public final class VppBaselineHelper {
         return points;
     }
 
-    public static BigDecimal mockDeclaredCapacityKw(Long siteId,
-                                                    LocalDate responseDate,
-                                                    LocalDateTime windowStart,
-                                                    LocalDateTime windowEnd,
-                                                    BigDecimal correctionFactorK) {
-        return calculateDeclaredCapacityKw(
-                buildMockHistoricalWindow(siteId, responseDate, windowStart, windowEnd),
-                windowStart,
-                windowEnd,
-                correctionFactorK);
-    }
-
-    public static List<DeclaredCapacityPointVO> buildMockDeclaredCapacityPoints(Long siteId,
-                                                                                LocalDate responseDate,
-                                                                                LocalDateTime windowStart,
-                                                                                LocalDateTime windowEnd,
-                                                                                BigDecimal correctionFactorK) {
-        return buildDeclaredCapacityPoints(
-                buildMockHistoricalWindow(siteId, responseDate, windowStart, windowEnd),
-                windowStart,
-                windowEnd,
-                correctionFactorK);
-    }
-
-    private static Map<String, BigDecimal> buildMockHistoricalWindow(Long siteId,
-                                                                     LocalDate responseDate,
-                                                                     LocalDateTime windowStart,
-                                                                     LocalDateTime windowEnd) {
-        Map<String, BigDecimal> mockHistorical = new TreeMap<>();
-        long seed = (siteId != null ? siteId : 0L) + responseDate.toEpochDay();
-        LocalDateTime cursor = windowStart;
-        while (!cursor.isAfter(windowEnd)) {
-            double hourFactor = mockHourFactor(cursor.toLocalTime());
-            double noise = 0.9 + pseudoRandom(seed, cursor.getHour() * 60 + cursor.getMinute(), 4) * 0.2;
-            mockHistorical.put(cursor.toLocalTime().format(TIME_FMT),
-                    BigDecimal.valueOf(900 * hourFactor * noise).setScale(2, RoundingMode.HALF_UP));
-            cursor = cursor.plusMinutes(INTERVAL_MINUTES);
-        }
-        return mockHistorical;
-    }
-
     private static BigDecimal averageValuesInWindow(Map<String, BigDecimal> valuesByTime,
                                                     LocalDateTime windowStart,
                                                     LocalDateTime windowEnd) {
@@ -512,34 +430,4 @@ public final class VppBaselineHelper {
         }
         return value.setScale(2, RoundingMode.HALF_UP);
     }
-
-    private static double mockHourFactor(LocalTime time) {
-        int hour = time.getHour();
-        int minute = time.getMinute();
-        double h = hour + minute / 60.0;
-        if (h < 6) {
-            return 0.45 + h / 6 * 0.15;
-        }
-        if (h < 9) {
-            return 0.6 + (h - 6) / 3 * 0.35;
-        }
-        if (h < 12) {
-            return 0.95 + (h - 9) / 3 * 0.05;
-        }
-        if (h < 14) {
-            return 0.85;
-        }
-        if (h < 17) {
-            return 0.9 + (h - 14) / 3 * 0.1;
-        }
-        if (h < 21) {
-            return 1.0 - (h - 17) / 4 * 0.35;
-        }
-        return 0.5 - (h - 21) / 3 * 0.15;
-    }
-
-    private static double pseudoRandom(long seed, int minuteOfDay, int seriesSalt) {
-        long mixed = seed * 31L + minuteOfDay * 17L + seriesSalt * 13L;
-        return (mixed % 1000) / 1000.0;
-    }
 }

+ 1 - 119
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppCapabilityEvalHelper.java

@@ -1,7 +1,5 @@
 package com.usky.vpp.util;
 
-import com.usky.vpp.domain.VppDevice;
-import com.usky.vpp.domain.VppResourcePoint;
 import com.usky.vpp.service.vo.CapabilityLoadPointVO;
 
 import java.math.BigDecimal;
@@ -20,7 +18,7 @@ import java.util.Set;
 import java.util.TreeMap;
 
 /**
- * 可调能力评估辅助(TSDB 聚合 + 模拟数据兜底
+ * 可调能力评估辅助(TSDB 聚合)
  */
 public final class VppCapabilityEvalHelper {
 
@@ -162,57 +160,6 @@ public final class VppCapabilityEvalHelper {
         return false;
     }
 
-    /**
-     * 生成当日负荷曲线(每 10 分钟一个点,00:00 ~ 23:50)- 模拟兜底
-     */
-    public static List<CapabilityLoadPointVO> buildLoadCurve(List<VppResourcePoint> resources,
-                                                           List<VppDevice> devices,
-                                                           Long siteId,
-                                                           LocalDate date) {
-        List<CapabilityLoadPointVO> points = new ArrayList<>();
-        long seed = (siteId != null ? siteId : 0L) + date.toEpochDay();
-        for (int minute = 0; minute < 1440; minute += 10) {
-            LocalTime time = LocalTime.of(minute / 60, minute % 60);
-            double hourFactor = timeFactor(time);
-            BigDecimal baseline = aggregateLoad(resources, devices, seed, minute, hourFactor, 0);
-            BigDecimal actual = aggregateLoad(resources, devices, seed, minute, hourFactor, 1);
-            CapabilityLoadPointVO point = new CapabilityLoadPointVO();
-            point.setTime(time.format(TIME_FMT));
-            point.setBaselineLoadKw(baseline);
-            point.setActualLoadKw(actual);
-            points.add(point);
-        }
-        return points;
-    }
-
-    private static BigDecimal aggregateLoad(List<VppResourcePoint> resources,
-                                            List<VppDevice> devices,
-                                            long seed,
-                                            int minuteOfDay,
-                                            double hourFactor,
-                                            int seriesSalt) {
-        if (resources == null || resources.isEmpty()) {
-            double base = 800 * hourFactor + pseudoRandom(seed, minuteOfDay, seriesSalt) * 120;
-            return BigDecimal.valueOf(base).setScale(2, RoundingMode.HALF_UP);
-        }
-        BigDecimal total = BigDecimal.ZERO;
-        for (VppResourcePoint resource : resources) {
-            VppDevice device = findDevice(devices, resource.getDeviceId());
-            BigDecimal cap = resource.getCapacityKw() != null ? resource.getCapacityKw() : BigDecimal.valueOf(100);
-            double typeFactor = typeLoadFactor(resource.getResourceType());
-            double noise = 0.85 + pseudoRandom(seed, resource.getId() != null ? resource.getId() : 0L, minuteOfDay, seriesSalt) * 0.3;
-            double value = cap.doubleValue() * hourFactor * typeFactor * noise;
-            if (CATEGORY_GENERATION.equals(resolveCategory(resource.getResourceType()))) {
-                value *= 0.15;
-            }
-            total = total.add(BigDecimal.valueOf(value));
-        }
-        if (seriesSalt == 1) {
-            total = total.multiply(BigDecimal.valueOf(1.02 + pseudoRandom(seed, 999, minuteOfDay, seriesSalt) * 0.08));
-        }
-        return total.setScale(2, RoundingMode.HALF_UP);
-    }
-
     private static BigDecimal sumBucketPower(Map<String, Map<String, TreeMap<LocalDateTime, BigDecimal>>> deviceData,
                                              List<String> metricCandidates,
                                              LocalDateTime bucketStart,
@@ -293,69 +240,4 @@ public final class VppCapabilityEvalHelper {
         }
         return value.setScale(2, RoundingMode.HALF_UP);
     }
-
-    private static VppDevice findDevice(List<VppDevice> devices, Long deviceId) {
-        if (devices == null || deviceId == null) {
-            return null;
-        }
-        return devices.stream().filter(d -> deviceId.equals(d.getId())).findFirst().orElse(null);
-    }
-
-    /**
-     * 日内负荷形态:夜间低、早晚峰、午间次峰
-     */
-    private static double timeFactor(LocalTime time) {
-        int hour = time.getHour();
-        int minute = time.getMinute();
-        double h = hour + minute / 60.0;
-        if (h < 6) {
-            return 0.45 + h / 6 * 0.15;
-        }
-        if (h < 9) {
-            return 0.6 + (h - 6) / 3 * 0.35;
-        }
-        if (h < 12) {
-            return 0.95 + (h - 9) / 3 * 0.05;
-        }
-        if (h < 14) {
-            return 0.85;
-        }
-        if (h < 17) {
-            return 0.9 + (h - 14) / 3 * 0.1;
-        }
-        if (h < 21) {
-            return 1.0 - (h - 17) / 4 * 0.35;
-        }
-        return 0.5 - (h - 21) / 3 * 0.15;
-    }
-
-    private static double typeLoadFactor(String resourceType) {
-        if (resourceType == null) {
-            return 0.7;
-        }
-        switch (resourceType.toUpperCase()) {
-            case "IND_LOAD":
-                return 0.75;
-            case "COM_BLDG":
-                return 0.65;
-            case "EVCS":
-                return 0.55;
-            case "ESS":
-                return 0.4;
-            case "PV":
-                return 1.0;
-            default:
-                return 0.7;
-        }
-    }
-
-    private static double pseudoRandom(long seed, long a, int b, int c) {
-        long mixed = seed * 31L + a * 17L + b * 13L + c * 7L;
-        return (mixed % 1000) / 1000.0;
-    }
-
-    private static double pseudoRandom(long seed, int minuteOfDay, int seriesSalt) {
-        long mixed = seed * 31L + minuteOfDay * 17L + seriesSalt * 13L;
-        return (mixed % 1000) / 1000.0;
-    }
 }

+ 0 - 62
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceMockHelper.java

@@ -1,62 +0,0 @@
-package com.usky.vpp.util;
-
-import com.usky.vpp.domain.VppDevice;
-import com.usky.vpp.domain.VppResourcePoint;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.LocalDateTime;
-import java.util.concurrent.ThreadLocalRandom;
-
-/**
- * 资源看板/概览模拟数据生成(联调阶段使用,后续可替换为 TSDB/IoT 实时数据)
- */
-public final class VppResourceMockHelper {
-
-    private VppResourceMockHelper() {
-    }
-
-    public static BigDecimal mockSocPercent(VppResourcePoint resource) {
-        if (!"ESS".equalsIgnoreCase(resource.getResourceType())) {
-            return null;
-        }
-        return BigDecimal.valueOf(20 + pseudoRandom(resource.getId(), 2) * 70).setScale(1, RoundingMode.HALF_UP);
-    }
-
-    public static BigDecimal mockEvcsChargePowerKw(VppResourcePoint resource) {
-        if (!"EVCS".equalsIgnoreCase(resource.getResourceType())) {
-            return null;
-        }
-        BigDecimal base = resource.getCapacityKw() != null ? resource.getCapacityKw() : BigDecimal.valueOf(60);
-        return base.multiply(BigDecimal.valueOf(0.2 + pseudoRandom(resource.getId(), 3) * 0.7))
-                .setScale(2, RoundingMode.HALF_UP);
-    }
-
-    public static String resourceTypeLabel(String resourceType) {
-        if (resourceType == null) {
-            return "未知";
-        }
-        switch (resourceType.toUpperCase()) {
-            case "PV":
-                return "光伏";
-            case "ESS":
-                return "储能";
-            case "EVCS":
-                return "充电桩";
-            case "IND_LOAD":
-                return "工业负荷";
-            case "COM_BLDG":
-                return "商业楼宇";
-            default:
-                return resourceType;
-        }
-    }
-
-    private static double pseudoRandom(Long seed, int salt) {
-        if (seed == null) {
-            return ThreadLocalRandom.current().nextDouble();
-        }
-        long mixed = seed * 31L + salt + LocalDateTime.now().getMinute();
-        return (mixed % 1000) / 1000.0;
-    }
-}

+ 30 - 0
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceTypeHelper.java

@@ -0,0 +1,30 @@
+package com.usky.vpp.util;
+
+/**
+ * 资源类型中文标签
+ */
+public final class VppResourceTypeHelper {
+
+    private VppResourceTypeHelper() {
+    }
+
+    public static String resourceTypeLabel(String resourceType) {
+        if (resourceType == null) {
+            return "未知";
+        }
+        switch (resourceType.toUpperCase()) {
+            case "PV":
+                return "光伏";
+            case "ESS":
+                return "储能";
+            case "EVCS":
+                return "充电桩";
+            case "IND_LOAD":
+                return "工业负荷";
+            case "COM_BLDG":
+                return "商业楼宇";
+            default:
+                return resourceType;
+        }
+    }
+}

+ 0 - 92
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResponseMonitorHelper.java

@@ -1,10 +1,8 @@
 package com.usky.vpp.util;
 
-import com.usky.vpp.domain.VppDevice;
 import com.usky.vpp.domain.VppDrEvent;
 import com.usky.vpp.domain.VppDrExecution;
 import com.usky.vpp.domain.VppDrParticipation;
-import com.usky.vpp.domain.VppResourcePoint;
 import com.usky.vpp.service.vo.ResponseLoadPointVO;
 import com.usky.vpp.service.vo.ResponseLoadStatRowVO;
 
@@ -76,32 +74,6 @@ public final class VppResponseMonitorHelper {
         return points;
     }
 
-    public static List<ResponseLoadPointVO> buildMockCurve(List<VppResourcePoint> resources,
-                                                         List<VppDevice> devices,
-                                                         Long siteId,
-                                                         LocalDate date,
-                                                         BigDecimal declaredCapacityKw) {
-        List<ResponseLoadPointVO> points = new ArrayList<>();
-        long seed = (siteId != null ? siteId : 0L) + date.toEpochDay();
-        for (int minute = 0; minute < 1440; minute += BUCKET_MINUTES) {
-            LocalTime time = LocalTime.of(minute / 60, minute % 60);
-            double hourFactor = dayTimeFactor(time);
-            BigDecimal baseline = mockAggregate(resources, devices, seed, minute, hourFactor, 0);
-            BigDecimal actual = mockAggregate(resources, devices, seed, minute, hourFactor, 1);
-            BigDecimal response = baseline.subtract(actual).max(BigDecimal.ZERO);
-
-            ResponseLoadPointVO point = new ResponseLoadPointVO();
-            point.setTime(time.format(TIME_FMT));
-            point.setDatetime(date.atTime(time).format(DATETIME_FMT));
-            point.setBaselineLoadKw(baseline);
-            point.setActualLoadKw(actual);
-            point.setDeclaredCapacityKw(declaredCapacityKw != null ? declaredCapacityKw : BigDecimal.ZERO);
-            point.setActualResponseLoadKw(response);
-            points.add(point);
-        }
-        return points;
-    }
-
     /**
      * 基于预计算的预测基线和今日实际,构建曲线点(替代直接操作 TSDB 原始时序)。
      */
@@ -232,30 +204,6 @@ public final class VppResponseMonitorHelper {
         return row;
     }
 
-    private static BigDecimal mockAggregate(List<VppResourcePoint> resources,
-                                            List<VppDevice> devices,
-                                            long seed,
-                                            int minuteOfDay,
-                                            double hourFactor,
-                                            int seriesSalt) {
-        if (resources == null || resources.isEmpty()) {
-            double base = 580 * hourFactor + pseudoRandom(seed, 0L, minuteOfDay, seriesSalt) * 80;
-            return BigDecimal.valueOf(base).setScale(2, RoundingMode.HALF_UP);
-        }
-        BigDecimal total = BigDecimal.ZERO;
-        for (VppResourcePoint resource : resources) {
-            BigDecimal cap = resource.getCapacityKw() != null ? resource.getCapacityKw() : BigDecimal.valueOf(100);
-            double noise = 0.85 + pseudoRandom(seed, resource.getId() != null ? resource.getId() : 0L,
-                    minuteOfDay, seriesSalt) * 0.3;
-            double value = cap.doubleValue() * hourFactor * 0.6 * noise;
-            total = total.add(BigDecimal.valueOf(value));
-        }
-        if (seriesSalt == 1) {
-            total = total.multiply(BigDecimal.valueOf(0.95 + pseudoRandom(seed, 999, minuteOfDay, seriesSalt) * 0.08));
-        }
-        return total.setScale(2, RoundingMode.HALF_UP);
-    }
-
     private static BigDecimal sumBucketPower(Map<String, Map<String, TreeMap<LocalDateTime, BigDecimal>>> deviceData,
                                              List<String> metricCandidates,
                                              LocalDateTime bucketStart,
@@ -333,44 +281,4 @@ public final class VppResponseMonitorHelper {
     private static BigDecimal min(List<BigDecimal> values) {
         return values.stream().min(BigDecimal::compareTo).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
     }
-
-    private static double pseudo(String time) {
-        if (time == null) {
-            return 0.5;
-        }
-        return (time.hashCode() & 0x7FFFFFFF) % 100 / 100.0;
-    }
-
-    private static double pseudoRandom(long seed, long a, int b, int c) {
-        long x = seed * 31 + a * 17 + b * 13L + c;
-        x = ((x >> 16) ^ x) * 0x45d9f3b;
-        x = ((x >> 16) ^ x) * 0x45d9f3b;
-        x = (x >> 16) ^ x;
-        return (x & 0x7FFFFFFF) / (double) 0x7FFFFFFF;
-    }
-
-    private static double dayTimeFactor(LocalTime time) {
-        int hour = time.getHour();
-        int minute = time.getMinute();
-        double h = hour + minute / 60.0;
-        if (h < 6) {
-            return 0.45 + h / 6 * 0.15;
-        }
-        if (h < 9) {
-            return 0.6 + (h - 6) / 3 * 0.35;
-        }
-        if (h < 12) {
-            return 0.95 + (h - 9) / 3 * 0.05;
-        }
-        if (h < 14) {
-            return 0.85;
-        }
-        if (h < 18) {
-            return 0.75 + (h - 14) / 4 * 0.25;
-        }
-        if (h < 21) {
-            return 1.0 - (h - 18) / 3 * 0.2;
-        }
-        return 0.55 - (h - 21) / 3 * 0.15;
-    }
 }