From c2c3fd9fd6102c752092c9a5746e140cb90e492c Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Mon, 6 Mar 2023 16:03:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=9B=86=E6=88=90=E5=8D=8E?= =?UTF-8?q?=E4=B8=BAobs=E6=9F=A5=E7=9C=8B=E6=B3=A2=E5=BD=A2=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/njcn/common/config/GeneralInfo.java | 9 + .../common/pojo/constant/GeneralConstant.java | 24 + .../njcn/common/pojo/constant/OssPath.java | 26 + .../enums/response/CommonResponseEnum.java | 1 + .../TransientStasticDataController.java | 54 - .../majornetwork/TransientPmsService.java | 21 - .../impl/TransientPmsServiceImpl.java | 144 -- .../njcn/event/enums/EventResponseEnum.java | 3 + .../njcn/event}/pojo/dto/wave/AnalogDTO.java | 2 +- .../event}/pojo/dto/wave/ComtradeCfgDTO.java | 10 +- .../njcn/event}/pojo/dto/wave/DigitalDTO.java | 2 +- .../event}/pojo/dto/wave/EigenvalueDTO.java | 3 +- .../event}/pojo/dto/wave/MutationDTO.java | 2 +- .../njcn/event}/pojo/dto/wave/RateDTO.java | 2 +- .../event}/pojo/dto/wave/SamplingDTO.java | 2 +- .../event}/pojo/dto/wave/SamplingsDTO.java | 2 +- .../event}/pojo/dto/wave/WaveDataDTO.java | 2 +- .../java/com/njcn/event/pojo/po/WavePath.java | 21 - pqs-event/event-boot/pom.xml | 12 + .../majornetwork/MonitorPointController.java | 19 - .../majornetwork/TransientController.java | 2 +- .../majornetwork/EventAnalysisService.java | 9 +- .../Impl/EventAnalysisServiceImpl.java | 52 +- .../Impl/EventDetailServiceImpl.java | 2 +- .../Impl/TransientServiceImpl.java | 102 +- .../majornetwork/TransientService.java | 2 +- .../com/njcn/event/utils/BitConverter.java | 81 ++ .../java/com/njcn/event/utils/WaveUtil.java | 1164 +++++++++-------- .../src/main/resources/bootstrap.yml | 1 + .../njcn/event/EventBootApplicationTest.java | 80 +- pqs-harmonic/harmonic-boot/pom.xml | 7 + pqs-job/job-executor/src/test/java/Test1.java | 2 +- 32 files changed, 938 insertions(+), 927 deletions(-) create mode 100644 pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/GeneralConstant.java create mode 100644 pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/OssPath.java delete mode 100644 pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/controller/majornetwork/TransientStasticDataController.java delete mode 100644 pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/TransientPmsService.java delete mode 100644 pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/TransientPmsServiceImpl.java rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/AnalogDTO.java (96%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/ComtradeCfgDTO.java (88%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/DigitalDTO.java (93%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/EigenvalueDTO.java (90%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/MutationDTO.java (94%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/RateDTO.java (91%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/SamplingDTO.java (95%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/SamplingsDTO.java (92%) rename {pqs-common/common-core/src/main/java/com/njcn/common => pqs-event/event-api/src/main/java/com/njcn/event}/pojo/dto/wave/WaveDataDTO.java (95%) delete mode 100644 pqs-event/event-api/src/main/java/com/njcn/event/pojo/po/WavePath.java create mode 100644 pqs-event/event-boot/src/main/java/com/njcn/event/utils/BitConverter.java rename pqs-common/common-core/src/main/java/com/njcn/common/utils/wave/AnalyWave.java => pqs-event/event-boot/src/main/java/com/njcn/event/utils/WaveUtil.java (57%) diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/config/GeneralInfo.java b/pqs-common/common-core/src/main/java/com/njcn/common/config/GeneralInfo.java index b962b65a5..56f6bea43 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/config/GeneralInfo.java +++ b/pqs-common/common-core/src/main/java/com/njcn/common/config/GeneralInfo.java @@ -36,4 +36,13 @@ public class GeneralInfo { @Value("${business.tempPath}") private String businessTempPath; + /*** + * 文件存储方式 + * 1:本地磁盘 + * 2:华为obs + * 3: minioss + */ + @Value("${business.file.storage}") + private int businessFileStorage; + } diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/GeneralConstant.java b/pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/GeneralConstant.java new file mode 100644 index 000000000..f3501bc3f --- /dev/null +++ b/pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/GeneralConstant.java @@ -0,0 +1,24 @@ +package com.njcn.common.pojo.constant; + +/** + * @author hongawen + * @version 1.0.0 + * @date 2023年03月06日 11:07 + */ +public interface GeneralConstant { + + /*** + * 文件存储的3种方式 + */ + Integer LOCAL_DISK = 1; + Integer HUAWEI_OBS = 2; + Integer MINIO_OSS = 3; + + /*** + * 波形文件的3种后缀 + */ + String CFG =".CFG"; + String DAT =".DAT"; + String HDR =".HDR"; + +} diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/OssPath.java b/pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/OssPath.java new file mode 100644 index 000000000..eaddd037f --- /dev/null +++ b/pqs-common/common-core/src/main/java/com/njcn/common/pojo/constant/OssPath.java @@ -0,0 +1,26 @@ +package com.njcn.common.pojo.constant; + +/** + * @author hongawen + * @version 1.0.0 + * @date 2023年03月03日 16:29 + */ +public interface OssPath { + + /*** + * 波形文件 + */ + String WAVE_DIR="comtrade/"; + + /*** + * 稳态报表 + */ + String HARMONIC_EXCEL_REPORT="harmonic/excel/report"; + + /*** + * 稳态报表模板 + */ + String HARMONIC_EXCEL_TEMPLATE="harmonic/excel/template"; + + +} diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/enums/response/CommonResponseEnum.java b/pqs-common/common-core/src/main/java/com/njcn/common/pojo/enums/response/CommonResponseEnum.java index 65e744d85..c76a2c16c 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/enums/response/CommonResponseEnum.java +++ b/pqs-common/common-core/src/main/java/com/njcn/common/pojo/enums/response/CommonResponseEnum.java @@ -91,6 +91,7 @@ public enum CommonResponseEnum { ID_NOT_EXIST("A0100", "id不存在"), TIME_ERROR("A0101","时间格式有误"), + CLOSE_RESOURCE_ERROR("A0102","关闭资源有误"), ; diff --git a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/controller/majornetwork/TransientStasticDataController.java b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/controller/majornetwork/TransientStasticDataController.java deleted file mode 100644 index c4bc3f45e..000000000 --- a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/controller/majornetwork/TransientStasticDataController.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.njcn.device.pms.controller.majornetwork; - - -import com.njcn.common.pojo.annotation.OperateInfo; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; -import com.njcn.common.pojo.enums.common.LogEnum; -import com.njcn.common.pojo.enums.response.CommonResponseEnum; -import com.njcn.common.pojo.response.HttpResult; -import com.njcn.common.utils.HttpResultUtil; -import com.njcn.device.pms.service.majornetwork.TransientPmsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import com.njcn.web.controller.BaseController; - -/** - * 暂态事件列表(PMS暂用) - * @author hongawen - * @since 2022-10-14 - */ -@Validated -@Slf4j -@RestController -@RequestMapping("/pms/transientStasticData") -@Api(tags = "暂态事件列表(PMS暂用)") -@AllArgsConstructor -public class TransientStasticDataController extends BaseController { - - private final TransientPmsService transientPmsService; - - @OperateInfo(info = LogEnum.BUSINESS_COMMON) - @PostMapping("/getTransientAnalyseWavePms") - @ApiOperation("暂态事件波形分析") - @ApiImplicitParams({ - @ApiImplicitParam(name = "timeId", value = "暂态时刻", required = true), - @ApiImplicitParam(name = "lineId", value = "暂态监测点Id", required = true), - @ApiImplicitParam(name = "lineType", value = "暂态监测点类型(1主网 2配网)", required = true) - }) - public HttpResult getTransientAnalyseWavePms(@RequestParam("timeId") String timeId, @RequestParam("lineId") String lineId, @RequestParam("lineType") Integer lineType){ - String methodDescribe = getMethodDescribe("getTransientAnalyseWavePms"); - WaveDataDTO wave = transientPmsService.getTransientAnalyseWavePms(timeId, lineId,lineType); - return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, wave, methodDescribe); - } -} - diff --git a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/TransientPmsService.java b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/TransientPmsService.java deleted file mode 100644 index 7dc9ff7d2..000000000 --- a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/TransientPmsService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.njcn.device.pms.service.majornetwork; - -import com.njcn.common.pojo.dto.wave.WaveDataDTO; - -/** - * TransientPmsService - * - * @author qijian - * @version 1.0.0 - * @createTime 2022/12/14 - 15:09 - */ -public interface TransientPmsService { - /** - * 功能描述: 暂态事件波形分析 - * @param timeId - * @param lineId - * @param lineType - * @return - */ - WaveDataDTO getTransientAnalyseWavePms(String timeId, String lineId, Integer lineType); -} diff --git a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/TransientPmsServiceImpl.java b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/TransientPmsServiceImpl.java deleted file mode 100644 index 5482a5786..000000000 --- a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/TransientPmsServiceImpl.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.njcn.device.pms.service.majornetwork.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.njcn.common.config.GeneralInfo; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; -import com.njcn.common.pojo.enums.common.ServerEnum; -import com.njcn.common.pojo.exception.BusinessException; -import com.njcn.common.pojo.response.HttpResult; -import com.njcn.common.utils.PubUtils; -import com.njcn.common.utils.wave.AnalyWave; -import com.njcn.device.pms.api.DistributionMonitorClient; -import com.njcn.device.pms.api.MonitorClient; -import com.njcn.device.pms.mapper.majornetwork.DistributionMonitorMapper; -import com.njcn.device.pms.mapper.majornetwork.MonitorMapper; -import com.njcn.device.pms.mapper.majornetwork.TerminalMapper; -import com.njcn.device.pms.pojo.po.DistributionMonitor; -import com.njcn.device.pms.pojo.po.Monitor; -import com.njcn.device.pms.pojo.po.PmsTerminal; -import com.njcn.device.pms.service.majornetwork.EventDetailPmsService; -import com.njcn.device.pms.service.majornetwork.IMonitorService; -import com.njcn.device.pms.service.majornetwork.TransientPmsService; -import com.njcn.device.pq.api.GeneralDeviceInfoClient; -import com.njcn.device.pq.api.LineFeignClient; -import com.njcn.device.pq.enums.DeviceResponseEnum; -import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO; -import com.njcn.device.pq.pojo.vo.AreaLineInfoVO; -import com.njcn.device.pq.pojo.vo.LineDetailDataVO; -import com.njcn.event.enums.EventResponseEnum; -import com.njcn.event.pojo.param.TransientParam; -import com.njcn.event.pojo.param.WaveFileParam; -import com.njcn.event.pojo.po.EventDetail; -import com.njcn.event.pojo.po.EventDetailNew; -import com.njcn.event.pojo.vo.TransientVO; -import com.njcn.influxdb.mapper.InfluxDBResultMapperCn; -import com.njcn.influxdb.param.InfluxDBPublicParam; -import com.njcn.influxdb.utils.InfluxDBCommUtils; -import com.njcn.influxdb.utils.InfluxDbUtils; -import com.njcn.system.api.DicDataFeignClient; -import com.njcn.system.enums.DicDataTypeEnum; -import com.njcn.system.pojo.po.DictData; -import lombok.AllArgsConstructor; -import org.influxdb.dto.QueryResult; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * @author: chenchao - * @date: 2022/03/29 14:37 - * @Description: <描述> - */ -@Service -@AllArgsConstructor -public class TransientPmsServiceImpl implements TransientPmsService { - - private final GeneralDeviceInfoClient generalDeviceInfoClient; - - private final DicDataFeignClient dicDataFeignClient; - - private final EventDetailPmsService eventDetailPmsService; - - private final GeneralInfo generalInfo; - - private final DistributionMonitorMapper distributionMonitorMapper; - - private final MonitorMapper monitorMapper; - - private final TerminalMapper terminalMapper; - - @Override - public WaveDataDTO getTransientAnalyseWavePms(String timeId, String lineId,Integer lineType) { - //初始化 - WaveDataDTO waveDataDTO; - PmsTerminal pmsTerminal; - DictData dictData; - String ip = null; - String ptTypeName = null; - Float pt1 = null; - Float pt2 = null; - Float ct1 = null; - Float ct2 = null; - - //根据监测点id获取信息(1主网 2配网) - if (lineType == 1){ - Monitor monitor = monitorMapper.selectById(lineId); - //获取ip - pmsTerminal = terminalMapper.selectById(monitor.getTerminalId()); - ip = pmsTerminal.getIp(); - //获取接线方式 - dictData = dicDataFeignClient.getDicDataById(monitor.getTerminalWiringMethod()).getData(); - ptTypeName = dictData.getName(); - //获取pt、ct - pt1 = monitor.getPt1(); - pt2 = monitor.getPt1(); - ct1 = monitor.getCt1(); - ct2 = monitor.getCt2(); - }else{ - DistributionMonitor distributionMonitor = distributionMonitorMapper.selectById(lineId); - //获取ip - pmsTerminal = terminalMapper.selectById(distributionMonitor.getTerminalId()); - ip = pmsTerminal.getIp(); - //获取接线方式 - dictData = dicDataFeignClient.getDicDataById(distributionMonitor.getTerminalWiringMethod()).getData(); - ptTypeName = dictData.getName(); - //获取pt、ct - pt1 = distributionMonitor.getPt1(); - pt2 = distributionMonitor.getPt1(); - ct1 = distributionMonitor.getCt1(); - ct2 = distributionMonitor.getCt2(); - } - - EventDetail eventDetailByTime = eventDetailPmsService.getEventDetailByTime(lineId, timeId); - String waveName = eventDetailByTime.getWaveName(); - - AnalyWave analyWave = new AnalyWave(); - WaveDataDTO comtrade = analyWave.getComtrade(generalInfo.getBusinessWavePath() + File.separator + ip + File.separator + waveName + ".CFG", 1); - if (Objects.isNull(comtrade.getComtradeCfgDTO())) { - throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); - } - waveDataDTO = analyWave.getValidData(comtrade); - waveDataDTO.setPtType(PubUtils.ptTypeName(ptTypeName)); - waveDataDTO.setPt((double) (pt1 / pt2)); - waveDataDTO.setCt((double) (ct1 / ct2)); - return waveDataDTO; - } - -} diff --git a/pqs-event/event-api/src/main/java/com/njcn/event/enums/EventResponseEnum.java b/pqs-event/event-api/src/main/java/com/njcn/event/enums/EventResponseEnum.java index a4e1dda2e..a8577149a 100644 --- a/pqs-event/event-api/src/main/java/com/njcn/event/enums/EventResponseEnum.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/enums/EventResponseEnum.java @@ -17,6 +17,9 @@ public enum EventResponseEnum { EVENT_COMMON_ERROR("A00650","暂降模块异常"), EVENT_NOT_FOUND("A00651","暂降事件或监测点不存在"), ANALYSEWAVE_NOT_FOUND("A00652","波形文件找不到"), + WAVE_DATA_INVALID("A00654","波形文件数据缺失"), + DAT_DATA_ERROR("A00653","dat文件数据读取失败"), + RMS_DATA_ERROR("A00653","rms数据读取失败"), /** diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/AnalogDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/AnalogDTO.java similarity index 96% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/AnalogDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/AnalogDTO.java index 07ea390f7..e135eb0ae 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/AnalogDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/AnalogDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/ComtradeCfgDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/ComtradeCfgDTO.java similarity index 88% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/ComtradeCfgDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/ComtradeCfgDTO.java index 1d9a21f5a..d583823b5 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/ComtradeCfgDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/ComtradeCfgDTO.java @@ -1,6 +1,5 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; -import cn.hutool.core.date.DateTime; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -41,6 +40,11 @@ public class ComtradeCfgDTO implements Serializable { // 最终采样率,计算的时候只用一个采样率 private Long finalSampleRate; // 整个波形大小 - private Long nAllWaveNum = 0l; + private Long nAllWaveNum = 0L; + + /*** + * 赋值编码格式(二进制) + */ + private String strBinType; } diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/DigitalDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/DigitalDTO.java similarity index 93% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/DigitalDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/DigitalDTO.java index 77ab65333..32c6d4c95 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/DigitalDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/DigitalDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/EigenvalueDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/EigenvalueDTO.java similarity index 90% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/EigenvalueDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/EigenvalueDTO.java index fdcb25227..e4faf5d4f 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/EigenvalueDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/EigenvalueDTO.java @@ -1,11 +1,10 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; -import java.util.List; /** * @author yxb diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/MutationDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/MutationDTO.java similarity index 94% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/MutationDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/MutationDTO.java index dde936d01..10c24f928 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/MutationDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/MutationDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/RateDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/RateDTO.java similarity index 91% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/RateDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/RateDTO.java index cd67cd677..6fdbce05a 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/RateDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/RateDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/SamplingDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/SamplingDTO.java similarity index 95% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/SamplingDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/SamplingDTO.java index 36c4a5e6c..d04250d24 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/SamplingDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/SamplingDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/SamplingsDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/SamplingsDTO.java similarity index 92% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/SamplingsDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/SamplingsDTO.java index 65f86d90f..1d5393af9 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/SamplingsDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/SamplingsDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/WaveDataDTO.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/WaveDataDTO.java similarity index 95% rename from pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/WaveDataDTO.java rename to pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/WaveDataDTO.java index 3fc199e3f..ada34ad7b 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/pojo/dto/wave/WaveDataDTO.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/dto/wave/WaveDataDTO.java @@ -1,4 +1,4 @@ -package com.njcn.common.pojo.dto.wave; +package com.njcn.event.pojo.dto.wave; import lombok.AllArgsConstructor; diff --git a/pqs-event/event-api/src/main/java/com/njcn/event/pojo/po/WavePath.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/po/WavePath.java deleted file mode 100644 index e350848ab..000000000 --- a/pqs-event/event-api/src/main/java/com/njcn/event/pojo/po/WavePath.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.njcn.event.pojo.po; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -/** - * @version 1.0.0 - * @author: chenchao - * @date: 2022/06/28 19:41 - */ -@Data -@Component -public class WavePath { - - - @Value("${business.wavePath}") - private String wavePath; - - -} diff --git a/pqs-event/event-boot/pom.xml b/pqs-event/event-boot/pom.xml index 3ba8bf31b..27dc8d35e 100644 --- a/pqs-event/event-boot/pom.xml +++ b/pqs-event/event-boot/pom.xml @@ -72,6 +72,18 @@ pq-device-api ${project.version} + + + com.njcn + huawei-obs-springboot-starter + ${project.version} + + + com.squareup.okio + okio + 2.8.0 + + diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/MonitorPointController.java b/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/MonitorPointController.java index 128bea687..fe1bae09d 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/MonitorPointController.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/MonitorPointController.java @@ -3,7 +3,6 @@ package com.njcn.event.controller.majornetwork; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.constant.OperateType; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; import com.njcn.common.pojo.enums.common.LogEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; @@ -202,24 +201,6 @@ public class MonitorPointController extends BaseController { - /** - *监测点事件波形分析 - * @author zbj - * @date 2022/7/27 - */ - @OperateInfo(info = LogEnum.BUSINESS_COMMON) - @PostMapping("/getMonitorEventAnalyseWave") - @ApiOperation("监测点事件波形分析") - @ApiImplicitParams({ - @ApiImplicitParam(name = "timeId", value = "时间Id", required = true), - @ApiImplicitParam(name = "lineId", value = "监测点Id", required = true) - }) - public HttpResult getMonitorEventAnalyseWave(@RequestParam("timeId") String timeId, @RequestParam("lineId") String lineId){ - String methodDescribe = getMethodDescribe("getMonitorEventAnalyseWave"); - WaveDataDTO wave = eventAnalysisService.getMonitorEventAnalyseWave(timeId, lineId); - return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, wave, methodDescribe); - } - /** *监测点事件波形下载 * @author zbj diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/TransientController.java b/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/TransientController.java index da7446b5f..c28777e3b 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/TransientController.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/controller/majornetwork/TransientController.java @@ -3,11 +3,11 @@ package com.njcn.event.controller.majornetwork; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.constant.OperateType; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; import com.njcn.common.pojo.enums.common.LogEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; +import com.njcn.event.pojo.dto.wave.WaveDataDTO; import com.njcn.event.pojo.param.TransientParam; import com.njcn.event.pojo.param.WaveFileParam; import com.njcn.event.pojo.po.EventDetailNew; diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/EventAnalysisService.java b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/EventAnalysisService.java index fda135de2..3dc61a3ba 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/EventAnalysisService.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/EventAnalysisService.java @@ -1,7 +1,7 @@ package com.njcn.event.service.majornetwork; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; +import com.njcn.event.pojo.dto.wave.WaveDataDTO; import com.njcn.event.pojo.param.*; import com.njcn.event.pojo.po.EventDetail; import com.njcn.event.pojo.vo.*; @@ -82,12 +82,7 @@ public interface EventAnalysisService { */ Page getMonitorEventAnalyseQuery(EventBaseParam eventBaseParam); - /** - *监测点事件波形分析 - * @author zbj - * @date 2022/7/27 - */ - WaveDataDTO getMonitorEventAnalyseWave(String timeId, String lineId); + /** *监测点事件波形下载 diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventAnalysisServiceImpl.java b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventAnalysisServiceImpl.java index 69f4a4f51..66307b25b 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventAnalysisServiceImpl.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventAnalysisServiceImpl.java @@ -4,16 +4,15 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.common.config.GeneralInfo; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.PubUtils; -import com.njcn.common.utils.wave.AnalyWave; import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.pojo.vo.AreaLineInfoVO; import com.njcn.device.pq.pojo.vo.LineDetailDataVO; import com.njcn.event.enums.EventResponseEnum; import com.njcn.event.pojo.constant.Param; +import com.njcn.event.pojo.dto.wave.WaveDataDTO; import com.njcn.event.pojo.param.*; import com.njcn.event.pojo.po.EventDetail; import com.njcn.event.pojo.po.EventDetailNew; @@ -1627,55 +1626,6 @@ public class EventAnalysisServiceImpl implements EventAnalysisService { } - /** - * 监测点事件波形分析 - * - * @author zbj - * @date 2022/7/27 - */ - @Override - public WaveDataDTO getMonitorEventAnalyseWave(String timeId, String lineId) { - WaveDataDTO waveDataDTO = new WaveDataDTO(); - //根据监测点id获取监测点详情 - LineDetailDataVO lineDetailData = lineFeignClient.getLineDetailData(lineId).getData(); - EventDetail eventDetailByTime = eventDetailService.getEventDetailByTime(lineId, timeId); - - //暂时没有进行拼接 - String ip = lineDetailData.getIp(); - String waveName = eventDetailByTime.getWaveName(); - /* if(StrUtil.isBlank(waveName)){ - throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); - }*/ - - - AnalyWave analyWave = new AnalyWave(); - - - /*WaveDataDTO comtrade = analyWave.getComtrade(generalInfo.getBusinessWavePath() + File.separator + ip + File.separator + waveName + ".CFG", 1); - if (Objects.isNull(comtrade.getComtradeCfgDTO())) { - throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); - }*/ - - - //测试用的本地路径 - WaveDataDTO comtrade = analyWave.getComtrade("C:\\Users\\CDF\\Desktop\\00-B7-8D-00-E7-15\\1_20220204_125513_383.cfg", 1); - - - waveDataDTO = analyWave.getValidData(comtrade); - - - waveDataDTO.setPtType(PubUtils.ptTypeName(lineDetailData.getPtType())); - double pt1 = Double.parseDouble(lineDetailData.getPt().split("/")[0]); - double pt2 = Double.parseDouble(lineDetailData.getPt().split("/")[1]); - double ct1 = Double.parseDouble(lineDetailData.getCt().split("/")[0]); - double ct2 = Double.parseDouble(lineDetailData.getCt().split("/")[1]); - - waveDataDTO.setPt(pt1 / pt2); - waveDataDTO.setCt(ct1 / ct2); - - - return waveDataDTO; - } /** diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventDetailServiceImpl.java b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventDetailServiceImpl.java index 55440b8c7..6d418ac47 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventDetailServiceImpl.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/EventDetailServiceImpl.java @@ -118,7 +118,7 @@ public class EventDetailServiceImpl implements EventDetailService { } stringBuilder.append(") order by time desc"); int i = (pageNum - 1)*pageSize; - stringBuilder.append("LIMIT ").append(pageSize).append(" OFFSET ").append(i).append(" tz('Asia/Shanghai')"); + stringBuilder.append(" LIMIT ").append(pageSize).append(" OFFSET ").append(i).append(" tz('Asia/Shanghai')"); //sql语句 String sql = "SELECT * FROM pqs_eventdetail WHERE " + stringBuilder; System.out.println(sql); diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java index b2eaaeba9..6961b31b8 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java @@ -5,11 +5,11 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.common.config.GeneralInfo; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; +import com.njcn.common.pojo.constant.GeneralConstant; +import com.njcn.common.pojo.constant.OssPath; import com.njcn.common.pojo.enums.common.ServerEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.utils.PubUtils; -import com.njcn.common.utils.wave.AnalyWave; import com.njcn.device.pq.api.GeneralDeviceInfoClient; import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO; @@ -17,6 +17,7 @@ import com.njcn.device.pq.pojo.vo.AreaLineInfoVO; import com.njcn.device.pq.pojo.vo.LineDetailDataVO; import com.njcn.event.enums.EventResponseEnum; import com.njcn.event.mapper.majornetwork.TransientMapper; +import com.njcn.event.pojo.dto.wave.WaveDataDTO; import com.njcn.event.pojo.param.TransientParam; import com.njcn.event.pojo.param.WaveFileParam; import com.njcn.event.pojo.po.EventDetail; @@ -24,6 +25,8 @@ import com.njcn.event.pojo.po.EventDetailNew; import com.njcn.event.pojo.vo.TransientVO; import com.njcn.event.service.majornetwork.EventDetailService; import com.njcn.event.service.majornetwork.TransientService; +import com.njcn.event.utils.WaveUtil; +import com.njcn.huawei.obs.util.OBSUtil; import com.njcn.influxdb.mapper.InfluxDBResultMapperCn; import com.njcn.influxdb.param.InfluxDBPublicParam; import com.njcn.influxdb.utils.InfluxDBCommUtils; @@ -75,6 +78,11 @@ public class TransientServiceImpl implements TransientService { private final InfluxDbUtils influxDbUtils; + private final OBSUtil obsUtil; + + private final WaveUtil waveUtil; + + @Override public Page getTransientData(TransientParam transientParam) { Page page = new Page<>(); @@ -86,7 +94,7 @@ public class TransientServiceImpl implements TransientService { List deviceList = generalDeviceInfoClient.getPracticalRunDeviceInfo(transientParam).getData(); if (!CollectionUtils.isEmpty(deviceList)) { //获取按终端分类的监测点索引集合 - List LineIndexes = deviceList.stream().flatMap(list->list.getLineIndexes().stream()).collect(Collectors.toList()); + List LineIndexes = deviceList.stream().flatMap(list -> list.getLineIndexes().stream()).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(LineIndexes)) { //influxDB查询待分页数据总量 @@ -96,7 +104,7 @@ public class TransientServiceImpl implements TransientService { int pages = (int) Math.ceil(data.size() * 1.0 / transientParam.getPageSize()); page.setPages(pages);*/ //influxDB分页查询 - List eventDetailData = eventDetailService.getEventDetailLimit(LineIndexes, transientParam.getSearchBeginTime(), transientParam.getSearchEndTime(), transientParam.getPageSize(), transientParam.getPageNum(),transientParam.getWaveType()); + List eventDetailData = eventDetailService.getEventDetailLimit(LineIndexes, transientParam.getSearchBeginTime(), transientParam.getSearchEndTime(), transientParam.getPageSize(), transientParam.getPageNum(), transientParam.getWaveType()); if (!CollectionUtils.isEmpty(eventDetailData)) { List lineIds = eventDetailData.stream().map(EventDetail::getLineId).collect(Collectors.toList()); @@ -168,23 +176,47 @@ public class TransientServiceImpl implements TransientService { @Override public WaveDataDTO getTransientAnalyseWave(String timeId, String lineId) { WaveDataDTO waveDataDTO; + //原始数据 + WaveDataDTO originalData; //根据监测点id获取监测点详情 LineDetailDataVO lineDetailData = lineFeignClient.getLineDetailData(lineId).getData(); EventDetail eventDetailByTime = eventDetailService.getEventDetailByTime(lineId, timeId); String ip = lineDetailData.getIp(); String waveName = eventDetailByTime.getWaveName(); - AnalyWave analyWave = new AnalyWave(); - // 从本地读取该事件的波形 - WaveDataDTO comtrade = analyWave.getComtrade(generalInfo.getBusinessWavePath() + File.separator + ip + File.separator + waveName + ".CFG", 1); - if (Objects.isNull(comtrade.getComtradeCfgDTO())) { - throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); + String cfgPath, datPath; + if (generalInfo.getBusinessFileStorage() == GeneralConstant.LOCAL_DISK) { + cfgPath = generalInfo.getBusinessWavePath() + File.separator + ip + File.separator + waveName + GeneralConstant.CFG; + datPath = generalInfo.getBusinessWavePath() + File.separator + ip + File.separator + waveName + GeneralConstant.DAT; + InputStream cfgStream = waveUtil.getFileInputStreamByFilePath(cfgPath); + InputStream datStream = waveUtil.getFileInputStreamByFilePath(datPath); + if (Objects.isNull(cfgStream) || Objects.isNull(datStream)) { + throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); + } + originalData = waveUtil.getComtrade(cfgStream, datStream, 1); +// } else if (generalInfo.getBusinessFileStorage() == GeneralConstant.HUAWEI_OBS) { + } else { + ip = "192.168.1.190"; + waveName = "PQMonitor_PQM1_002438_20210508_092859_938"; + cfgPath = OssPath.WAVE_DIR + ip + StrUtil.SLASH + waveName + GeneralConstant.CFG; + datPath = OssPath.WAVE_DIR + ip + StrUtil.SLASH + waveName + GeneralConstant.DAT; + try ( + InputStream cfgStream = obsUtil.fileDownload(cfgPath); + InputStream datStream = obsUtil.fileDownload(datPath) + ) { + if (Objects.isNull(cfgStream) || Objects.isNull(datStream)) { + throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); + } + originalData = waveUtil.getComtrade(cfgStream, datStream, 1); + } catch (IOException e) { + throw new BusinessException(EventResponseEnum.WAVE_DATA_INVALID); + } } - waveDataDTO = analyWave.getValidData(comtrade); + waveDataDTO = waveUtil.getValidData(originalData); waveDataDTO.setPtType(PubUtils.ptTypeName(lineDetailData.getPtType())); - double pt1 = Double.parseDouble(lineDetailData.getPt().split("/")[0]); - double pt2 = Double.parseDouble(lineDetailData.getPt().split("/")[1]); - double ct1 = Double.parseDouble(lineDetailData.getCt().split("/")[0]); - double ct2 = Double.parseDouble(lineDetailData.getCt().split("/")[1]); + double pt1 = Double.parseDouble(lineDetailData.getPt().split(StrUtil.SLASH)[0]); + double pt2 = Double.parseDouble(lineDetailData.getPt().split(StrUtil.SLASH)[1]); + double ct1 = Double.parseDouble(lineDetailData.getCt().split(StrUtil.SLASH)[0]); + double ct2 = Double.parseDouble(lineDetailData.getCt().split(StrUtil.SLASH)[1]); waveDataDTO.setPt(pt1 / pt2); waveDataDTO.setCt(ct1 / ct2); return waveDataDTO; @@ -227,7 +259,7 @@ public class TransientServiceImpl implements TransientService { } @Override - public Page getTransientValue(TransientParam transientParam){ + public Page getTransientValue(TransientParam transientParam) { Page page = new Page<>(); page.setSize(transientParam.getPageSize()); page.setCurrent(transientParam.getPageNum()); @@ -241,7 +273,7 @@ public class TransientServiceImpl implements TransientService { if (!CollectionUtils.isEmpty(lineList)) { StringBuilder stringBuilder = InfluxDBCommUtils.assToInfluxParam(lineList); //influxDB查询待分页数据总量 - Long total = getTransientDetail(stringBuilder,transientParam); + Long total = getTransientDetail(stringBuilder, transientParam); page.setTotal(total); //分页总页数 int pages = (int) Math.ceil(transientParam.getPageNum() * 1.0 / transientParam.getPageSize()); @@ -259,8 +291,8 @@ public class TransientServiceImpl implements TransientService { for (EventDetailNew eventDetail : eventDetailData) { - for(AreaLineInfoVO areaLineInfoVO : r){ - if(eventDetail.getLineId().equals(areaLineInfoVO.getLineId())){ + for (AreaLineInfoVO areaLineInfoVO : r) { + if (eventDetail.getLineId().equals(areaLineInfoVO.getLineId())) { eventDetail.setLineId(areaLineInfoVO.getLineId()); eventDetail.setLineName(areaLineInfoVO.getLineName()); eventDetail.setGdName(areaLineInfoVO.getGdName()); @@ -301,22 +333,22 @@ public class TransientServiceImpl implements TransientService { /** * 查询数据库 */ - private Long getTransientDetail(StringBuilder stringBuilder,TransientParam transientParam) { + private Long getTransientDetail(StringBuilder stringBuilder, TransientParam transientParam) { Long total = 0L; //组装sql语句 stringBuilder.append(" and time >= '").append(DateUtil.beginOfDay(DateUtil.parse(transientParam.getSearchBeginTime()))).append("' and ").append("time <= '").append(DateUtil.endOfDay(DateUtil.parse(transientParam.getSearchEndTime()))).append("'").append(InfluxDBPublicParam.TIME_ZONE); //sql语句 String sql = "SELECT count(wave_type) FROM pqs_eventdetail WHERE " + stringBuilder; - System.out.println("sql------------->>>"+sql); + System.out.println("sql------------->>>" + sql); //结果集 QueryResult result = influxDbUtils.query(sql); //结果集映射到对象中 List series = result.getResults().get(0).getSeries(); - if(CollUtil.isNotEmpty(series)){ - Double tem =(Double)series.get(0).getValues().get(0).get(1); + if (CollUtil.isNotEmpty(series)) { + Double tem = (Double) series.get(0).getValues().get(0).get(1); total = tem.longValue(); } - return total; + return total; } /** @@ -325,31 +357,31 @@ public class TransientServiceImpl implements TransientService { private List getTransientDetailLimit(List lineIndexes, TransientParam transientParam) { //查询数据是否为空,不为空拼接sql语句 StringBuilder querySql = new StringBuilder(); - if(Objects.nonNull(transientParam.getEventValueMin())){ + if (Objects.nonNull(transientParam.getEventValueMin())) { querySql.append(" and event_value >=").append(transientParam.getEventValueMin()); } - if(Objects.nonNull(transientParam.getEventValueMax())){ + if (Objects.nonNull(transientParam.getEventValueMax())) { querySql.append(" and event_value <=").append(transientParam.getEventValueMax()); } - if(Objects.nonNull(transientParam.getPersistMin())){ + if (Objects.nonNull(transientParam.getPersistMin())) { querySql.append(" and persist_time >=").append(transientParam.getPersistMin()); } - if(Objects.nonNull(transientParam.getEventValueMax())){ + if (Objects.nonNull(transientParam.getEventValueMax())) { querySql.append(" and persist_time <=").append(transientParam.getPersistMax()); } - if(Objects.nonNull(transientParam.getSeverityMin())){ + if (Objects.nonNull(transientParam.getSeverityMin())) { querySql.append(" and severity >=").append(transientParam.getSeverityMin()); } - if(Objects.nonNull(transientParam.getSeverityMax())){ + if (Objects.nonNull(transientParam.getSeverityMax())) { querySql.append(" and severity <=").append(transientParam.getSeverityMax()); } - if(Objects.nonNull(transientParam.getFileFlag())){ + if (Objects.nonNull(transientParam.getFileFlag())) { querySql.append(" and file_flag = ").append(transientParam.getFileFlag()); } - if(CollUtil.isNotEmpty(transientParam.getWaveType())) { + if (CollUtil.isNotEmpty(transientParam.getWaveType())) { querySql.append(" and ( "); for (int i = 0; i < transientParam.getWaveType().size(); i++) { if (transientParam.getWaveType().size() - i != 1) { @@ -359,7 +391,7 @@ public class TransientServiceImpl implements TransientService { } } } - if(CollUtil.isNotEmpty(transientParam.getEventReason())) { + if (CollUtil.isNotEmpty(transientParam.getEventReason())) { querySql.append(" and ( "); for (int i = 0; i < transientParam.getEventReason().size(); i++) { if (transientParam.getWaveType().size() - i != 1) { @@ -369,7 +401,7 @@ public class TransientServiceImpl implements TransientService { } } } - if(CollUtil.isNotEmpty(transientParam.getEventType())) { + if (CollUtil.isNotEmpty(transientParam.getEventType())) { querySql.append(" and ( "); for (int i = 0; i < transientParam.getEventType().size(); i++) { if (transientParam.getEventType().size() - i != 1) { @@ -393,8 +425,8 @@ public class TransientServiceImpl implements TransientService { stringBuilder.append("line_id ='").append(lineIndexes.get(i)).append("') "); } } - int i = (transientParam.getPageNum() - 1)*transientParam.getPageSize(); - stringBuilder.append("LIMIT ").append(transientParam.getPageSize()).append(" OFFSET ").append(i).append(" tz('Asia/Shanghai')"); + int i = (transientParam.getPageNum() - 1) * transientParam.getPageSize(); + stringBuilder.append(" LIMIT ").append(transientParam.getPageSize()).append(" OFFSET ").append(i).append(" tz('Asia/Shanghai')"); //sql语句 String sql = "SELECT * FROM pqs_eventdetail WHERE " + stringBuilder; diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/TransientService.java b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/TransientService.java index 3fffdad32..3fc5c4d9c 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/TransientService.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/TransientService.java @@ -1,7 +1,7 @@ package com.njcn.event.service.majornetwork; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.njcn.common.pojo.dto.wave.WaveDataDTO; +import com.njcn.event.pojo.dto.wave.WaveDataDTO; import com.njcn.event.pojo.param.TransientParam; import com.njcn.event.pojo.param.WaveFileParam; import com.njcn.event.pojo.po.EventDetail; diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/utils/BitConverter.java b/pqs-event/event-boot/src/main/java/com/njcn/event/utils/BitConverter.java new file mode 100644 index 000000000..3c44d08c9 --- /dev/null +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/utils/BitConverter.java @@ -0,0 +1,81 @@ +package com.njcn.event.utils; + +public class BitConverter { + + /** + * byte数组转换为无符号short整数 + * @param bytes byte数组 + * @param off 开始位置 + * @return short整数 + */ + public static short byte2ToUnsignedShort(byte[] bytes, int off) { + int low = bytes[off]& 0xFF; + int high = bytes[off + 1]& 0xFF; + return (short)(((high & 0x00FF) << 8) | (0x00FF & low)); + } + + /** + * 字节转换为浮点 + * + * @param b 字节(至少4个字节) + * @param index 开始位置 + * @return + */ + public static float byte4float(byte[] b, int index) { + /* b=new byte[4]; + b[0]=-16; + b[1]=-1; + b[2]=117; + b[3]=66;*/ + + int l; + l = b[index + 0]; + l &= 0xff; + l |= ((long) b[index + 1] << 8); + l &= 0xffff; + l |= ((long) b[index + 2] << 16); + l &= 0xffffff; + l |= ((long) b[index + 3] << 24); + return Float.intBitsToFloat(l); + } + /** + * byte数组转换为int32整数 + * @param bytes byte数组 + * @param off 开始位置 + * @return int整数 + */ + public static int byte4ToInt(byte[] bytes, int off) { + int b0 = bytes[off] & 0xFF; + int b1 = bytes[off + 1] & 0xFF; + int b2 = bytes[off + 2] & 0xFF; + int b3 = bytes[off + 3] & 0xFF; + return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0; + } + + /** + * byte数组转换为int16整数 + * @param bytes byte数组 + * @param off 开始位置 + * @return int整数 + */ + public static int byte2ToInt(byte[] bytes, int off) { + int b0 = bytes[off] & 0xFF; + int b1 = bytes[off + 1] & 0xFF; + return (b1 << 8) | b0; + } + + /** + * byte数组转换为int16整数 + * @param bytes byte数组 + * @param off 开始位置 + * @return int整数 + */ + public static long byte4ToLong(byte[] bytes, int off) { + long b0 = bytes[off] & 0xFF; + long b1 = bytes[off + 1] & 0xFF; + long b2 = bytes[off + 2] & 0xFF; + long b3 = bytes[off + 3] & 0xFF; + + return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0; + } +} diff --git a/pqs-common/common-core/src/main/java/com/njcn/common/utils/wave/AnalyWave.java b/pqs-event/event-boot/src/main/java/com/njcn/event/utils/WaveUtil.java similarity index 57% rename from pqs-common/common-core/src/main/java/com/njcn/common/utils/wave/AnalyWave.java rename to pqs-event/event-boot/src/main/java/com/njcn/event/utils/WaveUtil.java index ef41e7958..080390d09 100644 --- a/pqs-common/common-core/src/main/java/com/njcn/common/utils/wave/AnalyWave.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/utils/WaveUtil.java @@ -1,25 +1,35 @@ -package com.njcn.common.utils.wave; +package com.njcn.event.utils; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; -import com.njcn.common.pojo.dto.wave.*; +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.utils.wave.BitConverter; +import com.njcn.event.enums.EventResponseEnum; +import com.njcn.event.pojo.dto.wave.*; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; import java.io.*; +import java.nio.file.Files; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.List; +import java.util.*; /** - * @author yxb + * @author hongawen * @version 1.0.0 - * @date 2022年06月02日 20:03 - * 解析comtrate文件工具类 + * @date 2023年03月03日 10:01 */ @Slf4j -public class AnalyWave { +@Component +@RequiredArgsConstructor +public class WaveUtil { + + /****************************************** * 调用读取comtrate文件方法 * param strFilePath 波形.cfg文件路径 @@ -28,46 +38,36 @@ public class AnalyWave { * iType == 2 App抽点要求,采样率抽点成32 * iType == 3 高级算法原始波形(大于32) ******************************************/ - private String strBinType;//结束读取cfg标志 - public WaveDataDTO getComtrade(String strFilePath, int iType) { + public WaveDataDTO getComtrade(InputStream cfgStream, InputStream datStream, int iType) { WaveDataDTO waveDataDTO = new WaveDataDTO(); // 首先判断文件路径是否为空 - if(StrUtil.isNotEmpty(strFilePath)){ - File file = new File(strFilePath); - // 判断文件是否存在 - if (file.isFile() && file.exists()) { - // 读取cfg文件 - ComtradeCfgDTO comtradeCfgDTO = getComtradeCfg(file); - // 为空或者未找到结束符号 - if (comtradeCfgDTO == null && !strBinType.equals("BINARY")) - return waveDataDTO; - /*****根据通道号计算相别** add by yexb -----Start**** - * 1、判断是否是3的倍数,是3的倍数则是3相 - * 2、假如不是3的倍数 ,是1的倍数则是单相 - ********************************************************/ - if(comtradeCfgDTO.getNAnalogNum() % 3 == 0) { - comtradeCfgDTO.setNPhasic(3); - }else if(comtradeCfgDTO.getNAnalogNum() % 1 == 0) { - comtradeCfgDTO.setNPhasic(1); - }else{ - comtradeCfgDTO.setNPhasic(3); - } - // 给相别幅值 - waveDataDTO.setIPhasic(comtradeCfgDTO.getNPhasic()); - // 组装解析抬头 - List lstWaveTitle = getWaveTitle(comtradeCfgDTO); - // 解析.dat文件 - List> listWaveData = getComtradeDat(comtradeCfgDTO,strFilePath, iType); - waveDataDTO.setComtradeCfgDTO(comtradeCfgDTO); - waveDataDTO.setWaveTitle(lstWaveTitle); - waveDataDTO.setListWaveData(listWaveData); - - /*****根据通道号计算相别** add by yexb -----end****/ - }else{ - // .cfg文件不存在 - log.info("{},CFG文件不存在!",strFilePath); - } + // 读取cfg文件 + ComtradeCfgDTO comtradeCfgDTO = getComtradeCfg(cfgStream); + // 为空或者未找到结束符号 + if (comtradeCfgDTO == null || !"BINARY".equalsIgnoreCase(comtradeCfgDTO.getStrBinType())) { + return waveDataDTO; } + /*****根据通道号计算相别** add by yexb -----Start**** + * 1、判断是否是3的倍数,是3的倍数则是3相 + * 2、假如不是3的倍数 ,是1的倍数则是单相 + ********************************************************/ + if (comtradeCfgDTO.getNAnalogNum() % 3 == 0) { + comtradeCfgDTO.setNPhasic(3); + } else { + comtradeCfgDTO.setNPhasic(1); + } + // 给相别幅值 + waveDataDTO.setIPhasic(comtradeCfgDTO.getNPhasic()); + // 组装解析抬头 + List lstWaveTitle = getWaveTitle(comtradeCfgDTO); + // 解析.dat文件 + List> listWaveData = getComtradeDat(comtradeCfgDTO, datStream, iType); + waveDataDTO.setComtradeCfgDTO(comtradeCfgDTO); + waveDataDTO.setWaveTitle(lstWaveTitle); + waveDataDTO.setListWaveData(listWaveData); + + /*****根据通道号计算相别** add by yexb -----end****/ + return waveDataDTO; } @@ -78,72 +78,76 @@ public class AnalyWave { **********************************/ @SuppressWarnings("unused") public WaveDataDTO getValidData(WaveDataDTO waveDataDTO) { - ComtradeCfgDTO comtradeCfgDTO = waveDataDTO.getComtradeCfgDTO();//CFG 配置文件 - List> lstWave = waveDataDTO.getListWaveData();//瞬时波形值 - List> listRms = new ArrayList<>();//返回rms的值 + //CFG 配置文件 + ComtradeCfgDTO comtradeCfgDTO = waveDataDTO.getComtradeCfgDTO(); + //瞬时波形值 + List> lstWave = waveDataDTO.getListWaveData(); + //返回rms的值 + List> listRms = new ArrayList<>(); /*float fs = nOneWaveNum; int nWaveNum = (int) nAllWaveNum;*/ - int HalfTs = comtradeCfgDTO.getFinalSampleRate().intValue();// 全波有效值 (int)fs / 2;//半波有效值 + // 全波有效值 (int)fs / 2;//半波有效值 + int halfTs = comtradeCfgDTO.getFinalSampleRate().intValue(); // 计算有效值算法 /********************************* * modify by yexibao 2020-10-29 * 增加多波形算法 ---------start ********************************/ - double iWave = 0 ; - int nPhasic = 0;// 相别 - List> listRmsMin =new ArrayList<>();//存放RMS值的最小值 - if(lstWave.size() > 0){ + double iWave; + // 相别 + int nPhasic; + //存放RMS值的最小值 + List> listRmsMin = new ArrayList<>(); + if (lstWave.size() > 0) { nPhasic = comtradeCfgDTO.getNPhasic(); //ComtradeCfg.nAnalogNum为值的个数(-1的原因是一个存的是时间) - iWave = Math.floor((lstWave.get(0).size() -1) / nPhasic); + iWave = Math.floor((lstWave.get(0).size() - 1) / (double) nPhasic); List tmpListRms; List tmpListRmsMin; //增加RMS的最小值 - double fMinTime = 0.0 , fMinValue = 0.0; - + double fMinTime = 0.0, fMinValue = 0.0; //每一项一项计算 - for(int j = 0; j < iWave; j ++){ + for (int j = 0; j < iWave; j++) { // 实例化 tmpListRmsMin = new ArrayList<>(); - - double fSumA = 0.0, fSumB= 0.0, fSumC = 0.0; - double fValidA = 0.0, fValidB = 0.0, fValidC = 0.0; + double fSumA = 0.0, fSumB = 0.0, fSumC = 0.0; + double fValidA, fValidB, fValidC; //循环原始数据 for (int i = 0; i < lstWave.size(); i++) { - // 当第一次循环的时候实例化,其余的获取已有的List - List tmpListValue = lstWave.get(i); //获取每一项的值 + // 当第一次循环的时候实例化,其余的获取已有的List//获取每一项的值 + List tmpListValue = lstWave.get(i); if (j == 0) { tmpListRms = new ArrayList<>(); - tmpListRms.add(tmpListValue.get(0));//获取时间 + //获取时间 + tmpListRms.add(tmpListValue.get(0)); listRms.add(tmpListRms); - } else + } else { tmpListRms = listRms.get(i); + } //包含了时间、电压(A、B、C)三相、电流(A、B、C)三相 if (tmpListValue.size() >= 2) { //电压有效值算法,根据相别进行处理 - switch(comtradeCfgDTO.getNPhasic()) { + switch (comtradeCfgDTO.getNPhasic()) { case 1: fSumA += Math.pow(tmpListValue.get(1 + nPhasic * j), 2); - if (i >= HalfTs)// 计算有效值 - { - List forwardListValue = lstWave.get(i - HalfTs);//获取前推周波的值 + // 计算有效值 + if (i >= halfTs) { + //获取前推周波的值 + List forwardListValue = lstWave.get(i - halfTs); fSumA -= Math.pow(forwardListValue.get(1 + nPhasic * j), 2); } - fValidA = Math.sqrt(fSumA / HalfTs); - + fValidA = Math.sqrt(fSumA / halfTs); tmpListRms.add((float) (Math.round(fValidA * 100)) / 100); - listRms.set(i,tmpListRms); - + listRms.set(i, tmpListRms); // 最小值判断 - if (i >= HalfTs){ - if(i == HalfTs){ + if (i >= halfTs) { + if (i == halfTs) { fMinValue = fValidA; fMinTime = tmpListValue.get(0); - } - else{ - if(fValidA < fMinValue){ + } else { + if (fValidA < fMinValue) { fMinValue = fValidA; fMinTime = tmpListValue.get(0); } @@ -153,31 +157,31 @@ public class AnalyWave { case 2: fSumA += Math.pow(tmpListValue.get(1 + nPhasic * j), 2); fSumB += Math.pow(tmpListValue.get(2 + nPhasic * j), 2); - if (i >= HalfTs)// 计算有效值 - { - List forwardListValue = lstWave.get(i - HalfTs);//获取前推周波的值 + // 计算有效值 + if (i >= halfTs) { + //获取前推周波的值 + List forwardListValue = lstWave.get(i - halfTs); fSumA -= Math.pow(forwardListValue.get(1 + nPhasic * j), 2); fSumB -= Math.pow(forwardListValue.get(2 + nPhasic * j), 2); } - fValidA = Math.sqrt(fSumA / HalfTs); - fValidB = Math.sqrt(fSumB / HalfTs); + fValidA = Math.sqrt(fSumA / halfTs); + fValidB = Math.sqrt(fSumB / halfTs); tmpListRms.add((float) (Math.round(fValidA * 100)) / 100); tmpListRms.add((float) (Math.round(fValidB * 100)) / 100); - listRms.set(i,tmpListRms); + listRms.set(i, tmpListRms); // 最小值判断 - if (i >= HalfTs){ - if(i == HalfTs){ + if (i >= halfTs) { + if (i == halfTs) { fMinValue = fValidA; fMinTime = tmpListValue.get(0); - } - else{ - if(fValidA < fMinValue){ + } else { + if (fValidA < fMinValue) { fMinValue = fValidA; fMinTime = tmpListValue.get(0); } - if(fValidB < fMinValue){ + if (fValidB < fMinValue) { fMinValue = fValidB; fMinTime = tmpListValue.get(0); } @@ -188,87 +192,94 @@ public class AnalyWave { fSumA += Math.pow(tmpListValue.get(1 + nPhasic * j), 2); fSumB += Math.pow(tmpListValue.get(2 + nPhasic * j), 2); fSumC += Math.pow(tmpListValue.get(3 + nPhasic * j), 2); - if (i >= HalfTs)// 计算有效值 - { - List forwardListValue = lstWave.get(i - HalfTs);//获取前推周波的值 + // 计算有效值 + if (i >= halfTs) { + //获取前推周波的值 + List forwardListValue = lstWave.get(i - halfTs); fSumA -= Math.pow(forwardListValue.get(1 + nPhasic * j), 2); fSumB -= Math.pow(forwardListValue.get(2 + nPhasic * j), 2); fSumC -= Math.pow(forwardListValue.get(3 + nPhasic * j), 2); } - fValidA = Math.sqrt(fSumA / HalfTs); - fValidB = Math.sqrt(fSumB / HalfTs); - fValidC = Math.sqrt(fSumC / HalfTs); + fValidA = Math.sqrt(fSumA / halfTs); + fValidB = Math.sqrt(fSumB / halfTs); + fValidC = Math.sqrt(fSumC / halfTs); tmpListRms.add((float) (Math.round(fValidA * 100)) / 100); tmpListRms.add((float) (Math.round(fValidB * 100)) / 100); tmpListRms.add((float) (Math.round(fValidC * 100)) / 100); - listRms.set(i,tmpListRms); + listRms.set(i, tmpListRms); // 最小值判断 - if (i >= HalfTs){ - if(i == HalfTs){ + if (i >= halfTs) { + if (i == halfTs) { fMinValue = fValidA; fMinTime = tmpListValue.get(0); - } - else{ - if(fValidA < fMinValue){ + } else { + if (fValidA < fMinValue) { fMinValue = fValidA; fMinTime = tmpListValue.get(0); } - if(fValidB < fMinValue){ + if (fValidB < fMinValue) { fMinValue = fValidB; fMinTime = tmpListValue.get(0); } - if(fValidC < fMinValue){ + if (fValidC < fMinValue) { fMinValue = fValidC; fMinTime = tmpListValue.get(0); } } } break; + default: + break; } } } - - //增加最小值时间,最小值 - tmpListRmsMin.add((float)fMinTime);//获取时间 - tmpListRmsMin.add((float)(Math.round(fMinValue * 100)) / 100);//获取时间 + //增加最小值时间,最小值//获取时间 + tmpListRmsMin.add((float) fMinTime); + //获取时间 + tmpListRmsMin.add((float) (Math.round(fMinValue * 100)) / 100); listRmsMin.add(tmpListRmsMin); } //过滤前一个周波 //HalfTs表示一个周波 try { - for (int i = 0; i < HalfTs; i++) { - //电压有效值算法 - List tmpNewListRms = new ArrayList<>();//没相具体的值 - for(int j = 0; j < iWave; j ++) { - if (j == 0) - tmpNewListRms.add(listRms.get(i).get(0));//获取时间 - - switch(nPhasic) { + for (int i = 0; i < halfTs; i++) { + //电压有效值算法 //没相具体的值 + List tmpNewListRms = new ArrayList<>(); + for (int j = 0; j < iWave; j++) { + if (j == 0) { + //获取时间 + tmpNewListRms.add(listRms.get(i).get(0)); + } + switch (nPhasic) { case 1: - tmpNewListRms.add(listRms.get(i + HalfTs).get(1 + nPhasic * j)); + tmpNewListRms.add(listRms.get(i + halfTs).get(1 + nPhasic * j)); break; case 2: - tmpNewListRms.add(listRms.get(i + HalfTs).get(1 + nPhasic * j)); - tmpNewListRms.add(listRms.get(i + HalfTs).get(2 + nPhasic * j)); + tmpNewListRms.add(listRms.get(i + halfTs).get(1 + nPhasic * j)); + tmpNewListRms.add(listRms.get(i + halfTs).get(2 + nPhasic * j)); break; case 3: - tmpNewListRms.add(listRms.get(i + HalfTs).get(1 + nPhasic * j)); - tmpNewListRms.add(listRms.get(i + HalfTs).get(2 + nPhasic * j)); - tmpNewListRms.add(listRms.get(i + HalfTs).get(3 + nPhasic * j)); + tmpNewListRms.add(listRms.get(i + halfTs).get(1 + nPhasic * j)); + tmpNewListRms.add(listRms.get(i + halfTs).get(2 + nPhasic * j)); + tmpNewListRms.add(listRms.get(i + halfTs).get(3 + nPhasic * j)); + break; + default: break; } } - listRms.set(i, tmpNewListRms);//重新赋值 + //重新赋值 + listRms.set(i, tmpNewListRms); } } catch (Exception e) { - // TODO 更改收个周波值出错 + throw new BusinessException(EventResponseEnum.RMS_DATA_ERROR); } } waveDataDTO.setListRmsData(listRms); - waveDataDTO.setListRmsMinData(listRmsMin);//RMS最小值 + //RMS最小值 + waveDataDTO.setListRmsMinData(listRmsMin); return waveDataDTO; } @@ -279,196 +290,221 @@ public class AnalyWave { * param blType 计算方式 true:浮动门槛 false:固定门槛 *****************************/ public List getEigenvalue(WaveDataDTO waveDataDTO, boolean blType) { - ComtradeCfgDTO comtradeCfgDTO = waveDataDTO.getComtradeCfgDTO();//CFG 配置文件 - List> lstWave = waveDataDTO.getListWaveData();// 瞬时波形值 - Long finalSampleRate = comtradeCfgDTO.getFinalSampleRate();//获取最终采样率 - List lstEigenvalueDTO =new ArrayList<>();// 返回值 + //CFG 配置文件 + ComtradeCfgDTO comtradeCfgDTO = waveDataDTO.getComtradeCfgDTO(); + // 瞬时波形值 + List> lstWave = waveDataDTO.getListWaveData(); + //获取最终采样率 + Long finalSampleRate = comtradeCfgDTO.getFinalSampleRate(); + // 返回值 + List lstEigenvalueDTO = new ArrayList<>(); // 必须包含了瞬时波形 if (lstWave.size() > 0) { - MutationDTO mutationDTO = getMutationValue(lstWave,finalSampleRate); + MutationDTO mutationDTO = getMutationValue(lstWave, finalSampleRate); //获取突变量和RMS值 - if(mutationDTO != null){ - if (mutationDTO.getListRms_Offline().size() > 0 && mutationDTO.getListTBL_Offline().size() > 0) { - lstEigenvalueDTO = getEventValue(lstWave,mutationDTO,comtradeCfgDTO,blType); - } + if (mutationDTO.getListRms_Offline().size() > 0 && mutationDTO.getListTBL_Offline().size() > 0) { + lstEigenvalueDTO = getEventValue(lstWave, mutationDTO, comtradeCfgDTO, blType); } - } - else{ + } else { lstEigenvalueDTO = null; } return lstEigenvalueDTO; } + /*** + * 获取波形文件流,存在则返回inputStream,不存在则返回null + * 为null时,这抛出波形文件不存在异常 + * @author hongawen + * @date 2023/3/3 14:03 + */ + public InputStream getFileInputStreamByFilePath(String filePath) { + File file = new File(filePath); + if (file.isFile() && file.exists()) { + InputStream inputStream; + try { + inputStream = Files.newInputStream(file.toPath()); + if (inputStream.available() < 1) { + throw new BusinessException(EventResponseEnum.WAVE_DATA_INVALID); + } + return inputStream; + } catch (IOException e) { + throw new BusinessException(EventResponseEnum.WAVE_DATA_INVALID); + } + } else { + throw new BusinessException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND); + } + } + /********************************* * 读取cfg方法 * param strFilePath 文件路径 * return 返回bool为是否解析出错 **********************************/ - private String encoding = "GBK"; - private float nFreq;//comtrade频率 WW 2019-11-14 - private BufferedReader bufferedReader; - private InputStreamReader read; - private String strFileLine;// 每行读取内容 - private String[] strTempArray;// 每行读取内容按“,”分割 - //private ComtradeCfgDTO comtradeCfgDTO;//波形文件cfg总类 - private ComtradeCfgDTO getComtradeCfg(File file) { + private ComtradeCfgDTO getComtradeCfg(InputStream cfgStream) { ComtradeCfgDTO comtradeCfgDTO = new ComtradeCfgDTO(); + InputStreamReader read = null; + BufferedReader bufferedReader = null; try { // 将.cfg文件转换为管道流 - // Stream lines = Files.lines(Paths.get(strFilePath)); - read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式 + read = new InputStreamReader(cfgStream, CharsetUtil.CHARSET_GBK); bufferedReader = new BufferedReader(read); - - if (bufferedReader != null) { - nFreq = 0f;//WW 2019-11-14 - // 第一行不关心仅仅是一些描述类的信息 - strFileLine = bufferedReader.readLine(); - // 第二行需要关心第二个(模拟量的个数)和第三个参数(开关量的个数) - strFileLine = bufferedReader.readLine(); - // 按“,”进行分割 - strTempArray = strFileLine.split(","); - // 按“,”进行分割 - for (int i = 0; i < strTempArray.length; i++) { - switch (i) { - case 0:// 总个数 - comtradeCfgDTO.setNChannelNum(Integer.parseInt(strTempArray[i])); - break; - case 1:// 模拟量的个数 - { - String str = strTempArray[i].substring(0, strTempArray[i].length() - 1); - comtradeCfgDTO.setNAnalogNum(Integer.parseInt(str)); - } + //WW 2019-11-14 + float nFreq; + // 第一行不关心仅仅是一些描述类的信息 + String strFileLine = bufferedReader.readLine(); + // 第二行需要关心第二个(模拟量的个数)和第三个参数(开关量的个数) + strFileLine = bufferedReader.readLine(); + // 按“,”进行分割 + String[] strTempArray = strFileLine.split(StrUtil.COMMA); + // 按“,”进行分割 + for (int i = 0; i < strTempArray.length; i++) { + switch (i) { + // 总个数 + case 0: + comtradeCfgDTO.setNChannelNum(Integer.parseInt(strTempArray[i])); break; - case 2:// 开关量的个数 - { - String str = strTempArray[i].substring(0, strTempArray[i].length() - 1); - comtradeCfgDTO.setNDigitalNum(Integer.parseInt(str)); - } + // 模拟量的个数 + case 1: + comtradeCfgDTO.setNAnalogNum(Integer.parseInt(strTempArray[i].substring(0, strTempArray[i].length() - 1))); + break; + // 开关量的个数 + case 2: + comtradeCfgDTO.setNDigitalNum(Integer.parseInt(strTempArray[i].substring(0, strTempArray[i].length() - 1))); + break; + default: break; - } } - - // 从第三行到第ComtradeCfg.nChannelNum + 3行是模拟量通道和数字量通道 - List lstAnalogDTO =new ArrayList<>(); - comtradeCfgDTO.setLstAnalogDTO(lstAnalogDTO); - for (int i = 0; i < comtradeCfgDTO.getNChannelNum(); i++) { - AnalogDTO analogDTO = new AnalogDTO(); - lstAnalogDTO.add(analogDTO); - - strFileLine = bufferedReader.readLine(); - strTempArray = strFileLine.split(","); - // 配置总共13项 - for (int j = 0; j < strTempArray.length; j++) { - switch (j) { - case 0:// 通道序号 - analogDTO.setNIndex(Integer.parseInt(strTempArray[j])); - break; - case 1:// 通道名称 - analogDTO.setSzChannleName(strTempArray[j]); - break; - case 2:// 相位名称 - analogDTO.setSzPhasicName(strTempArray[j]); - break; - case 3:// 监视的通道名称 - analogDTO.setSzMonitoredChannleName(strTempArray[j]); - break; - case 4:// 通道的单位 - analogDTO.setSzUnitName(strTempArray[j]); - break; - case 5:// 通道的系数 - analogDTO.setFCoefficent(Float.parseFloat(strTempArray[j])); - break; - case 6:// 通道的偏移量 - analogDTO.setFOffset(Float.parseFloat(strTempArray[j])); - break; - case 7:// 起始采样时间的偏移量 - analogDTO.setFTimeOffset(Float.parseFloat(strTempArray[j])); - break; - case 8:// 采样值的最小值 - analogDTO.setNMin(Integer.parseInt(strTempArray[j])); - break; - case 9:// 采样值的最大值 - analogDTO.setNMax(Integer.parseInt(strTempArray[j])); - break; - case 10:// 一次变比 - analogDTO.setFPrimary(Float.parseFloat(strTempArray[j])); - break; - case 11:// 二次变比 - analogDTO.setFSecondary(Float.parseFloat(strTempArray[j])); - break; - case 12:// 一次值还是二次值标志 - analogDTO.setSzValueType(strTempArray[j]); - break; - } - } - } - // 采样频率 - strFileLine = bufferedReader.readLine(); - float fFreq = Float.parseFloat(strFileLine); - nFreq = (Float) fFreq;//WW 2019-11-14 - // 获取采样段数 - strFileLine = bufferedReader.readLine(); - int nRates = Integer.parseInt(strFileLine); - comtradeCfgDTO.setNRates(nRates); - // 获得每段的采样率 - List lstRate =new ArrayList<>();//采样率 - long nOffset = 0; - for (int i = 0; i < nRates; i++) { - strFileLine = bufferedReader.readLine(); - strTempArray = strFileLine.split(","); - RateDTO rateDTO = new RateDTO(); - lstRate.add(rateDTO); - for (int j = 0; j < strTempArray.length; j++) { - switch (j) { - case 0:// 单周波采样点数 - rateDTO.setNOneSample((long) (Float.parseFloat(strTempArray[j]) / nFreq));//WW 2019-11-14 - break; - case 1:// 总点数 //这里的strTemp是一个偏移量 - nOffset = (long) (Float.parseFloat(strTempArray[j]) - nOffset); - rateDTO.setNSampleNum(nOffset); - break; - } - } - } - comtradeCfgDTO.setLstRate(lstRate); - - // 增加读取波形起始时间个结束时间 - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS"); - // 波形起始时间 - strFileLine = bufferedReader.readLine(); - strFileLine = strFileLine.substring(0, strFileLine.length() - 3).replace(",", " "); - comtradeCfgDTO.setTimeStart(sdf.parse(strFileLine)); - // 暂态触发时间 - strFileLine = bufferedReader.readLine(); - strFileLine = strFileLine.substring(0, strFileLine.length() - 3).replace(",", " "); - comtradeCfgDTO.setTimeTrige(sdf.parse(strFileLine)); - // 获取触发时间的时间 + 毫秒 - Calendar calendar = Calendar.getInstance(); - calendar.setTime(comtradeCfgDTO.getTimeTrige()); - comtradeCfgDTO.setFirstMs(calendar.get(Calendar.MILLISECOND)); - comtradeCfgDTO.setFirstTime(calendar.getTime()); - - long a = comtradeCfgDTO.getTimeStart().getTime(); - long b = comtradeCfgDTO.getTimeTrige().getTime(); - int c = (int) (b - a); - if (c >= 90 && c <= 110) { - comtradeCfgDTO.setNPush(100); - } else if (c >= 190 && c <= 210) { - comtradeCfgDTO.setNPush(200); - } - // 赋值编码格式(二进制) - strBinType = bufferedReader.readLine().toUpperCase(); - read.close(); - } else { - //未读取到.cfg内容 - log.info("{},未读取到CFG文件内容!",file.getPath()); - comtradeCfgDTO = null; } + + // 从第三行到第ComtradeCfg.nChannelNum + 3行是模拟量通道和数字量通道 + List lstAnalogDTO = new ArrayList<>(); + comtradeCfgDTO.setLstAnalogDTO(lstAnalogDTO); + for (int i = 0; i < comtradeCfgDTO.getNChannelNum(); i++) { + AnalogDTO analogDTO = new AnalogDTO(); + lstAnalogDTO.add(analogDTO); + strFileLine = bufferedReader.readLine(); + strTempArray = strFileLine.split(StrUtil.COMMA); + // 配置总共13项 + for (int j = 0; j < strTempArray.length; j++) { + switch (j) { + // 通道序号 + case 0: + analogDTO.setNIndex(Integer.parseInt(strTempArray[j])); + break; + // 通道名称 + case 1: + analogDTO.setSzChannleName(strTempArray[j]); + break; + // 相位名称 + case 2: + analogDTO.setSzPhasicName(strTempArray[j]); + break; + // 监视的通道名称 + case 3: + analogDTO.setSzMonitoredChannleName(strTempArray[j]); + break; + // 通道的单位 + case 4: + analogDTO.setSzUnitName(strTempArray[j]); + break; + // 通道的系数 + case 5: + analogDTO.setFCoefficent(Float.parseFloat(strTempArray[j])); + break; + // 通道的偏移量 + case 6: + analogDTO.setFOffset(Float.parseFloat(strTempArray[j])); + break; + // 起始采样时间的偏移量 + case 7: + analogDTO.setFTimeOffset(Float.parseFloat(strTempArray[j])); + break; + // 采样值的最小值 + case 8: + analogDTO.setNMin(Integer.parseInt(strTempArray[j])); + break; + // 采样值的最大值 + case 9: + analogDTO.setNMax(Integer.parseInt(strTempArray[j])); + break; + // 一次变比 + case 10: + analogDTO.setFPrimary(Float.parseFloat(strTempArray[j])); + break; + // 二次变比 + case 11: + analogDTO.setFSecondary(Float.parseFloat(strTempArray[j])); + break; + // 一次值还是二次值标志 + case 12: + analogDTO.setSzValueType(strTempArray[j]); + break; + default: + break; + } + } + } + //WW 2019-11-14 // 采样频率 + nFreq = Float.parseFloat(bufferedReader.readLine()); + // 获取采样段数 + strFileLine = bufferedReader.readLine(); + int nRates = Integer.parseInt(strFileLine); + comtradeCfgDTO.setNRates(nRates); + // 获得每段的采样率 //采样率 + List lstRate = new ArrayList<>(); + long nOffset = 0; + for (int i = 0; i < nRates; i++) { + strFileLine = bufferedReader.readLine(); + strTempArray = strFileLine.split(StrUtil.COMMA); + RateDTO rateDTO = new RateDTO(); + // 单周波采样点数 //WW 2019-11-14 + rateDTO.setNOneSample((long) (Float.parseFloat(strTempArray[0]) / nFreq)); + // 总点数 //这里的strTemp是一个偏移量 + rateDTO.setNSampleNum((long) (Float.parseFloat(strTempArray[1]) - nOffset)); + lstRate.add(rateDTO); + } + comtradeCfgDTO.setLstRate(lstRate); + // 增加读取波形起始时间个结束时间 + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS"); + // 波形起始时间 + strFileLine = bufferedReader.readLine(); + strFileLine = strFileLine.substring(0, strFileLine.length() - 3).replace(StrUtil.COMMA, StrUtil.SPACE); + comtradeCfgDTO.setTimeStart(sdf.parse(strFileLine)); + // 暂态触发时间 + strFileLine = bufferedReader.readLine(); + strFileLine = strFileLine.substring(0, strFileLine.length() - 3).replace(StrUtil.COMMA, StrUtil.SPACE); + comtradeCfgDTO.setTimeTrige(sdf.parse(strFileLine)); + // 获取触发时间的时间 + 毫秒 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(comtradeCfgDTO.getTimeTrige()); + comtradeCfgDTO.setFirstMs(calendar.get(Calendar.MILLISECOND)); + comtradeCfgDTO.setFirstTime(calendar.getTime()); + + long a = comtradeCfgDTO.getTimeStart().getTime(); + long b = comtradeCfgDTO.getTimeTrige().getTime(); + int c = (int) (b - a); + if (c >= 90 && c <= 110) { + comtradeCfgDTO.setNPush(100); + } else if (c >= 190 && c <= 210) { + comtradeCfgDTO.setNPush(200); + } + // 赋值编码格式(二进制) + comtradeCfgDTO.setStrBinType(bufferedReader.readLine().toUpperCase()); } catch (Exception e) { // 解析.cfg文件出错 - log.info("{},解析CFG文件出错!",file.getPath()); comtradeCfgDTO = null; + } finally { + try { + bufferedReader.close(); + } catch (IOException e) { + throw new BusinessException(CommonResponseEnum.CLOSE_RESOURCE_ERROR); + } + try { + read.close(); + } catch (IOException e) { + throw new BusinessException(CommonResponseEnum.CLOSE_RESOURCE_ERROR); + } } return comtradeCfgDTO; } @@ -480,60 +516,50 @@ public class AnalyWave { * param iType 访问波形类型 * List> 返回波形瞬时值 **********************************/ - private List> getComtradeDat(ComtradeCfgDTO comtradeCfgDTO,String strFilePath, int iType) { - List> listWaveData = new ArrayList<>();//返回数据 + private List> getComtradeDat(ComtradeCfgDTO comtradeCfgDTO, InputStream datStream, int iType) { + //返回数据 + List> listWaveData = new ArrayList<>(); // 波形文件路径由 .cfg 换成 .dat - String strDatFilePath = getDatFilePath(strFilePath); - float xValueAll = 0;//初始化xValue的值 - boolean blxValue = false;//判断是否首次登陆 - byte[] Array; + //初始化xValue的值 + float xValueAll = 0; + //判断是否首次登陆 + boolean blxValue = false; + byte[] datArray; try { - //读取本地文件 - File file = new File(strDatFilePath); - // 判断文件是否存在 - if (file.isFile() && file.exists()) { - Array = new byte[(int) file.length()]; - FileInputStream readFile = null; - try { - readFile = new FileInputStream(file); - readFile.read(Array, 0, Array.length); - } catch (IOException e) { - // TODO 读取DAT文件失败 - } - finally { - if (readFile != null) { - //PubUtils.safeClose(readFile,"安全关闭读取CFG文件失败,异常为:"); - } - } - } else { - // TODO 找不到DAT文件 + datArray = IoUtil.readBytes(datStream); + if (ArrayUtil.isEmpty(datArray)) { return listWaveData; } - - // 计算每个单独的数据块的大小 4字节的序号 4字节的时间 2字节的值 - // 示例中的排布是 4字节的序号 4字节的时间 UA(2字节) UB(2字节) UC(2字节) IA(2字节) IB(2字节) IC(2字节) - int nDigSize = (comtradeCfgDTO.getNDigitalNum() % 16) > 0 ? (comtradeCfgDTO.getNDigitalNum() / 16 + 1) * 2: comtradeCfgDTO.getNDigitalNum() / 16 * 2; + // 计算每个单独的数据块的大小 4个字节的序号 4个字节的时间 2个字节的值 + // 示例中的排布是 4个字节的序号 4个字节的时间 UA(2字节) UB(2字节) UC(2字节) IA(2字节) IB(2字节) IC(2字节) + int nDigSize = (comtradeCfgDTO.getNDigitalNum() % 16) > 0 ? (comtradeCfgDTO.getNDigitalNum() / 16 + 1) * 2 : comtradeCfgDTO.getNDigitalNum() / 16 * 2; int nBlockSize = 2 * Integer.SIZE / 8 + comtradeCfgDTO.getNAnalogNum() * 2 + nDigSize; - int nBlockNum = Array.length / nBlockSize;// 总长度除以每个快的大小 - long finalSampleRate = getFinalWaveSample(comtradeCfgDTO.getLstRate(),iType);// 获取采样率 - if (finalSampleRate != -1){ - comtradeCfgDTO.setFinalSampleRate(finalSampleRate);//设置最终采样率 - - int nnInd = 0;// 计算转换后的采样率 - long nWaveNum = 0;// 抽点后总共多少点数据 - List newLstRate = new ArrayList<>();//抽点后新的的采样率 + // 总长度除以每个快的大小 + int nBlockNum = datArray.length / nBlockSize; + // 获取采样率 + long finalSampleRate = getFinalWaveSample(comtradeCfgDTO.getLstRate(), iType); + if (finalSampleRate != -1) { + //设置最终采样率 + comtradeCfgDTO.setFinalSampleRate(finalSampleRate); + // 计算转换后的采样率 + int nnInd = 0; + // 抽点后总共多少点数据 + long nWaveNum; + //抽点后新的的采样率 + List newLstRate = new ArrayList<>(); for (int iRate = 0; iRate < comtradeCfgDTO.getNRates(); iRate++) { if (comtradeCfgDTO.getLstRate().get(iRate).getNOneSample() >= 32) { // 计算本段录波总共有多少波形 nWaveNum = comtradeCfgDTO.getLstRate().get(iRate).getNSampleNum() / comtradeCfgDTO.getLstRate().get(iRate).getNOneSample(); - comtradeCfgDTO.setNAllWaveNum(comtradeCfgDTO.getNAllWaveNum() + nWaveNum);//设置总波形大小 + //设置总波形大小 + comtradeCfgDTO.setNAllWaveNum(comtradeCfgDTO.getNAllWaveNum() + nWaveNum); // 将最低采样率替换到本段录波内 RateDTO tmpRateDTO = new RateDTO(); newLstRate.add(tmpRateDTO); //iFlag =3 一定不进行抽点算法 - if(iType !=3) { + if (iType != 3) { //true 抽点算法(当前采样率跟统一采样率不一样则是抽点,否则是未抽点) - if (comtradeCfgDTO.getLstRate().get(iRate).getNOneSample() != comtradeCfgDTO.getFinalSampleRate()) { + if (!Objects.equals(comtradeCfgDTO.getLstRate().get(iRate).getNOneSample(), comtradeCfgDTO.getFinalSampleRate())) { newLstRate.get(nnInd).setNOneSample(comtradeCfgDTO.getFinalSampleRate()); // 计算本段录波按照最低采样点应该有多少录波 newLstRate.get(nnInd).setNSampleNum(comtradeCfgDTO.getFinalSampleRate() * nWaveNum); @@ -542,7 +568,7 @@ public class AnalyWave { // 计算本段录波按照最低采样点应该有多少录波 newLstRate.get(nnInd).setNSampleNum(comtradeCfgDTO.getLstRate().get(iRate).getNOneSample() * nWaveNum); } - } else{ + } else { newLstRate.get(nnInd).setNOneSample(comtradeCfgDTO.getLstRate().get(iRate).getNOneSample()); // 计算本段录波按照最低采样点应该有多少录波 newLstRate.get(nnInd).setNSampleNum(comtradeCfgDTO.getLstRate().get(iRate).getNOneSample() * nWaveNum); @@ -554,13 +580,15 @@ public class AnalyWave { nnInd++; } } - - long nOffSet = 0,nWaveSpan = 0;// 偏移量,采样间隔 - float fValue = 0f,dfValue = 0f;//两个点之间的时间差 - int nIndex = 0;// 计算不同块的采样率 + // 偏移量,采样间隔 + long nOffSet = 0, nWaveSpan; + //两个点之间的时间差 + float fValue, dfValue; + // 计算不同块的采样率 + int nIndex = 0; // 将最低采样率替换到本段录波内 - RateDTO tmpRateDTO = new RateDTO();// .CFG中采样率 - + // .CFG中采样率 + RateDTO tmpRateDTO; // nBlockNum 总循环次数 for (int i = 0; i < nBlockNum; i++) { tmpRateDTO = comtradeCfgDTO.getLstRate().get(nIndex); @@ -570,55 +598,56 @@ public class AnalyWave { if (i == tmpRateDTO.getNSampleNum() + nOffSet) { nOffSet += tmpRateDTO.getNSampleNum(); nIndex++; - if (nIndex == nnInd) + if (nIndex == nnInd) { break; + } } dfValue = (float) 20 / tmpRateDTO.getNOneSample(); // 判断是否到了需要抽的采样点 if (i % nWaveSpan == 0) { // 计算每个通道的值 - List tmpWaveData = new ArrayList();//存储局部数据集合,包含了时间,A,B,C三相 - AnalogDTO tmpAnalogDTO =new AnalogDTO(); + //存储局部数据集合,包含了时间,A,B,C三相 + List tmpWaveData = new ArrayList<>(); + AnalogDTO tmpAnalogDTO; for (int j = 0; j < comtradeCfgDTO.getNAnalogNum(); j++) { tmpAnalogDTO = comtradeCfgDTO.getLstAnalogDTO().get(j); - //数据只有电压ABC三相数据,不展示U0、I0等数据 YXB2020-10-09 去除相别为N相的数据 - if (tmpAnalogDTO.getSzPhasicName().toUpperCase().equals("N")) + if ("N".equalsIgnoreCase(tmpAnalogDTO.getSzPhasicName())) { break; - - float fCoef = tmpAnalogDTO.getFCoefficent(); - fValue = BitConverter.byte2ToUnsignedShort(Array, i * nBlockSize + 2 * 4 + j * 2) * fCoef; - - //WW 2019-11-14 - if (tmpAnalogDTO.getSzValueType().toUpperCase().equals("S"))//P是一次值 S是二次值 - { - if (tmpAnalogDTO.getSzUnitName().toUpperCase().equals("KV"))//判断单位是V还是kV - fValue = fValue*1000.0f; - else - fValue = fValue; } - else if (tmpAnalogDTO.getSzValueType().toUpperCase().equals("P"))//P是一次值 S是二次值 - { - if (tmpAnalogDTO.getSzUnitName().toUpperCase().equals("V"))//判断单位是V还是kV - { - if (tmpAnalogDTO.getFPrimary() != 0.0f)//根据cfg内的变比,将一次值转换成二次值 + float fCoef = tmpAnalogDTO.getFCoefficent(); + fValue = BitConverter.byte2ToUnsignedShort(datArray, i * nBlockSize + 2 * 4 + j * 2) * fCoef; + + //WW 2019-11-14//P是一次值 S是二次值 + if ("S".equalsIgnoreCase(tmpAnalogDTO.getSzValueType())) { + //判断单位是V还是kV + if ("KV".equalsIgnoreCase(tmpAnalogDTO.getSzUnitName())) { + fValue = fValue * 1000.0f; + } + } + //P是一次值 S是二次值 + else if ("P".equalsIgnoreCase(tmpAnalogDTO.getSzValueType())) { + //判断单位是V还是kV + if ("V".equalsIgnoreCase(tmpAnalogDTO.getSzUnitName())) { + //根据cfg内的变比,将一次值转换成二次值 + if (tmpAnalogDTO.getFPrimary() != 0.0f) { fValue = fValue * tmpAnalogDTO.getFSecondary() / tmpAnalogDTO.getFPrimary(); - else - fValue = fValue; + } + } - else if(tmpAnalogDTO.getSzUnitName().toUpperCase().equals("KV"))//判断单位是V还是kV - { - if (tmpAnalogDTO.getFPrimary() != 0.0f)//根据cfg内的变比,将一次值转换成二次值 + //判断单位是V还是kV + else if ("KV".equalsIgnoreCase(tmpAnalogDTO.getSzUnitName())) { + //根据cfg内的变比,将一次值转换成二次值 + if (tmpAnalogDTO.getFPrimary() != 0.0f) { fValue = fValue * 1000.0f * tmpAnalogDTO.getFSecondary() / tmpAnalogDTO.getFPrimary(); - else - fValue = fValue; + } } - else //还有可能是电流,单位是A - { - if (tmpAnalogDTO.getFPrimary() != 0.0f)//根据cfg内的变比,将一次值转换成二次值 + //还有可能是电流,单位是A + else { + //根据cfg内的变比,将一次值转换成二次值 + if (tmpAnalogDTO.getFPrimary() != 0.0f) { fValue = tmpAnalogDTO.getFSecondary() / tmpAnalogDTO.getFPrimary(); - else - fValue= fValue; + } } } @@ -628,124 +657,49 @@ public class AnalyWave { if (!blxValue && j == 0) { xValueAll = (float) (i * 20) / tmpRateDTO.getNOneSample() - comtradeCfgDTO.getNPush(); blxValue = true; - //只增加一个xValue的值 - tmpWaveData.add((float) (Math.round(xValueAll * 100)) / 100);//增加时间值 + //只增加一个xValue的值 //增加时间值 + tmpWaveData.add((float) (Math.round(xValueAll * 100)) / 100); } else if (j == 0) { xValueAll += (float) nWaveSpan * dfValue; - //只增加一个xValue的值 - tmpWaveData.add((float) (Math.round(xValueAll * 100)) / 100);//增加时间值 + //只增加一个xValue的值 //增加时间值 + tmpWaveData.add((float) (Math.round(xValueAll * 100)) / 100); } - //不同通道yValue的值都需要增加,最终成ABC三相 - tmpWaveData.add((float) (Math.round(fValue * 100)) / 100);//每个通道的值 + //不同通道yValue的值都需要增加,最终成ABC三相 //每个通道的值 + tmpWaveData.add((float) (Math.round(fValue * 100)) / 100); } - listWaveData.add(tmpWaveData);//把每个单独的值赋予到整体里面去 + //把每个单独的值赋予到整体里面去 + listWaveData.add(tmpWaveData); } } } } catch (Exception e) { - // TODO 读取文件出错 - return listWaveData; + throw new BusinessException(EventResponseEnum.DAT_DATA_ERROR); } return listWaveData; } - /********************************* - * 获取波形标题的方法 - * param tmpComtradeCfgDTO 文件路径 - * return 返回List返回数据格式说明 - **********************************/ - private List getWaveTitle(ComtradeCfgDTO comtradeCfgDTO){ - //编辑数据标题 YXB2020-10-09 去除相别为N相的数据//存储数据标题 - List tmpWaveTitle = new ArrayList<>(); - // 模拟量通道记录类 - AnalogDTO analogDTO = new AnalogDTO(); - tmpWaveTitle.add("Time"); - String strUnit = "U"; - for (int j = 0; j lstRate,int iType) { - long nFinalOneSample = -1;// 最终返回采样率 - long nMinOneSample = -1;// 最小采样率 - if(lstRate.size() > 0){ - nMinOneSample = lstRate.get(0).getNOneSample(); - long tmpOneSample = 0; - for (int i = 0; i < lstRate.size(); i++) { - tmpOneSample = lstRate.get(i).getNOneSample(); + private long getFinalWaveSample(List lstRate, int iType) { + // 最终返回采样率 + long nFinalOneSample = -1; + // 最小采样率 + long nMinOneSample = -1; + if (lstRate.size() > 0) { + nMinOneSample = lstRate.get(0).getNOneSample(); + long tmpOneSample; + for (RateDTO rateDTO : lstRate) { + tmpOneSample = rateDTO.getNOneSample(); if (tmpOneSample >= 32) { - if (nMinOneSample > tmpOneSample) + if (nMinOneSample > tmpOneSample) { nMinOneSample = tmpOneSample; + } } } } @@ -755,7 +709,7 @@ public class AnalyWave { * iFlag == 2 App抽点要求,采样率抽点成32 * iFlag == 3 高级算法原始波形(大于32) ********************************************************/ - switch (iType){ + switch (iType) { case 0: if (nMinOneSample < 32) { nFinalOneSample = 32; @@ -763,15 +717,10 @@ public class AnalyWave { nFinalOneSample = 128; } break; - case 1: - nFinalOneSample = nMinOneSample; - break; case 2: nFinalOneSample = 32; break; - case 3: - nFinalOneSample = nMinOneSample; - break; + default: nFinalOneSample = nMinOneSample; break; @@ -780,20 +729,22 @@ public class AnalyWave { return nFinalOneSample; } + /********************************* * 离线波形导入时获取突变量算法 * param tmpListWave 波形原始数据 * param finalSampleRate 最终采样率 **********************************/ - private MutationDTO getMutationValue(List> lstWave,float finalSampleRate) { - MutationDTO mutationDTO =new MutationDTO(); + private MutationDTO getMutationValue(List> lstWave, float finalSampleRate) { + MutationDTO mutationDTO = new MutationDTO(); // 计算有效值 double fSumA = 0.0, fSumB = 0.0, fSumC = 0.0; - double fValidA = 0.0, fValidB = 0.0, fValidC = 0.0; + double fValidA, fValidB, fValidC; double fValue = 0.0; - int HalfTs = (int) finalSampleRate;// 全波有效值 ; (int)fs / 2;//半波有效值 + // 全波有效值 ; (int)fs / 2;//半波有效值 + int HalfTs = (int) finalSampleRate; //瞬时波形数据_瞬时---前推周波的值_瞬时----周波的值_突变量----前推周波的值_突变量 - List tmpRealValue,forwardRealValue,tblValue,forwardTblValue; + List tmpRealValue, forwardRealValue, tblValue, forwardTblValue; // 计算有效值算法 for (int i = 0; i < lstWave.size(); i++) { //获取每一项的值 @@ -813,10 +764,13 @@ public class AnalyWave { } // 计算突变量值 List tmpTblValue = new ArrayList<>(); - tmpTblValue.add(tmpRealValue.get(0));//获取时间 + //获取时间 + tmpTblValue.add(tmpRealValue.get(0)); if (i >= HalfTs) { - tblValue = lstWave.get(i);//获取前推周波的值 - forwardTblValue = lstWave.get(i - HalfTs);//获取前推周波的值 + //获取前推周波的值 + tblValue = lstWave.get(i); + //获取前推周波的值 + forwardTblValue = lstWave.get(i - HalfTs); tmpTblValue.add(tblValue.get(1) - forwardTblValue.get(1)); tmpTblValue.add(tblValue.get(2) - forwardTblValue.get(2)); tmpTblValue.add(tblValue.get(3) - forwardTblValue.get(3)); @@ -830,15 +784,18 @@ public class AnalyWave { fValidC = Math.sqrt(fSumC / HalfTs); if (i >= finalSampleRate) { - if (fValidA < mutationDTO.getFMinMagA()) + if (fValidA < mutationDTO.getFMinMagA()) { mutationDTO.setFMinMagA(fValidA); - if (fValidB < mutationDTO.getFMinMagB()) + } + if (fValidB < mutationDTO.getFMinMagB()) { mutationDTO.setFMinMagB(fValidB); - if (fValidC < mutationDTO.getFMinMagC()) + } + if (fValidC < mutationDTO.getFMinMagC()) { mutationDTO.setFMinMagC(fValidC); + } } - //RMS获取 - tmpRmsValue.add(tmpRealValue.get(0));//获取时间 + //RMS获取//获取时间 + tmpRmsValue.add(tmpRealValue.get(0)); tmpRmsValue.add((float) fValidA); tmpRmsValue.add((float) fValidB); tmpRmsValue.add((float) fValidC); @@ -860,13 +817,13 @@ public class AnalyWave { * param blType 计算方式 * List> 返回暂降数据 **********************************/ - private List getEventValue(List> lstWave,MutationDTO mutationDTO,ComtradeCfgDTO comtradeCfgDTO, boolean blType) { + private List getEventValue(List> lstWave, MutationDTO mutationDTO, ComtradeCfgDTO comtradeCfgDTO, boolean blType) { List> tblWave = mutationDTO.getListTBL_Offline(); List> rmstWave = mutationDTO.getListRms_Offline(); //额定电压 float fBase = 57.74f; - //假如所选的是380V,那么PT变比是1:1,因此额定电压要选220 - List lstAnalogDTO = comtradeCfgDTO.getLstAnalogDTO();//模拟量通道记录 + //假如所选的是380V,那么PT变比是1:1,因此额定电压要选220 //模拟量通道记录 + List lstAnalogDTO = comtradeCfgDTO.getLstAnalogDTO(); if (lstAnalogDTO.size() > 0) { if (lstAnalogDTO.get(0).getFPrimary() / lstAnalogDTO.get(0).getFSecondary() <= 1) { fBase = 220f; @@ -880,10 +837,13 @@ public class AnalyWave { * 2额定定压(动态电压) * 3是持续时间 **********************************/ - List lstEigenvalueDTO = new ArrayList<>();//ABC三相分析结果 + //ABC三相分析结果 + List lstEigenvalueDTO = new ArrayList<>(); for (int i = 0; i < 3; i++) { - int iDDY = 0, iGDY = 0;//低电压和郭电压标识值 - EigenvalueDTO eigenvalueDTO = new EigenvalueDTO();//某一项分析结果 + //低电压和郭电压标识值 + int iDDY = 0, iGDY; + //某一项分析结果 + EigenvalueDTO eigenvalueDTO = new EigenvalueDTO(); iDDY = App_Disturb_DDY1(lstWave, tblWave, rmstWave, nSJ, i, blType); if (Disturb_Val == 0 && Disturb_SJ == 0) { //判断A相的暂态事件类型是否为短时中断或电压暂降 @@ -891,19 +851,27 @@ public class AnalyWave { if (iGDY != 0) { if (Disturb_Val != 0) { if (blType) { - eigenvalueDTO.setAmplitude(Disturb_Val / rmstWave.get(nSJ + 2).get(i + 1));//征幅值(残余电压百分比) - eigenvalueDTO.setResidualVoltage(Disturb_Val);//特征幅值(残余电压) - eigenvalueDTO.setRatedVoltage(rmstWave.get(nSJ + 2).get(i + 1));//额定定压(动态电压) + //征幅值(残余电压百分比) + eigenvalueDTO.setAmplitude(Disturb_Val / rmstWave.get(nSJ + 2).get(i + 1)); + //特征幅值(残余电压) + eigenvalueDTO.setResidualVoltage(Disturb_Val); + //额定定压(动态电压) + eigenvalueDTO.setRatedVoltage(rmstWave.get(nSJ + 2).get(i + 1)); } else { - eigenvalueDTO.setAmplitude(Disturb_Val / 57.74f);//征幅值(残余电压百分比) - eigenvalueDTO.setResidualVoltage(Disturb_Val);//特征幅值(残余电压) - eigenvalueDTO.setRatedVoltage(57.74f);//额定定压(动态电压) + //征幅值(残余电压百分比) + eigenvalueDTO.setAmplitude(Disturb_Val / 57.74f); + //特征幅值(残余电压) + eigenvalueDTO.setResidualVoltage(Disturb_Val); + //额定定压(动态电压) + eigenvalueDTO.setRatedVoltage(57.74f); } } - } else//如果都没有找到,那么需要从曲线里面找出比较小的值来计算 - { + } + //如果都没有找到,那么需要从曲线里面找出比较小的值来计算 + else { double rate = 0f; - double residualVoltage = 0.f;//残余电压 + //残余电压 + double residualVoltage = 0.f; switch (i) { case 0: residualVoltage = mutationDTO.getFMinMagA(); @@ -914,43 +882,71 @@ public class AnalyWave { case 2: residualVoltage = mutationDTO.getFMinMagC(); break; + default: + break; } if (residualVoltage != -1) { rate = residualVoltage / fBase > 1 ? 1.0f : residualVoltage / fBase; } - eigenvalueDTO.setAmplitude((float) rate);//征幅值(残余电压百分比) - eigenvalueDTO.setResidualVoltage((float) residualVoltage);//特征幅值(残余电压) - eigenvalueDTO.setRatedVoltage(fBase);//额定定压(动态电压) + //征幅值(残余电压百分比) + eigenvalueDTO.setAmplitude((float) rate); + //特征幅值(残余电压) + eigenvalueDTO.setResidualVoltage((float) residualVoltage); + //额定定压(动态电压) + eigenvalueDTO.setRatedVoltage(fBase); } } else { if (Disturb_Val != 0) { - if (Disturb_Val != 0) { - if (blType) { - eigenvalueDTO.setAmplitude(Disturb_Val / rmstWave.get(nSJ + 2).get(i + 1));//征幅值(残余电压百分比) - eigenvalueDTO.setResidualVoltage(Disturb_Val);//特征幅值(残余电压) - eigenvalueDTO.setRatedVoltage(rmstWave.get(nSJ + 2).get(i + 1));//额定定压(动态电压) - } else { - eigenvalueDTO.setAmplitude(Disturb_Val / 57.74f);//征幅值(残余电压百分比) - eigenvalueDTO.setResidualVoltage(Disturb_Val);//特征幅值(残余电压) - eigenvalueDTO.setRatedVoltage(57.74f);//额定定压(动态电压) - } + if (blType) { + //征幅值(残余电压百分比) + eigenvalueDTO.setAmplitude(Disturb_Val / rmstWave.get(nSJ + 2).get(i + 1)); + //特征幅值(残余电压) + eigenvalueDTO.setResidualVoltage(Disturb_Val); + //额定定压(动态电压) + eigenvalueDTO.setRatedVoltage(rmstWave.get(nSJ + 2).get(i + 1)); + } else { + //征幅值(残余电压百分比) + eigenvalueDTO.setAmplitude(Disturb_Val / 57.74f); + //特征幅值(残余电压) + eigenvalueDTO.setResidualVoltage(Disturb_Val); + //额定定压(动态电压) + eigenvalueDTO.setRatedVoltage(57.74f); } } } - eigenvalueDTO.setDurationTime(Disturb_SJ / nSJ * 20.0f);//持续时间 + //持续时间 + eigenvalueDTO.setDurationTime(Disturb_SJ / nSJ * 20.0f); lstEigenvalueDTO.add(eigenvalueDTO); } return lstEigenvalueDTO; } - private float Disturb_Val = 0;//暂降幅值 - private double Disturb_Time = 0;//持续时间 - private float Disturb_SJ = 0;//暂态启动点号 + /*** + * 暂降幅值 + */ + private float Disturb_Val = 0; + /*** + * 持续时间 + */ + private double Disturb_Time = 0; + /*** + * 暂态启动点号 + */ + private float Disturb_SJ = 0; - private float Un09 = (0.90f * 57.74f);//暂降幅值90% - private float Un002 = (0.02f * 57.74f);//暂降幅值2% - private float Un110 = (1.10f * 57.74f);//暂降幅值110% + /*** + * 暂降幅值90% + */ + private float Un09 = (0.90f * 57.74f); + /*** + * 暂降幅值2% + */ + private float Un002 = (0.02f * 57.74f); + /*** + * 暂降幅值110% + */ + private float Un110 = (1.10f * 57.74f); /************************************ *低电压的判据 包含了暂降和中断 @@ -1007,13 +1003,13 @@ public class AnalyWave { for (int j = 0; j < nHalfSJ; j++) { //临时的突变量 ADC = tblWave.get(i - nHalfSJ + j).get(nType + 1); - //临时的突变量小于0时候取绝对值 + //临时的突变量小于0的时候取绝对值 if (ADC < 0) { ADC = 0 - ADC; } if (ADC > fUN002) { Disturb_SJ += (nHalfSJ - j); - iTbl = (int) (i - nHalfSJ + j); + iTbl = (i - nHalfSJ + j); break; } } @@ -1035,12 +1031,13 @@ public class AnalyWave { iFlag = j; //临时的突变量 ADC = tblWave.get(i - nHalfSJ + j).get(nType + 1); - //临时的突变量小于0时候取绝对值 + //临时的突变量小于0的时候取绝对值 if (ADC < 0) { ADC = 0 - ADC; } - if (ADC > fUN002) + if (ADC > fUN002) { break; + } } Disturb_SJ -= (nHalfSJ - iFlag); Disturb_Time = ((double) Disturb_SJ) * 20 / nSJ; @@ -1048,9 +1045,13 @@ public class AnalyWave { } else { Disturb_SJ++; ADC = realWave.get(i).get(nType + 1); - if (ADC < 0) ADC = 0 - ADC; + if (ADC < 0) { + ADC = 0 - ADC; + } temp = rmsValue - Disturb_JS_Val; - if (temp < 0) temp = 0 - temp; + if (temp < 0) { + temp = 0 - temp; + } if ((ADC > 100) && (temp < 0.1)) { Disturb_SJ -= (nHalfSJ + 1); Disturb_Time = ((double) Disturb_SJ) * 20 / nSJ + 1; @@ -1064,6 +1065,7 @@ public class AnalyWave { return iTbl; } + /************************************ *过电压的判据 * @param realWave 原始波形数据 @@ -1134,8 +1136,9 @@ public class AnalyWave { else { if (rmsValue > (fUN110 - fUN002)) { Disturb_SJ++; - if (Disturb_Val < rmsValue) + if (Disturb_Val < rmsValue) { Disturb_Val = rmsValue; + } Disturb_JS_Val = rmsValue; } else { if (Disturb_SJ >= (nSJ + nHalfSJ)) { @@ -1143,9 +1146,12 @@ public class AnalyWave { for (int j = 0; j < nHalfSJ; j++) { iFlag = j; ADC = tblWave.get(i - nHalfSJ + j).get(nType + 1); - if (ADC < 0) ADC = 0 - ADC; - if (ADC > fUN002) + if (ADC < 0) { + ADC = 0 - ADC; + } + if (ADC > fUN002) { break; + } } Disturb_SJ -= (nHalfSJ - iFlag); Disturb_Time = (double) Disturb_SJ * 20 / nSJ; @@ -1153,9 +1159,13 @@ public class AnalyWave { } else { Disturb_SJ++; ADC = realWave.get(i).get(nType + 1); - if (ADC < 0) ADC = 0 - ADC; + if (ADC < 0) { + ADC = 0 - ADC; + } temp = rmsValue - Disturb_JS_Val; - if (temp < 0) temp = 0 - temp; + if (temp < 0) { + temp = 0 - temp; + } if ((ADC > 100) && (temp < 0.1)) { Disturb_SJ -= (nHalfSJ + 1); Disturb_Time = Disturb_SJ * 20 / nSJ + 1; @@ -1170,6 +1180,79 @@ public class AnalyWave { } + /********************************* + * 获取波形标题的方法 + * param tmpComtradeCfgDTO 文件路径 + * return 返回List返回数据格式说明 + **********************************/ + private List getWaveTitle(ComtradeCfgDTO comtradeCfgDTO) { + //编辑数据标题 YXB2020-10-09 去除相别为N相的数据//存储数据标题 + List tmpWaveTitle = new ArrayList<>(); + // 模拟量通道记录类 + AnalogDTO analogDTO; + tmpWaveTitle.add("Time"); + String strUnit; + for (int j = 0; j < comtradeCfgDTO.getNAnalogNum(); j++) { + analogDTO = comtradeCfgDTO.getLstAnalogDTO().get(j); + // 假如为N相则跳过 + if (!StrUtil.equals(analogDTO.getSzPhasicName().toUpperCase(), "N")) { + if ("A".equalsIgnoreCase(analogDTO.getSzUnitName())) { + strUnit = "I"; + } else { + strUnit = "U"; + } + tmpWaveTitle.add(strUnit + analogDTO.getSzPhasicName().toUpperCase() + "相"); + } + } + return tmpWaveTitle; + } + + /********************************* + * 由.cfg 路径更换成 .dat + * param strFilePath 文件路径 + * return String返回.dat文件的路径 + **********************************/ + private String getDatFilePath(String strFilePath) { + String strDatFilePath; + //替换前的 + String strOriginally = ".cfg"; + //替换后的 + String strReplace = ".dat"; + //截取.之后字符串 + String strIntercept = strFilePath.substring(strFilePath.lastIndexOf(".") + 1); + switch (strIntercept) { + case "cfg": + strOriginally = ".cfg"; + strReplace = ".dat"; + break; + case "CFG": + strOriginally = ".CFG"; + strReplace = ".DAT"; + break; + case "Cfg": + strOriginally = ".Cfg"; + strReplace = ".Dat"; + break; + case "CFg": + strOriginally = ".CFg"; + strReplace = ".DAt"; + break; + case "cFg": + strOriginally = ".cFg"; + strReplace = ".dAt"; + break; + case "cFG": + strOriginally = ".cFG"; + strReplace = ".dAT"; + break; + default: + break; + } + //把.cfg换成.dat + strDatFilePath = strFilePath.replace(strOriginally, strReplace); + return strDatFilePath; + } + public static void main(String[] args) { /******************************************************** * iFlag == 0 高级算法的要求,采样率只能是32-128 @@ -1179,24 +1262,25 @@ public class AnalyWave { ********************************************************/ /** 输出格式: 2014-5-05 00:00:00 大写H为24小时制 */ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String s = null; + String s; Date d = new Date(); s = sdf.format(d); System.out.println(s); - - AnalyWave analyWave = new AnalyWave(); - // 获取瞬时波形 - WaveDataDTO waveDataDTO = analyWave.getComtrade("D:\\Comtrade\\00-B7-8D-00-EA-4A\\PQMonitor_PQM1_001341_20220627_063159_104_WAV.CFG", 1);//获取原始波形值 + WaveUtil waveUtil = new WaveUtil(); + InputStream cfgStream = waveUtil.getFileInputStreamByFilePath("D:\\comtrade\\00-B7-8D-00-B7-25\\1_20200629_164016_234.CFG"); + InputStream datStream = waveUtil.getFileInputStreamByFilePath("D:\\comtrade\\00-B7-8D-00-B7-25\\1_20200629_164016_234.DAT"); + // 获取瞬时波形 //获取原始波形值 + WaveDataDTO waveDataDTO = waveUtil.getComtrade(cfgStream,datStream, 1); d = new Date(); s = sdf.format(d); System.out.println(s); // 获取RMS波形 - WaveDataDTO waveDataDTO1 = analyWave.getValidData(waveDataDTO); + WaveDataDTO waveDataDTO1 = waveUtil.getValidData(waveDataDTO); d = new Date(); s = sdf.format(d); System.out.println(s); // 获取特征值 - List lstEigenvalueDTO = analyWave.getEigenvalue(waveDataDTO,true); - String str = ""; + List lstEigenvalueDTO = waveUtil.getEigenvalue(waveDataDTO, true); } + } diff --git a/pqs-event/event-boot/src/main/resources/bootstrap.yml b/pqs-event/event-boot/src/main/resources/bootstrap.yml index 3ebf023df..185a07259 100644 --- a/pqs-event/event-boot/src/main/resources/bootstrap.yml +++ b/pqs-event/event-boot/src/main/resources/bootstrap.yml @@ -44,3 +44,4 @@ mybatis-plus: type-aliases-package: com.njcn.event.pojo mqtt: client-id: @artifactId@${random.value} + diff --git a/pqs-event/event-boot/src/test/java/com/njcn/event/EventBootApplicationTest.java b/pqs-event/event-boot/src/test/java/com/njcn/event/EventBootApplicationTest.java index 44ba22767..8a62afc3e 100644 --- a/pqs-event/event-boot/src/test/java/com/njcn/event/EventBootApplicationTest.java +++ b/pqs-event/event-boot/src/test/java/com/njcn/event/EventBootApplicationTest.java @@ -1,8 +1,14 @@ package com.njcn.event; +import com.njcn.common.pojo.constant.OssPath; +import com.njcn.event.enums.EventResponseEnum; import com.njcn.event.pojo.PqsEventDetail; import com.njcn.event.pojo.PqsOnlinerateAggregate; import com.njcn.event.pojo.PqsEventDetailCount; +import com.njcn.event.pojo.dto.wave.EigenvalueDTO; +import com.njcn.event.pojo.dto.wave.WaveDataDTO; +import com.njcn.event.utils.WaveUtil; +import com.njcn.huawei.obs.util.OBSUtil; import com.njcn.influxdb.config.InfluxDbConfig; import com.njcn.influxdb.utils.InfluxDbUtils; import org.influxdb.dto.QueryResult; @@ -20,8 +26,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.util.Arrays; +import java.util.Date; import java.util.List; +import java.util.Objects; import static com.njcn.influxdb.param.InfluxDBPublicParam.PQS_EVENT_DETAIL; @@ -39,79 +51,85 @@ public class EventBootApplicationTest { @Autowired private InfluxDbUtils influxDbUtils; - + + @Autowired + private WaveUtil waveUtil; + + @Autowired + private OBSUtil obsUtil; + // TODO https://github.com/influxdata/influxdb-java/blob/master/QUERY_BUILDER.md - + @Test public void queryList() { // or 条件数据 List clauses = getClauses(); - + SelectQueryImpl selectQuery = select().column("line_id").column("eventass_index").from(influxDbConfig.getDatabase(), PQS_EVENT_DETAIL); WhereQueryImpl where = selectQuery.where(); - + // WHERE (line_id = '1' OR line_id = '2' OR line_id = '3') 加上前后() whereAndNested(clauses, where); - + // AND time >= '2022-05-01T00:00:00Z' AND time <= '2022-09-01T00:00:00Z' tz('Asia/Shanghai'); where.and(gte("time", "2022-05-01T00:00:00Z")).and(lte("time", "2022-09-01T00:00:00Z")); where.tz("Asia/Shanghai"); - + QueryResult result = influxDbUtils.query(selectQuery.getCommand()); InfluxDBResultMapper influxDBResultMapper = new InfluxDBResultMapper(); List re = influxDBResultMapper.toPOJO(result, PqsEventDetail.class); Assert.assertTrue(re.size() > 0); } - + @Test public void queryCount() { // or 条件数据 List clauses = getClauses(); - + SelectQueryImpl selectQuery = select().count("eventass_index").from(influxDbConfig.getDatabase(), PQS_EVENT_DETAIL); WhereQueryImpl where = selectQuery.where(); - + // WHERE (line_id = '1' OR line_id = '2' OR line_id = '3') 加上前后() whereAndNested(clauses, where); - + // AND time >= '2022-05-01T00:00:00Z' AND time <= '2022-09-01T00:00:00Z' tz('Asia/Shanghai'); where.and(gte("time", "2022-05-01T00:00:00Z")).and(lte("time", "2022-09-01T00:00:00Z")); where.tz("Asia/Shanghai"); - + QueryResult result = influxDbUtils.query(selectQuery.getCommand()); InfluxDBResultMapper influxDBResultMapper = new InfluxDBResultMapper(); List re = influxDBResultMapper.toPOJO(result, PqsEventDetailCount.class); Assert.assertTrue(re.size() > 0); } - + @Test public void queryAggregate() { - + // SELECT (SUM(onlinemin) / (SUM(onlinemin) + SUM(offlinemin))) * 100 FROM pqs_onlinerate SelectionQueryImpl select = select(); SelectionQueryImpl sum = select.op(op(sum("onlinemin"), "/", op(sum("onlinemin"), "+", sum("offlinemin"))), "*", 100) .as("value"); SelectQueryImpl selectQuery = sum.from(influxDbConfig.getDatabase(), "pqs_onlinerate"); WhereQueryImpl where = selectQuery.where(); - + // AND time >= '2022-05-01T00:00:00Z' AND time <= '2022-09-01T00:00:00Z' tz('Asia/Shanghai'); where.and(gte("time", "2022-05-01T00:00:00Z")).and(lte("time", "2022-09-01T00:00:00Z")); where.tz("Asia/Shanghai"); - + QueryResult result = influxDbUtils.query(selectQuery.getCommand()); InfluxDBResultMapper influxDBResultMapper = new InfluxDBResultMapper(); List re = influxDBResultMapper.toPOJO(result, PqsOnlinerateAggregate.class); Assert.assertTrue(re.size() > 0); } - + private List getClauses() { Clause c1 = eq("line_id", "5e467a40023b299070682eb21f2ec9a1"); Clause c2 = eq("line_id", "183245996f303ebfd80eeb3377cecdc2"); Clause c3 = eq("line_id", "0d46f54420246e999d5c68b3133f668c"); - + return Arrays.asList(c1, c2, c3); } - + private void whereAndNested(List clauses, WhereQueryImpl whereQuery) { WhereNested> andNested = whereQuery.andNested(); for (Clause clause : clauses) { @@ -119,5 +137,29 @@ public class EventBootApplicationTest { } andNested.close(); } - + + @Test + public void testHuaweiOBS() throws FileNotFoundException { + + String cfgPath = OssPath.WAVE_DIR+"192.168.1.190/PQMonitor_PQM1_002438_20210508_092859_938.CFG"; + String datPath = OssPath.WAVE_DIR+"192.168.1.190/PQMonitor_PQM1_002438_20210508_092859_938.DAT"; + + InputStream cfgStream =obsUtil.fileDownload(cfgPath); + InputStream datStream =obsUtil.fileDownload(datPath); + + if(Objects.isNull(cfgStream) || Objects.isNull(datStream)){ + throw new FileNotFoundException(EventResponseEnum.ANALYSEWAVE_NOT_FOUND.getMessage()); + } + + // 获取瞬时波形 //获取原始波形值 + WaveDataDTO waveDataDTO = waveUtil.getComtrade(cfgStream,datStream, 1); + + // 获取RMS波形 + WaveDataDTO waveDataDTO1 = waveUtil.getValidData(waveDataDTO); + + // 获取特征值 + List lstEigenvalueDTO = waveUtil.getEigenvalue(waveDataDTO, true); + System.out.println(1); + } + } diff --git a/pqs-harmonic/harmonic-boot/pom.xml b/pqs-harmonic/harmonic-boot/pom.xml index 1b768d0f9..b5f166343 100644 --- a/pqs-harmonic/harmonic-boot/pom.xml +++ b/pqs-harmonic/harmonic-boot/pom.xml @@ -97,6 +97,13 @@ spring-boot-configuration-processor true + + + + com.njcn + huawei-obs-springboot-starter + ${project.version} + diff --git a/pqs-job/job-executor/src/test/java/Test1.java b/pqs-job/job-executor/src/test/java/Test1.java index 4ad8689ad..c56d3c2de 100644 --- a/pqs-job/job-executor/src/test/java/Test1.java +++ b/pqs-job/job-executor/src/test/java/Test1.java @@ -33,7 +33,7 @@ public class Test1 extends BaseJunitTest{ @Test public void testMethod(){ - InfluxDbUtils influxDBUtil = new InfluxDbUtils(influxDbConfig.getUserName(), influxDbConfig.getPassword(), influxDbConfig.getInfluxDBUrl(), influxDbConfig.getDatabase(), ""); + InfluxDbUtils influxDBUtil = new InfluxDbUtils(influxDbConfig.getUser(), influxDbConfig.getPassword(), influxDbConfig.getUrl(), influxDbConfig.getDatabase(), ""); SelectQueryImpl selectQuery = select().from(influxDbConfig.getDatabase(),"data_flicker").where(eq("fluc",0)).limit(1).tz("Asia/Shanghai"); WhereQueryImpl where = selectQuery.where(); QueryResult queryResult = influxDBUtil.query(selectQuery.getCommand());