From 1f4e168b56f40f04c71631095306e000fff51540 Mon Sep 17 00:00:00 2001 From: lxj <15683799673@163.com> Date: Mon, 4 Aug 2025 19:50:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/api/RemoteFileService.java | 11 +- .../dromara/common/core/enums/ImageType.java | 70 +++++++++ .../common/core/utils/Base64Utils.java | 147 ++++++++++++++++++ .../dromara/sis/domain/SisAlarmEvents.java | 17 +- .../sis/domain/bo/SisAlarmEventsBo.java | 29 ++-- .../sis/domain/vo/SisAlarmEventsVo.java | 8 + .../sis/service/ISisAlarmEventsService.java | 13 +- .../sis/service/ISisDeviceManageService.java | 4 +- .../impl/SisAlarmEventsServiceImpl.java | 42 ++++- .../impl/SisDeviceManageServiceImpl.java | 4 +- .../impl/ZeroSensationPassageServiceImpl.java | 5 +- .../resource/dubbo/RemoteFileServiceImpl.java | 14 ++ 12 files changed, 329 insertions(+), 35 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/ImageType.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Base64Utils.java diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java index 182ca629..429d3dbf 100644 --- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java @@ -1,6 +1,5 @@ package org.dromara.resource.api; -import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.core.exception.ServiceException; import org.dromara.resource.api.domain.RemoteFile; @@ -22,6 +21,14 @@ public interface RemoteFileService { */ RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException; + /** + * 文件上传 + * @param file 文件信息 + * @return 结果 + * @throws ServiceException + */ + RemoteFile upload(byte[] file) throws ServiceException; + /** * 通过ossId查询对应的url * @@ -41,7 +48,7 @@ public interface RemoteFileService { /** * 文件下载方法,支持一次性下载完整文件 * - * @param ossId OSS对象ID + * @param ossId OSS对象ID * @return byte[] 返回下载的字节数组 */ byte[] downloadToByteArray(Long ossId) throws IOException; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/ImageType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/ImageType.java new file mode 100644 index 00000000..bea3685b --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/ImageType.java @@ -0,0 +1,70 @@ +package org.dromara.common.core.enums; + +/** + * 常用文件的文件头如下:(以前六位为准) + * JPEG (jpg),文件头:FFD8FF + * PNG (png),文件头:89504E47 + * GIF (gif),文件头:47494638 + * TIFF (tif),文件头:49492A00 + * Windows Bitmap (bmp),文件头:424D + * CAD (dwg),文件头:41433130 + * Adobe Photoshop (psd),文件头:38425053 + * Rich Text Format (rtf),文件头:7B5C727466 + * XML (xml),文件头:3C3F786D6C + * HTML (html),文件头:68746D6C3E + * Email [thorough only] (eml),文件头:44656C69766572792D646174653A + * Outlook Express (dbx),文件头:CFAD12FEC5FD746F + * Outlook (pst),文件头:2142444E + * MS Word/Excel (xls.or.doc),文件头:D0CF11E0 + * MS Access (mdb),文件头:5374616E64617264204A + * WordPerfect (wpd),文件头:FF575043 + * Postscript (eps.or.ps),文件头:252150532D41646F6265 + * Adobe Acrobat (pdf),文件头:255044462D312E + * Quicken (qdf),文件头:AC9EBD8F + * Windows Password (pwl),文件头:E3828596 + * ZIP Archive (zip),文件头:504B0304 + * RAR Archive (rar),文件头:52617221 + * Wave (wav),文件头:57415645 + * AVI (avi),文件头:41564920 + * Real Audio (ram),文件头:2E7261FD + * Real Media (rm),文件头:2E524D46 + * MPEG (mpg),文件头:000001BA + * MPEG (mpg),文件头:000001B3 + * Quicktime (mov),文件头:6D6F6F76 + * Windows Media (asf),文件头:3026B2758E66CF11 + * MIDI (mid),文件头:4D546864 + */ +public enum ImageType { + JPEG("jpg", "FFD8FF"), + PNG("png","89504E47"), + Windows_Bitmap("bmp","424D"), + + GIF("gif","47494638"), + TIFF("tif","49492A00"), + CAD("dwg","41433130"), + Adobe_Photoshop("psd","38425053"), + XML("xml","3C3F786D6C"), + HTML("html","68746D6C3E"), + Adobe_Acrobat("pdf","255044462D312E"), + ZIP_Archive("zip","504B0304"), + RAR_Archive("rar","52617221"), + Wave("wav","57415645"), + AVI("avi","41564920"); + + private final String suffix; + private final String headCode; + + ImageType(String suffix, String headCode) { + this.suffix = suffix; + this.headCode = headCode; + } + + public String getSuffix() { + return suffix; + } + + public String getHeadCode() { + return headCode; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Base64Utils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Base64Utils.java new file mode 100644 index 00000000..c79e227f --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Base64Utils.java @@ -0,0 +1,147 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.io.IoUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.enums.ImageType; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Base64; + +/** + * [base64 加密解密工具类] + * + * @author : [lxj] + * @version : [v1.0] + * @createTime : [2021/4/27 12:54] + */ +@Slf4j +public class Base64Utils { + + + public Base64Utils(){} + /** + * 文件路径转base64 + * @param path 文件路径 + * @return 如果成功返回base64 字符串,否则返回null + */ + public static String file2Base64(String path){ + File f = new File(path); + if(f.exists()){ + return file2Base64(f); + } + return null; + } + + /** + * 文件转base64 + * @param filePath 文件对象 + * @return 如果成功返回base64 字符串,否则返回null + */ + public static String file2Base64(File filePath){ + return file2Base64(filePath.toPath()); + } + + /** + * 文件转base64 + * @param p Path 对象 + * @return 如果成功返回base64 字符串,否则返回null + */ + public static String file2Base64(Path p) { + try { + byte[] b = Files.readAllBytes(p); + return byte2Base64(b); + } catch (IOException e) { + log.error("文件转base64失败, msg:" + e.getMessage()); + return null; + } + } + + /** + * 输入流转base64 + * @param inputStream 输入流 + * @return 如果成功返回base64 字符串,否则返回null + */ + public static String stream2Base64(InputStream inputStream){ + try { + byte [] b = IoUtil.readBytes(inputStream); + return byte2Base64(b); + } catch (Exception e) { + log.error("输入流转base64失败, msg:" + e.getMessage()); + return null; + } + } + + /** + * 字节数组转base64 + * @param b 字节数组 + * @return + */ + public static String byte2Base64(byte [] b){ + assert b != null && b.length > 0; + return Base64.getEncoder().encodeToString(b); + } + + /** + * 通过文件的base计算文件的格式 + * @param base64 文件的base64 + * @return + */ + public static String getType(String base64){ + byte[] b = Base64.getDecoder().decode(base64); + return getType(b); + } + + public static String getType(byte [] b){ + try { + String xxx = bytesToHexString(b); + assert xxx != null && !xxx.isEmpty(); + ImageType[] types = ImageType.values(); + String suffix = null; + for (ImageType type: types) { + if(xxx.toUpperCase().startsWith(type.getHeadCode())){ + suffix = type.getSuffix(); + break; + } + } + return suffix; + }catch (Exception e) { + return null; + } + } + + + /** + * 判断文件格式 取前6个字符来进行判断 + * @param src 文件字节数组 + * @return 返回文件字节数组前6位编码 + */ + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(); + int pifNum = 10; + if (src == null || src.length <= pifNum) { + return null; + } + for (int i = 0; i < pifNum; i ++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + public static String handleBase64Header(String webBase64Code){ + String [] s = webBase64Code.split("base64,"); + if(s.length == 2){ + return s[1]; + } + return webBase64Code; + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java index aa9c0bb6..8db8ed8a 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAlarmEvents.java @@ -1,13 +1,13 @@ package org.dromara.sis.domain; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; +import java.util.Date; /** * 告警对象 sis_alarm_events @@ -64,5 +64,14 @@ public class SisAlarmEvents extends TenantEntity { */ private Date reportTime; + /** + * 事件状态 + */ + private Integer state; + + /** + * 工单id + */ + private Long workOrderId; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java index 04ed9212..9f2f7427 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAlarmEventsBo.java @@ -1,15 +1,15 @@ package org.dromara.sis.domain.bo; -import org.dromara.sis.domain.SisAlarmEvents; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.sis.domain.SisAlarmEvents; + import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; /** * 告警业务对象 sis_alarm_events @@ -25,19 +25,19 @@ public class SisAlarmEventsBo extends BaseEntity { /** * 报警记录ID */ - @NotNull(message = "报警记录ID不能为空", groups = { EditGroup.class }) + @NotNull(message = "报警记录ID不能为空", groups = {EditGroup.class}) private Long id; /** * 报警事件类型 */ - @NotNull(message = "报警事件类型不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "报警事件类型不能为空", groups = {AddGroup.class, EditGroup.class}) private Long type; /** * 报警记录级别(1:一般,2:中级,3:紧急) */ - @NotNull(message = "报警记录级别(1:一般,2:中级,3:紧急)不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "报警记录级别(1:一般,2:中级,3:紧急)不能为空", groups = {AddGroup.class, EditGroup.class}) private Long level; /** @@ -63,8 +63,17 @@ public class SisAlarmEventsBo extends BaseEntity { /** * 设备告警时间 */ - @NotNull(message = "设备告警时间不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "设备告警时间不能为空", groups = {AddGroup.class, EditGroup.class}) private Date reportTime; + /** + * 事件状态 + */ + private Integer state; + + /** + * 工单id + */ + private Long workOrderId; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java index 9ab1e4ca..ee9fdc34 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAlarmEventsVo.java @@ -78,5 +78,13 @@ public class SisAlarmEventsVo implements Serializable { @ExcelProperty(value = "设备告警时间") private Date reportTime; + /** + * 事件状态 + */ + private Integer state; + /** + * 工单id + */ + private Long workOrderId; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java index 02eecf4a..c6f05eef 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAlarmEventsService.java @@ -1,10 +1,9 @@ package org.dromara.sis.service; -import org.dromara.sis.domain.SisAlarmEvents; -import org.dromara.sis.domain.vo.SisAlarmEventsVo; -import org.dromara.sis.domain.bo.SisAlarmEventsBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.domain.bo.SisAlarmEventsBo; +import org.dromara.sis.domain.vo.SisAlarmEventsVo; import java.util.Collection; import java.util.List; @@ -66,4 +65,10 @@ public interface ISisAlarmEventsService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 异步生成告警记录 + */ + void createAlarmRecord(String deviceIp, Integer level, Integer type, byte[] smallImg, byte[] bigImg); + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java index 0525b342..68b45bca 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java @@ -71,10 +71,10 @@ public interface ISisDeviceManageService { /** * 通过设备ip查询设备信息 * - * @param deviceCode 设备编码 + * @param deviceIp 设备编码 * @return 设备信息 */ - SisDeviceManageVo queryVoByDeviceIp(Integer deviceCode); + SisDeviceManageVo queryVoByDeviceIp(String deviceIp); /** * 查询设备数 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java index 0ce2b341..28680f85 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java @@ -1,24 +1,29 @@ package org.dromara.sis.service.impl; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.sis.domain.SisAlarmEvents; import org.dromara.sis.domain.bo.SisAlarmEventsBo; import org.dromara.sis.domain.vo.SisAlarmEventsVo; -import org.dromara.sis.domain.SisAlarmEvents; +import org.dromara.sis.domain.vo.SisDeviceManageVo; import org.dromara.sis.mapper.SisAlarmEventsMapper; import org.dromara.sis.service.ISisAlarmEventsService; +import org.dromara.sis.service.ISisDeviceManageService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 告警Service业务层处理 @@ -32,7 +37,10 @@ import java.util.Collection; public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { private final SisAlarmEventsMapper baseMapper; + private final ISisDeviceManageService deviceManageService; + @DubboReference + private RemoteFileService remoteFileService; /** * 查询告警 * @@ -134,5 +142,23 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; + } + + @Async + @Override + public void createAlarmRecord(String deviceIp, Integer level, Integer type, byte[] smallImg, byte[] bigImg) { + // 校验设备信息 + SisDeviceManageVo sisDeviceManageVo = deviceManageService.queryVoByDeviceIp(deviceIp); + if(sisDeviceManageVo == null){ + log.error("设备信息不存在,放弃此条告警记录。"); + return; + } + // 上传图片 + remoteFileService.upload(smallImg); + + + + + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java index 7ac272b4..6cf7f4ec 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java @@ -175,9 +175,9 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService { @Override - public SisDeviceManageVo queryVoByDeviceIp(Integer deviceCode) { + public SisDeviceManageVo queryVoByDeviceIp(String deviceIp) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(SisDeviceManage::getDeviceIp, deviceCode); + lqw.eq(SisDeviceManage::getDeviceIp, deviceIp); return baseMapper.selectVoById(lqw); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java index 3bfea6fc..3b6eca62 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java @@ -109,9 +109,8 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer /** * 生成告警事件 */ - public void createAlarmRecord() { - - + public void createAlarmRecord(String deviceIp, Integer level, Integer type, byte[] smallImg, byte[] bigImg) { + alarmEventsService.createAlarmRecord(deviceIp, level, type, smallImg, bigImg); } /** diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java index bbaa3578..306e57b9 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.Base64Utils; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.oss.core.OssClient; @@ -66,6 +67,19 @@ public class RemoteFileServiceImpl implements RemoteFileService { } } + @Override + public RemoteFile upload(byte[] file) throws ServiceException { + // 计算文件类型 + String type = Base64Utils.getType(file); + // 获contentType + + + + + + return null; + } + /** * 通过ossId查询对应的url *