feat(event): 添加暂态事件波形查看与导出功能

- 新增 getTransientEventWave 接口用于查看暂态事件波形
- 新增 exportTransientEventWaves 接口用于批量导出暂态事件波形
- 添加 EventWaveExportParam 参数类支持波形导出
- 在 EventListMapper 中增加 selectTransientDetailsByIds 查询方法
- 更新事件列表查询参数支持毫秒级时间格式
- 移除事件描述模糊查询条件优化查询性能
- 添加波形导出相关的常量和工具类集成
This commit is contained in:
2026-05-18 08:45:05 +08:00
parent 90219a3daf
commit 38f910fccd
67 changed files with 1203 additions and 1760 deletions

View File

@@ -1,265 +0,0 @@
package com.njcn.gather.tool.wave.component;
import com.njcn.gather.tool.wave.pojo.dto.EigenvalueDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveCycleVectorDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveHarmonicDTO;
import com.njcn.gather.tool.wave.pojo.dto.WavePhaseVectorDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveVectorGroupDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveDataDTO;
import com.njcn.gather.tool.wave.pojo.param.WaveComtradeParseParam;
import com.njcn.gather.tool.wave.pojo.vo.WaveComtradeVectorResultVO;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
/**
* 本地调试 getComtrade 的命令行入口。
*/
public final class WaveFileComponentTestMain {
/** 默认测试 CFG 文件路径。 */
private static final String DEFAULT_CFG_PATH = "D:\\00-B7-8D-00-E4-09\\PQMonitor_PQM2_006970_20260320_175033_734.CFG";
/** 默认测试 DAT 文件路径。 */
private static final String DEFAULT_DAT_PATH = "D:\\00-B7-8D-00-E4-09\\PQMonitor_PQM2_006970_20260320_175033_734.DAT";
/** 默认解析类型1 表示普通展示。 */
private static final int DEFAULT_PARSE_TYPE = 1;
/** 向量调试固定使用原始波形。 */
private static final int VECTOR_PARSE_TYPE = 3;
/** 默认使用浮动门槛计算特征值。 */
private static final boolean DEFAULT_DYNAMIC_THRESHOLD = true;
private WaveFileComponentTestMain() {
}
/**
* 用法:
* java com.njcn.gather.tool.wave.component.WaveFileComponentTestMain <cfgPath> <datPath> [parseType]
*/
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.out.println("未传入参数,使用默认测试文件路径");
System.out.println("cfgPath: " + DEFAULT_CFG_PATH);
System.out.println("datPath: " + DEFAULT_DAT_PATH);
}
Path cfgPath = Paths.get(args.length > 0 ? args[0] : DEFAULT_CFG_PATH);
Path datPath = Paths.get(args.length > 1 ? args[1] : DEFAULT_DAT_PATH);
int parseType = args.length > 2 ? Integer.parseInt(args[2]) : DEFAULT_PARSE_TYPE;
WaveFileComponent waveFileComponent = new WaveFileComponent();
try (InputStream cfgStream = Files.newInputStream(cfgPath);
InputStream datStream = Files.newInputStream(datPath)) {
WaveDataDTO waveDataDTO = waveFileComponent.getComtrade(cfgStream, datStream, parseType);
printComtradeResult(waveDataDTO);
WaveDataDTO validWaveDataDTO = waveFileComponent.getValidData(waveDataDTO);
printValidDataResult(validWaveDataDTO);
List<EigenvalueDTO> eigenvalues = waveFileComponent.getEigenvalue(validWaveDataDTO, DEFAULT_DYNAMIC_THRESHOLD);
printEigenvalueResult(eigenvalues);
}
runParseComtradeVectorTest(cfgPath, datPath);
}
/**
* 调试 parseComtradeVector 逻辑。
*/
private static void runParseComtradeVectorTest(Path cfgPath, Path datPath) throws Exception {
System.out.println("=== parseComtradeVector 结果 ===");
WaveFileComponent waveFileComponent = new WaveFileComponent();
WaveVectorComponent waveVectorComponent = new WaveVectorComponent();
WaveComtradeParseParam param = new WaveComtradeParseParam();
param.setParseType(VECTOR_PARSE_TYPE);
param.setPtType(0);
param.setPt(1D);
param.setCt(1D);
param.setMonitorName("main方法调试测点");
try (InputStream cfgStream = Files.newInputStream(cfgPath);
InputStream datStream = Files.newInputStream(datPath)) {
WaveDataDTO waveDataDTO = waveFileComponent.getComtrade(cfgStream, datStream, VECTOR_PARSE_TYPE);
applyWaveMetadata(waveDataDTO, param);
List<WaveVectorGroupDTO> vectorGroups = waveVectorComponent.calculateVectors(waveDataDTO);
WaveComtradeVectorResultVO result = new WaveComtradeVectorResultVO();
result.setMonitorName(waveDataDTO.getMonitorName());
result.setTime(waveDataDTO.getTime());
result.setSamplePerCycle(waveDataDTO.getComtradeCfgDTO() == null ? null : waveDataDTO.getComtradeCfgDTO().getFinalSampleRate());
result.setCycleCount(resolveCycleCount(vectorGroups));
result.setVectorGroups(vectorGroups);
printParseComtradeVectorResult(result);
}
}
/**
* 给向量调试结果补齐 PT/CT/测点信息。
*/
private static void applyWaveMetadata(WaveDataDTO waveDataDTO, WaveComtradeParseParam param) {
waveDataDTO.setPt(param.getPt() == null || param.getPt() <= 0 ? 1D : param.getPt());
waveDataDTO.setCt(param.getCt() == null || param.getCt() <= 0 ? 1D : param.getCt());
waveDataDTO.setPtType(param.getPtType() == null ? 0 : param.getPtType());
waveDataDTO.setMonitorName(param.getMonitorName() == null || param.getMonitorName().trim().isEmpty()
? "未命名测点"
: param.getMonitorName().trim());
}
/**
* 打印 parseComtradeVector 的关键摘要。
*/
private static void printParseComtradeVectorResult(WaveComtradeVectorResultVO result) {
System.out.println("测点名称: " + result.getMonitorName());
System.out.println("事件时间: " + result.getTime());
System.out.println("每周波采样点数: " + result.getSamplePerCycle());
System.out.println("可计算周波数: " + result.getCycleCount());
System.out.println("分组数量: " + sizeOf(result.getVectorGroups()));
if (result.getVectorGroups() == null || result.getVectorGroups().isEmpty()) {
return;
}
for (WaveVectorGroupDTO group : result.getVectorGroups()) {
System.out.println("-- 分组: channelName=" + group.getChannelName()
+ ", unit=" + group.getUnit()
+ ", phaseCount=" + group.getPhaseCount()
+ ", phaseNames=" + group.getPhaseNames());
if (group.getVectorSeries() == null || group.getVectorSeries().isEmpty()) {
continue;
}
WaveCycleVectorDTO firstCycle = group.getVectorSeries().get(0);
System.out.println(" 首周波: cycleIndex=" + firstCycle.getCycleIndex() + ", time=" + firstCycle.getTime());
printPhaseVectorSummary(firstCycle.getPhaseVectors());
if (firstCycle.getPositiveSequence() != null) {
System.out.println(" 正序: amplitude=" + firstCycle.getPositiveSequence().getAmplitude()
+ ", rms=" + firstCycle.getPositiveSequence().getRms()
+ ", phaseAngle=" + firstCycle.getPositiveSequence().getPhaseAngle());
}
if (firstCycle.getNegativeSequence() != null) {
System.out.println(" 负序: amplitude=" + firstCycle.getNegativeSequence().getAmplitude()
+ ", rms=" + firstCycle.getNegativeSequence().getRms()
+ ", phaseAngle=" + firstCycle.getNegativeSequence().getPhaseAngle());
}
if (firstCycle.getZeroSequence() != null) {
System.out.println(" 零序: amplitude=" + firstCycle.getZeroSequence().getAmplitude()
+ ", rms=" + firstCycle.getZeroSequence().getRms()
+ ", phaseAngle=" + firstCycle.getZeroSequence().getPhaseAngle());
}
if (firstCycle.getUnbalance() != null) {
System.out.println(" 不平衡度: negative=" + firstCycle.getUnbalance().getNegativeUnbalanceRate()
+ ", zero=" + firstCycle.getUnbalance().getZeroUnbalanceRate());
}
}
}
/**
* 打印单相电能质量结果摘要。
*/
private static void printPhaseVectorSummary(List<WavePhaseVectorDTO> phaseVectors) {
if (phaseVectors == null || phaseVectors.isEmpty()) {
return;
}
for (WavePhaseVectorDTO phaseVector : phaseVectors) {
System.out.println(" 相别=" + phaseVector.getPhaseName()
+ ", totalRms=" + phaseVector.getTotalRms()
+ ", fundamentalAmplitude=" + phaseVector.getFundamentalAmplitude()
+ ", fundamentalRms=" + phaseVector.getFundamentalRms()
+ ", fundamentalPhaseAngle=" + phaseVector.getFundamentalPhaseAngle()
+ ", harmonicDistortionRate=" + phaseVector.getHarmonicDistortionRate());
printHarmonicSummary("电压谐波", phaseVector.getHarmonicVoltageContentRates());
printHarmonicSummary("电流谐波", phaseVector.getHarmonicCurrentAmplitudes());
}
}
/**
* 打印前几个谐波结果,避免控制台过长。
*/
private static void printHarmonicSummary(String label, List<WaveHarmonicDTO> harmonics) {
if (harmonics == null || harmonics.isEmpty()) {
return;
}
int limit = Math.min(3, harmonics.size());
for (int i = 0; i < limit; i++) {
WaveHarmonicDTO harmonic = harmonics.get(i);
System.out.println(" " + label + "-第" + harmonic.getHarmonicOrder() + "次: amplitude=" + harmonic.getAmplitude()
+ ", rms=" + harmonic.getRms()
+ ", rate=" + harmonic.getRate());
}
}
/**
* 解析向量结果中的可计算周波数。
*/
private static Integer resolveCycleCount(List<WaveVectorGroupDTO> vectorGroups) {
if (vectorGroups == null || vectorGroups.isEmpty() || vectorGroups.get(0).getVectorSeries() == null) {
return 0;
}
return vectorGroups.get(0).getVectorSeries().size();
}
/**
* 打印 getComtrade 的关键摘要,便于快速人工核对。
*/
private static void printComtradeResult(WaveDataDTO waveDataDTO) {
System.out.println("=== getComtrade 结果 ===");
System.out.println("事件时间: " + waveDataDTO.getTime());
System.out.println("相别数: " + waveDataDTO.getIPhasic());
System.out.println("标题数: " + sizeOf(waveDataDTO.getWaveTitle()));
System.out.println("通道数: " + sizeOf(waveDataDTO.getChannelNames()));
System.out.println("波形点数: " + sizeOf(waveDataDTO.getListWaveData()));
if (waveDataDTO.getComtradeCfgDTO() != null) {
System.out.println("模拟量通道数: " + waveDataDTO.getComtradeCfgDTO().getNAnalogNum());
System.out.println("开关量通道数: " + waveDataDTO.getComtradeCfgDTO().getNDigitalNum());
System.out.println("最终采样率: " + waveDataDTO.getComtradeCfgDTO().getFinalSampleRate());
}
if (waveDataDTO.getWaveTitle() != null && !waveDataDTO.getWaveTitle().isEmpty()) {
System.out.println("波形标题: " + waveDataDTO.getWaveTitle());
}
if (waveDataDTO.getListWaveData() != null && !waveDataDTO.getListWaveData().isEmpty()) {
System.out.println("首行数据: " + waveDataDTO.getListWaveData().get(0));
System.out.println("末行数据: " + waveDataDTO.getListWaveData().get(waveDataDTO.getListWaveData().size() - 1));
}
}
/**
* 打印 getValidData 的关键摘要。
*/
private static void printValidDataResult(WaveDataDTO waveDataDTO) {
System.out.println("=== getValidData 结果 ===");
System.out.println("RMS 点数: " + sizeOf(waveDataDTO.getListRmsData()));
System.out.println("RMS 最小值点数: " + sizeOf(waveDataDTO.getListRmsMinData()));
if (waveDataDTO.getListRmsData() != null && !waveDataDTO.getListRmsData().isEmpty()) {
System.out.println("RMS 首行数据: " + waveDataDTO.getListRmsData().get(0));
System.out.println("RMS 末行数据: " + waveDataDTO.getListRmsData().get(waveDataDTO.getListRmsData().size() - 1));
}
if (waveDataDTO.getListRmsMinData() != null && !waveDataDTO.getListRmsMinData().isEmpty()) {
System.out.println("RMS 最小值数据: " + waveDataDTO.getListRmsMinData());
}
}
/**
* 打印特征值结果摘要。
*/
private static void printEigenvalueResult(List<EigenvalueDTO> eigenvalues) {
System.out.println("=== getEigenvalue 结果 ===");
System.out.println("特征值数量: " + sizeOf(eigenvalues));
if (eigenvalues == null || eigenvalues.isEmpty()) {
return;
}
for (int i = 0; i < eigenvalues.size(); i++) {
EigenvalueDTO eigenvalueDTO = eigenvalues.get(i);
System.out.println("" + (i + 1) + "相: amplitude=" + eigenvalueDTO.getAmplitude()
+ ", residualVoltage=" + eigenvalueDTO.getResidualVoltage()
+ ", ratedVoltage=" + eigenvalueDTO.getRatedVoltage()
+ ", durationTime=" + eigenvalueDTO.getDurationTime());
}
}
/**
* 安全返回列表大小,避免空指针。
*/
private static int sizeOf(List<?> list) {
return list == null ? 0 : list.size();
}
}

