liuaini 3 giorni fa
parent
commit
e52a74b23a

+ 17 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/controller/optimization/IndicatorController.java

@@ -9,6 +9,7 @@ import com.hdkj.lt.bf.entity.dto.SeOverloadAlarmListReq;
 import com.hdkj.lt.bf.entity.dto.SeVoltageAlarmListReq;
 import com.hdkj.lt.bf.entity.vo.PageResult;
 import com.hdkj.lt.bf.entity.vo.SeCapacityDashboardVO;
+import com.hdkj.lt.bf.entity.vo.SeLineLossVO;
 import com.hdkj.lt.bf.entity.vo.FeederSelectVO;
 import com.hdkj.lt.bf.entity.vo.SeAlarmDetailVO;
 import com.hdkj.lt.bf.entity.vo.SeAlarmListVO;
@@ -104,6 +105,22 @@ public class IndicatorController extends BaseController {
         return ApiResponse.success(seIndicatorService.queryCapacity(id, Integer.parseInt(type), timeScope));
     }
 
+    /**
+     * 线损电量(独立接口,从供电能力拆出;today/month/year)
+     *
+     * @param params {id, type(2/3/4), timeScope(today/month/year)}
+     */
+    @PostMapping("/line-loss")
+    public ApiResponse<SeLineLossVO> lineLoss(@RequestBody Map<String, String> params) {
+        String id = params.get("id");
+        String type = params.get("type");
+        String timeScope = params.get("timeScope");
+        if (id == null || type == null || timeScope == null) {
+            return ApiResponse.fail("参数缺失");
+        }
+        return ApiResponse.success(seIndicatorService.queryLineLoss(id, Integer.parseInt(type), timeScope));
+    }
+
     /**
      * 异常告警-线路重过载列表
      */

+ 0 - 4
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/vo/SeCapacityDashboardVO.java

@@ -56,10 +56,6 @@ public class SeCapacityDashboardVO implements Serializable {
     @ApiModelProperty(value = "总事件次数")
     private Integer totalEventCount;
 
-    @ApiModelProperty(value = "线路损耗电量(kWh)")
-    @JsonSerialize(using = BigDecimalSerializer.StripTrailingZerosSerializer.class)
-    private BigDecimal lineLossKwh;
-
     // ============================================================
     // 今日馈线96点时序(仅馈线type=4+today时返回)
     // ============================================================

+ 36 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/vo/SeLineLossVO.java

@@ -0,0 +1,36 @@
+package com.hdkj.lt.bf.entity.vo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.hdkj.lt.base.serializer.BigDecimalSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 线损电量 VO(独立接口,从供电能力拆出)
+ * <p>
+ * 供电能力 /indicator/capacity 只返回负载率/重过载,线损单独 /indicator/line-loss 查询,
+ * 避免线损明细聚合拖慢主接口。
+ *
+ * @author lsl
+ * @since 2026-08
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel(description = "线损电量")
+public class SeLineLossVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "线路损耗电量(kWh)")
+    @JsonSerialize(using = BigDecimalSerializer.StripTrailingZerosSerializer.class)
+    private BigDecimal lineLossKwh;
+}

+ 10 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/SeIndicatorService.java

@@ -1,6 +1,7 @@
 package com.hdkj.lt.bf.service;
 
 import com.hdkj.lt.bf.entity.vo.SeCapacityDashboardVO;
+import com.hdkj.lt.bf.entity.vo.SeLineLossVO;
 import com.hdkj.lt.bf.entity.vo.SeOutageDashboardVO;
 import com.hdkj.lt.bf.entity.vo.SeVoltageDashboardVO;
 import com.hdkj.lt.bf.entity.vo.SeVoltageIndexVO;
@@ -47,4 +48,13 @@ public interface SeIndicatorService {
      * @param timeScope today/month/year
      */
     SeCapacityDashboardVO queryCapacity(String id, Integer type, String timeScope);
+
+    /**
+     * 线损电量(独立接口,从供电能力拆出)
+     *
+     * @param id       节点ID
+     * @param type     节点类型 2=区县 3=变电站 4=馈线
+     * @param timeScope today/month/year
+     */
+    SeLineLossVO queryLineLoss(String id, Integer type, String timeScope);
 }

+ 41 - 14
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/SeIndicatorServiceImpl.java

@@ -14,6 +14,7 @@ import com.hdkj.lt.bf.entity.FhzgSeConsumerCountDaily;
 import com.hdkj.lt.bf.entity.FhzgSeConsumerRelation;
 import com.hdkj.lt.bf.entity.dto.TodayOutageData;
 import com.hdkj.lt.bf.entity.vo.SeCapacityDashboardVO;
+import com.hdkj.lt.bf.entity.vo.SeLineLossVO;
 import com.hdkj.lt.bf.entity.vo.SeOutageDashboardVO;
 import com.hdkj.lt.bf.entity.vo.SeVoltageDashboardVO;
 import com.hdkj.lt.bf.entity.vo.SeVoltageIndexVO;
