diff --git a/pom.xml b/pom.xml index a9b377258..7361066b7 100644 --- a/pom.xml +++ b/pom.xml @@ -108,6 +108,7 @@ 1.2.7 4.4.0 1.7.0-Hoxton + 1.2.83 @@ -390,6 +391,16 @@ influxdb-java ${influxdb-java.version} + + com.alibaba + fastjson + ${fastjson.version} + + + org.apache.logging.log4j + log4j-api + 2.18.0 + diff --git a/pqs-common/common-event/src/main/java/com/njcn/event/file/component/WaveFileComponent.java b/pqs-common/common-event/src/main/java/com/njcn/event/file/component/WaveFileComponent.java index ffd11d814..538892136 100644 --- a/pqs-common/common-event/src/main/java/com/njcn/event/file/component/WaveFileComponent.java +++ b/pqs-common/common-event/src/main/java/com/njcn/event/file/component/WaveFileComponent.java @@ -48,8 +48,9 @@ public class WaveFileComponent { ComtradeCfgDTO comtradeCfgDTO = getComtradeCfg(cfgStream); // 为空或者未找到结束符号 if (comtradeCfgDTO == null || !"BINARY".equalsIgnoreCase(comtradeCfgDTO.getStrBinType())) { - return waveDataDTO; + throw new BusinessException(WaveFileResponseEnum.CFG_DATA_ERROR); } + /*****根据通道号计算相别** add by yexb -----Start**** * 1、判断是否是3的倍数,是3的倍数则是3相 * 2、假如不是3的倍数 ,是1的倍数则是单相 @@ -59,16 +60,22 @@ public class WaveFileComponent { } else { comtradeCfgDTO.setNPhasic(1); } - // 给相别幅值 + + // 给相别数量赋值 waveDataDTO.setIPhasic(comtradeCfgDTO.getNPhasic()); + // 组装解析抬头 - getWaveTitle(waveDataDTO,comtradeCfgDTO); + getWaveTitle(waveDataDTO, comtradeCfgDTO); + // 解析.dat文件 List> listWaveData = getComtradeDat(comtradeCfgDTO, datStream, iType); + waveDataDTO.setComtradeCfgDTO(comtradeCfgDTO); + waveDataDTO.setListWaveData(listWaveData); + //add by hongawen,将暂态触发起始时间记录下来 - waveDataDTO.setTime(DateUtil.format(comtradeCfgDTO.getFirstTime(), DatePattern.NORM_DATETIME_PATTERN).concat(StrPool.DOT)+comtradeCfgDTO.getFirstMs()); + waveDataDTO.setTime(DateUtil.format(comtradeCfgDTO.getTimeTrige(),DatePattern.NORM_DATETIME_MS_PATTERN)); /*****根据通道号计算相别** add by yexb -----end****/ return waveDataDTO; @@ -298,7 +305,7 @@ public class WaveFileComponent { // 瞬时波形值 List> lstWave = waveDataDTO.getListWaveData(); //获取最终采样率 - Long finalSampleRate = comtradeCfgDTO.getFinalSampleRate(); + int finalSampleRate = comtradeCfgDTO.getFinalSampleRate(); // 返回值 List lstEigenvalueDTO = new ArrayList<>(); @@ -321,7 +328,7 @@ public class WaveFileComponent { * @author hongawen * @date 2023/3/3 14:03 */ - public InputStream getFileInputStreamByFilePath(String filePath) { + public InputStream getFileInputStreamByFilePath(String filePath) { File file = new File(filePath); if (file.isFile() && file.exists()) { InputStream inputStream; @@ -346,41 +353,25 @@ public class WaveFileComponent { **********************************/ private ComtradeCfgDTO getComtradeCfg(InputStream cfgStream) { ComtradeCfgDTO comtradeCfgDTO = new ComtradeCfgDTO(); - InputStreamReader read = null; - BufferedReader bufferedReader = null; - try { - // 将.cfg文件转换为管道流 - read = new InputStreamReader(cfgStream, CharsetUtil.CHARSET_GBK); - bufferedReader = new BufferedReader(read); - //WW 2019-11-14 - float nFreq; + try ( + InputStreamReader read = new InputStreamReader(cfgStream, CharsetUtil.CHARSET_GBK); + BufferedReader bufferedReader = new BufferedReader(read); + ) { // 第一行不关心仅仅是一些描述类的信息 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 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; - } - } + // 总个数 + comtradeCfgDTO.setNChannelNum(Integer.parseInt(strTempArray[0])); + // 模拟量的个数 + comtradeCfgDTO.setNAnalogNum(Integer.parseInt(strTempArray[1].substring(0, strTempArray[1].length() - 1))); + // 开关量的个数 + comtradeCfgDTO.setNDigitalNum(Integer.parseInt(strTempArray[2].substring(0, strTempArray[2].length() - 1))); - // 从第三行到第ComtradeCfg.nChannelNum + 3行是模拟量通道和数字量通道 + // 从第三行开始的ComtradeCfg.nChannelNum行是模拟量通道和数字量通道 List lstAnalogDTO = new ArrayList<>(); comtradeCfgDTO.setLstAnalogDTO(lstAnalogDTO); for (int i = 0; i < comtradeCfgDTO.getNChannelNum(); i++) { @@ -388,104 +379,76 @@ public class WaveFileComponent { 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; - } - } + //通道序号 + analogDTO.setNIndex(Integer.parseInt(strTempArray[0])); + // 通道名称 + analogDTO.setSzChannleName(strTempArray[1]); + // 相位名称 + analogDTO.setSzPhasicName(strTempArray[2]); + // 监视的通道名称 + analogDTO.setSzMonitoredChannleName(strTempArray[3]); + // 通道的单位 + analogDTO.setSzUnitName(strTempArray[4]); + // 通道的系数 + analogDTO.setFCoefficent(Float.parseFloat(strTempArray[5])); + // 通道的偏移量 + analogDTO.setFOffset(Float.parseFloat(strTempArray[6])); + // 起始采样时间的偏移量 + analogDTO.setFTimeOffset(Float.parseFloat(strTempArray[7])); + // 采样值的最小值 + analogDTO.setNMin(Integer.parseInt(strTempArray[8])); + // 采样值的最大值 + analogDTO.setNMax(Integer.parseInt(strTempArray[9])); + // 一次变比 + analogDTO.setFPrimary(Float.parseFloat(strTempArray[10])); + // 二次变比 + analogDTO.setFSecondary(Float.parseFloat(strTempArray[11])); + // 一次值还是二次值标志 + analogDTO.setSzValueType(strTempArray[12]); } + //WW 2019-11-14 // 采样频率 - nFreq = Float.parseFloat(bufferedReader.readLine()); + int nFreq = Integer.parseInt(bufferedReader.readLine()); + // 获取采样段数 strFileLine = bufferedReader.readLine(); int nRates = Integer.parseInt(strFileLine); comtradeCfgDTO.setNRates(nRates); // 获得每段的采样率 //采样率 List lstRate = new ArrayList<>(); - long nOffset = 0; + int 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)); + rateDTO.setNOneSample((Integer.parseInt(strTempArray[0]) / nFreq)); // 总点数 //这里的strTemp是一个偏移量 - rateDTO.setNSampleNum((long) (Float.parseFloat(strTempArray[1]) - nOffset)); + rateDTO.setNSampleNum((Integer.parseInt(strTempArray[1]) - nOffset)); lstRate.add(rateDTO); } comtradeCfgDTO.setLstRate(lstRate); // 增加读取波形起始时间个结束时间 - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS"); + String timeFormat = "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 = strFileLine.substring(0, strFileLine.length() - 3); + comtradeCfgDTO.setTimeStart(DateUtil.parse(strFileLine, timeFormat)); + // 暂态触发时间 strFileLine = bufferedReader.readLine(); - strFileLine = strFileLine.substring(0, strFileLine.length() - 3).replace(StrUtil.COMMA, StrUtil.SPACE); - comtradeCfgDTO.setTimeTrige(sdf.parse(strFileLine)); + strFileLine = strFileLine.substring(0, strFileLine.length() - 3); + comtradeCfgDTO.setTimeTrige(DateUtil.parse(strFileLine, timeFormat)); + // 获取触发时间的时间 + 毫秒 - Calendar calendar = Calendar.getInstance(); - calendar.setTime(comtradeCfgDTO.getTimeTrige()); + Calendar calendar = DateUtil.calendar(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); @@ -497,17 +460,6 @@ public class WaveFileComponent { } catch (Exception e) { // 解析.cfg文件出错 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; } @@ -520,9 +472,8 @@ public class WaveFileComponent { * List> 返回波形瞬时值 **********************************/ private List> getComtradeDat(ComtradeCfgDTO comtradeCfgDTO, InputStream datStream, int iType) { - //返回数据 + //返回数据,如果仅仅做展示后期考虑换String类型,降低内存开销 List> listWaveData = new ArrayList<>(); - // 波形文件路径由 .cfg 换成 .dat //初始化xValue的值 float xValueAll = 0; //判断是否首次登陆 @@ -531,23 +482,24 @@ public class WaveFileComponent { try { datArray = IoUtil.readBytes(datStream); if (ArrayUtil.isEmpty(datArray)) { - return listWaveData; + throw new BusinessException(WaveFileResponseEnum.DAT_DATA_ERROR); } // 计算每个单独的数据块的大小 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 = datArray.length / nBlockSize; + // 获取采样率 - long finalSampleRate = getFinalWaveSample(comtradeCfgDTO.getLstRate(), iType); + int finalSampleRate = getFinalWaveSample(comtradeCfgDTO.getLstRate(), iType); if (finalSampleRate != -1) { //设置最终采样率 comtradeCfgDTO.setFinalSampleRate(finalSampleRate); // 计算转换后的采样率 int nnInd = 0; // 抽点后总共多少点数据 - long nWaveNum; + int nWaveNum; //抽点后新的的采样率 List newLstRate = new ArrayList<>(); for (int iRate = 0; iRate < comtradeCfgDTO.getNRates(); iRate++) { @@ -689,14 +641,14 @@ public class WaveFileComponent { * @param lstRate cfg中关于采样率参数 * @return 返回最小采样率 **********************************/ - private long getFinalWaveSample(List lstRate, int iType) { + private int getFinalWaveSample(List lstRate, int iType) { // 最终返回采样率 - long nFinalOneSample = -1; + int nFinalOneSample = -1; // 最小采样率 - long nMinOneSample = -1; + int nMinOneSample = -1; if (lstRate.size() > 0) { nMinOneSample = lstRate.get(0).getNOneSample(); - long tmpOneSample; + int tmpOneSample; for (RateDTO rateDTO : lstRate) { tmpOneSample = rateDTO.getNOneSample(); if (tmpOneSample >= 32) { @@ -1276,7 +1228,7 @@ public class WaveFileComponent { InputStream cfgStream = waveFileComponent.getFileInputStreamByFilePath("D:\\comtrade\\00-B7-8D-00-B7-25\\1_20200629_164016_234.CFG"); InputStream datStream = waveFileComponent.getFileInputStreamByFilePath("D:\\comtrade\\00-B7-8D-00-B7-25\\1_20200629_164016_234.DAT"); // 获取瞬时波形 //获取原始波形值 - WaveDataDTO waveDataDTO = waveFileComponent.getComtrade(cfgStream,datStream, 1); + WaveDataDTO waveDataDTO = waveFileComponent.getComtrade(cfgStream, datStream, 1); d = new Date(); s = sdf.format(d); System.out.println(s); diff --git a/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/ComtradeCfgDTO.java b/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/ComtradeCfgDTO.java index 185ba122f..dca9c5e46 100644 --- a/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/ComtradeCfgDTO.java +++ b/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/ComtradeCfgDTO.java @@ -1,5 +1,8 @@ package com.njcn.event.file.pojo.dto; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -18,14 +21,15 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class ComtradeCfgDTO implements Serializable { - private Integer nChannelNum; - private Integer nPhasic;// 模拟量通道的个数 yxb 2020-12-15 + private Integer nChannelNum;//总个数 + private Integer nPhasic;// 相别的个数 yxb 2020-12-15 private Integer nAnalogNum;// 模拟量通道的个数 WW 2013-05-15 - private Integer nDigitalNum;// 数字量通道的个数 WW 2013-05-15 + private Integer nDigitalNum;// 开关量的个数 WW 2013-05-15 private Date timeStart;// 暂态记录时间 yxb 2022-06-06 private Date timeTrige;// 暂态触发时间 yxb 2022-06-06 private List lstAnalogDTO;//模拟量通道记录 + private List lstDigitalDTO;//数字量通道记录 public Integer nRates;//对应采样次数 @@ -38,13 +42,16 @@ public class ComtradeCfgDTO implements Serializable { // 波形前推周波束 private Integer nPush = 0; // 最终采样率,计算的时候只用一个采样率 - private Long finalSampleRate; + private Integer finalSampleRate; // 整个波形大小 - private Long nAllWaveNum = 0L; + private Integer nAllWaveNum = 0; /*** * 赋值编码格式(二进制) */ private String strBinType; + public static void main(String[] args) { + System.out.println(0/16); + } } diff --git a/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/RateDTO.java b/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/RateDTO.java index 169428e09..68aec4c68 100644 --- a/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/RateDTO.java +++ b/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/dto/RateDTO.java @@ -18,7 +18,7 @@ import java.io.Serializable; public class RateDTO implements Serializable { // 1秒钟内的采样点数 - private Long nOneSample; + private Integer nOneSample; // 总采样点数 - private Long nSampleNum; + private Integer nSampleNum; } diff --git a/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/enums/WaveFileResponseEnum.java b/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/enums/WaveFileResponseEnum.java index a59138b21..373849ae4 100644 --- a/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/enums/WaveFileResponseEnum.java +++ b/pqs-common/common-event/src/main/java/com/njcn/event/file/pojo/enums/WaveFileResponseEnum.java @@ -17,7 +17,8 @@ public enum WaveFileResponseEnum { EVENT_NOT_FOUND("A00651","暂降事件或监测点不存在"), ANALYSE_WAVE_NOT_FOUND("A00652","波形文件找不到"), WAVE_DATA_INVALID("A00654","波形文件数据缺失"), - DAT_DATA_ERROR("A00653","dat文件数据读取失败"), + CFG_DATA_ERROR("A00653","CFG文件解析有误"), + DAT_DATA_ERROR("A00653","DAT文件数据读取失败"), RMS_DATA_ERROR("A00653","rms数据读取失败"), COMPOSE_PIC_ERROR("A00653","合成波形图失败"), ; diff --git a/pqs-device/device-boot/pom.xml b/pqs-device/device-boot/pom.xml index 164509511..afe8857d4 100644 --- a/pqs-device/device-boot/pom.xml +++ b/pqs-device/device-boot/pom.xml @@ -26,11 +26,11 @@ pq-device-boot ${project.version} - + + + + + com.njcn