From 48cddd92b0181ac98efa22a973cd07e704627921 Mon Sep 17 00:00:00 2001 From: hzj <826100833@qq.com> Date: Tue, 9 Jun 2026 11:09:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E9=99=8D=E6=8A=A5=E5=91=8A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/EventAdvanceServiceImpl.java | 32 ++++++----- .../impl/EventWaveAnalysisServiceImpl.java | 4 +- .../majornetwork/ReportController.java | 3 +- .../CommMonitorEventReportService.java | 3 +- .../CommMonitorEventReportServiceImpl.java | 54 ++++++++++++++----- 5 files changed, 64 insertions(+), 32 deletions(-) diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/event/service/impl/EventAdvanceServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/event/service/impl/EventAdvanceServiceImpl.java index cb20eab7e..83d8047ba 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/event/service/impl/EventAdvanceServiceImpl.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/event/service/impl/EventAdvanceServiceImpl.java @@ -112,7 +112,6 @@ public class EventAdvanceServiceImpl implements IEventAdvanceService { try { QvvrDLL.INSTANCE.qvvr_fun(typeDataStruct); System.out.println("调用qvvrdll成功-----------"); - if (typeDataStruct.evt_num > 0) { // 全局比较找出最小三相电压特征值 float globalMinVoltage = Float.MAX_VALUE; @@ -127,25 +126,26 @@ public class EventAdvanceServiceImpl implements IEventAdvanceService { } } } - String str = WriteData2File(typeDataStruct); - if (Objects.isNull(wlFilePath)) { - String hdrPath = OssPath.WAVE_DIR + ip+StrUtil.SLASH; - String hdrName = waveName + GeneralConstant.HDR_LOWER; - fileStorageUtil.uploadStreamSpecifyName(new ByteArrayInputStream(str.getBytes()),hdrPath,hdrName); - } else { - // comtrade/00:B7:8D:00:A8:7A/PQMonitor_PQM1_00100_20260204_162453_071_WAV.hdr - String fullPath = wlFilePath + GeneralConstant.HDR_LOWER; - int lastSlashIndex = fullPath.lastIndexOf('/'); - String hdrPath = fullPath.substring(0, lastSlashIndex + 1); - String hdrName = fullPath.substring(lastSlashIndex + 1); - fileStorageUtil.uploadStreamSpecifyName(new ByteArrayInputStream(str.getBytes()),hdrPath,hdrName); - } + //上传HR eventAnalysis.setType(globalFaultType); } else { eventAnalysis.setType(DataFeature.TYPE10); } + String str = WriteData2File(typeDataStruct); + if (Objects.isNull(wlFilePath)) { + String hdrPath = OssPath.WAVE_DIR + ip+StrUtil.SLASH; + String hdrName = waveName + GeneralConstant.HDR_LOWER; + fileStorageUtil.uploadStreamSpecifyName(new ByteArrayInputStream(str.getBytes()),hdrPath,hdrName); + } else { + // comtrade/00:B7:8D:00:A8:7A/PQMonitor_PQM1_00100_20260204_162453_071_WAV.hdr + String fullPath = wlFilePath + GeneralConstant.HDR_LOWER; + int lastSlashIndex = fullPath.lastIndexOf('/'); + String hdrPath = fullPath.substring(0, lastSlashIndex + 1); + String hdrName = fullPath.substring(lastSlashIndex + 1); + fileStorageUtil.uploadStreamSpecifyName(new ByteArrayInputStream(str.getBytes()),hdrPath,hdrName); + } System.out.println("结束qvvrdll方法调用-----------"); } catch (Exception e) { eventAnalysis.setType(DataFeature.TYPE10); @@ -458,6 +458,10 @@ public class EventAdvanceServiceImpl implements IEventAdvanceService { stringBuilder.append(EnumEvt.setEnter(EnumEvt.setClose(2), 2)); } } + if(rect.evt_num==0){ + stringBuilder.append("]"); + + } stringBuilder.append("}"); return stringBuilder.toString(); diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventWaveAnalysisServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventWaveAnalysisServiceImpl.java index d17774ec2..780af4430 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventWaveAnalysisServiceImpl.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventWaveAnalysisServiceImpl.java @@ -176,7 +176,7 @@ public class EventWaveAnalysisServiceImpl implements EventWaveAnalysisService { causeStruct.smp_len = pitchList.size(); causeStruct.smp_rate = (int) wavePitchData.getnOneWaveNum(); - String hdrStr = waveUtils.getFile(OssPath.WAVE_DIR + lineDetailDataVO.getIp() + StrUtil.SLASH + rmpEventDetailPO.getWavePath() + GeneralConstant.HDR); + String hdrStr = waveUtils.getFile(OssPath.WAVE_DIR + lineDetailDataVO.getIp() + StrUtil.SLASH + rmpEventDetailPO.getWavePath() + GeneralConstant.HDR_LOWER); JSONObject jsonObject = JSONObject.fromObject(hdrStr); translateData(jsonObject, rmpEventDetailPO.getStartTime(), entityAdvancedData); @@ -628,7 +628,7 @@ public class EventWaveAnalysisServiceImpl implements EventWaveAnalysisService { entityAdvancedData.backNumber = len; //初始化EntityAdvancedData的BackData数据 - len = (len == 0 ? 1 : len); +// len = (len == 0 ? 1 : len); entityAdvancedData.evt_buf = new BackData[len]; for (int i = 0; i < len; i++) { entityAdvancedData.evt_buf[i] = new BackData(); diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/ReportController.java b/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/ReportController.java index e9d9f2c9e..a251487c2 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/ReportController.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/ReportController.java @@ -40,6 +40,7 @@ import java.io.IOException; import java.text.ParseException; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ExecutionException; /** * @author xxy @@ -237,7 +238,7 @@ public class ReportController extends BaseController { @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/createEventReport") @ApiOperation("暂态事件报告导出") - public void createEventReport(@RequestBody @Validated List index, HttpServletResponse response) throws IOException, InvalidFormatException { + public void createEventReport(@RequestBody @Validated List index, HttpServletResponse response) throws IOException, InvalidFormatException, ExecutionException, InterruptedException { commMonitorEventReportService.createEventReport(index,response); } } diff --git a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java index b67218667..b34852612 100644 --- a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java +++ b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java @@ -9,6 +9,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; /** * pqs @@ -25,7 +26,7 @@ public interface CommMonitorEventReportService { * 暂态事件报告 * @param index */ - void createEventReport(List index, HttpServletResponse response) throws IOException, InvalidFormatException; + void createEventReport(List index, HttpServletResponse response) throws IOException, InvalidFormatException, ExecutionException, InterruptedException; /** * 暂态事件报告存储,返回文件路径 diff --git a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java index fa3b35d12..b1045b348 100644 --- a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java +++ b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java @@ -48,6 +48,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; @@ -60,6 +61,7 @@ import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -86,7 +88,8 @@ public class CommMonitorEventReportServiceImpl implements CommMonitorEventReport private final FileStorageUtil fileStorageUtil; private final LineFeignClient lineFeignClient; private final EventCauseFeignClient eventCauseFeignClient; - + @Resource(name="asyncExecutor") + private Executor executor; /** * 监测点导出word @@ -600,8 +603,10 @@ public class CommMonitorEventReportServiceImpl implements CommMonitorEventReport /** * 生成暂降事件报告 */ - public void createEventReport(List eventIndex, HttpServletResponse response) throws IOException, InvalidFormatException { + @Override + public void createEventReport(List eventIndex, HttpServletResponse response) throws IOException, InvalidFormatException, ExecutionException, InterruptedException { WordUtil wordUtil = new WordUtil(); + // 创建专用的线程池(建议大小为CPU核心数或稍大,这里设为3个并行任务) for (String index : eventIndex) { RmpEventDetailPO detail = rmpEventDetailMapper.selectById(index); List lineDetail = lineFeignClient.getBaseLineAreaInfo(Stream.of(detail.getLineId()).collect(Collectors.toList())).getData(); @@ -612,18 +617,42 @@ public class CommMonitorEventReportServiceImpl implements CommMonitorEventReport if (ObjUtil.isNull(waveData)) { throw new BusinessException(CommonResponseEnum.FAIL, "没有波形数据"); } else { - //获取瞬时波形 - String instantPath = wavePicComponent.generateImageShun(waveData, waveDataDetails); - InputStream instantStream = fileStorageUtil.getFileStream(instantPath); - String imageShun64 = cn.hutool.core.codec.Base64.encode(instantStream); + // 使用 CompletableFuture 并行执行三个耗时操作 + CompletableFuture instantFuture = CompletableFuture.supplyAsync(() -> { + String instantPath = wavePicComponent.generateImageShun(waveData, waveDataDetails); + try (InputStream instantStream = fileStorageUtil.getFileStream(instantPath)) { + return cn.hutool.core.codec.Base64.encode(instantStream); + } catch (Exception e) { + throw new RuntimeException("生成瞬时波形失败", e); + } + }, executor); + CompletableFuture rmsFuture = CompletableFuture.supplyAsync(() -> { + String rmsPath = wavePicComponent.generateImageRms(waveData, waveDataDetails); + try (InputStream rmsStream = fileStorageUtil.getFileStream(rmsPath)) { + return cn.hutool.core.codec.Base64.encode(rmsStream); + } catch (Exception e) { + throw new RuntimeException("生成RMS波形失败", e); + } + }, executor); + + CompletableFuture> eigFuture = CompletableFuture.supplyAsync(() -> + waveService.eventDetailEigenvalue(index, line.getPtType()), executor + ); + + // 等待所有异步任务完成并获取结果(无超时,但可加) + CompletableFuture allFutures = CompletableFuture.allOf(instantFuture, rmsFuture, eigFuture); + allFutures.join(); // 阻塞直到三个任务都完成 + + // 获取结果(此时所有任务已完成,get()不会阻塞) + String imageShun64 = instantFuture.get(); + String rmsShun64 = rmsFuture.get(); + List eventDetailEigenvalue = eigFuture.get(); + // 主线程顺序调用 WordUtil 方法(保证线程安全) wordUtil.translateShun(index, imageShun64); - //获取rms波形 - String rmsPath = wavePicComponent.generateImageRms(waveData, waveDataDetails); - InputStream rmsStream = fileStorageUtil.getFileStream(rmsPath); - String rmsShun64 = cn.hutool.core.codec.Base64.encode(rmsStream); wordUtil.translateRms(index, rmsShun64); - + wordUtil.setEventDetailEigenvalue(index, eventDetailEigenvalue); + // 设置事件基本信息(不涉及耗时操作) EventInfoDetailVO eventInfoList = new EventInfoDetailVO(); eventInfoList.setLineName(line.getLineName()); eventInfoList.setGdName(line.getGdName()); @@ -637,9 +666,6 @@ public class CommMonitorEventReportServiceImpl implements CommMonitorEventReport eventInfoList.setMs(detail.getFirstMs()); eventInfoList.setEventValue(detail.getFeatureAmplitude()); wordUtil.setEventInfoList(index, eventInfoList); - List eventDetailEigenvalue = waveService.eventDetailEigenvalue(index,line.getPtType()); - wordUtil.setEventDetailEigenvalue(index, eventDetailEigenvalue); - } } wordUtil.createReport(eventIndex);