Ver Fonte

Merge branch 'fyc-vpp' of uskycloud/usky-modules into feature/service-vpp-20260701

fuyuchuan há 4 dias atrás
pai
commit
d05125be86
31 ficheiros alterados com 241 adições e 256 exclusões
  1. 2 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/constant/VppTsdbConstants.java
  2. 6 29
      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/domain/VppDrSubsidyPrediction.java
  6. 5 3
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppDrMonitorService.java
  7. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppResourceBoardService.java
  8. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/VppResourceOverviewService.java
  9. 10 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppBaselineServiceImpl.java
  10. 6 5
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppCapabilityEvalServiceImpl.java
  11. 68 122
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppDrMonitorServiceImpl.java
  12. 16 19
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppDrSubsidyPredictionServiceImpl.java
  13. 13 7
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourceBoardServiceImpl.java
  14. 15 4
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourceOverviewServiceImpl.java
  15. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResourcePointServiceImpl.java
  16. 12 11
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppResponseMonitorServiceImpl.java
  17. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/AlarmLevelStatVO.java
  18. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/CapabilityLoadCurveVO.java
  19. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DashboardCurveVO.java
  20. 4 14
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrMonitorCurveVO.java
  21. 7 0
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrMonitorRecordVO.java
  22. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrSubsidyPredictionRequest.java
  23. 2 2
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrSubsidyPredictionVO.java
  24. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/ResponseLoadAnalysisVO.java
  25. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/SiteBaselineVO.java
  26. 1 1
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/SiteDeclaredCapacityVO.java
  27. 6 0
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppBaselineHelper.java
  28. 5 9
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppCapabilityEvalHelper.java
  29. 11 9
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceMockHelper.java
  30. 30 0
      service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceTypeHelper.java
  31. 6 2
      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"
     );
 
     /** 日发电量(光伏) */

+ 6 - 29
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/controller/web/DrMonitorController.java

@@ -7,19 +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.PathVariable;
 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;
 
 /**
  * 需求响应监测(响应记录)
@@ -56,30 +50,13 @@ public class DrMonitorController {
     }
 
     /**
-     * 折线图:两条基线(5日/3日)+ 当日实测;时间窗为响应前2小时 + 响应时长 + 响应后1小时
-     * <p>baselineDays 传 3 或 5 时优先展示对应基线到 baselineKw;为空则同时返回两条。</p>
+     * 折线图:基线负荷 + 实际响应容量;查询范围为当天
+     * <p>基线负荷复用 getSiteBaseline,实际响应容量复用 getSiteDeclaredCapacity。</p>
+     * <p>baselineDays 传 3 或 5 时按对应周期计算基线负荷;为空则按 5 日基线。</p>
      */
