|
|
@@ -1,12 +1,13 @@
|
|
|
package com.hdkj.lt.bf.listener;
|
|
|
|
|
|
-import com.hdkj.hussar.ApiResponse;
|
|
|
-import com.hdkj.lt.bf.adapter.SiReconClient;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.hdkj.lt.bf.entity.FhzgSeCurrentEvent;
|
|
|
import com.hdkj.lt.bf.entity.FhzgSeVoltageEvent;
|
|
|
import com.hdkj.lt.bf.event.ReconTriggerEvent;
|
|
|
import com.hdkj.lt.bf.mapper.FhzgSeCurrentEventMapper;
|
|
|
import com.hdkj.lt.bf.mapper.FhzgSeVoltageEventMapper;
|
|
|
+import com.hdkj.lt.feign.IReconApiClient;
|
|
|
+import com.hdkj.lt.modle.vo.recon.ReconstructionParam;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
@@ -21,7 +22,7 @@ import java.util.Map;
|
|
|
* 重构算法触发监听器
|
|
|
* <p>
|
|
|
* 当线路重过载/电压越限告警持续1小时触发时,异步调用同事编写的重构接口。
|
|
|
- * 通过 Feign 客户端 SiReconClient 调用 SI 模块的 POST /recon/trigger。
|
|
|
+ * 通过 Feign 客户端 IReconApiClient 调用 SI 模块的 POST /recon/trigger。
|
|
|
* <p>
|
|
|
* 调用过程中同步更新告警事件的 reconStatus:
|
|
|
* <ul>
|
|
|
@@ -39,48 +40,38 @@ import java.util.Map;
|
|
|
@RequiredArgsConstructor
|
|
|
public class ReconTriggerListener {
|
|
|
|
|
|
- private final SiReconClient siReconClient;
|
|
|
+ private final IReconApiClient reconApiClient;
|
|
|
private final FhzgSeCurrentEventMapper currentEventMapper;
|
|
|
private final FhzgSeVoltageEventMapper voltageEventMapper;
|
|
|
|
|
|
private static final DateTimeFormatter DT_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
- /** 重构状态常量 */
|
|
|
- private static final int RECON_PENDING = 0; // 未触发
|
|
|
- private static final int RECON_RUNNING = 1; // 生成中
|
|
|
- private static final int RECON_COMPLETED = 2; // 有方案
|
|
|
- private static final int RECON_NO_PLAN = 3; // 无方案
|
|
|
- private static final int RECON_FAILED = -1; // 调用失败
|
|
|
+ private static final int RECON_RUNNING = 1;
|
|
|
+ private static final int RECON_COMPLETED = 2;
|
|
|
+ private static final int RECON_NO_PLAN = 3;
|
|
|
+ private static final int RECON_FAILED = -1;
|
|
|
|
|
|
- /**
|
|
|
- * 异步监听:告警持续1h → 触发重构算法
|
|
|
- */
|
|
|
@Async
|
|
|
@EventListener
|
|
|
public void onReconTrigger(ReconTriggerEvent event) {
|
|
|
- // 1. 标记为"生成中"
|
|
|
updateReconStatus(event.getEventId(), event.getAlarmType(), RECON_RUNNING);
|
|
|
|
|
|
- // 2. 构造请求参数
|
|
|
Map<String, Object> params = new HashMap<>();
|
|
|
params.put("feeder_id", event.getFeederId());
|
|
|
params.put("point_time", event.getPointTime() != null
|
|
|
? event.getPointTime().format(DT_FMT) : null);
|
|
|
|
|
|
- Map<String, Object> request = new HashMap<>();
|
|
|
- request.put("eventId", String.valueOf(event.getEventId()));
|
|
|
- request.put("params", params);
|
|
|
+ ReconstructionParam param = new ReconstructionParam();
|
|
|
+ param.setEventId(String.valueOf(event.getEventId()));
|
|
|
+ param.setParams(params);
|
|
|
|
|
|
- log.info("重构触发: eventId={}, feederId={}, alarmType={}, pointTime={}, request={}",
|
|
|
- event.getEventId(), event.getFeederId(), event.getAlarmType(),
|
|
|
- event.getPointTime(), request);
|
|
|
+ log.info("重构触发: eventId={}, feederId={}, alarmType={}, pointTime={}",
|
|
|
+ event.getEventId(), event.getFeederId(), event.getAlarmType(), event.getPointTime());
|
|
|
|
|
|
- // 3. Feign 调用同事接口
|
|
|
try {
|
|
|
- ApiResponse<Map> resp = siReconClient.triggerRecon(request);
|
|
|
+ String resp = reconApiClient.triggerReconfiguration(param);
|
|
|
log.info("重构接口调用成功: eventId={}, response={}", event.getEventId(), resp);
|
|
|
|
|
|
- // 4. 解析响应判断是否有方案
|
|
|
int status = parseReconResponse(resp);
|
|
|
updateReconStatus(event.getEventId(), event.getAlarmType(), status);
|
|
|
} catch (Exception e) {
|
|
|
@@ -90,32 +81,26 @@ public class ReconTriggerListener {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 解析同事重构接口响应,判断是否有方案
|
|
|
- */
|
|
|
- private int parseReconResponse(ApiResponse<Map> resp) {
|
|
|
- if (resp == null || !resp.isSuccess()) {
|
|
|
- return RECON_FAILED;
|
|
|
- }
|
|
|
- Map data = resp.getData();
|
|
|
- if (data != null) {
|
|
|
- Object success = data.get("success");
|
|
|
- if (Boolean.TRUE.equals(success)) {
|
|
|
- return RECON_COMPLETED;
|
|
|
- } else if (Boolean.FALSE.equals(success)) {
|
|
|
- return RECON_NO_PLAN;
|
|
|
+ private int parseReconResponse(String response) {
|
|
|
+ if (response == null || response.isEmpty()) return RECON_FAILED;
|
|
|
+ try {
|
|
|
+ JSONObject root = com.alibaba.fastjson.JSON.parseObject(response);
|
|
|
+ String status = root.getString("status");
|
|
|
+ if ("200".equals(status) || "success".equalsIgnoreCase(status)) {
|
|
|
+ Object data = root.get("data");
|
|
|
+ if (data instanceof JSONObject) {
|
|
|
+ Boolean success = ((JSONObject) data).getBoolean("success");
|
|
|
+ return Boolean.TRUE.equals(success) ? RECON_COMPLETED : RECON_NO_PLAN;
|
|
|
+ }
|
|
|
}
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("解析重构接口响应失败: {}", e.getMessage());
|
|
|
}
|
|
|
- // 调通了但没有明确的 success 标记,保守返回"有方案"
|
|
|
return RECON_COMPLETED;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 根据 alarmType 前缀更新对应告警事件的 reconStatus
|
|
|
- */
|
|
|
private void updateReconStatus(Long eventId, String alarmType, int reconStatus) {
|
|
|
if (eventId == null) return;
|
|
|
-
|
|
|
try {
|
|
|
if (alarmType != null && alarmType.startsWith("current_")) {
|
|
|
FhzgSeCurrentEvent update = new FhzgSeCurrentEvent();
|