Commit 634f7dc1 authored by 董国亮's avatar 董国亮

模板更新

parent ef86feb1
......@@ -101,7 +101,6 @@ public class GreenwaveInducesController {
induceDTO.setResolutionHeight(deviceInduces.get(0).getResolutionHeight());
induceDTO.setWkt(deviceInduces.get(0).getWkt());
}
//获取上屏状态
induceDTO.setStatus(o.getStatus());
//获取关联绿波信息
......@@ -144,7 +143,6 @@ public class GreenwaveInducesController {
return jsonView;
}
/**
* 根据条件查询记录
*
......
......@@ -183,14 +183,13 @@ public class GreenwaveInducesHistController {
greenwaveInducesDTO.setDesignSpeed(x.getDesignSpeed());
greenwaveInducesDTO.setWkt(x.getWkt());
greenwaveInducesDTO.setStatus(x.getStatus());
AtomicReference<Integer> equipCount = new AtomicReference<>(0);
List<GreenwaveDirDTO> dirList = new ArrayList<>();
greenwaveInducesHistList.stream().filter(o->Objects.isNull(o.getGreenId()) || o.getGreenId().equals(x.getId())).forEach(o -> {
// greenwaveInducesList.stream().collect(Collectors.toMap(p -> p.getGreenId() + "_" + p.getDir(), p -> p)).values().stream().distinct().collect(Collectors.toList()).stream().forEach(p->{
greenwaveInducesHistList.stream().filter(o -> Objects.isNull(o.getGreenId()) && o.getGreenId().equals(x.getId()) && o.getDir().equals(p.getDir())).forEach(o -> {
GreenwaveDirDTO greenwaveDirDTO = new GreenwaveDirDTO();
//这里从绿波表里获取基本信息
List<GreenwaveInfoPO> greenwaveInfoByGreenId = greenwaveInfoPOList.stream().filter(n -> n.getId().equals(o.getGreenId())).collect(Collectors.toList());// 过滤条件// 收集结果
// List<GreenwaveInfoPO> greenwaveInfoByGreenId = greenwaveInfoPOList.stream().filter(n -> n.getId().equals(o.getGreenId())).collect(Collectors.toList());// 过滤条件// 收集结果
greenwaveDirDTO.setDir(o.getDir());
greenwaveDirDTO.setStrategyId(o.getStrategyId());
greenwaveDirDTO.setStrategyName(o.getStrategyName());
......@@ -232,6 +231,7 @@ public class GreenwaveInducesHistController {
equipCount.updateAndGet(v -> v + induceDTOList.size());
dirList.add(greenwaveDirDTO);
});
// });
greenwaveInducesDTO.setGreenwaveDirList(dirList);
greenwaveInducesDTO.setEquipCount(equipCount.get());
greenwaveInfoList.add(greenwaveInducesDTO);
......
......@@ -125,8 +125,7 @@ public class InduceSendController {
// 根据 equipCode 获取文件名
LambdaQueryWrapper<InduceHist> InduceHistQueryWrapper = new LambdaQueryWrapper<>();
InduceHistQueryWrapper.eq(InduceHist::getEquipCode, equipCode);
InduceHistQueryWrapper.orderByAsc(InduceHist::getCreateTime);
// InduceHist pictureFile=this.induceHistService.getOne(InduceHistQueryWrapper);
InduceHistQueryWrapper.orderByDesc(InduceHist::getCreateTime);
InduceHist pictureFile = this.induceHistService.getOne(InduceHistQueryWrapper,false);
if (Objects.isNull(pictureFile) && pictureFile.getFilePath() == null) {
return ResponseEntity.status(HttpStatus.OK)
......
......@@ -58,14 +58,14 @@ public class InduceTemplate implements Serializable {
/**
* 文字左上角X坐标
*/
@TableField("text_x")
private Integer textX;
@TableField("top_left")
private String topLeft;
/**
* 文字左上角Y坐标
*/
@TableField("text_y")
private Integer textY;
@TableField("bottom_right")
private String bottomRight;
/**
* 文字大小
......
......@@ -14,8 +14,6 @@ import net.wanji.opt.service.DeviceInducesService;
import net.wanji.opt.service.induce.*;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
......@@ -103,9 +101,22 @@ public class InduceSendServiceImpl implements InduceSendService {
// 将字节数组转换为字节对象
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
// 修改图像中文字
addTextToImage(image, param.getContents(), induceTemplate.getTextX(), induceTemplate.getTextY(), induceTemplate.getTextSize(), induceTemplate.getTextSign());
//addTextToImage(image, param.getContents(), induceTemplate.getTextX(), induceTemplate.getTextY(), induceTemplate.getTextSize(), induceTemplate.getTextSign());
// 定义文字区域四个角的坐标
String[] topLeft = induceTemplate.getTopLeft().split(",");
String[] bottomRight = induceTemplate.getBottomRight().split(",");
if (topLeft.length != 2 || bottomRight.length != 2) {
return;
}
int topLeftX = Integer.parseInt(topLeft[0]);
int topLeftY = Integer.parseInt(topLeft[1]);
int bottomRightX = Integer.parseInt(bottomRight[0]);
int bottomRightY = Integer.parseInt(bottomRight[1]);
// 图片生成操作
boolean upDown=param.getContents()[0].contains("▲") || param.getContents()[0].contains("▼");
createImageWithText(induceTemplate, image, param.getContents(), induceTemplate.getTextSign(), upDown,topLeftX, topLeftY, bottomRightX, bottomRightY);
// 测试阶段保存图片到本地
//ImageIO.write(image, "bmp", new File("D:\\tmp\\" + induceTemplate.getFileName()));
// ImageIO.write(image, "bmp", new File("D:\\tmp\\" + induceTemplate.getFileName()));
// 上传文件至ftp
if (param.getFlg() == 1) {
String dirName=LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
......@@ -271,6 +282,121 @@ public class InduceSendServiceImpl implements InduceSendService {
}
/**
* 根据绘制的区域,动态调整字体大小,以适应文本区域
*
* @param g2d graphics2d对象
* @param sign 绘制方向标识
* @param text 绘制内容
* @param width 绘制区域宽度
* @param height 绘制区域高度
*/
private static FontMetrics autoFont(InduceTemplate pictureFile, Graphics2D g2d, boolean sign, String[] text, int width, int height) {
// 初始化字体
Font font = new Font("Arial", Font.BOLD, 1);
g2d.setFont(font);
FontMetrics metrics = g2d.getFontMetrics();
// 字体最大、最小限制
int minFontSize = 1;
int maxFontSize = 100;
// 动态调整字体大小以适应文本区域
for (int fontSize = minFontSize; fontSize <= maxFontSize; fontSize++) {
font = new Font("Arial", Font.BOLD, fontSize);
g2d.setFont(font);
metrics = g2d.getFontMetrics();
pictureFile.setTextSize(fontSize);
// 确保绘制区域能够容纳文本,考虑字体长度和高度
if (sign) {
// 高度考虑上下边距
if (metrics.stringWidth(text[0]) > width || (metrics.getHeight() - 4) > height) {
// 设置字体大小
font = new Font("Arial", Font.BOLD, --fontSize);
g2d.setFont(font);
metrics = g2d.getFontMetrics();
pictureFile.setTextSize(fontSize);
return metrics;
}
} else {
// 高度只考虑上边距
if (metrics.stringWidth(text[0]) > width || (metrics.getHeight() - 1) * text.length > height) {
// 设置字体大小
font = new Font("Arial", Font.BOLD, --fontSize);
g2d.setFont(font);
metrics = g2d.getFontMetrics();
pictureFile.setTextSize(fontSize);
return metrics;
}
}
}
// 若字体大小超出限制,则返回最小字体
return metrics;
}
/**
* 根据图片、文字内容、图片分辨率、绘制方向、区域坐标生成带有文字的图片
*
* @param image 图片
* @param text 内容数组
* @param sign 绘制方向
* @param topLeftX 区域左上角x坐标
* @param topLeftY 区域左上角y坐标
* @param bottomRightX 区域右下角x坐标
* @param bottomRightY 区域右下角y坐标
*/
public static void createImageWithText(InduceTemplate pictureFile, BufferedImage image, String[] text, boolean sign,boolean updown, int topLeftX, int topLeftY, int bottomRightX, int bottomRightY) {
// 创建Graphics2D对象
Graphics2D g2d = image.createGraphics();
// 转换坐标,原始坐标从底部开始,转换为顶部坐标
topLeftY = image.getHeight() - topLeftY;
bottomRightY = image.getHeight() - bottomRightY;
System.out.println("转换后坐标:" + topLeftY + " " + bottomRightY);
// 计算绘制区域总宽度和高度
int width = bottomRightX - topLeftX;
int height = bottomRightY - topLeftY;
// 动态调整字体大小,以适应文本区域
FontMetrics metrics = autoFont(pictureFile, g2d, sign, text, width, height);
// 绘制坐标点
int textWidth;
// 考虑文字绘制方向、文字居中。垂直居中要根据文字高度,水平居中要根据文字宽度。
// int currentX = topLeftX + (width - textWidth) / 2;
int currentX;
int currentY = topLeftY + metrics.getAscent();
// 设置文字颜色
g2d.setColor(Color.green);
// 根据方向开始文字绘制
if (sign) {
// 因文字动态调整的字体大小,所以此处代码不应该被执行
// if (currentX < topLeftX) {
// currentX = topLeftX; // 若超出左边界,调整为左边界
// } else if (currentX + textWidth > topLeftX + width) {
// currentX = topLeftX + width - textWidth; // 若超出右边界,调整为右边界
// }
textWidth = metrics.stringWidth(text[0]);
currentX = topLeftX + (width - textWidth) / 2;
// 计算居中的y坐标
currentY = currentY + (height - metrics.getHeight()) / 2;
if (updown) {
currentX -= 33;
}
g2d.drawString(text[0], currentX, currentY);
} else {
// 计算每个文本内容的竖向绘制坐标
for (String con : text) {
// 考虑每个字符的宽度,计算居中X坐标
textWidth = metrics.stringWidth(con);
currentX = topLeftX + (width - textWidth) / 2;
if (con.contains("km/h")) {
currentX = currentX + metrics.getDescent();
}
g2d.drawString(con, currentX, currentY);
// 每绘制一个字符后Y坐标向下移,间距为文字的0.8倍
currentY += (int) (metrics.getHeight() * 0.8);
}
}
// 释放资源
g2d.dispose();
}
/**
* 在指定位置添加文字到图像
*
......
......@@ -91,7 +91,6 @@ public class InducesMonitorTask {
@Autowired
private InduceTemplateService induceTemplateService;
/**
* #绿波调度计划扫描周期
* 5 分钟 300000
......@@ -183,6 +182,7 @@ public class InducesMonitorTask {
greenwaveInducesHist.setCreateTime(greenOptHistEntity.getCreateTime());
greenwaveInducesHist.setGreenId(greenwaveInfoPO.getId());
greenwaveInducesHist.setDir(getDir(greenOptHistEntity.getDir()));
greenwaveInducesHistService.save(greenwaveInducesHist);
}else{
greenwaveInducesHist=greenwaveInducesHistList.get(0);
}
......@@ -208,12 +208,13 @@ public class InducesMonitorTask {
MessageParam messageParam = new MessageParam();
messageParam.setFlg(1);
messageParam.setGreenId(greenwaveInfoPO.getId());
messageParam.setContents(new String[]{greenOptHistEntity.getMaxSpeed()+"-"+greenOptHistEntity.getMaxSpeed()+"km/h"});
messageParam.setContents(new String[]{(Objects.nonNull(greenOptHistEntity.getMinSpeed())?greenOptHistEntity.getMinSpeed().intValue()+"-":"")+(Objects.nonNull(greenOptHistEntity.getMaxSpeed())?greenOptHistEntity.getMaxSpeed().intValue():"")+"km/h"});
messageParam.setType("TFMH");
try {
if(greenwaveInducesHist.getStatus()==0||greenwaveInducesHist.getModifyTime().before(greenOptHistEntity.getCreateTime())) {
LambdaQueryWrapper<GreenwaveInduces> greenwaveInducesQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesQueryWrapper.eq(GreenwaveInduces::getGreenId, greenwaveInfoPO.getId());
greenwaveInducesQueryWrapper.eq(GreenwaveInduces::getDir, getDir(greenOptHistEntity.getDir()));
List<GreenwaveInduces> greenwaveInducesList = greenwaveInducesService.list(greenwaveInducesQueryWrapper);
for(GreenwaveInduces greenwaveCross :greenwaveInducesList){
LambdaQueryWrapper<InduceTemplate> induceTemplateQueryWrapper = new LambdaQueryWrapper<>();
......@@ -233,6 +234,7 @@ public class InducesMonitorTask {
messageParam.setEndTime(DateUtil.format(System.currentTimeMillis() + 1000 * 60, Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND));
}
induceSendService.send(messageParam);
Thread.sleep(1000);
}
}
greenwaveInducesHist.setStatus(1);
......@@ -243,7 +245,7 @@ public class InducesMonitorTask {
} catch (TemplateException e) {
log.info("发送上屏信息异常" + e.getMessage());
}
greenwaveInducesHistService.saveOrUpdate(greenwaveInducesHist);
greenwaveInducesHistService.updateById(greenwaveInducesHist);
synCount.getAndIncrement();
log.info("同步绿波状态信息成功->" + greenwaveInfoPO.getName()+greenwaveInducesHist.getDir());
}
......@@ -284,7 +286,7 @@ public class InducesMonitorTask {
//保存绿波状态
n.setStatus(0);
n.setModifyTime(new Date());
greenwaveInducesHistService.saveOrUpdate(n);
greenwaveInducesHistService.updateById(n);
log.info("同步绿波状态信息(下屏)->" + greenwaveInfoPO.getName()+"####"+n.getDir());
synCount.getAndIncrement();
});
......@@ -339,7 +341,7 @@ public class InducesMonitorTask {
// System.out.println("当前时间不在范围内: " + now);
// }
System.out.print(new Date().before(DateUtil.parse("2024-12-04", Constants.DATE_FORMAT.E_DATE_FORMAT_DAY)));
// System.out.print(new Date().before(DateUtil.parse("2024-12-04", Constants.DATE_FORMAT.E_DATE_FORMAT_DAY)));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment