From 2f89b3c53f98a3fa2d0c0199d6b5d789a42f6d47 Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Wed, 28 May 2025 09:48:40 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=E5=A2=9E=E5=8A=A0=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/domain/BusinessAlert.java | 6 + .../business/feign/FeignDeviceGroup.java | 4 + .../impl/BusinessAlertServiceImpl.java | 42 +++--- .../dromara/business/utils/ImageRotator.java | 125 ++++++++++++++++++ .../src/main/resources/templates/1.png | Bin 0 -> 12919 bytes .../src/main/resources/templates/2.png | Bin 0 -> 12424 bytes .../media/controller/FileController.java | 11 ++ .../sample/media/service/IFileService.java | 2 + .../media/service/impl/FileServiceImpl.java | 13 ++ 9 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 dk-modules/business/src/main/java/org/dromara/business/utils/ImageRotator.java create mode 100644 dk-modules/business/src/main/resources/templates/1.png create mode 100644 dk-modules/business/src/main/resources/templates/2.png diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java index e98774b..a78da95 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java @@ -257,4 +257,10 @@ public class BusinessAlert { //预警扩展施工信息 @TableField(exist = false) private BusinessAlertConstructInfoVo alertConstructInfoVo; + + /** + * 指南针 + */ + @TableField(exist = false) + private String icon; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java b/dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java index 21924a8..648aabe 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java +++ b/dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java @@ -22,4 +22,8 @@ public interface FeignDeviceGroup { @GetMapping("/device/flight/count") public Map getDevices(); + + @GetMapping("/media/api/v1/files/degree") + public Double getGimbalYawDegree(@RequestParam("fileId") String fileId); + } diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java index bd99d4b..6e78ebb 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java @@ -24,12 +24,11 @@ import org.dromara.business.domain.BusinessAlertConstructInfo; import org.dromara.business.domain.bo.BusinessAlertBo; import org.dromara.business.domain.vo.BusinessAlertConstructInfoVo; import org.dromara.business.domain.vo.BusinessAlertVo; +import org.dromara.business.feign.FeignDeviceGroup; import org.dromara.business.mapper.BusinessAlertConstructInfoMapper; import org.dromara.business.mapper.BusinessAlertMapper; import org.dromara.business.service.IBusinessAlertService; -import org.dromara.business.utils.BatchProcessorUtil; -import org.dromara.business.utils.FreemarkerUtil; -import org.dromara.business.utils.MinioUntil; +import org.dromara.business.utils.*; import org.dromara.business.utils.constants.MinIOConstants; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.enums.FormatsType; @@ -39,7 +38,6 @@ import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.business.utils.MinioUtil; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.api.RemoteLabelPostService; import org.dromara.system.api.RemoteUserService; @@ -101,6 +99,9 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { @DubboReference private RemoteUserService remoteUserService; + @Autowired + FeignDeviceGroup feignDeviceGroup; + /** * 新增预警任务 * @@ -833,7 +834,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { //根据前端查询条件查询 List alertList = this.baseMapper.exportAlert(wrapper,ptPrefix); - + alertList = alertList.stream().filter(p-> !p.getHandleType().equalsIgnoreCase("cancel")).toList(); long todoCount = alertList.stream().filter(p -> p.getHandleType().equalsIgnoreCase("waiting")).count(); long finishCount = alertList.stream().filter(p -> p.getHandleType().equalsIgnoreCase("finish")).count(); @@ -852,33 +853,36 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { alertList.parallelStream().forEach(businessAlert->{ try { - if (ObjectUtil.isNotEmpty(userIdMap.get(businessAlert.getAssignUserId()))){ - businessAlert.setAssignUserName(userIdMap.get(businessAlert.getAssignUserId()).get(0).getNickName()); + if (ObjectUtil.isNotEmpty(userIdMap.get(Long.valueOf(businessAlert.getAssignUserId())))){ + businessAlert.setAssignUserName(userIdMap.get(Long.valueOf(businessAlert.getAssignUserId())).get(0).getNickName()); } businessAlert.setHandleType(businessAlert.getHandleType().equalsIgnoreCase("waiting")?"未处理":businessAlert.getHandleType().equalsIgnoreCase("finish")?"已完结":businessAlert.getHandleType().equalsIgnoreCase("cancel")?"已忽略":"待验证"); if (businessAlert.getBusinessType() == 1){ businessAlert.setImages(imageToBase64(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getImages(), 3600).toString())); - if (ObjectUtil.isEmpty(businessAlert.getImages())){ - log.info("images为null"); - } businessAlert.setMaxImages(imageToBase64(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMaxImages(), 3600).toString())); - if (ObjectUtil.isEmpty(businessAlert.getMaxImages())){ - log.info("MaxImages为null"); - } businessAlert.setMaxMateSourceImgUrl(imageToBase64(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMaxMateSourceImgUrl(), 3600).toString())); - if (ObjectUtil.isEmpty(businessAlert.getMaxMateSourceImgUrl())){ - log.info("MaxMateSourceImgUrl为null"); - } businessAlert.setMateSourceImgUrl(imageToBase64(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMateSourceImgUrl(), 3600).toString())); - if (ObjectUtil.isEmpty(businessAlert.getMateSourceImgUrl())){ - log.info("MateSourceImgUrl为null"); - } }else { businessAlert.setImages(imageToBase64(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getImages(), 3600).toString())); } + //获取指南针 + Double gimbalYawDegree = feignDeviceGroup.getGimbalYawDegree(businessAlert.getTaskImageId()); + if (ObjectUtil.isNotEmpty(gimbalYawDegree)){ + if (gimbalYawDegree < 0){ + gimbalYawDegree = gimbalYawDegree - 180; + }else { + gimbalYawDegree = 180 - gimbalYawDegree; + } + + log.info("旋转角度${}",gimbalYawDegree); + + String rotatedAndOverlayImage = ImageRotator.rotateAndOverlayImage(null, null, gimbalYawDegree); + businessAlert.setIcon(rotatedAndOverlayImage); + } + } catch (Exception e) { log.error(e.getMessage(),e); } diff --git a/dk-modules/business/src/main/java/org/dromara/business/utils/ImageRotator.java b/dk-modules/business/src/main/java/org/dromara/business/utils/ImageRotator.java new file mode 100644 index 0000000..6d2b843 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/utils/ImageRotator.java @@ -0,0 +1,125 @@ + +package org.dromara.business.utils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Base64; + +public class ImageRotator { + + /** + * 旋转图片并叠加到另一个图片上 + * @param sourceImagePath 源图片路径 + * @param targetImagePath 目标图片路径 + * @param angle 旋转角度(顺时针) + * @return 处理后的图片的Base64字符串 + */ + public static String rotateAndOverlayImage(String sourceImagePath, String targetImagePath, double angle) { + try { + URL resourceUrl = ImageRotator.class.getClassLoader().getResource("templates/1.png"); + URL targetUrl = ImageRotator.class.getClassLoader().getResource("templates/2.png"); + + // 读取源图片和目标图片 + BufferedImage sourceImage = ImageIO.read(new File(resourceUrl.getPath())); + BufferedImage targetImage = ImageIO.read(new File(targetUrl.getPath())); + + // 创建旋转后的图片 + BufferedImage rotatedImage = rotateImage(sourceImage, angle); + + // 创建新的画布,使用目标图片的尺寸 + BufferedImage resultImage = new BufferedImage( + targetImage.getWidth(), + targetImage.getHeight(), + BufferedImage.TYPE_INT_ARGB + ); + + // 创建图形上下文 + Graphics2D g2d = resultImage.createGraphics(); + + // 绘制目标图片 + g2d.drawImage(targetImage, 0, 0, null); + + // 计算旋转图片的位置(居中) + int x = (targetImage.getWidth() - rotatedImage.getWidth()) / 2; + int y = (targetImage.getHeight() - rotatedImage.getHeight()) / 2; + + // 绘制旋转后的图片 + g2d.drawImage(rotatedImage, x, y, null); + + // 释放图形上下文 + g2d.dispose(); + + // 转换为Base64 + return convertToBase64(resultImage); + + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 旋转图片 + * @param image 要旋转的图片 + * @param angle 旋转角度(顺时针) + * @return 旋转后的图片 + */ + private static BufferedImage rotateImage(BufferedImage image, double angle) { + double rads = Math.toRadians(angle); + double sin = Math.abs(Math.sin(rads)); + double cos = Math.abs(Math.cos(rads)); + + int w = image.getWidth(); + int h = image.getHeight(); + + int newWidth = (int) Math.floor(w * cos + h * sin); + int newHeight = (int) Math.floor(h * cos + w * sin); + + BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = rotated.createGraphics(); + + g2d.translate((newWidth - w) / 2, (newHeight - h) / 2); + g2d.rotate(rads, w / 2, h / 2); + g2d.drawImage(image, 0, 0, null); + g2d.dispose(); + + return rotated; + } + + /** + * 将图片转换为Base64字符串 + * @param image 要转换的图片 + * @return Base64字符串 + */ + private static String convertToBase64(BufferedImage image) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ImageIO.write(image, "jpeg", outputStream); + byte[] imageBytes = outputStream.toByteArray(); + return Base64.getEncoder().encodeToString(imageBytes); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + // 使用示例 + public static void main(String[] args) { + String sourceImagePath = "C:\\Users\\Administrator\\Desktop\\1.png"; // 源图片路径 + String targetImagePath = "C:\\Users\\Administrator\\Desktop\\2.png"; // 目标图片路径 + double angle = 90; // 旋转角度 + + String base64Result = rotateAndOverlayImage(sourceImagePath, targetImagePath, angle); + if (base64Result != null) { + System.out.println("处理成功,Base64结果:" + base64Result); + } else { + System.out.println("处理失败"); + } + } +} + diff --git a/dk-modules/business/src/main/resources/templates/1.png b/dk-modules/business/src/main/resources/templates/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a9e2397eaf1707b3cf3b511b3681058a9f14bf GIT binary patch literal 12919 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 literal 0 HcmV?d00001 diff --git a/dk-modules/business/src/main/resources/templates/2.png b/dk-modules/business/src/main/resources/templates/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c86474c8d2d3f166ac0f6b45ba943968b341dc17 GIT binary patch literal 12424 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 literal 0 HcmV?d00001 diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/media/controller/FileController.java b/dk-modules/sample/src/main/java/org/dromara/sample/media/controller/FileController.java index 6a91180..905b9fb 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/media/controller/FileController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/media/controller/FileController.java @@ -85,4 +85,15 @@ public class FileController { } return HttpResultResponse.success(filesList); } + + /** + * 根据文件id查询图片的偏航角 + * @param fileId + * @return + */ + @GetMapping("/degree") + @Operation(summary = "根据文件id查询图片的偏航角", description = "根据文件id查询图片的偏航角") + public Double getGimbalYawDegree(@RequestParam("fileId") String fileId) { + return fileService.getGimbalYawDegree(fileId); + } } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/media/service/IFileService.java b/dk-modules/sample/src/main/java/org/dromara/sample/media/service/IFileService.java index 6ece33f..144bfb9 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/media/service/IFileService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/media/service/IFileService.java @@ -88,4 +88,6 @@ public interface IFileService { List getMediaFileDTO( String jobId,String fileType); String copyFile(String sourceBucket, String originFileUrl, String targetBucket); + + Double getGimbalYawDegree(String fileId); } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/FileServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/FileServiceImpl.java index 437abc1..8b2ae4d 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/FileServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/FileServiceImpl.java @@ -201,6 +201,19 @@ public class FileServiceImpl implements IFileService { return fileUrl; } + + @Override + public Double getGimbalYawDegree(String fileId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MediaFileEntity::getFileId, fileId); + List mediaFileEntities = mapper.selectList(wrapper); + if (ObjectUtil.isNotEmpty(mediaFileEntities)){ + return mediaFileEntities.get(0).getGimbalYawDegree(); + } + + return 0.0; + } + /** * Convert the received file object into a database entity object. * @param file