@@ -456,9 +457,6 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
             vo.setOverloadRate(BigDecimal.ZERO);
         }
 
-        // 3. 线损电量:从明细表聚合(今日未刷日汇总,用明细实时算)
-        vo.setLineLossKwh(queryLineLossKwhFromDetail(id, type, startTime, endTime));
-
         return vo;
     }
 
@@ -485,7 +483,6 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
         int histDays = 0;
         long sumHeavy = 0;
         long sumOverload = 0;
-        BigDecimal histLineLossKwh = BigDecimal.ZERO;
 
         if (!endDate.isBefore(startDate)) {
             LambdaQueryWrapper<FhzgSeCapacityDaily> wrapper = new LambdaQueryWrapper<FhzgSeCapacityDaily>()
@@ -507,17 +504,14 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
                 if (d.getHeavyCount() != null) sumHeavy += d.getHeavyCount();
                 if (d.getOverloadCount() != null) sumOverload += d.getOverloadCount();
             }
-            // 线损电量(历史部分)
-            histLineLossKwh = queryLineLossKwhFromDaily(id, type, startDate, endDate);
         }
 
-        // 今日部分实时聚合(断面明细 + 事件表 + 线损明细
+        // 今日部分实时聚合(断面明细 + 事件表)
         SeCapacityDashboardVO todayVo = queryCapacityToday(id, type);
         BigDecimal todayMaxLoadRate = todayVo != null ? todayVo.getMaxLoadRate() : null;
         BigDecimal todayAvgLoadRate = todayVo != null ? todayVo.getAvgLoadRate() : null;
         int todayHeavy = todayVo != null ? todayVo.getHeavyLoadEventCount() : 0;
         int todayOverload = todayVo != null ? todayVo.getOverloadEventCount() : 0;
-        BigDecimal todayLineLoss = todayVo != null ? todayVo.getLineLossKwh() : null;
 
         // 合并
         BigDecimal maxLoadRate = histMaxLoadRate;
@@ -541,18 +535,12 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
         long totalOverload = sumOverload + todayOverload;
         long totalEvents = totalHeavy + totalOverload;
 
-        BigDecimal lineLossKwh = histLineLossKwh;
-        if (todayLineLoss != null) {
-            lineLossKwh = lineLossKwh.add(todayLineLoss);
-        }
-
         SeCapacityDashboardVO vo = SeCapacityDashboardVO.builder()
                 .maxLoadRate(maxLoadRate)
                 .avgLoadRate(avgLoadRate)
                 .heavyLoadEventCount((int) totalHeavy)
                 .overloadEventCount((int) totalOverload)
                 .totalEventCount((int) totalEvents)
-                .lineLossKwh(lineLossKwh)
                 .build();
         if (totalEvents > 0) {
             vo.setHeavyLoadRate(new BigDecimal(totalHeavy * 100)
@@ -567,6 +555,45 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
         return vo;
     }
 
+    /**
+     * 线损电量(独立接口,从供电能力拆出):
+     * today → 明细表实时 SUM;
+     * month/year → 历史查日汇总表 [startDate, yesterday] + 今日明细实时补。
+     */
+    @Override
+    public SeLineLossVO queryLineLoss(String id, Integer type, String timeScope) {
+        if (StringUtils.isBlank(id) || type == null || StringUtils.isBlank(timeScope)) {
+            return null;
+        }
+
+        BigDecimal lineLossKwh;
+        if ("today".equalsIgnoreCase(timeScope)) {
+            lineLossKwh = queryLineLossKwhFromDetail(id, type,
+                    LocalDate.now().atStartOfDay(), LocalDateTime.now());
+        } else {
+            // month/year:历史(日汇总 T+1,只到昨天)+ 今日(明细实时)
+            LocalDate today = LocalDate.now();
+            LocalDate startDate;
+            LocalDate endDate = today.minusDays(1);
+            if ("month".equalsIgnoreCase(timeScope)) {
+                startDate = today.withDayOfMonth(1);
+            } else {
+                startDate = LocalDate.of(today.getYear(), 1, 1);
+            }
+            BigDecimal histKwh = BigDecimal.ZERO;
+            if (!endDate.isBefore(startDate)) {
+                histKwh = queryLineLossKwhFromDaily(id, type, startDate, endDate);
+            }
+            BigDecimal todayKwh = queryLineLossKwhFromDetail(id, type,
+                    today.atStartOfDay(), LocalDateTime.now());
+            lineLossKwh = histKwh.add(todayKwh);
+        }
+
+        return SeLineLossVO.builder()
+                .lineLossKwh(lineLossKwh.setScale(2, RoundingMode.HALF_UP))
+                .build();
+    }
+
     /**
      * 构建馈线今日96点时序(负载率+电流+电压+有功+无功)
      */