添加暂态事件波形图后台绘图并保存文件服务器
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -45,3 +45,6 @@ rebel.xml
|
||||
|
||||
!DmJdbcDriver18.jar
|
||||
!kingbase8-8.6.0.jar
|
||||
/.fastRequest/collections/Root/Default Group/directory.json
|
||||
/.fastRequest/collections/Root/directory.json
|
||||
/.fastRequest/config/fastRequestCurrentProjectConfig.json
|
||||
|
||||
2
pqs-common/common-event/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
2
pqs-common/common-event/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
|
||||
36
pqs-common/common-event/pom.xml
Normal file
36
pqs-common/common-event/pom.xml
Normal file
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>pqs-common</artifactId>
|
||||
<groupId>com.njcn</groupId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>common-event</artifactId>
|
||||
<name>common-event</name>
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>common-core</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>common-echarts</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>common-oss</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
|
||||
</project>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,152 @@
|
||||
package com.njcn.event.file.component;
|
||||
|
||||
import cn.hutool.core.img.ImgUtil;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.util.CharsetUtil;
|
||||
import com.njcn.common.pojo.exception.BusinessException;
|
||||
import com.njcn.common.utils.FileUtil;
|
||||
import com.njcn.echarts.util.DrawPicUtil;
|
||||
import com.njcn.event.file.pojo.bo.WaveDataDetail;
|
||||
import com.njcn.event.file.pojo.dto.WaveDataDTO;
|
||||
import com.njcn.event.file.pojo.enums.WaveFileResponseEnum;
|
||||
import com.njcn.oss.constant.OssPath;
|
||||
import com.njcn.oss.utils.FileStorageUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import sun.awt.image.BufferedImageGraphicsConfig;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2023年09月21日 09:18
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class WavePicComponent {
|
||||
|
||||
private final DrawPicUtil drawPicUtil;
|
||||
|
||||
private final FileStorageUtil fileStorageUtil;
|
||||
|
||||
/***
|
||||
* 绘制瞬时波形图
|
||||
* @author hongawen
|
||||
* @date 2023/9/21 15:32
|
||||
* @return String 文件地址
|
||||
*/
|
||||
public String generateImageShun(WaveDataDTO waveDataDTO, List<WaveDataDetail> waveDataDetails) {
|
||||
String picPath = null;
|
||||
String time = waveDataDTO.getTime();
|
||||
String title = "监测点名称:" + waveDataDTO.getMonitorName() + " 发生时刻:" + time;
|
||||
WaveDataDetail waveDataDetail = waveDataDetails.get(0);
|
||||
String firstPic = drawPicUtil.drawWavePic(title, waveDataDetail.getInstantData().getAValue(),
|
||||
waveDataDetail.getInstantData().getBValue(), waveDataDetail.getInstantData().getCValue(),
|
||||
waveDataDetail.getUnit(), waveDataDetail.getInstantData().getMax(), waveDataDetail.getInstantData().getMin(),
|
||||
waveDataDetail.getA(), waveDataDetail.getB(), waveDataDetail.getC(),
|
||||
waveDataDetail.getColors(), waveDataDetail.getIsOpen()
|
||||
);
|
||||
String secondPic;
|
||||
if (waveDataDetails.size() == 1) {
|
||||
//将图片上传到minioss
|
||||
InputStream instantStream = IoUtil.toStream(firstPic, CharsetUtil.UTF_8);
|
||||
picPath = fileStorageUtil.uploadStream(instantStream, OssPath.EVENT_WAVE_PIC, FileUtil.generateFileName("png"));
|
||||
} else if (waveDataDetails.size() == 2) {
|
||||
//绘制第二个电压瞬时波形图
|
||||
waveDataDetail = waveDataDetails.get(1);
|
||||
secondPic = drawPicUtil.drawWavePic("", waveDataDetail.getInstantData().getAValue(),
|
||||
waveDataDetail.getInstantData().getBValue(), waveDataDetail.getInstantData().getCValue(),
|
||||
waveDataDetail.getUnit(), waveDataDetail.getInstantData().getMax(), waveDataDetail.getInstantData().getMin(),
|
||||
waveDataDetail.getA(), waveDataDetail.getB(), waveDataDetail.getC(),
|
||||
waveDataDetail.getColors(), waveDataDetail.getIsOpen()
|
||||
);
|
||||
picPath = composeImage(firstPic, secondPic);
|
||||
}
|
||||
return picPath;
|
||||
}
|
||||
|
||||
/***
|
||||
* 绘制RMS波形图
|
||||
* @author hongawen
|
||||
* @date 2023/9/21 15:32
|
||||
* @return String 文件地址
|
||||
*/
|
||||
public String generateImageRms(WaveDataDTO waveDataDTO, List<WaveDataDetail> waveDataDetails) {
|
||||
String picPath = null;
|
||||
String time = waveDataDTO.getTime();
|
||||
String title = "监测点名称:" + waveDataDTO.getMonitorName() + " 发生时刻:" + time;
|
||||
WaveDataDetail waveDataDetail = waveDataDetails.get(0);
|
||||
String firstPic = drawPicUtil.drawWavePic(title, waveDataDetail.getRmsData().getAValue(),
|
||||
waveDataDetail.getRmsData().getBValue(), waveDataDetail.getRmsData().getCValue(),
|
||||
waveDataDetail.getUnit(), waveDataDetail.getRmsData().getMax(), waveDataDetail.getRmsData().getMin(),
|
||||
waveDataDetail.getA(), waveDataDetail.getB(), waveDataDetail.getC(),
|
||||
waveDataDetail.getColors(), waveDataDetail.getIsOpen()
|
||||
);
|
||||
String secondPic;
|
||||
if (waveDataDetails.size() == 1) {
|
||||
//将图片上传到minioss
|
||||
InputStream instantStream = IoUtil.toStream(firstPic, CharsetUtil.UTF_8);
|
||||
picPath = fileStorageUtil.uploadStream(instantStream, OssPath.EVENT_WAVE_PIC, FileUtil.generateFileName("png"));
|
||||
} else if (waveDataDetails.size() == 2) {
|
||||
//绘制第二个电压瞬时波形图
|
||||
waveDataDetail = waveDataDetails.get(1);
|
||||
secondPic = drawPicUtil.drawWavePic("", waveDataDetail.getRmsData().getAValue(),
|
||||
waveDataDetail.getRmsData().getBValue(), waveDataDetail.getRmsData().getCValue(),
|
||||
waveDataDetail.getUnit(), waveDataDetail.getRmsData().getMax(), waveDataDetail.getRmsData().getMin(),
|
||||
waveDataDetail.getA(), waveDataDetail.getB(), waveDataDetail.getC(),
|
||||
waveDataDetail.getColors(), waveDataDetail.getIsOpen()
|
||||
);
|
||||
picPath = composeImage(firstPic, secondPic);
|
||||
}
|
||||
return picPath;
|
||||
}
|
||||
|
||||
/***
|
||||
* 合成图片
|
||||
* @author hongawen
|
||||
* @date 2023/9/21 15:33
|
||||
* @param firstPic 第一张图
|
||||
* @param secondPic 第二张图
|
||||
* @return String
|
||||
*/
|
||||
private String composeImage(String firstPic, String secondPic) {
|
||||
try {
|
||||
//第一张图片 base64截取删除前缀data:image/png;base64,
|
||||
BufferedImage imageOne = ImgUtil.toBufferedImage(ImgUtil.toImage(firstPic.substring(22)), ImgUtil.IMAGE_TYPE_PNG);
|
||||
int width = imageOne.getWidth();
|
||||
int height = imageOne.getHeight();
|
||||
int[] imageArrayOne = new int[width * height];
|
||||
imageArrayOne = imageOne.getRGB(0, 0, width, height, imageArrayOne, 0, width);
|
||||
//第二张图片 base64截取删除前缀data:image/png;base64,
|
||||
BufferedImage imageTwo = ImgUtil.toBufferedImage(ImgUtil.toImage(secondPic.substring(22)), ImgUtil.IMAGE_TYPE_PNG);
|
||||
int width2 = imageTwo.getWidth();
|
||||
int height2 = imageTwo.getHeight();
|
||||
int[] ImageArrayTwo = new int[width2 * height2];
|
||||
ImageArrayTwo = imageTwo.getRGB(0, 0, width, height, ImageArrayTwo, 0, width);
|
||||
//新图片
|
||||
BufferedImage imageNew = new BufferedImage(width, height * 2, BufferedImage.TYPE_INT_RGB);
|
||||
BufferedImageGraphicsConfig config = BufferedImageGraphicsConfig.getConfig(imageNew);
|
||||
imageNew = config.createCompatibleImage(width, height * 2, Transparency.TRANSLUCENT);
|
||||
imageNew.setRGB(0, 0, width, height, imageArrayOne, 0, width);
|
||||
imageNew.setRGB(0, height, width, height, ImageArrayTwo, 0, width);
|
||||
String resultImg = ImgUtil.toBase64(imageNew, ImgUtil.IMAGE_TYPE_PNG);
|
||||
byte[] bytes = Base64.getDecoder().decode(resultImg);
|
||||
return fileStorageUtil.uploadStream(new ByteArrayInputStream(bytes), OssPath.EVENT_WAVE_PIC, FileUtil.generateFileName("png"));
|
||||
} catch (Exception e) {
|
||||
throw new BusinessException(WaveFileResponseEnum.COMPOSE_PIC_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.njcn.event.file.pojo.bo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2023年09月20日 16:11
|
||||
*/
|
||||
@Data
|
||||
public class InstantData {
|
||||
|
||||
private Float max;
|
||||
|
||||
private Float min;
|
||||
|
||||
List<List<Float>> aValue =new ArrayList<>();
|
||||
|
||||
List<List<Float>> bValue =new ArrayList<>();
|
||||
|
||||
List<List<Float>> cValue =new ArrayList<>();
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.njcn.event.file.pojo.bo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2023年09月20日 16:12
|
||||
*/
|
||||
@Data
|
||||
public class RmsData {
|
||||
|
||||
private Float max;
|
||||
|
||||
private Float min;
|
||||
|
||||
List<List<Float>> aValue =new ArrayList<>();
|
||||
|
||||
List<List<Float>> bValue =new ArrayList<>();
|
||||
|
||||
List<List<Float>> cValue =new ArrayList<>();
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.njcn.event.file.pojo.bo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2023年09月20日 16:13
|
||||
*/
|
||||
@Data
|
||||
public class WaveDataDetail {
|
||||
|
||||
private InstantData instantData;
|
||||
|
||||
private RmsData rmsData;
|
||||
|
||||
private String a ="A相";
|
||||
|
||||
private String b ="B相";
|
||||
|
||||
private String c ="C相";
|
||||
|
||||
private String unit;
|
||||
|
||||
private Boolean isOpen = false;
|
||||
|
||||
private String title;
|
||||
|
||||
private List<String> colors= new ArrayList<>();
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* 模拟量通道记录类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class AnalogDTO implements Serializable {
|
||||
|
||||
// 通道序号
|
||||
private Integer nIndex;
|
||||
// 通道名称
|
||||
private String szChannleName;
|
||||
// 相位名称
|
||||
private String szPhasicName;
|
||||
// 监视的通道名称
|
||||
private String szMonitoredChannleName;
|
||||
// 通道的单位
|
||||
private String szUnitName;
|
||||
// 通道的系数
|
||||
private Float fCoefficent;
|
||||
// 通道的便宜量
|
||||
private Float fOffset;
|
||||
// 起始采样时间的偏移量
|
||||
private Float fTimeOffset;
|
||||
// 采样值的最小值
|
||||
private Integer nMin;
|
||||
// 采样值的最大值
|
||||
private Integer nMax;
|
||||
// 一次变比
|
||||
private Float fPrimary;
|
||||
// 二次变比
|
||||
private Float fSecondary;
|
||||
// 一次值还是二次值标志
|
||||
private String szValueType;
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* CFG配置文件总类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class ComtradeCfgDTO implements Serializable {
|
||||
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 Date timeStart;// 暂态记录时间 yxb 2022-06-06
|
||||
private Date timeTrige;// 暂态触发时间 yxb 2022-06-06
|
||||
|
||||
private List<AnalogDTO> lstAnalogDTO;//模拟量通道记录
|
||||
private List<DigitalDTO> lstDigitalDTO;//数字量通道记录
|
||||
|
||||
public Integer nRates;//对应采样次数
|
||||
public List<RateDTO> lstRate;//采样率合集
|
||||
|
||||
// add by sw 暂降触发时间
|
||||
private Date firstTime; // 暂降触发第一次
|
||||
private Integer firstMs; // 暂降触发第一次毫秒
|
||||
|
||||
// 波形前推周波束
|
||||
private Integer nPush = 0;
|
||||
// 最终采样率,计算的时候只用一个采样率
|
||||
private Long finalSampleRate;
|
||||
// 整个波形大小
|
||||
private Long nAllWaveNum = 0L;
|
||||
|
||||
/***
|
||||
* 赋值编码格式(二进制)
|
||||
*/
|
||||
private String strBinType;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* 数字量通道记录类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class DigitalDTO implements Serializable {
|
||||
|
||||
// 通道序号
|
||||
private Integer nIndex;
|
||||
// 通道名称
|
||||
private String szChannleName;
|
||||
// 相位名称
|
||||
private String szPhasicName;
|
||||
// 监视的通道名称
|
||||
private String szMonitoredChannleName;
|
||||
// 通道的单位
|
||||
private Integer Initial;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* 特征值计算类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class EigenvalueDTO implements Serializable {
|
||||
|
||||
//是特征幅值(残余电压百分比)
|
||||
private float amplitude;
|
||||
//是特征幅值(残余电压)
|
||||
private float residualVoltage;
|
||||
//额定定压(动态电压)
|
||||
private float ratedVoltage;
|
||||
//持续时间
|
||||
private float durationTime;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* 突变量计算类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MutationDTO implements Serializable {
|
||||
|
||||
private List<List<Float>> listRms_Offline = new ArrayList<>();//离线数据RMS有效值数据
|
||||
private List<List<Float>> listTBL_Offline = new ArrayList<>();//离线数据突变量数据
|
||||
private double fMinMagA = 99999d;
|
||||
private double fMinMagB = 99999d;
|
||||
private double fMinMagC = 99999d;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* 采样率类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class RateDTO implements Serializable {
|
||||
|
||||
// 1秒钟内的采样点数
|
||||
private Long nOneSample;
|
||||
// 总采样点数
|
||||
private Long nSampleNum;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.njcn.event.file.pojo.dto;
|
||||
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yxb
|
||||
* @version 1.0.0
|
||||
* @date 2022年06月02日 20:03
|
||||
* 返回波形数据类
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class WaveDataDTO implements Serializable {
|
||||
|
||||
//CFG实体类
|
||||
private ComtradeCfgDTO comtradeCfgDTO;
|
||||
//波形对应的标题
|
||||
private List<String> waveTitle;
|
||||
//波形对应的值
|
||||
private List<List<Float>> listWaveData;
|
||||
//波形RMS值
|
||||
private List<List<Float>> listRmsData;
|
||||
//RMS最小值
|
||||
private List<List<Float>> listRmsMinData;
|
||||
//波形对应的相别数量
|
||||
private Integer iPhasic;
|
||||
//接线方式(0.星型接法;1.三角型接法;2.开口三角型接法)
|
||||
private Integer ptType;
|
||||
//PT变比
|
||||
private Double pt;
|
||||
//CT变比"
|
||||
private Double ct;
|
||||
//暂降发生时刻
|
||||
private String time;
|
||||
//测点名称
|
||||
private String monitorName;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.njcn.event.file.pojo.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2021年12月20日 09:56
|
||||
*/
|
||||
@Getter
|
||||
public enum WaveFileResponseEnum {
|
||||
|
||||
/**
|
||||
* 暂降模块异常响应码的范围:
|
||||
* A00650 ~ A00749
|
||||
*/
|
||||
EVENT_NOT_FOUND("A00651","暂降事件或监测点不存在"),
|
||||
ANALYSE_WAVE_NOT_FOUND("A00652","波形文件找不到"),
|
||||
WAVE_DATA_INVALID("A00654","波形文件数据缺失"),
|
||||
DAT_DATA_ERROR("A00653","dat文件数据读取失败"),
|
||||
RMS_DATA_ERROR("A00653","rms数据读取失败"),
|
||||
COMPOSE_PIC_ERROR("A00653","合成波形图失败"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
private final String message;
|
||||
|
||||
WaveFileResponseEnum(String code, String message) {
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
package com.njcn.event.file.utils;
|
||||
|
||||
import com.njcn.event.file.pojo.bo.InstantData;
|
||||
import com.njcn.event.file.pojo.bo.RmsData;
|
||||
import com.njcn.event.file.pojo.bo.WaveDataDetail;
|
||||
import com.njcn.event.file.pojo.dto.WaveDataDTO;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @version 1.0.0
|
||||
* @date 2023年09月20日 16:14
|
||||
*/
|
||||
public class WaveUtil {
|
||||
|
||||
/**
|
||||
* 筛选后台绘图所需的瞬时、RMS等一次值数据
|
||||
*/
|
||||
public static List<WaveDataDetail> filterWaveData(WaveDataDTO waveDataDTO) {
|
||||
List<WaveDataDetail> waveDataDetails = new ArrayList<>();
|
||||
List<String> waveTitle = waveDataDTO.getWaveTitle();
|
||||
boolean openTri = waveDataDTO.getPtType() == 2;
|
||||
/************ 一个图形的相别决定了图形个数 Modify by yexb -----start ***********/
|
||||
Integer iPhase = waveDataDTO.getIPhasic();
|
||||
int picCounts = (waveTitle.size() - 1) / iPhase;
|
||||
/**处理相别的颜色**/
|
||||
List<String> colors = new ArrayList<>();
|
||||
//遍历图形个数
|
||||
for (int i = 0; i < picCounts; i++) {
|
||||
WaveDataDetail waveDataDetail = new WaveDataDetail();
|
||||
switch (iPhase) {
|
||||
case 1:
|
||||
waveDataDetail.setA(waveTitle.get(i + 1).substring(1));
|
||||
waveDataDetail.setB("");
|
||||
waveDataDetail.setC("");
|
||||
colors.add("#DAA520");
|
||||
colors.add("#fff");
|
||||
colors.add("#fff");
|
||||
break;
|
||||
case 2:
|
||||
waveDataDetail.setA(waveTitle.get(i * 2 + 1).substring(1));
|
||||
waveDataDetail.setB(waveTitle.get(i * 2 + 2).substring(1));
|
||||
waveDataDetail.setC("");
|
||||
colors.add("#DAA520");
|
||||
colors.add("#2E8B57");
|
||||
colors.add("#fff");
|
||||
break;
|
||||
case 3:
|
||||
waveDataDetail.setA(waveTitle.get(i * 3 + 1).substring(1));
|
||||
waveDataDetail.setB(waveTitle.get(i * 3 + 2).substring(1));
|
||||
waveDataDetail.setC(waveTitle.get(i * 3 + 3).substring(1));
|
||||
colors.add("#DAA520");
|
||||
colors.add("#2E8B57");
|
||||
colors.add("#A52a2a");
|
||||
break;
|
||||
}
|
||||
waveDataDetail.setColors(colors);
|
||||
|
||||
float xishu = waveDataDTO.getPt().floatValue();
|
||||
if (waveTitle.get(iPhase * i + 1).substring(0, 1).equalsIgnoreCase("U")) {
|
||||
waveDataDetail.setUnit("kV");
|
||||
xishu = xishu / 1000;
|
||||
} else {
|
||||
waveDataDetail.setUnit("A");
|
||||
xishu = waveDataDTO.getCt().floatValue();
|
||||
}
|
||||
Float sfMax = 0f, sfMin = 0f, rfMax = 0f, rfMin = 0f;
|
||||
List<List<Float>> sAValue = new ArrayList<>(), sBValue = new ArrayList<>(), sCValue = new ArrayList<>(), rAValue = new ArrayList<>(), rBValue = new ArrayList<>(), rCValue = new ArrayList<>();
|
||||
List<List<Float>> sunData = waveDataDTO.getListWaveData();
|
||||
for (int j = 0; j < sunData.size(); j++) {
|
||||
float x = sunData.get(j).get(0);
|
||||
float shunFirstA = 0f, shunFirstB = 0f, shunFirstC = 0f;
|
||||
//根据相别来确认标题的名称
|
||||
for (int m = 0; m < iPhase; m++) {
|
||||
if (waveTitle.get(iPhase * i + m + 1).substring(1).contains("A")) {
|
||||
float tmpShunFirstA = sunData.get(j).get(iPhase * i + m + 1) * xishu;
|
||||
shunFirstA = tmpShunFirstA;
|
||||
sAValue.add(new ArrayList<Float>() {{
|
||||
add(x);
|
||||
add(tmpShunFirstA);
|
||||
}});
|
||||
}
|
||||
if (waveTitle.get(iPhase * i + m + 1).substring(1).contains("B")) {
|
||||
float tmpShunFirstB = sunData.get(j).get(iPhase * i + m + 1) * xishu;
|
||||
shunFirstB = tmpShunFirstB;
|
||||
sBValue.add(new ArrayList<Float>() {{
|
||||
add(x);
|
||||
add(tmpShunFirstB);
|
||||
}});
|
||||
}
|
||||
if (waveTitle.get(iPhase * i + m + 1).substring(1).contains("C")) {
|
||||
float tmpShunFirstC = sunData.get(j).get(iPhase * i + m + 1) * xishu;
|
||||
shunFirstC = tmpShunFirstC;
|
||||
sCValue.add(new ArrayList<Float>() {{
|
||||
add(x);
|
||||
add(tmpShunFirstC);
|
||||
}});
|
||||
}
|
||||
}
|
||||
sfMax = getMax(sfMax, shunFirstA, shunFirstB, shunFirstC);
|
||||
if (openTri) {
|
||||
sfMin = getMinOpen(sfMin, shunFirstA, shunFirstC);
|
||||
} else {
|
||||
sfMin = getMin(sfMin, shunFirstA, shunFirstB, shunFirstC);
|
||||
}
|
||||
}
|
||||
InstantData instantData = new InstantData();
|
||||
instantData.setAValue(sAValue);
|
||||
instantData.setBValue(sBValue);
|
||||
instantData.setCValue(sCValue);
|
||||
instantData.setMax(sfMax);
|
||||
instantData.setMin(sfMin);
|
||||
List<List<Float>> rmsData = waveDataDTO.getListRmsData();
|
||||
for (int k = 0; k < rmsData.size(); k++) {
|
||||
float x = rmsData.get(k).get(0);
|
||||
float rmsFirstA = 0f, rmsFirstB = 0f, rmsFirstC = 0f;
|
||||
//根据相别来确认标题的名称
|
||||
for (int m = 0; m < iPhase; m++) {
|
||||
if (waveTitle.get(iPhase * i + m + 1).substring(1).contains("A")) {
|
||||
float tmpRmsFirstA = rmsData.get(k).get(iPhase * i + m + 1) * xishu;
|
||||
rmsFirstA = tmpRmsFirstA;
|
||||
rAValue.add(new ArrayList<Float>() {{
|
||||
add(x);
|
||||
add(tmpRmsFirstA);
|
||||
}});
|
||||
}
|
||||
if (waveTitle.get(iPhase * i + m + 1).substring(1).contains("B")) {
|
||||
float tmpRmsFirstB = rmsData.get(k).get(iPhase * i + m + 1) * xishu;
|
||||
rmsFirstB = tmpRmsFirstB;
|
||||
rBValue.add(new ArrayList<Float>() {{
|
||||
add(x);
|
||||
add(tmpRmsFirstB);
|
||||
}});
|
||||
}
|
||||
if (waveTitle.get(iPhase * i + m + 1).substring(1).contains("C")) {
|
||||
float tmpRmsFirstC = rmsData.get(k).get(iPhase * i + m + 1) * xishu;
|
||||
rmsFirstC = tmpRmsFirstC;
|
||||
rCValue.add(new ArrayList<Float>() {{
|
||||
add(x);
|
||||
add(tmpRmsFirstC);
|
||||
}});
|
||||
}
|
||||
}
|
||||
rfMax = getMax(sfMax, rmsFirstA, rmsFirstB, rmsFirstC);
|
||||
if (openTri) {
|
||||
rfMin = getMinOpen(sfMin, rmsFirstA, rmsFirstC);
|
||||
} else {
|
||||
rfMin = getMin(sfMin, rmsFirstA, rmsFirstB, rmsFirstC);
|
||||
}
|
||||
}
|
||||
RmsData rmsData1 = new RmsData();
|
||||
rmsData1.setAValue(rAValue);
|
||||
rmsData1.setBValue(rBValue);
|
||||
rmsData1.setCValue(rCValue);
|
||||
rmsData1.setMax(rfMax);
|
||||
rmsData1.setMin(rfMin);
|
||||
|
||||
waveDataDetail.setInstantData(instantData);
|
||||
waveDataDetail.setRmsData(rmsData1);
|
||||
waveDataDetail.setIsOpen(openTri);
|
||||
waveDataDetails.add(waveDataDetail);
|
||||
}
|
||||
/************ Modify by yexb -----end ***********/
|
||||
return waveDataDetails;
|
||||
}
|
||||
|
||||
private static Float getMinOpen(Float temp, float tempA, float tempB) {
|
||||
temp = temp < tempA ? temp : tempA;
|
||||
temp = temp < tempB ? temp : tempB;
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
private static float getMin(float temp, float tempA, float tempB, float tempC) {
|
||||
temp = Math.min(temp, tempA);
|
||||
temp = Math.min(temp, tempB);
|
||||
temp = Math.min(temp, tempC);
|
||||
return temp;
|
||||
}
|
||||
|
||||
private static float getMax(float temp, float tempA, float tempB, float tempC) {
|
||||
temp = Math.max(temp, tempA);
|
||||
temp = Math.max(temp, tempB);
|
||||
temp = Math.max(temp, tempC);
|
||||
return temp;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user