View File

@@ -1,22 +0,0 @@
package com.njcn.gather.tool.wave.component;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
* 波形文件解析组件测试。
*/
class WaveFileComponentTest {
@Test
void shouldRoundWaveTimeToThreeDecimals() {
Assertions.assertEquals(1.235F, WaveFileComponent.roundWaveTime(1.2345F));
Assertions.assertEquals(-99.988F, WaveFileComponent.roundWaveTime(-99.9876F));
}
@Test
void shouldRoundWaveAmplitudeToThreeDecimals() {
Assertions.assertEquals(220.123F, WaveFileComponent.roundWaveAmplitude(220.1234F));
Assertions.assertEquals(-12.988F, WaveFileComponent.roundWaveAmplitude(-12.9876F));
}
}

View File

@@ -1,73 +0,0 @@
package com.njcn.gather.tool.wave.component;
import com.njcn.gather.tool.wave.pojo.dto.ComtradeCfgDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveDataDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveVectorGroupDTO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 波形向量计算组件测试。
*/
class WaveVectorComponentTest {
@Test
void shouldScaleVoltageVectorValuesToKv() {
WaveVectorComponent component = new WaveVectorComponent();
WaveDataDTO waveDataDTO = buildThreePhaseWaveData("U", 8153.209D, 1D);
List<WaveVectorGroupDTO> groups = component.calculateVectors(waveDataDTO);
Assertions.assertEquals("kV", groups.get(0).getUnit());
Assertions.assertEquals(5.7652F, groups.get(0).getVectorSeries().get(0).getPhaseVectors().get(0).getTotalRms());
Assertions.assertEquals(8.1532F, groups.get(0).getVectorSeries().get(0).getPhaseVectors().get(0).getFundamentalAmplitude());
Assertions.assertEquals(5.7652F, groups.get(0).getVectorSeries().get(0).getPhaseVectors().get(0).getFundamentalRms());
Assertions.assertEquals(5.7652F, groups.get(0).getVectorSeries().get(0).getPositiveSequence().getRms());
}
@Test
void shouldKeepCurrentVectorValuesInAmpere() {
WaveVectorComponent component = new WaveVectorComponent();
WaveDataDTO waveDataDTO = buildThreePhaseWaveData("I", 35D, 1D);
List<WaveVectorGroupDTO> groups = component.calculateVectors(waveDataDTO);
Assertions.assertEquals("A", groups.get(0).getUnit());
Assertions.assertEquals(24.7487F, groups.get(0).getVectorSeries().get(0).getPhaseVectors().get(0).getTotalRms());
Assertions.assertEquals(35F, groups.get(0).getVectorSeries().get(0).getPhaseVectors().get(0).getFundamentalAmplitude());
Assertions.assertEquals(24.7487F, groups.get(0).getVectorSeries().get(0).getPhaseVectors().get(0).getFundamentalRms());
}
private WaveDataDTO buildThreePhaseWaveData(String titlePrefix, double amplitude, double ratio) {
int samplePerCycle = 32;
WaveDataDTO waveDataDTO = new WaveDataDTO();
ComtradeCfgDTO cfgDTO = new ComtradeCfgDTO();
cfgDTO.setFinalSampleRate(samplePerCycle);
waveDataDTO.setComtradeCfgDTO(cfgDTO);
waveDataDTO.setIPhasic(3);
waveDataDTO.setPt(ratio);
waveDataDTO.setCt(ratio);
waveDataDTO.setWaveTitle(Arrays.asList("x", titlePrefix + "A", titlePrefix + "B", titlePrefix + "C"));
waveDataDTO.setChannelNames(Arrays.asList("x", titlePrefix));
waveDataDTO.setListWaveData(buildRows(samplePerCycle, amplitude));
return waveDataDTO;
}
private List<List<Float>> buildRows(int samplePerCycle, double amplitude) {
List<List<Float>> rows = new ArrayList<>();
for (int i = 0; i < samplePerCycle; i++) {
double angle = 2D * Math.PI * i / samplePerCycle;
List<Float> row = new ArrayList<>();
row.add((float) i);
row.add((float) (amplitude * Math.sin(angle)));
row.add((float) (amplitude * Math.sin(angle - 2D * Math.PI / 3D)));
row.add((float) (amplitude * Math.sin(angle + 2D * Math.PI / 3D)));
rows.add(row);
}
return rows;
}
}

