From 20c72b06712e8f2f123ae323a00cc30fe44f7f97 Mon Sep 17 00:00:00 2001
From: hongawen <83944980@qq.com>
Date: Mon, 4 Dec 2023 09:37:09 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 11 +
.../file/component/WaveFileComponent.java | 204 +++++++-----------
.../event/file/pojo/dto/ComtradeCfgDTO.java | 17 +-
.../com/njcn/event/file/pojo/dto/RateDTO.java | 4 +-
.../file/pojo/enums/WaveFileResponseEnum.java | 3 +-
pqs-device/device-boot/pom.xml | 10 +-
6 files changed, 110 insertions(+), 139 deletions(-)
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