-    @GetMapping("/records/{id}/curve")
-    public ApiResult<DrMonitorCurveVO> curve(@PathVariable("id") Long id,
-                                             @RequestParam("siteIds") List<Long> siteIds,
+    @GetMapping("/records/curve")
+    public ApiResult<DrMonitorCurveVO> curve(@RequestParam("siteId") Long siteId,
                                              @RequestParam(value = "baselineDays", required = false) Integer baselineDays) {
-        return ApiResult.success(drMonitorService.getCurve(id, 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/domain/VppDrSubsidyPrediction.java

@@ -87,11 +87,11 @@ public class VppDrSubsidyPrediction implements Serializable {
     @TableField("price_adjustment_coefficient")
     private BigDecimal priceAdjustmentCoefficient;
 
-    /** 完成率(百分比)= 平台实际响应量 / 申报出清量 × 100 */
+    /** 完成率(百分比)= 实际响应容量(电网) / 实际出清 × 100 */
     @TableField("completion_rate")
     private BigDecimal completionRate;
 
-    /** 偏差率(百分比)= (电网实际响应量 − 平台实际响应量) / 申报出清量 × 100 */
+    /** 偏差率(百分比)= (1 − 完成率) × 100 */
     @TableField("deviation_rate")
     private BigDecimal deviationRate;
 

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

@@ -29,9 +29,11 @@ public interface VppDrMonitorService {
                                               List<Long> siteIds, Map<String, Object> params);
 
     /**
-     * 折线图:基线/实际负荷按可调峰资源点加权平均;申报/实际响应按资源点平均
+     * 折线图:以当天为查询范围,基线负荷复用 getSiteBaseline,实际响应容量复用
+     * getSiteDeclaredCapacity,再按可调峰资源点平均
      *
-     * @param baselineDays 基线参考天数,仅支持 3 或 5;为空时同时返回 3/5 日两条基线
+     * @param siteId       站点 ID(必填)
+     * @param baselineDays 基线参考天数,仅支持 3 或 5;为空时按 5 日基线
      */
-    DrMonitorCurveVO getCurve(Long eventId, 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();
 }

+ 10 - 2
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
@@ -103,6 +103,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         result.setResponseStartTime(startTime);
 
         if (deviceUuids.isEmpty()) {
+            // return buildMockResult(result, siteId, responseDate, startTime);
             return result;
         }
 
@@ -134,6 +135,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
                 VppBaselineHelper.INTERVAL_MINUTES,
                 null);
         if (originalBaselineByTime.isEmpty()) {
+            // return buildMockResult(result, siteId, responseDate, startTime);
             return result;
         }
 
@@ -214,6 +216,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
 
         List<String> deviceUuids = listControllableDeviceUuids(siteId);
         if (deviceUuids.isEmpty()) {
+            // return buildMockDeclaredCapacityResult(result, siteId, responseDate, startTime, endTime);
             return result;
         }
 
@@ -256,6 +259,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
                 VppBaselineHelper.INTERVAL_MINUTES,
                 null);
         if (historicalAvgByTime.isEmpty()) {
+            // return buildMockDeclaredCapacityResult(result, siteId, responseDate, startTime, endTime);
             return result;
         }
 
@@ -269,6 +273,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         return result;
     }
 
+    /*
     private SiteDeclaredCapacityVO buildMockDeclaredCapacityResult(SiteDeclaredCapacityVO result,
                                                                  Long siteId,
                                                                  LocalDate responseDate,
@@ -286,6 +291,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         result.setDataSource("mock");
         return result;
     }
+    */
 
     private Map<String, BigDecimal> applyCorrection(Map<String, BigDecimal> originalBaselineByTime,
                                                     BigDecimal correctionFactorK) {
@@ -297,6 +303,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         return corrected;
     }
 
+    /*
     private SiteBaselineVO buildMockResult(SiteBaselineVO result,
                                            Long siteId,
                                            LocalDate responseDate,
@@ -309,6 +316,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
         result.setDataSource("mock");
         return result;
     }
+    */
 
     private List<String> listControllableDeviceUuids(Long siteId) {
         List<VppResourcePoint> resources = resourcePointMapper.selectList(

+ 6 - 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,12 @@ 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(
+        //         VppCapabilityEvalHelper.buildLoadCurve(resources, devices, siteId, statDate),
+        //         "mock");
+        return new LoadCurveBuildResult(Collections.emptyList(), null);
     }
 
     @Override

+ 68 - 122
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppDrMonitorServiceImpl.java

@@ -22,6 +22,7 @@ import com.usky.vpp.service.vo.DrMonitorCurveVO;
 import com.usky.vpp.service.vo.DrMonitorRecordVO;
 import com.usky.vpp.service.vo.DrMonitorSummaryVO;
 import com.usky.vpp.service.vo.SiteBaselineVO;
+import com.usky.vpp.service.vo.SiteDeclaredCapacityVO;
 import com.usky.vpp.util.VppAuditHelper;
 import com.usky.vpp.util.VppPageHelper;
 import org.springframework.beans.BeanUtils;
@@ -38,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;
@@ -224,143 +222,83 @@ public class VppDrMonitorServiceImpl implements VppDrMonitorService {
     }
 
     @Override
-    public DrMonitorCurveVO getCurve(Long eventId, List<Long> siteIds, Integer baselineDays) {
-        if (eventId == null) {
-            throw new BusinessException("事件ID不能为空");
+    public DrMonitorCurveVO getCurve(Long siteId, Integer baselineDays) {
+        if (siteId == null) {
+            throw new BusinessException("站点ID不能为空");
         }
-        requireSiteIds(siteIds);
         if (baselineDays != null && baselineDays != 3 && baselineDays != 5) {
-            throw new BusinessException("baselineDays 仅支持 3 或 5");
+            throw new BusinessException("基线负荷仅支持3天或5天维度查询!");
         }
         Integer tenantId = SecurityUtils.getTenantId();
-        VppDrEvent event = eventMapper.selectById(eventId);
-        if (event == null || VppAuditHelper.isDeleted(event.getDeleteFlag())) {
-            throw new BusinessException("事件不存在");
-        }
-        if (tenantId != null && event.getTenantId() != null && !tenantId.equals(event.getTenantId())) {
-            throw new BusinessException("事件不存在");
-        }
-        if (event.getStartTime() == null) {
-            throw new BusinessException("事件缺少开始时间");
-        }
-
-        List<VppResourcePoint> peakResources = listPeakResources(siteIds, tenantId);
+        List<VppResourcePoint> peakResources = listPeakResources(siteId, tenantId);
         if (peakResources.isEmpty()) {
-            throw new BusinessException("所选站点下无可参与调峰的资源点");
+            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();
 
-        List<VppDrInvitation> invitations = listInvitations(
-                Collections.singleton(event.getId()), peakSiteIds, tenantId);
-        BigDecimal declaredSum = BigDecimal.ZERO;
-        BigDecimal actualSum = BigDecimal.ZERO;
-        for (VppDrInvitation invitation : invitations) {
-            declaredSum = declaredSum.add(nz(invitation.getDeclaredCapacityKw()));
-            actualSum = actualSum.add(nz(invitation.getActualResponseCapacityKw()));
-        }
-        BigDecimal declaredAvg = avg(declaredSum, resourceCount);
-        BigDecimal actualAvg = avg(actualSum, resourceCount);
-
-        LocalDateTime windowStart = event.getStartTime().minusHours(2);
-        LocalDateTime windowEnd = (event.getEndTime() != null ? event.getEndTime() : event.getStartTime()).plusHours(1);
-        String responseStartTime = event.getStartTime().format(DATE_TIME_FMT);
+        LocalDate today = LocalDate.now();
+        LocalDateTime windowStart = today.atStartOfDay();
+        LocalDateTime windowEnd = today.atTime(LocalTime.MAX);
+        String responseStartTime = windowStart.format(DATE_TIME_FMT);
+        String responseEndTime = windowEnd.format(DATE_TIME_FMT);
         String actualEndTime = windowEnd.format(DATE_TIME_FMT);
+        int requiredDays = (baselineDays != null && baselineDays == 3) ? 3 : 5;
 
-        Map<String, BigDecimal> baseline5Weighted = new LinkedHashMap<>();
-        Map<String, BigDecimal> baseline3Weighted = new LinkedHashMap<>();
-        Map<String, BigDecimal> loadWeighted = new LinkedHashMap<>();
-        Set<String> dataSources = new LinkedHashSet<>();
-        List<Long> usedSiteIds = new ArrayList<>();
-
-        for (Map.Entry<Long, Long> entry : siteResourceCount.entrySet()) {
-            Long siteId = entry.getKey();
-            BigDecimal weight = BigDecimal.valueOf(entry.getValue());
-            SiteBaselineVO baseline5 = baselineService.getSiteBaseline(siteId, responseStartTime, 5, actualEndTime);
-            SiteBaselineVO baseline3 = baselineService.getSiteBaseline(siteId, responseStartTime, 3, actualEndTime);
-            if ((baseline5 == null || CollectionUtils.isEmpty(baseline5.getPoints()))
-                    && (baseline3 == null || CollectionUtils.isEmpty(baseline3.getPoints()))) {
-                continue;
-            }
-            usedSiteIds.add(siteId);
-            if (baseline5 != null && StringUtils.hasText(baseline5.getDataSource())) {
-                dataSources.add(baseline5.getDataSource());
-            }
-            if (baseline5 != null && !CollectionUtils.isEmpty(baseline5.getPoints())) {
-                for (BaselinePointVO point : baseline5.getPoints()) {
-                    if (!StringUtils.hasText(point.getTime()) || !inCurveWindow(point.getTime(), windowStart, windowEnd)) {
-                        continue;
-                    }
-                    baseline5Weighted.merge(point.getTime(),
-                            nz(point.getPredictedBaselineKw()).multiply(weight), BigDecimal::add);
-                    loadWeighted.merge(point.getTime(),
-                            nz(point.getTodayActualKw()).multiply(weight), BigDecimal::add);
-                }
-            }
-            if (baseline3 != null && !CollectionUtils.isEmpty(baseline3.getPoints())) {
-                for (BaselinePointVO point : baseline3.getPoints()) {
-                    if (!StringUtils.hasText(point.getTime()) || !inCurveWindow(point.getTime(), windowStart, windowEnd)) {
-                        continue;
-                    }
-                    baseline3Weighted.merge(point.getTime(),
-                            nz(point.getPredictedBaselineKw()).multiply(weight), BigDecimal::add);
-                    if (!loadWeighted.containsKey(point.getTime())) {
-                        loadWeighted.merge(point.getTime(),
-                                nz(point.getTodayActualKw()).multiply(weight), BigDecimal::add);
-                    }
-                }
-            }
-        }
+        BigDecimal actualAvg = avg(resolveSiteActualResponseKw(
+                siteId, responseStartTime, responseEndTime, BigDecimal.ZERO), resourceCount);
+
+        SiteBaselineVO baseline = baselineService.getSiteBaseline(
+                siteId, responseStartTime, requiredDays, actualEndTime);
 
-        BigDecimal divisor = BigDecimal.valueOf(resourceCount);
         DrMonitorCurveVO curve = new DrMonitorCurveVO();
-        curve.setId(event.getId());
-        curve.setEventId(event.getEventId());
-        curve.setResponseDate(event.getStartTime().toLocalDate().format(DATE_FMT));
-        curve.setSiteIds(usedSiteIds);
-        curve.setDeclaredCapacityKw(declaredAvg);
+        curve.setResponseDate(today.format(DATE_FMT));
+        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");
-        }
-
-        Set<String> timeSet = new LinkedHashSet<>();
-        timeSet.addAll(baseline5Weighted.keySet());
-        timeSet.addAll(baseline3Weighted.keySet());
-        timeSet.addAll(loadWeighted.keySet());
-        List<String> times = new ArrayList<>(timeSet);
-        times.sort(Comparator.naturalOrder());
-        for (String time : times) {
-            DrMonitorCurveVO.Point point = new DrMonitorCurveVO.Point();
-            point.setTime(time);
-            BigDecimal b5 = baseline5Weighted.getOrDefault(time, BigDecimal.ZERO)
-                    .divide(divisor, SCALE, RoundingMode.HALF_UP);
-            BigDecimal b3 = baseline3Weighted.getOrDefault(time, BigDecimal.ZERO)
-                    .divide(divisor, SCALE, RoundingMode.HALF_UP);
-            point.setBaseline5DayKw(b5);
-            point.setBaseline3DayKw(b3);
-            if (baselineDays != null && baselineDays == 3) {
-                point.setBaselineKw(b3);
-            } else {
-                point.setBaselineKw(b5);
+        if (baseline != null && StringUtils.hasText(baseline.getDataSource())) {
+            curve.setDataSource(baseline.getDataSource());
+        }
+        // if (dataSources.isEmpty()) {
+        //     curve.setDataSource("mock");
+        // }
+
+        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;
             }
-            point.setLoadKw(loadWeighted.getOrDefault(time, BigDecimal.ZERO)
-                    .divide(divisor, SCALE, RoundingMode.HALF_UP));
-            point.setDeclaredCapacityKw(declaredAvg);
-            point.setActualResponseCapacityKw(actualAvg);
-            curve.getPoints().add(point);
+            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;
     }
 
+    /**
+     * 实际响应容量复用申报容量链路 {@link VppBaselineService#getSiteDeclaredCapacity},
+     * 取预估响应容量;无数据时回退邀约实际响应容量。
+     */
+    private BigDecimal resolveSiteActualResponseKw(Long siteId, String responseStartTime,
+                                                   String responseEndTime, BigDecimal fallbackKw) {
+        if (siteId == null || !StringUtils.hasText(responseStartTime) || !StringUtils.hasText(responseEndTime)) {
+            return nz(fallbackKw);
+        }
+        try {
+            SiteDeclaredCapacityVO capacity = baselineService.getSiteDeclaredCapacity(
+                    siteId, responseStartTime, responseEndTime);
+            if (capacity != null && capacity.getEstimatedResponseCapacityKw() != null
+                    && capacity.getEstimatedResponseCapacityKw().compareTo(BigDecimal.ZERO) > 0) {
+                return capacity.getEstimatedResponseCapacityKw();
+            }
+        } catch (Exception ignored) {
+            // 回退邀约实际响应容量,保持曲线可返回
+        }
+        return nz(fallbackKw);
+    }
+
     private boolean inCurveWindow(String timeKey, LocalDateTime windowStart, LocalDateTime windowEnd) {
         try {
             LocalTime t = LocalTime.parse(timeKey.length() == 5 ? timeKey : timeKey.substring(0, 5));
@@ -405,6 +343,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)

+ 16 - 19
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/impl/VppDrSubsidyPredictionServiceImpl.java

@@ -133,6 +133,9 @@ public class VppDrSubsidyPredictionServiceImpl implements VppDrSubsidyPrediction
         BigDecimal declaredKw = invitation.getDeclaredCapacityKw() != null
                 ? invitation.getDeclaredCapacityKw()
                 : invitation.getActualClearedCapacityKw();
+        BigDecimal actualClearedKw = invitation.getActualClearedCapacityKw() != null
+                ? invitation.getActualClearedCapacityKw()
+                : declaredKw;
         BigDecimal platformKw = resolvePlatformActualResponseKw(
                 invitation.getSiteId(), event.getStartTime(), event.getEndTime(),
                 invitation.getEstimatedResponseCapacityKw());
@@ -141,7 +144,7 @@ public class VppDrSubsidyPredictionServiceImpl implements VppDrSubsidyPrediction
         entity.setActualResponsePlatformKw(platformKw);
         entity.setDeclaredClearedKw(declaredKw);
         entity.setEstimatedCapacityKw(platformKw);
-        entity.setClearedCapacityKw(declaredKw);
+        entity.setClearedCapacityKw(actualClearedKw);
         entity.setTenantId(event.getTenantId() != null ? event.getTenantId() : invitation.getTenantId());
 
         recalculate(entity, loadActivePriceAdjustments(
@@ -319,12 +322,15 @@ public class VppDrSubsidyPredictionServiceImpl implements VppDrSubsidyPrediction
         BigDecimal declaredKw = invitation.getDeclaredCapacityKw() != null
                 ? invitation.getDeclaredCapacityKw()
                 : invitation.getActualClearedCapacityKw();
+        BigDecimal actualClearedKw = invitation.getActualClearedCapacityKw() != null
+                ? invitation.getActualClearedCapacityKw()
+                : declaredKw;
 
         p.setActualResponsePlatformKw(platformKw);
         p.setActualResponseGridKw(gridKw);
         p.setDeclaredClearedKw(declaredKw);
         p.setEstimatedCapacityKw(platformKw);
-        p.setClearedCapacityKw(declaredKw);
+        p.setClearedCapacityKw(actualClearedKw);
         p.setTenantId(event.getTenantId());
         recalculate(p, adjustments);
         return p;
@@ -508,8 +514,8 @@ public class VppDrSubsidyPredictionServiceImpl implements VppDrSubsidyPrediction
     /**
      * 自动计算:响应时长、偏差率、完成率、补贴金额
      * <ul>
-     *   <li>完成率(%)= 平台实际响应量 / 申报出清量 × 100(≥0,正常 0~100,超发可 &gt;100)</li>
-     *   <li>偏差率(%)= (电网实际响应量 − 平台实际响应量) / 申报出清量 × 100(可正可负)</li>
+     *   <li>完成率(%)= 实际响应容量(电网) / 实际出清 × 100(实际出清为 null 或 ≤0 时不计算)</li>
+     *   <li>偏差率(%)= (1 − 完成率) × 100</li>
      *   <li>价格调整系数:按完成率比例匹配响应量偏差价格调整配置</li>
      *   <li>补贴金额 = 电网实际响应量 × 响应时长(h) × 价格调整系数 × 补贴标准</li>
      * </ul>
@@ -523,16 +529,12 @@ public class VppDrSubsidyPredictionServiceImpl implements VppDrSubsidyPrediction
         }
         entity.setResponseDurationMin(durationMin);
 
-        BigDecimal platformKw = entity.getActualResponsePlatformKw() != null
-                ? entity.getActualResponsePlatformKw()
-                : entity.getEstimatedCapacityKw();
         BigDecimal gridKw = entity.getActualResponseGridKw();
-        BigDecimal declaredKw = entity.getDeclaredClearedKw() != null
-                ? entity.getDeclaredClearedKw()
-                : entity.getClearedCapacityKw();
+        BigDecimal clearedKw = entity.getClearedCapacityKw() != null
+                ? entity.getClearedCapacityKw()
+                : entity.getDeclaredClearedKw();
 
-        if (declaredKw == null || declaredKw.compareTo(BigDecimal.ZERO) <= 0
-                || platformKw == null || gridKw == null) {
+        if (clearedKw == null || clearedKw.compareTo(BigDecimal.ZERO) <= 0 || gridKw == null) {
             entity.setDeviationRate(null);
             entity.setCompletionRate(null);
             entity.setPriceAdjustmentCoefficient(null);
@@ -540,13 +542,8 @@ public class VppDrSubsidyPredictionServiceImpl implements VppDrSubsidyPrediction
             return;
         }
 
-        // 完成率用平台量;价格档按完成率比例匹配
-        BigDecimal completionRatio = platformKw.divide(declaredKw, 6, RoundingMode.HALF_UP);
-        if (completionRatio.compareTo(BigDecimal.ZERO) < 0) {
-            completionRatio = BigDecimal.ZERO;
-        }
-        BigDecimal deviationRatio = gridKw.subtract(platformKw)
-                .divide(declaredKw, 6, RoundingMode.HALF_UP);
+        BigDecimal completionRatio = gridKw.divide(clearedKw, 6, RoundingMode.HALF_UP);
+        BigDecimal deviationRatio = BigDecimal.ONE.subtract(completionRatio);
         BigDecimal priceAdjustmentCoefficient = resolvePriceAdjustmentCoefficient(completionRatio, adjustments);
 
         entity.setCompletionRate(completionRatio.multiply(BigDecimal.valueOf(100)).setScale(4, RoundingMode.HALF_UP));

+ 13 - 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,25 @@ 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());
+        // item.setSocPercent(VppResourceMockHelper.mockSocPercent(resource));
+        // item.setEvcsChargePowerKw(VppResourceMockHelper.mockEvcsChargePowerKw(resource));
     }
 
-    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) {

+ 15 - 4
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,8 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
 
     @Override
     public List<AlarmLevelStatVO> getAlarmStats() {
-        return buildAlarmStatsMock();
+        // return buildAlarmStatsMock();
+        return buildAlarmStats();
     }
 
     @Override
@@ -277,7 +278,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 +289,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,6 +443,15 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
         return new ArrayList<>(uuids);
     }
 
+    private List<AlarmLevelStatVO> buildAlarmStats() {
+        List<AlarmLevelStatVO> stats = new ArrayList<>();
+        stats.add(buildAlarmStat(1, "紧急", 0L));
+        stats.add(buildAlarmStat(2, "重要", 0L));
+        stats.add(buildAlarmStat(3, "一般", 0L));
+        return stats;
+    }
+
+    /*
     private List<AlarmLevelStatVO> buildAlarmStatsMock() {
         List<AlarmLevelStatVO> stats = new ArrayList<>();
         stats.add(buildAlarmStat(1, "紧急", 3L));
@@ -449,6 +459,7 @@ public class VppResourceOverviewServiceImpl implements VppResourceOverviewServic
         stats.add(buildAlarmStat(3, "一般", 15L));
         return stats;
     }
+    */
 
     private AlarmLevelStatVO buildAlarmStat(int level, String label, long count) {
         AlarmLevelStatVO stat = new AlarmLevelStatVO();

+ 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());

+ 12 - 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,14 @@ public class VppResponseMonitorServiceImpl implements VppResponseMonitorService
         LocalDate statDate = parseDate(date);
         ResponseCompareVO result = new ResponseCompareVO();
         result.setDate(statDate.format(DATE_FMT));
-        String dataSource = "mock";
+        // 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 +206,15 @@ 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(
+            //         VppResponseMonitorHelper.buildMockCurve(resources, devices, siteId, statDate, declaredCapacityKw),
+            //         "mock");
+            return new CurveBuildResult(Collections.emptyList(), null);
         }
 
         // 确定响应时段(有事件用事件时段,无事件用全天)
@@ -246,9 +246,10 @@ 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(
+            //         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<>();
 

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

@@ -7,7 +7,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 响应监测 - 折线图(基线/实际负荷 + 申报/实际响应容量)
+ * 响应监测 - 折线图(基线负荷 + 实际响应容量)
  */
 @Data
 public class DrMonitorCurveVO {
@@ -15,11 +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<>();
-    /** 申报容量合计 kW(邀约) */
-    private BigDecimal declaredCapacityKw = BigDecimal.ZERO;
+    private Long siteId;
     /** 实际响应容量合计 kW(邀约) */
     private BigDecimal actualResponseCapacityKw = BigDecimal.ZERO;
     private List<Point> points = new ArrayList<>();
@@ -28,16 +26,8 @@ public class DrMonitorCurveVO {
     public static class Point {
         /** 时刻 HH:mm */
         private String time;
-        /** 基线负荷(兼容旧字段,默认取 5 日或指定周期) */
+        /** 基线负荷 kW */
         private BigDecimal baselineKw;
-        /** 5 日基线 kW */
-        private BigDecimal baseline5DayKw;
-        /** 3 日基线 kW */
-        private BigDecimal baseline3DayKw;
-        /** 实际负荷 kW */
-        private BigDecimal loadKw;
-        /** 申报容量 kW */
-        private BigDecimal declaredCapacityKw;
         /** 实际响应容量 kW */
         private BigDecimal actualResponseCapacityKw;
     }

+ 7 - 0
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/service/vo/DrMonitorRecordVO.java

@@ -21,10 +21,17 @@ public class DrMonitorRecordVO {
     private LocalDateTime startTime;
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
+    /** 响应截止时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime declareDeadline;
+
+    /** 邀约范围 */
     private String inviteScope;
+
+    /** 邀约容量 */
     private BigDecimal targetCapacityKw;
+
+    /** 出清容量 */
     private BigDecimal clearedCapacityKw;
     private String remark;
     private String attachmentUrl;

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

@@ -56,10 +56,10 @@ public class DrSubsidyPredictionRequest {
     /** 响应时长(分钟,试算结果) */
     private Integer responseDurationMin;
 
-    /** 偏差率(百分比)= (电网−平台)/申报出清 ×100 */
+    /** 偏差率(百分比)= (1 − 完成率) × 100 */
     private BigDecimal deviationRate;
 
-    /** 完成率(百分比)= 平台实际响应量/申报出清 ×100 */
+    /** 完成率(百分比)= 实际响应容量(电网) / 实际出清 × 100 */
     private BigDecimal completionRate;
 
     /** 价格调整系数(试算结果) */

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

@@ -61,10 +61,10 @@ public class DrSubsidyPredictionVO {
     /** 按完成率匹配得到的价格调整系数。 */
     private BigDecimal priceAdjustmentCoefficient;
 
-    /** 完成率(百分比)= 平台实际响应量 / 申报出清量 × 100(≥0,正常 0~100,超发可 &gt;100) */
+    /** 完成率(百分比)= 实际响应容量(电网) / 实际出清 × 100 */
     private BigDecimal completionRate;
 
-    /** 偏差率(百分比)= (电网实际响应量 − 平台实际响应量) / 申报出清量 × 100(可正可负) */
+    /** 偏差率(百分比)= (1 − 完成率) × 100 */
     private BigDecimal deviationRate;
 
     /** 预估补贴金额(元) */

+ 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;

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

@@ -238,6 +238,7 @@ public final class VppBaselineHelper {
         return VppCapabilityEvalHelper.hasTsdbPowerData(deviceMetricData, POWER_METRICS);
     }
 
+    /*
     public static List<BaselinePointVO> buildMockBaselinePoints(Long siteId,
                                                                 LocalDate responseDate,
                                                                 LocalDateTime responseStartTime) {
@@ -278,6 +279,7 @@ public final class VppBaselineHelper {
         }
         return k;
     }
+    */
 
     public static String formatDate(LocalDate date) {
         return date.format(DATE_FMT);
@@ -359,6 +361,7 @@ public final class VppBaselineHelper {
         return points;
     }
 
+    /*
     public static BigDecimal mockDeclaredCapacityKw(Long siteId,
                                                     LocalDate responseDate,
                                                     LocalDateTime windowStart,
@@ -399,6 +402,7 @@ public final class VppBaselineHelper {
         }
         return mockHistorical;
     }
+    */
 
     private static BigDecimal averageValuesInWindow(Map<String, BigDecimal> valuesByTime,
                                                     LocalDateTime windowStart,
@@ -513,6 +517,7 @@ 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();
@@ -542,4 +547,5 @@ public final class VppBaselineHelper {
         long mixed = seed * 31L + minuteOfDay * 17L + seriesSalt * 13L;
         return (mixed % 1000) / 1000.0;
     }
+    */
 }

+ 5 - 9
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,9 +160,7 @@ public final class VppCapabilityEvalHelper {
         return false;
     }
 
-    /**
-     * 生成当日负荷曲线(每 10 分钟一个点,00:00 ~ 23:50)- 模拟兜底
-     */
+    /*
     public static List<CapabilityLoadPointVO> buildLoadCurve(List<VppResourcePoint> resources,
                                                            List<VppDevice> devices,
                                                            Long siteId,
@@ -212,6 +208,7 @@ public final class VppCapabilityEvalHelper {
         }
         return total.setScale(2, RoundingMode.HALF_UP);
     }
+    */
 
     private static BigDecimal sumBucketPower(Map<String, Map<String, TreeMap<LocalDateTime, BigDecimal>>> deviceData,
                                              List<String> metricCandidates,
@@ -294,6 +291,7 @@ 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;
@@ -301,9 +299,6 @@ public final class VppCapabilityEvalHelper {
         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();
@@ -358,4 +353,5 @@ public final class VppCapabilityEvalHelper {
         long mixed = seed * 31L + minuteOfDay * 17L + seriesSalt * 13L;
         return (mixed % 1000) / 1000.0;
     }
+    */
 }

+ 11 - 9
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppResourceMockHelper.java

@@ -1,21 +1,22 @@
 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() {
     }
 
+    /*
+    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;
+
     public static BigDecimal mockSocPercent(VppResourcePoint resource) {
         if (!"ESS".equalsIgnoreCase(resource.getResourceType())) {
             return null;
@@ -59,4 +60,5 @@ public final class VppResourceMockHelper {
         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;
+        }
+    }
+}

+ 6 - 2
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,6 +74,7 @@ public final class VppResponseMonitorHelper {
         return points;
     }
 
+    /*
     public static List<ResponseLoadPointVO> buildMockCurve(List<VppResourcePoint> resources,
                                                          List<VppDevice> devices,
                                                          Long siteId,
@@ -101,6 +100,7 @@ public final class VppResponseMonitorHelper {
         }
         return points;
     }
+    */
 
     /**
      * 基于预计算的预测基线和今日实际,构建曲线点(替代直接操作 TSDB 原始时序)。
@@ -232,6 +232,7 @@ public final class VppResponseMonitorHelper {
         return row;
     }
 
+    /*
     private static BigDecimal mockAggregate(List<VppResourcePoint> resources,
                                             List<VppDevice> devices,
                                             long seed,
@@ -255,6 +256,7 @@ public final class VppResponseMonitorHelper {
         }
         return total.setScale(2, RoundingMode.HALF_UP);
     }
+    */
 
     private static BigDecimal sumBucketPower(Map<String, Map<String, TreeMap<LocalDateTime, BigDecimal>>> deviceData,
                                              List<String> metricCandidates,
@@ -334,6 +336,7 @@ public final class VppResponseMonitorHelper {
         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;
@@ -373,4 +376,5 @@ public final class VppResponseMonitorHelper {
         }
         return 0.55 - (h - 21) / 3 * 0.15;
     }
+    */
 }