View File

@@ -1,162 +0,0 @@
package com.njcn.gather.tool.wave.service.impl;
import com.njcn.gather.tool.wave.component.WaveFileComponent;
import com.njcn.gather.tool.wave.component.WaveVectorComponent;
import com.njcn.gather.tool.wave.pojo.dto.AnalogDTO;
import com.njcn.gather.tool.wave.pojo.dto.ComtradeCfgDTO;
import com.njcn.gather.tool.wave.pojo.dto.WaveDataDTO;
import com.njcn.gather.tool.wave.pojo.param.WaveComtradeParseParam;
import com.njcn.gather.tool.wave.pojo.vo.WaveComtradeResultVO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 波形服务测试。
*/
class WaveServiceImplTest {
@Test
void shouldUseCfgRatioWhenCfgContainsValidPtAndCt() throws Exception {
WaveServiceImpl service = new WaveServiceImpl(new WaveFileComponent(), new WaveVectorComponent());
WaveDataDTO waveDataDTO = new WaveDataDTO();
ComtradeCfgDTO cfgDTO = new ComtradeCfgDTO();
cfgDTO.setLstAnalogDTO(Arrays.asList(
buildAnalog("V", 10000F, 100F),
buildAnalog("A", 200F, 1F)
));
waveDataDTO.setComtradeCfgDTO(cfgDTO);
WaveComtradeParseParam param = new WaveComtradeParseParam();
param.setPt(1D);
param.setCt(1D);
Method method = WaveServiceImpl.class.getDeclaredMethod("applyWaveMetadata", WaveDataDTO.class, WaveComtradeParseParam.class);
method.setAccessible(true);
method.invoke(service, waveDataDTO, param);
Assertions.assertEquals(100D, waveDataDTO.getPt());
Assertions.assertEquals(200D, waveDataDTO.getCt());
}
@Test
void shouldFillComtradeSummaryFields() throws Exception {
WaveServiceImpl service = new WaveServiceImpl(new WaveFileComponent(), new WaveVectorComponent());
WaveDataDTO waveDataDTO = new WaveDataDTO();
ComtradeCfgDTO cfgDTO = new ComtradeCfgDTO();
cfgDTO.setNChannelNum(8);
cfgDTO.setNPhasic(3);
cfgDTO.setLstAnalogDTO(Arrays.asList(
buildAnalog("V", 10000F, 100F),
buildAnalog("A", 200F, 1F)
));
waveDataDTO.setComtradeCfgDTO(cfgDTO);
waveDataDTO.setIPhasic(3);
WaveComtradeResultVO result = new WaveComtradeResultVO();
Method method = WaveServiceImpl.class.getDeclaredMethod("fillComtradeSummary", WaveComtradeResultVO.class, WaveDataDTO.class);
method.setAccessible(true);
method.invoke(service, result, waveDataDTO);
Assertions.assertEquals(8, result.getTotalChannels());
Assertions.assertEquals(3, result.getPhaseCount());
Assertions.assertEquals("kV/A", result.getUnit());
}
@Test
void shouldMaskValuesInsideBottomPlatformMiddle() throws Exception {
WaveServiceImpl service = new WaveServiceImpl(new WaveFileComponent(), new WaveVectorComponent());
WaveDataDTO waveDataDTO = new WaveDataDTO();
ComtradeCfgDTO cfgDTO = new ComtradeCfgDTO();
cfgDTO.setFinalSampleRate(1);
waveDataDTO.setComtradeCfgDTO(cfgDTO);
waveDataDTO.setListWaveData(buildRows(new float[][]{
{0F, 100F, 100F, 100F},
{1F, 100F, 100F, 100F},
{2F, 100F, 100F, 100F},
{3F, 100F, 100F, 100F},
{4F, 80F, 100F, 100F},
{5F, 60F, 100F, 100F},
{6F, 60F, 100F, 100F},
{7F, 60F, 100F, 100F},
{8F, 95F, 100F, 100F},
{9F, 100F, 100F, 100F}
}));
waveDataDTO.setListRmsData(buildRows(new float[][]{
{0F, 100F, 100F, 100F},
{1F, 100F, 100F, 100F},
{2F, 100F, 100F, 100F},
{3F, 100F, 100F, 100F},
{4F, 80F, 100F, 100F},
{5F, 60F, 100F, 100F},
{6F, 60F, 100F, 100F},
{7F, 60F, 100F, 100F},
{8F, 95F, 100F, 100F},
{9F, 100F, 100F, 100F}
}));
Method method = WaveServiceImpl.class.getDeclaredMethod("applySimplifiedDisplay", WaveDataDTO.class);
method.setAccessible(true);
method.invoke(service, waveDataDTO);
Assertions.assertEquals(0F, waveDataDTO.getListWaveData().get(0).get(0));
Assertions.assertEquals(100F, waveDataDTO.getListWaveData().get(0).get(1));
Assertions.assertEquals(100F, waveDataDTO.getListWaveData().get(2).get(1));
Assertions.assertEquals(80F, waveDataDTO.getListWaveData().get(4).get(1));
Assertions.assertEquals(60F, waveDataDTO.getListWaveData().get(5).get(1));
Assertions.assertNull(waveDataDTO.getListWaveData().get(6).get(1));
Assertions.assertEquals(60F, waveDataDTO.getListWaveData().get(7).get(1));
Assertions.assertEquals(95F, waveDataDTO.getListWaveData().get(8).get(1));
Assertions.assertEquals(100F, waveDataDTO.getListWaveData().get(9).get(1));
}
@Test
void shouldKeepDataWhenSimplifiedRangeCannotBeDetected() throws Exception {
WaveServiceImpl service = new WaveServiceImpl(new WaveFileComponent(), new WaveVectorComponent());
WaveDataDTO waveDataDTO = new WaveDataDTO();
ComtradeCfgDTO cfgDTO = new ComtradeCfgDTO();
cfgDTO.setFinalSampleRate(1);
waveDataDTO.setComtradeCfgDTO(cfgDTO);
waveDataDTO.setListWaveData(buildRows(new float[][]{
{0F, 100F, 100F, 100F},
{1F, 99F, 100F, 100F},
{2F, 98F, 100F, 100F}
}));
waveDataDTO.setListRmsData(buildRows(new float[][]{
{0F, 100F, 100F, 100F},
{1F, 99F, 100F, 100F},
{2F, 98F, 100F, 100F}
}));
Method method = WaveServiceImpl.class.getDeclaredMethod("applySimplifiedDisplay", WaveDataDTO.class);
method.setAccessible(true);
method.invoke(service, waveDataDTO);
Assertions.assertEquals(99F, waveDataDTO.getListWaveData().get(1).get(1));
Assertions.assertEquals(98F, waveDataDTO.getListRmsData().get(2).get(1));
}
private AnalogDTO buildAnalog(String unit, Float primary, Float secondary) {
AnalogDTO analogDTO = new AnalogDTO();
analogDTO.setSzUnitName(unit);
analogDTO.setFPrimary(primary);
analogDTO.setFSecondary(secondary);
return analogDTO;
}
private List<List<Float>> buildRows(float[][] values) {
List<List<Float>> rows = new ArrayList<>();
for (float[] value : values) {
List<Float> row = new ArrayList<>();
for (float item : value) {
row.add(item);
}
rows.add(row);
}
return rows;
}
}