feat(file): 添加四通道波形图生成功能

- 增加 Objects 工具类导入用于对象比较
- 实现四通道波形图的处理逻辑,支持 4 个数据详情的绘制
- 添加 getTitle2 方法用于生成电压电流标题
- 实现 composeImage 方法用于合成四张图片为一张
- 扩展波形图生成逻辑以支持瞬时数据和有效值数据的四通道显示
This commit is contained in:
xy
2026-07-06 13:30:10 +08:00
parent 1cd3283ba5
commit 0d3dd0748c

View File

@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
/** /**
* @author hongawen * @author hongawen
@@ -206,6 +207,37 @@ public class WavePicComponent {
waveDataDetail.getColors(), waveDataDetail.getIsOpen() waveDataDetail.getColors(), waveDataDetail.getIsOpen()
); );
picPath = composeImage(firstPic, secondPic); picPath = composeImage(firstPic, secondPic);
} else if (waveDataDetails.size() == 4) {
WaveDataDetail waveDataDetail1 = waveDataDetails.get(0);
String pic1 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail1.getChannelName(),time), waveDataDetail1.getInstantData().getAValue(),
waveDataDetail1.getInstantData().getBValue(), waveDataDetail1.getInstantData().getCValue(),
waveDataDetail1.getUnit(), waveDataDetail1.getInstantData().getMax(), waveDataDetail1.getInstantData().getMin(),
waveDataDetail1.getA(), waveDataDetail1.getB(), waveDataDetail1.getC(),
waveDataDetail1.getColors(), waveDataDetail1.getIsOpen()
);
WaveDataDetail waveDataDetail2 = waveDataDetails.get(1);
String pic2 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail2.getChannelName(),time), waveDataDetail2.getInstantData().getAValue(),
waveDataDetail2.getInstantData().getBValue(), waveDataDetail2.getInstantData().getCValue(),
waveDataDetail2.getUnit(), waveDataDetail2.getInstantData().getMax(), waveDataDetail2.getInstantData().getMin(),
waveDataDetail2.getA(), waveDataDetail2.getB(), waveDataDetail2.getC(),
waveDataDetail2.getColors(), waveDataDetail2.getIsOpen());
WaveDataDetail waveDataDetail3 = waveDataDetails.get(2);
String pic3 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail3.getChannelName(),time), waveDataDetail3.getInstantData().getAValue(),
waveDataDetail3.getInstantData().getBValue(), waveDataDetail3.getInstantData().getCValue(),
waveDataDetail3.getUnit(), waveDataDetail3.getInstantData().getMax(), waveDataDetail3.getInstantData().getMin(),
waveDataDetail3.getA(), waveDataDetail3.getB(), waveDataDetail3.getC(),
waveDataDetail3.getColors(), waveDataDetail3.getIsOpen());
WaveDataDetail waveDataDetail4 = waveDataDetails.get(3);
String pic4 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail4.getChannelName(),time), waveDataDetail4.getInstantData().getAValue(),
waveDataDetail4.getInstantData().getBValue(), waveDataDetail4.getInstantData().getCValue(),
waveDataDetail4.getUnit(), waveDataDetail4.getInstantData().getMax(), waveDataDetail4.getInstantData().getMin(),
waveDataDetail4.getA(), waveDataDetail4.getB(), waveDataDetail4.getC(),
waveDataDetail4.getColors(), waveDataDetail4.getIsOpen()
);
picPath = composeImageZl(pic1, pic2, pic3, pic4);
} }
return picPath; return picPath;
} }
@@ -286,10 +318,55 @@ public class WavePicComponent {
waveDataDetail.getColors(), waveDataDetail.getIsOpen() waveDataDetail.getColors(), waveDataDetail.getIsOpen()
); );
picPath = composeImage(firstPic, secondPic); picPath = composeImage(firstPic, secondPic);
} else if (waveDataDetails.size() == 4) {
WaveDataDetail waveDataDetail1 = waveDataDetails.get(0);
String pic1 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail1.getChannelName(),time), waveDataDetail1.getRmsData().getAValue(),
waveDataDetail1.getRmsData().getBValue(), waveDataDetail1.getRmsData().getCValue(),
waveDataDetail1.getUnit(), waveDataDetail1.getRmsData().getMax(), waveDataDetail1.getRmsData().getMin(),
waveDataDetail1.getA(), waveDataDetail1.getB(), waveDataDetail1.getC(),
waveDataDetail1.getColors(), waveDataDetail1.getIsOpen()
);
WaveDataDetail waveDataDetail2 = waveDataDetails.get(1);
String pic2 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail2.getChannelName(),time), waveDataDetail2.getRmsData().getAValue(),
waveDataDetail2.getRmsData().getBValue(), waveDataDetail2.getRmsData().getCValue(),
waveDataDetail2.getUnit(), waveDataDetail2.getRmsData().getMax(), waveDataDetail2.getRmsData().getMin(),
waveDataDetail2.getA(), waveDataDetail2.getB(), waveDataDetail2.getC(),
waveDataDetail2.getColors(), waveDataDetail2.getIsOpen());
WaveDataDetail waveDataDetail3 = waveDataDetails.get(2);
String pic3 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail3.getChannelName(),time), waveDataDetail3.getRmsData().getAValue(),
waveDataDetail3.getRmsData().getBValue(), waveDataDetail3.getRmsData().getCValue(),
waveDataDetail3.getUnit(), waveDataDetail3.getRmsData().getMax(), waveDataDetail3.getRmsData().getMin(),
waveDataDetail3.getA(), waveDataDetail3.getB(), waveDataDetail3.getC(),
waveDataDetail3.getColors(), waveDataDetail3.getIsOpen());
WaveDataDetail waveDataDetail4 = waveDataDetails.get(3);
String pic4 = drawPicUtil.drawWavePic(getTitle2(waveDataDetail4.getChannelName(),time), waveDataDetail4.getRmsData().getAValue(),
waveDataDetail4.getRmsData().getBValue(), waveDataDetail4.getRmsData().getCValue(),
waveDataDetail4.getUnit(), waveDataDetail4.getRmsData().getMax(), waveDataDetail4.getRmsData().getMin(),
waveDataDetail4.getA(), waveDataDetail4.getB(), waveDataDetail4.getC(),
waveDataDetail4.getColors(), waveDataDetail4.getIsOpen()
);
picPath = composeImageZl(pic1, pic2, pic3, pic4);
} }
return picPath; return picPath;
} }
public String getTitle2(String channelName, String time) {
String title;
if (channelName.toUpperCase().startsWith("SU")) {
title ="电压-电网侧" + " 发生时刻:" + time;
} else if (channelName.toUpperCase().startsWith("SI")) {
title ="电流-电网侧" + " 发生时刻:" + time;
} else if (channelName.toUpperCase().startsWith("LU")) {
title ="电压-负载侧" + " 发生时刻:" + time;
} else {
title ="电流-负载侧" + " 发生时刻:" + time;
}
return title;
}
/*** /***
* 绘制RMS波形图 App端用来绘制图片会去掉部分数据只保留开始数据 结束数据 * 绘制RMS波形图 App端用来绘制图片会去掉部分数据只保留开始数据 结束数据
* @author xy * @author xy
@@ -364,6 +441,59 @@ public class WavePicComponent {
} }
} }
private String composeImage(String firstPic, String secondPic, String thirdPic, String forthPic) {
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);
int[] ImageArrayThree = null;
if (Objects.equals(thirdPic, "")) {
BufferedImage imageThree = ImgUtil.toBufferedImage(ImgUtil.toImage(thirdPic.substring(22)), ImgUtil.IMAGE_TYPE_PNG);
int width3 = imageThree.getWidth();
int height3 = imageThree.getHeight();
ImageArrayThree = new int[width3 * height3];
ImageArrayThree = imageThree.getRGB(0, 0, width, height, ImageArrayThree, 0, width);
}
int[] ImageArrayForth = null;
if (Objects.equals(forthPic, "")) {
BufferedImage imageForth = ImgUtil.toBufferedImage(ImgUtil.toImage(forthPic.substring(22)), ImgUtil.IMAGE_TYPE_PNG);
int width4 = imageForth.getWidth();
int height4 = imageForth.getHeight();
ImageArrayForth = new int[width4 * height4];
ImageArrayForth = imageForth.getRGB(0, 0, width, height, ImageArrayForth, 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);
if (!Objects.isNull(ImageArrayThree)) {
imageNew.setRGB(0, height, width, height, ImageArrayThree, 0, width);
}
if (!Objects.isNull(ImageArrayForth)) {
imageNew.setRGB(0, height, width, height, ImageArrayForth, 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);
}
}
/** /**
* app越限指标图 * app越限指标图
* @param title * @param title