[add]斯巴达识别图片并保存有问题的图片 [update]修改菜单权限
This commit is contained in:
		| @ -3,9 +3,24 @@ package org.dromara.test; | |||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.dromara.manager.spartamanager.SpartaManager; | import org.dromara.manager.spartamanager.SpartaManager; | ||||||
|  | import org.dromara.manager.spartamanager.enums.SpartaRecTypeEnum; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaRecognizeVo; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaTargetVo; | ||||||
|  | import org.dromara.other.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture; | ||||||
|  | import org.dromara.other.service.IOthYs7DeviceImgService; | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  |  | ||||||
|  | import javax.imageio.ImageIO; | ||||||
|  | import java.awt.*; | ||||||
|  | import java.awt.image.BufferedImage; | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.net.URI; | ||||||
|  | import java.net.URISyntaxException; | ||||||
|  | import java.util.Date; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author lcj |  * @author lcj | ||||||
|  * @date 2025/6/20 19:40 |  * @date 2025/6/20 19:40 | ||||||
| @ -17,9 +32,82 @@ public class SpartaTest { | |||||||
|     @Resource |     @Resource | ||||||
|     private SpartaManager spartaManager; |     private SpartaManager spartaManager; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private IOthYs7DeviceImgService othYs7DeviceImgService; | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     public void test() { |     public void test() { | ||||||
|         String token = spartaManager.getToken(); |         String token = spartaManager.getToken(); | ||||||
|         log.info("token: {}", token); |         log.info("token: {}", token); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void test2() throws URISyntaxException, IOException { | ||||||
|  |         String url = "http://58.17.134.85:9000/xinnengyuan-dev/ys7/device/img/sxt_1750583731809_227.jpg"; | ||||||
|  | //        List<SpartaRecTypeEnum> hat = List.of(SpartaRecTypeEnum.HAT, SpartaRecTypeEnum.HEAD); | ||||||
|  | //        SpartaRecognizeVo recognize = spartaManager.recognize( | ||||||
|  | //            url, | ||||||
|  | //            hat, | ||||||
|  | //            null, | ||||||
|  | //            null, | ||||||
|  | //            null | ||||||
|  | //        ); | ||||||
|  | //        log.info("识别结果: {}", recognize); | ||||||
|  |         SpartaRecognizeVo vo = new SpartaRecognizeVo(); | ||||||
|  |         vo.setHasTarget(1); | ||||||
|  |         vo.setOriginalImgSize(List.of(2560, 1440)); | ||||||
|  |  | ||||||
|  |         SpartaTargetVo targets = new SpartaTargetVo(); | ||||||
|  |         targets.setType("hat"); | ||||||
|  |         targets.setSize(List.of(59, 78)); | ||||||
|  |         targets.setLeftTopPoint(List.of(880, 597)); | ||||||
|  |         targets.setScore(0.41687846183776855); | ||||||
|  |  | ||||||
|  |         vo.setTargets(List.of(targets)); | ||||||
|  |         // 1. 读取图片 | ||||||
|  |         URI uri = new URI(url); | ||||||
|  |         BufferedImage image = ImageIO.read(uri.toURL()); | ||||||
|  |         // 2. 创建画布 | ||||||
|  |         Graphics2D g = image.createGraphics(); | ||||||
|  |         g.setColor(Color.RED); | ||||||
|  |         g.setStroke(new BasicStroke(5)); | ||||||
|  |         g.setFont(new Font("SansSerif", Font.BOLD, 18)); | ||||||
|  |         // 3. 遍历目标并画框 | ||||||
|  |         for (SpartaTargetVo target : vo.getTargets()) { | ||||||
|  |             List<Integer> size = target.getSize(); // 宽高 | ||||||
|  |             List<Integer> leftTop = target.getLeftTopPoint(); // x y | ||||||
|  |  | ||||||
|  |             int x = leftTop.get(0); | ||||||
|  |             int y = leftTop.get(1); | ||||||
|  |             int width = size.get(0); | ||||||
|  |             int height = size.get(1); | ||||||
|  |  | ||||||
|  |             // 画矩形框 | ||||||
|  |             g.drawRect(x, y, width, height); | ||||||
|  |  | ||||||
|  |             // 写文字(类型 + 置信度) | ||||||
|  |             String label = SpartaRecTypeEnum.fromValue(target.getType()).getText() + " (" + String.format("%.2f", target.getScore()) + ")"; | ||||||
|  |             g.drawString(label, x, y - 5); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         g.dispose(); | ||||||
|  |  | ||||||
|  |         // 4. 保存标记后的图片 | ||||||
|  |         File outFile = new File("marked_output.jpg"); | ||||||
|  |         ImageIO.write(image, "jpg", outFile); | ||||||
|  |  | ||||||
|  |         System.out.println("标记完成,保存路径: " + "marked_output.jpg"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void test3() { | ||||||
|  |         String url = "http://58.17.134.85:9000/xinnengyuan-dev/ys7/device/img/sxt_1750583731809_227.jpg"; | ||||||
|  |         OthYs7DeviceImgCreateByCapture img = new OthYs7DeviceImgCreateByCapture(); | ||||||
|  |         img.setCreateTime(new Date()); | ||||||
|  |         img.setUrl(url); | ||||||
|  |         img.setDeviceName("摄像头1"); | ||||||
|  |         img.setDeviceSerial("sxt_1750583731809_227"); | ||||||
|  |         log.info("识别结果: {}", img); | ||||||
|  |         othYs7DeviceImgService.saveCapturePic(List.of(img)); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ import java.util.stream.Collectors; | |||||||
|  * @date 2025/6/18 15:59 |  * @date 2025/6/18 15:59 | ||||||
|  */ |  */ | ||||||
| @Slf4j | @Slf4j | ||||||
| //@Component | @Component | ||||||
| public class IncSyncYs7DeviceCapturePicData { | public class IncSyncYs7DeviceCapturePicData { | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
| @ -132,7 +132,7 @@ public class IncSyncYs7DeviceCapturePicData { | |||||||
|             log.error("主线程中断", e); |             log.error("主线程中断", e); | ||||||
|         } |         } | ||||||
|         // 输出抓图结果日志 |         // 输出抓图结果日志 | ||||||
|         log.info("获取图片完成,共 {} 张:{}", imgList.size(), imgList); |         log.info("获取图片完成,共 {} 张", imgList.size()); | ||||||
|         ys7DeviceImgService.saveCapturePic(imgList); |         ys7DeviceImgService.saveCapturePic(imgList); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,11 +1,28 @@ | |||||||
| package org.dromara.manager.spartamanager; | package org.dromara.manager.spartamanager; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.io.FileUtil; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
|  | import org.dromara.common.core.exception.ServiceException; | ||||||
|  | import org.dromara.manager.spartamanager.enums.SpartaRecTypeEnum; | ||||||
|  | import org.dromara.manager.spartamanager.vo.ImageStreamResult; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaRecognizeVo; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaTargetVo; | ||||||
| import org.dromara.manager.spartamanager.vo.SpartaTokenVo; | import org.dromara.manager.spartamanager.vo.SpartaTokenVo; | ||||||
| import org.springframework.data.redis.core.StringRedisTemplate; | import org.springframework.data.redis.core.StringRedisTemplate; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
|  | import javax.imageio.ImageIO; | ||||||
|  | import java.awt.*; | ||||||
|  | import java.awt.image.BufferedImage; | ||||||
|  | import java.io.ByteArrayInputStream; | ||||||
|  | import java.io.ByteArrayOutputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.net.FileNameMap; | ||||||
|  | import java.net.URI; | ||||||
|  | import java.net.URISyntaxException; | ||||||
|  | import java.net.URLConnection; | ||||||
|  | import java.util.List; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -39,7 +56,112 @@ public class SpartaManager { | |||||||
|         ); |         ); | ||||||
|         token = tokenVo.getToken(); |         token = tokenVo.getToken(); | ||||||
|         Long expiresAt = tokenVo.getExpiresAt(); |         Long expiresAt = tokenVo.getExpiresAt(); | ||||||
|         stringRedisTemplate.opsForValue().set(SpartaConstant.TOKEN_REDIS_KEY, token, (expiresAt - 3600), TimeUnit.SECONDS); |         // 当前时间戳(单位:秒) | ||||||
|  |         long now = System.currentTimeMillis() / 1000; | ||||||
|  |         // 相差秒数 | ||||||
|  |         long diff = expiresAt - now; | ||||||
|  |         if (diff <= 0) { | ||||||
|  |             throw new ServiceException("token已过期"); | ||||||
|  |         } | ||||||
|  |         stringRedisTemplate.opsForValue().set(SpartaConstant.TOKEN_REDIS_KEY, token, (diff - 3600), TimeUnit.SECONDS); | ||||||
|         return token; |         return token; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 识别图片 | ||||||
|  |      * | ||||||
|  |      * @param capUrl      图片地址 | ||||||
|  |      * @param recTypeList 识别类型 | ||||||
|  |      * @param async       是否异步 | ||||||
|  |      * @param callBackUrl 回调地址 | ||||||
|  |      * @param areaHigh    区域高 | ||||||
|  |      * @return 识别结果 | ||||||
|  |      */ | ||||||
|  |     public SpartaRecognizeVo recognize(String capUrl, List<SpartaRecTypeEnum> recTypeList, Boolean async, String callBackUrl, String areaHigh) { | ||||||
|  |         String token = getToken(); | ||||||
|  |         String recType = SpartaRecTypeEnum.joinRecTypes(recTypeList); | ||||||
|  |         return SpartaRequestUtils.recognize( | ||||||
|  |             spartaProperties.getUrl(), | ||||||
|  |             token, | ||||||
|  |             capUrl, | ||||||
|  |             recType, | ||||||
|  |             async, | ||||||
|  |             callBackUrl, | ||||||
|  |             areaHigh | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 识别图片 | ||||||
|  |      * | ||||||
|  |      * @param capUrl      图片地址 | ||||||
|  |      * @param recTypeList 识别类型 | ||||||
|  |      * @return 识别结果 | ||||||
|  |      */ | ||||||
|  |     public SpartaRecognizeVo recognize(String capUrl, List<SpartaRecTypeEnum> recTypeList) { | ||||||
|  |         return recognize(capUrl, recTypeList, false, null, null); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 绘制图片 | ||||||
|  |      * | ||||||
|  |      * @param imgUrl  图片地址 | ||||||
|  |      * @param targets 识别结果 | ||||||
|  |      * @return 绘制后的图片 | ||||||
|  |      */ | ||||||
|  |     public ImageStreamResult drawImageToStream(String imgUrl, List<SpartaTargetVo> targets) throws IOException, URISyntaxException { | ||||||
|  |         // 1. 加载图片 | ||||||
|  |         URI uri = new URI(imgUrl); | ||||||
|  |         BufferedImage image = ImageIO.read(uri.toURL()); | ||||||
|  |         // 2. 开始绘图 | ||||||
|  |         Graphics2D g = image.createGraphics(); | ||||||
|  |         g.setColor(Color.RED); | ||||||
|  |         g.setStroke(new BasicStroke(5)); | ||||||
|  |         // 设置中文兼容字体(或使用指定字体) | ||||||
|  |         g.setFont(new Font("SansSerif", Font.BOLD, 18)); | ||||||
|  |         for (SpartaTargetVo target : targets) { | ||||||
|  |             int x = target.getLeftTopPoint().get(0); | ||||||
|  |             int y = target.getLeftTopPoint().get(1); | ||||||
|  |             int w = target.getSize().get(0); | ||||||
|  |             int h = target.getSize().get(1); | ||||||
|  |             // 画矩形框 | ||||||
|  |             g.drawRect(x, y, w, h); | ||||||
|  |             // 写文字(类型 + 置信度) | ||||||
|  |             String label = target.getType() + " (" + String.format("%.2f", target.getScore()) + ")"; | ||||||
|  |             g.drawString(label, x, y - 5); | ||||||
|  |         } | ||||||
|  |         g.dispose(); | ||||||
|  |         // 3. 输出为 InputStream | ||||||
|  |         ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||||||
|  |         String filename = extractFilename(imgUrl); | ||||||
|  |         String suffix = FileUtil.getSuffix(filename); | ||||||
|  |         ImageIO.write(image, suffix == null ? "jpg" : suffix, baos); | ||||||
|  |         return new ImageStreamResult(new ByteArrayInputStream(baos.toByteArray()), baos.size(), getContentTypeByFilename(filename)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 提取文件名 | ||||||
|  |      * | ||||||
|  |      * @param url 文件路径 | ||||||
|  |      * @return 文件名 | ||||||
|  |      */ | ||||||
|  |     private static String extractFilename(String url) { | ||||||
|  |         int start = url.lastIndexOf("/") + 1; | ||||||
|  |         int end = url.indexOf("?", start); | ||||||
|  |         if (start > 0 && end > start) { | ||||||
|  |             return url.substring(start, end); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 根据文件名获取文件类型 | ||||||
|  |      * | ||||||
|  |      * @param filename 文件名 | ||||||
|  |      * @return 文件类型 | ||||||
|  |      */ | ||||||
|  |     private static String getContentTypeByFilename(String filename) { | ||||||
|  |         FileNameMap fileNameMap = URLConnection.getFileNameMap(); | ||||||
|  |         return fileNameMap.getContentTypeFor(filename); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,14 +2,19 @@ package org.dromara.manager.spartamanager; | |||||||
|  |  | ||||||
| import cn.hutool.http.HttpRequest; | import cn.hutool.http.HttpRequest; | ||||||
| import cn.hutool.http.HttpResponse; | import cn.hutool.http.HttpResponse; | ||||||
|  | import cn.hutool.http.HttpStatus; | ||||||
| import cn.hutool.json.JSONObject; | import cn.hutool.json.JSONObject; | ||||||
| import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.dromara.common.core.exception.ServiceException; | import org.dromara.common.core.exception.ServiceException; | ||||||
| import org.dromara.manager.spartamanager.vo.SpartaResponseVo; | import org.dromara.common.core.utils.StringUtils; | ||||||
|  | import org.dromara.manager.spartamanager.enums.SpartaHasTargetEnum; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaRecognizeVo; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaTargetVo; | ||||||
| import org.dromara.manager.spartamanager.vo.SpartaTokenVo; | import org.dromara.manager.spartamanager.vo.SpartaTokenVo; | ||||||
|  |  | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author lcj |  * @author lcj | ||||||
| @ -51,4 +56,55 @@ public class SpartaRequestUtils { | |||||||
|             return tokenVo; |             return tokenVo; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 识别图片 | ||||||
|  |      * | ||||||
|  |      * @param host        域名 | ||||||
|  |      * @param token       token | ||||||
|  |      * @param capUrl      在线图片地址 | ||||||
|  |      * @param recType     识别算法模型,多选模式每个参数之间用空格隔开例 | ||||||
|  |      * @param async       是否异步处理 | ||||||
|  |      * @param callBackUrl 回调地址(Post) | ||||||
|  |      * @param areaHigh    高空识别项目,格式为:勾选范围的左上角x,y坐标以及宽,高,中间用空格隔开 | ||||||
|  |      * @return 识别结果 | ||||||
|  |      */ | ||||||
|  |     public static SpartaRecognizeVo recognize(String host, String token, String capUrl, | ||||||
|  |                                               String recType, Boolean async, String callBackUrl, String areaHigh) { | ||||||
|  |         if (StringUtils.isAnyBlank(host, token, capUrl)) { | ||||||
|  |             throw new ServiceException("斯巴达识别图片参数为空", HttpStatus.HTTP_BAD_REQUEST); | ||||||
|  |         } | ||||||
|  |         HashMap<String, Object> paramMap = new HashMap<>(); | ||||||
|  |         paramMap.put("capUrl", capUrl); | ||||||
|  |         paramMap.put("recType", recType); | ||||||
|  |         paramMap.put("async", async != null && async ? "True" : "False"); | ||||||
|  |         paramMap.put("callBackUrl", callBackUrl); | ||||||
|  |         paramMap.put("area_high", areaHigh); | ||||||
|  |         String errorMsg = "斯巴达识别图片请求失败"; | ||||||
|  |         String url = host + SpartaConstant.RECOGNIZE_API_PATH_GET; | ||||||
|  |         try (HttpResponse response = HttpRequest.get(url) | ||||||
|  |             .header("Authorization", "Basic " + token) | ||||||
|  |             .form(paramMap) | ||||||
|  |             .execute()) { | ||||||
|  |             if (!response.isOk()) { | ||||||
|  |                 log.error("{}:{}", errorMsg, response.getStatus()); | ||||||
|  |                 throw new ServiceException(errorMsg + response.getStatus()); | ||||||
|  |             } | ||||||
|  |             String body = response.body(); | ||||||
|  |             if (body == null) { | ||||||
|  |                 log.error("{}:{}", errorMsg, "返回参数为空"); | ||||||
|  |             } | ||||||
|  |             JSONObject result = JSONUtil.parseObj(response.body()); | ||||||
|  |             log.info("斯巴达识别图片请求成功:{}", body); | ||||||
|  |             SpartaRecognizeVo spartaRecognizeVo = new SpartaRecognizeVo(); | ||||||
|  |             Integer hasTarget = result.getInt("hasTarget"); | ||||||
|  |             spartaRecognizeVo.setHasTarget(hasTarget); | ||||||
|  |             if (hasTarget.equals(SpartaHasTargetEnum.YES.getValue())) { | ||||||
|  |                 spartaRecognizeVo.setOriginalImgSize(result.getJSONArray("originalImgSize").toList(Integer.class)); | ||||||
|  |                 List<SpartaTargetVo> targetList = JSONUtil.toList(result.getJSONArray("targets"), SpartaTargetVo.class); | ||||||
|  |                 spartaRecognizeVo.setTargets(targetList); | ||||||
|  |             } | ||||||
|  |             return spartaRecognizeVo; | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,22 @@ | |||||||
|  | package org.dromara.manager.spartamanager.enums; | ||||||
|  |  | ||||||
|  | import lombok.Getter; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lcj | ||||||
|  |  * @date 2025/6/23 9:51 | ||||||
|  |  */ | ||||||
|  | @Getter | ||||||
|  | public enum SpartaHasTargetEnum { | ||||||
|  |  | ||||||
|  |     YES("是", 1), | ||||||
|  |     NO("否", 0); | ||||||
|  |  | ||||||
|  |     private final String text; | ||||||
|  |     private final int value; | ||||||
|  |  | ||||||
|  |     SpartaHasTargetEnum(String text, int value) { | ||||||
|  |         this.text = text; | ||||||
|  |         this.value = value; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,62 @@ | |||||||
|  | package org.dromara.manager.spartamanager.enums; | ||||||
|  |  | ||||||
|  | import lombok.Getter; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lcj | ||||||
|  |  * @date 2025/6/23 9:42 | ||||||
|  |  */ | ||||||
|  | @Getter | ||||||
|  | public enum SpartaRecTypeEnum { | ||||||
|  |  | ||||||
|  |     HAT("安全帽识别", "hat"), | ||||||
|  |     HEAD("不戴安全帽识别", "head"), | ||||||
|  |     SMOKE("吸烟识别", "smoke"), | ||||||
|  |     BELT("安全带识别", "belt"), | ||||||
|  |     WASTE("工程垃圾识别(暂无)", "waste"), | ||||||
|  |     EXCAVATOR("挖掘机", "excavator"), | ||||||
|  |     ROLLER("压路机", "Roller"), | ||||||
|  |     TRUCK_CRANE("汽车吊", "Truck_crane"), | ||||||
|  |     LOADER("装载机", "Loader"), | ||||||
|  |     SUBMERSIBLE_DRILLING_RIG("潜挖钻机", "Submersible_drilling_rig"), | ||||||
|  |     SPRINKLER("洒水车", "Sprinkler"), | ||||||
|  |     TRUCK_MOUNTED_CRANE("随车吊", "Truck_mounted_crane"), | ||||||
|  |     TRUCK("货车", "Truck"), | ||||||
|  |     PHO("光伏板", "pho"), | ||||||
|  |     HOLE("洞", "hole"), | ||||||
|  |     SHELVES("架子", "shelves"), | ||||||
|  |     PILE("桩", "pile"); | ||||||
|  |  | ||||||
|  |     private final String text; | ||||||
|  |     private final String value; | ||||||
|  |  | ||||||
|  |     SpartaRecTypeEnum(String text, String value) { | ||||||
|  |         this.text = text; | ||||||
|  |         this.value = value; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static SpartaRecTypeEnum fromValue(String value) { | ||||||
|  |         for (SpartaRecTypeEnum type : SpartaRecTypeEnum.values()) { | ||||||
|  |             if (type.getValue().equals(value)) { | ||||||
|  |                 return type; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 将多个 SpartaRecTypeEnum 拼接为接口识别参数字符串(空格分隔) | ||||||
|  |      * 示例:hat belt Truck | ||||||
|  |      */ | ||||||
|  |     public static String joinRecTypes(List<SpartaRecTypeEnum> types) { | ||||||
|  |         if (types == null || types.isEmpty()) { | ||||||
|  |             return ""; | ||||||
|  |         } | ||||||
|  |         return types.stream() | ||||||
|  |             .map(SpartaRecTypeEnum::getValue) | ||||||
|  |             .collect(Collectors.joining(" ")); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | package org.dromara.manager.spartamanager.vo; | ||||||
|  |  | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.InputStream; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lcj | ||||||
|  |  * @date 2025/6/23 14:44 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @AllArgsConstructor | ||||||
|  | public class ImageStreamResult { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 图片输入流 | ||||||
|  |      */ | ||||||
|  |     private InputStream inputStream; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 图片长度 | ||||||
|  |      */ | ||||||
|  |     private long length; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 图片类型 | ||||||
|  |      */ | ||||||
|  |     private String contentType; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,29 @@ | |||||||
|  | package org.dromara.manager.spartamanager.vo; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lcj | ||||||
|  |  * @date 2025/6/20 19:25 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class SpartaRecognizeVo { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否监测到目标:1:是;0:否 | ||||||
|  |      */ | ||||||
|  |     private Integer hasTarget; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 原始图片尺寸([宽,高]),ex:[1920,1080] | ||||||
|  |      */ | ||||||
|  |     private List<Integer> originalImgSize; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标信息 | ||||||
|  |      */ | ||||||
|  |     private List<SpartaTargetVo> targets; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -1,27 +0,0 @@ | |||||||
| package org.dromara.manager.spartamanager.vo; |  | ||||||
|  |  | ||||||
| import lombok.Data; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @author lcj |  | ||||||
|  * @date 2025/6/20 19:25 |  | ||||||
|  */ |  | ||||||
| @Data |  | ||||||
| public class SpartaResponseVo { |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 响应码 |  | ||||||
|      */ |  | ||||||
|     private String code; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 响应数据 |  | ||||||
|      */ |  | ||||||
|     private String data; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 响应信息 |  | ||||||
|      */ |  | ||||||
|     private String msg; |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | package org.dromara.manager.spartamanager.vo; | ||||||
|  |  | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.NoArgsConstructor; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lcj | ||||||
|  |  * @date 2025/6/23 11:22 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @NoArgsConstructor | ||||||
|  | @AllArgsConstructor | ||||||
|  | public class SpartaTargetVo { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标类型 | ||||||
|  |      */ | ||||||
|  |     private String type; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标外接矩形像素 | ||||||
|  |      */ | ||||||
|  |     private List<Integer> size; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标在画面中左上角位置信息 | ||||||
|  |      */ | ||||||
|  |     private List<Integer> leftTopPoint; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 置信度得分(0~1) | ||||||
|  |      */ | ||||||
|  |     private Double score; | ||||||
|  | } | ||||||
| @ -88,7 +88,6 @@ public class Ys7RequestUtils { | |||||||
|                 log.error("{},状态码:{},{}", errorMsg, responseVo.getCode(), responseVo.getMsg()); |                 log.error("{},状态码:{},{}", errorMsg, responseVo.getCode(), responseVo.getMsg()); | ||||||
|                 throw new ServiceException(errorMsg + responseVo.getMsg()); |                 throw new ServiceException(errorMsg + responseVo.getMsg()); | ||||||
|             } |             } | ||||||
|             log.info("Ys7 分页查询设备列表 第{}页大小{} 响应数据:{}", pageStart, pageSize, responseVo.getData()); |  | ||||||
|             log.info("Ys7 分页查询设备列表 第{}页大小{} 请求成功:{}", pageStart, pageSize, responseVo.getPage()); |             log.info("Ys7 分页查询设备列表 第{}页大小{} 请求成功:{}", pageStart, pageSize, responseVo.getPage()); | ||||||
|             return JSONUtil.toList(responseVo.getData(), Ys7QueryDeviceResponseVo.class); |             return JSONUtil.toList(responseVo.getData(), Ys7QueryDeviceResponseVo.class); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ import org.springframework.web.bind.annotation.*; | |||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 公司 |  * 材料供应商 | ||||||
|  * |  * | ||||||
|  * @author lcj |  * @author lcj | ||||||
|  * @date 2025-03-06 |  * @date 2025-03-06 | ||||||
| @ -42,7 +42,7 @@ public class MatCompanyController extends BaseController { | |||||||
|     private final IMatCompanyService companyService; |     private final IMatCompanyService companyService; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询公司列表 |      * 查询材料供应商列表 | ||||||
|      */ |      */ | ||||||
|     @SaCheckPermission("materials:company:list") |     @SaCheckPermission("materials:company:list") | ||||||
|     @GetMapping("/list") |     @GetMapping("/list") | ||||||
| @ -51,18 +51,18 @@ public class MatCompanyController extends BaseController { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 导出公司列表 |      * 导出材料供应商列表 | ||||||
|      */ |      */ | ||||||
|     @SaCheckPermission("materials:company:export") |     @SaCheckPermission("materials:company:export") | ||||||
|     @Log(title = "公司", businessType = BusinessType.EXPORT) |     @Log(title = "材料供应商", businessType = BusinessType.EXPORT) | ||||||
|     @PostMapping("/export") |     @PostMapping("/export") | ||||||
|     public void export(MatCompanyQueryReq req, HttpServletResponse response) { |     public void export(MatCompanyQueryReq req, HttpServletResponse response) { | ||||||
|         List<MatCompanyVo> list = companyService.queryList(req); |         List<MatCompanyVo> list = companyService.queryList(req); | ||||||
|         ExcelUtil.exportExcel(list, "公司", MatCompanyVo.class, response); |         ExcelUtil.exportExcel(list, "材料供应商", MatCompanyVo.class, response); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 获取公司详细信息 |      * 获取材料供应商详细信息 | ||||||
|      * |      * | ||||||
|      * @param id 主键 |      * @param id 主键 | ||||||
|      */ |      */ | ||||||
| @ -74,10 +74,10 @@ public class MatCompanyController extends BaseController { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 新增公司 |      * 新增材料供应商 | ||||||
|      */ |      */ | ||||||
|     @SaCheckPermission("materials:company:add") |     @SaCheckPermission("materials:company:add") | ||||||
|     @Log(title = "公司", businessType = BusinessType.INSERT) |     @Log(title = "材料供应商", businessType = BusinessType.INSERT) | ||||||
|     @RepeatSubmit() |     @RepeatSubmit() | ||||||
|     @PostMapping() |     @PostMapping() | ||||||
|     public R<Long> add(@Validated(AddGroup.class) @RequestBody MatCompanyCreateReq req) { |     public R<Long> add(@Validated(AddGroup.class) @RequestBody MatCompanyCreateReq req) { | ||||||
| @ -88,10 +88,10 @@ public class MatCompanyController extends BaseController { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 修改公司 |      * 修改材料供应商 | ||||||
|      */ |      */ | ||||||
|     @SaCheckPermission("materials:company:edit") |     @SaCheckPermission("materials:company:edit") | ||||||
|     @Log(title = "公司", businessType = BusinessType.UPDATE) |     @Log(title = "材料供应商", businessType = BusinessType.UPDATE) | ||||||
|     @RepeatSubmit() |     @RepeatSubmit() | ||||||
|     @PutMapping() |     @PutMapping() | ||||||
|     public R<Void> edit(@Validated(EditGroup.class) @RequestBody MatCompanyUpdateReq req) { |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody MatCompanyUpdateReq req) { | ||||||
| @ -99,12 +99,12 @@ public class MatCompanyController extends BaseController { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 删除公司 |      * 删除材料供应商 | ||||||
|      * |      * | ||||||
|      * @param ids 主键串 |      * @param ids 主键串 | ||||||
|      */ |      */ | ||||||
|     @SaCheckPermission("materials:company:remove") |     @SaCheckPermission("materials:company:remove") | ||||||
|     @Log(title = "公司", businessType = BusinessType.DELETE) |     @Log(title = "材料供应商", businessType = BusinessType.DELETE) | ||||||
|     @DeleteMapping("/{ids}") |     @DeleteMapping("/{ids}") | ||||||
|     public R<Void> remove(@NotEmpty(message = "主键不能为空") |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|                           @PathVariable Long[] ids) { |                           @PathVariable Long[] ids) { | ||||||
|  | |||||||
| @ -29,4 +29,19 @@ public interface Ys7DeviceImgConstant { | |||||||
|         String fileName = String.format("%s_%s.%s", date, uuid, suffix); |         String fileName = String.format("%s_%s.%s", date, uuid, suffix); | ||||||
|         return DEVICE_IMG_OSS_URL_PREFIX + deviceSerial + "/" + fileName; |         return DEVICE_IMG_OSS_URL_PREFIX + deviceSerial + "/" + fileName; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取设备图片oss路径 | ||||||
|  |      * | ||||||
|  |      * @param originalFilename 文件名原始名 | ||||||
|  |      * @param deviceSerial     设备序列号 | ||||||
|  |      * @return oss路径 | ||||||
|  |      */ | ||||||
|  |     static String getTargetImgOssPath(String originalFilename, String deviceSerial) { | ||||||
|  |         String suffix = FileUtil.getSuffix(originalFilename); | ||||||
|  |         String uuid = IdUtil.fastSimpleUUID(); | ||||||
|  |         String date = DateUtils.getDate(); | ||||||
|  |         String fileName = String.format("%s_%s.%s", date, uuid, suffix); | ||||||
|  |         return DEVICE_IMG_OSS_URL_PREFIX + deviceSerial + "/target/" + fileName; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -42,6 +42,31 @@ public class OthYs7DeviceImg implements Serializable { | |||||||
|      */ |      */ | ||||||
|     private String url; |     private String url; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 识别算法模型 | ||||||
|  |      */ | ||||||
|  |     private String recType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否监测到目标(1是 0否) | ||||||
|  |      */ | ||||||
|  |     private Integer isRecognize; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 原始图片尺寸 | ||||||
|  |      */ | ||||||
|  |     private String imgSize; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标信息 | ||||||
|  |      */ | ||||||
|  |     private String targets; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 识别结果图片地址 | ||||||
|  |      */ | ||||||
|  |     private String recognizeUrl; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 备注 |      * 备注 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ import org.dromara.other.domain.OthYs7DeviceImg; | |||||||
| import java.io.Serial; | import java.io.Serial; | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -49,6 +50,16 @@ public class OthYs7DeviceImgVo implements Serializable { | |||||||
|     @ExcelProperty(value = "图片地址") |     @ExcelProperty(value = "图片地址") | ||||||
|     private String url; |     private String url; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 识别算法模型 | ||||||
|  |      */ | ||||||
|  |     private List<String> recTypeList; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否监测到目标(1是 0否) | ||||||
|  |      */ | ||||||
|  |     private Integer isRecognize; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 备注 |      * 备注 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package org.dromara.other.mapper; | ||||||
|  |  | ||||||
|  | import org.dromara.other.domain.OthYs7DeviceImg; | ||||||
|  | import org.dromara.other.domain.vo.ys7deviceimg.OthYs7DeviceImgVo; | ||||||
|  | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 萤石摄像头图片Mapper接口 | ||||||
|  |  * | ||||||
|  |  * @author lcj | ||||||
|  |  * @date 2025-06-18 | ||||||
|  |  */ | ||||||
|  | public interface OthYs7DeviceImgMapper extends BaseMapperPlus<OthYs7DeviceImg, OthYs7DeviceImgVo> { | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -1,15 +1,25 @@ | |||||||
| package org.dromara.other.service.impl; | package org.dromara.other.service.impl; | ||||||
|  |  | ||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
|  | import cn.hutool.json.JSONUtil; | ||||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
|  | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.dromara.common.core.constant.HttpStatus; | import org.dromara.common.core.constant.HttpStatus; | ||||||
| import org.dromara.common.core.exception.ServiceException; | import org.dromara.common.core.exception.ServiceException; | ||||||
| import org.dromara.common.core.utils.StringUtils; | import org.dromara.common.core.utils.StringUtils; | ||||||
| import org.dromara.common.mybatis.core.page.PageQuery; | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.oss.core.OssClient; | ||||||
|  | import org.dromara.common.oss.factory.OssFactory; | ||||||
|  | import org.dromara.manager.spartamanager.SpartaManager; | ||||||
|  | import org.dromara.manager.spartamanager.enums.SpartaHasTargetEnum; | ||||||
|  | import org.dromara.manager.spartamanager.enums.SpartaRecTypeEnum; | ||||||
|  | import org.dromara.manager.spartamanager.vo.ImageStreamResult; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaRecognizeVo; | ||||||
|  | import org.dromara.manager.spartamanager.vo.SpartaTargetVo; | ||||||
| import org.dromara.other.constant.Ys7DeviceImgConstant; | import org.dromara.other.constant.Ys7DeviceImgConstant; | ||||||
| import org.dromara.other.domain.OthYs7DeviceImg; | import org.dromara.other.domain.OthYs7DeviceImg; | ||||||
| import org.dromara.other.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture; | import org.dromara.other.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture; | ||||||
| @ -23,13 +33,11 @@ import org.springframework.beans.BeanUtils; | |||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
|  |  | ||||||
|  | import java.io.InputStream; | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||||
| import java.time.ZoneId; | import java.time.ZoneId; | ||||||
| import java.util.ArrayList; | import java.util.*; | ||||||
| import java.util.Collection; |  | ||||||
| import java.util.Date; |  | ||||||
| import java.util.List; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 萤石摄像头图片Service业务层处理 |  * 萤石摄像头图片Service业务层处理 | ||||||
| @ -37,6 +45,7 @@ import java.util.List; | |||||||
|  * @author lcj |  * @author lcj | ||||||
|  * @date 2025-06-18 |  * @date 2025-06-18 | ||||||
|  */ |  */ | ||||||
|  | @Slf4j | ||||||
| @Service | @Service | ||||||
| public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMapper, OthYs7DeviceImg> | public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMapper, OthYs7DeviceImg> | ||||||
|     implements IOthYs7DeviceImgService { |     implements IOthYs7DeviceImgService { | ||||||
| @ -44,6 +53,9 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe | |||||||
|     @Resource |     @Resource | ||||||
|     private ISysOssService ossService; |     private ISysOssService ossService; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private SpartaManager spartaManager; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询萤石摄像头图片 |      * 查询萤石摄像头图片 | ||||||
|      * |      * | ||||||
| @ -150,7 +162,20 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe | |||||||
|         if (CollUtil.isEmpty(ys7DeviceImgList)) { |         if (CollUtil.isEmpty(ys7DeviceImgList)) { | ||||||
|             return ys7DeviceImgVoPage; |             return ys7DeviceImgVoPage; | ||||||
|         } |         } | ||||||
|         List<OthYs7DeviceImgVo> ys7DeviceImgVoList = ys7DeviceImgList.stream().map(this::getVo).toList(); |         List<OthYs7DeviceImgVo> ys7DeviceImgVoList = ys7DeviceImgList.stream().map(deviceImg -> { | ||||||
|  |             OthYs7DeviceImgVo vo = new OthYs7DeviceImgVo(); | ||||||
|  |             if (deviceImg == null) { | ||||||
|  |                 return vo; | ||||||
|  |             } | ||||||
|  |             BeanUtils.copyProperties(deviceImg, vo); | ||||||
|  |             if (deviceImg.getRecognizeUrl() != null) { | ||||||
|  |                 vo.setUrl(deviceImg.getRecognizeUrl()); | ||||||
|  |             } | ||||||
|  |             List<String> recTypeList = JSONUtil.toList(deviceImg.getRecType(), String.class); | ||||||
|  |             List<String> list = recTypeList.stream().map(recType -> Objects.requireNonNull(SpartaRecTypeEnum.fromValue(recType)).getText()).toList(); | ||||||
|  |             vo.setRecTypeList(list); | ||||||
|  |             return vo; | ||||||
|  |         }).toList(); | ||||||
|         ys7DeviceImgVoPage.setRecords(ys7DeviceImgVoList); |         ys7DeviceImgVoPage.setRecords(ys7DeviceImgVoList); | ||||||
|         return ys7DeviceImgVoPage; |         return ys7DeviceImgVoPage; | ||||||
|     } |     } | ||||||
| @ -177,6 +202,31 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe | |||||||
|                 othYs7DeviceImg.setCreateTime(img.getCreateTime()); |                 othYs7DeviceImg.setCreateTime(img.getCreateTime()); | ||||||
|                 othYs7DeviceImg.setDeviceName(img.getDeviceName()); |                 othYs7DeviceImg.setDeviceName(img.getDeviceName()); | ||||||
|                 othYs7DeviceImg.setUrl(ossUrl); |                 othYs7DeviceImg.setUrl(ossUrl); | ||||||
|  |                 // 将抓取的图片进行识别 | ||||||
|  |                 List<SpartaRecTypeEnum> recTypes = List.of(SpartaRecTypeEnum.HEAD, SpartaRecTypeEnum.SMOKE); | ||||||
|  |                 SpartaRecognizeVo recognizeVo = spartaManager.recognize(ossUrl, recTypes); | ||||||
|  |                 if (recognizeVo != null && recognizeVo.getHasTarget().equals(SpartaHasTargetEnum.YES.getValue())) { | ||||||
|  |                     List<SpartaTargetVo> targets = recognizeVo.getTargets(); | ||||||
|  |                     othYs7DeviceImg.setTargets(JSONUtil.toJsonStr(targets)); | ||||||
|  |                     othYs7DeviceImg.setImgSize(JSONUtil.toJsonStr(recognizeVo.getOriginalImgSize())); | ||||||
|  |                     othYs7DeviceImg.setIsRecognize(SpartaHasTargetEnum.YES.getValue()); | ||||||
|  |                     List<String> recTypeList = targets.stream().map(SpartaTargetVo::getType).distinct().toList(); | ||||||
|  |                     othYs7DeviceImg.setRecType(JSONUtil.toJsonStr(recTypeList)); | ||||||
|  |                     try { | ||||||
|  |                         ImageStreamResult imageStreamResult = spartaManager.drawImageToStream(url, targets); | ||||||
|  |                         InputStream inputStream = imageStreamResult.getInputStream(); | ||||||
|  |                         String contentType = imageStreamResult.getContentType(); | ||||||
|  |                         long length = imageStreamResult.getLength(); | ||||||
|  |                         String targetImgPath = Ys7DeviceImgConstant.getTargetImgOssPath(originalFilename, deviceSerial); | ||||||
|  |                         SysOssUploadVo drawImageUploadVo = ossService.uploadFileUrlWithNoSave(inputStream, targetImgPath, contentType, length); | ||||||
|  |                         String targetUrl = drawImageUploadVo.getUrl(); | ||||||
|  |                         if (StringUtils.isNotBlank(targetUrl)) { | ||||||
|  |                             othYs7DeviceImg.setRecognizeUrl(targetUrl); | ||||||
|  |                         } | ||||||
|  |                     } catch (Exception e) { | ||||||
|  |                         log.error("图片识别失败", e); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|                 saveList.add(othYs7DeviceImg); |                 saveList.add(othYs7DeviceImg); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -195,10 +245,27 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe | |||||||
|      * @return 删除数量 |      * @return 删除数量 | ||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|  |     @Transactional(rollbackFor = Exception.class) | ||||||
|     public int deleteByCreateTimeBefore(Date cutoffDate) { |     public int deleteByCreateTimeBefore(Date cutoffDate) { | ||||||
|         LambdaQueryWrapper<OthYs7DeviceImg> lqw = new LambdaQueryWrapper<>(); |         LambdaQueryWrapper<OthYs7DeviceImg> lqw = new LambdaQueryWrapper<>(); | ||||||
|         lqw.lt(OthYs7DeviceImg::getCreateTime, cutoffDate); |         lqw.lt(OthYs7DeviceImg::getCreateTime, cutoffDate); | ||||||
|         return baseMapper.delete(lqw); |         // 删除对象存储中的图片 | ||||||
|  |         List<OthYs7DeviceImg> list = this.list(lqw); | ||||||
|  |         if (CollUtil.isEmpty(list)) { | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |         OssClient storage = OssFactory.instance(); | ||||||
|  |         for (OthYs7DeviceImg othYs7DeviceImg : list) { | ||||||
|  |             storage.delete(othYs7DeviceImg.getUrl()); | ||||||
|  |             if (othYs7DeviceImg.getRecognizeUrl() != null) { | ||||||
|  |                 storage.delete(othYs7DeviceImg.getRecognizeUrl()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         boolean result = this.removeBatchByIds(list); | ||||||
|  |         if (!result) { | ||||||
|  |             throw new ServiceException("删除图片失败,数据库异常", HttpStatus.ERROR); | ||||||
|  |         } | ||||||
|  |         return list.size(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -210,6 +277,17 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe | |||||||
|     @Override |     @Override | ||||||
|     @Transactional(rollbackFor = Exception.class) |     @Transactional(rollbackFor = Exception.class) | ||||||
|     public Boolean deleteWithValidByIds(Collection<Long> ids) { |     public Boolean deleteWithValidByIds(Collection<Long> ids) { | ||||||
|  |         List<OthYs7DeviceImg> ys7DeviceImgList = this.listByIds(ids); | ||||||
|  |         if (CollUtil.isEmpty(ys7DeviceImgList)) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         OssClient storage = OssFactory.instance(); | ||||||
|  |         for (OthYs7DeviceImg ys7DeviceImg : ys7DeviceImgList) { | ||||||
|  |             storage.delete(ys7DeviceImg.getUrl()); | ||||||
|  |             if (ys7DeviceImg.getRecognizeUrl() != null) { | ||||||
|  |                 storage.delete(ys7DeviceImg.getRecognizeUrl()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|         return this.removeBatchByIds(ids); |         return this.removeBatchByIds(ids); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -219,7 +297,7 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe | |||||||
|      * @param url 文件路径 |      * @param url 文件路径 | ||||||
|      * @return 文件名 |      * @return 文件名 | ||||||
|      */ |      */ | ||||||
|     public static String extractFilename(String url) { |     private static String extractFilename(String url) { | ||||||
|         int start = url.lastIndexOf("/") + 1; |         int start = url.lastIndexOf("/") + 1; | ||||||
|         int end = url.indexOf("?", start); |         int end = url.indexOf("?", start); | ||||||
|         if (start > 0 && end > start) { |         if (start > 0 && end > start) { | ||||||
|  | |||||||
| @ -2,13 +2,11 @@ package org.dromara.project.controller; | |||||||
|  |  | ||||||
| import cn.dev33.satoken.annotation.SaCheckPermission; | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
| import cn.hutool.json.JSONObject; | import cn.hutool.json.JSONObject; | ||||||
| import jakarta.servlet.http.HttpServletResponse; |  | ||||||
| import jakarta.validation.constraints.NotEmpty; | import jakarta.validation.constraints.NotEmpty; | ||||||
| import jakarta.validation.constraints.NotNull; | import jakarta.validation.constraints.NotNull; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| import org.dromara.common.core.domain.R; | import org.dromara.common.core.domain.R; | ||||||
| import org.dromara.common.core.validate.EditGroup; | import org.dromara.common.core.validate.EditGroup; | ||||||
| import org.dromara.common.excel.utils.ExcelUtil; |  | ||||||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
| import org.dromara.common.log.annotation.Log; | import org.dromara.common.log.annotation.Log; | ||||||
| import org.dromara.common.log.enums.BusinessType; | import org.dromara.common.log.enums.BusinessType; | ||||||
| @ -49,17 +47,6 @@ public class BusProjectFileController extends BaseController { | |||||||
|         return busProjectFileService.queryPageList(req, pageQuery); |         return busProjectFileService.queryPageList(req, pageQuery); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 导出项目文件存储列表 |  | ||||||
|      */ |  | ||||||
|     @SaCheckPermission("project:projectFile:export") |  | ||||||
|     @Log(title = "项目文件存储", businessType = BusinessType.EXPORT) |  | ||||||
|     @PostMapping("/export") |  | ||||||
|     public void export(BusProjectFileQueryReq req, HttpServletResponse response) { |  | ||||||
|         List<BusProjectFileVo> list = busProjectFileService.queryList(req); |  | ||||||
|         ExcelUtil.exportExcel(list, "项目文件存储", BusProjectFileVo.class, response); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 获取项目文件存储详细信息 |      * 获取项目文件存储详细信息 | ||||||
|      * |      * | ||||||
| @ -99,6 +86,7 @@ public class BusProjectFileController extends BaseController { | |||||||
|     /** |     /** | ||||||
|      * 上传 dxf 文件并解析为 json |      * 上传 dxf 文件并解析为 json | ||||||
|      */ |      */ | ||||||
|  |     @SaCheckPermission("project:projectFile:add") | ||||||
|     @Log(title = "项目文件存储", businessType = BusinessType.IMPORT) |     @Log(title = "项目文件存储", businessType = BusinessType.IMPORT) | ||||||
|     @PostMapping("/upload/dxf") |     @PostMapping("/upload/dxf") | ||||||
|     public R<Void> uploadDxf2Json(@RequestParam("file") MultipartFile file, BusProjectFileUploadDxfReq req) { |     public R<Void> uploadDxf2Json(@RequestParam("file") MultipartFile file, BusProjectFileUploadDxfReq req) { | ||||||
|  | |||||||
| @ -1,10 +1,8 @@ | |||||||
| package org.dromara.project.domain.vo.projectfile; | package org.dromara.project.domain.vo.projectfile; | ||||||
|  |  | ||||||
| import org.dromara.project.domain.BusProjectFile; |  | ||||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; |  | ||||||
| import com.alibaba.excel.annotation.ExcelProperty; |  | ||||||
| import io.github.linpeilie.annotations.AutoMapper; | import io.github.linpeilie.annotations.AutoMapper; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  | import org.dromara.project.domain.BusProjectFile; | ||||||
|  |  | ||||||
| import java.io.Serial; | import java.io.Serial; | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| @ -17,7 +15,6 @@ import java.io.Serializable; | |||||||
|  * @date 2025-04-23 |  * @date 2025-04-23 | ||||||
|  */ |  */ | ||||||
| @Data | @Data | ||||||
| @ExcelIgnoreUnannotated |  | ||||||
| @AutoMapper(target = BusProjectFile.class) | @AutoMapper(target = BusProjectFile.class) | ||||||
| public class BusProjectFileVo implements Serializable { | public class BusProjectFileVo implements Serializable { | ||||||
|  |  | ||||||
| @ -27,19 +24,16 @@ public class BusProjectFileVo implements Serializable { | |||||||
|     /** |     /** | ||||||
|      * 文件类型 |      * 文件类型 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "文件类型") |  | ||||||
|     private String fileType; |     private String fileType; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 文件名称 |      * 文件名称 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "文件名称") |  | ||||||
|     private String fileName; |     private String fileName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 文件路径 |      * 文件路径 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "文件路径") |  | ||||||
|     private String filePath; |     private String filePath; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -117,7 +117,7 @@ public class HseViolationLevelServiceImpl extends ServiceImpl<HseViolationLevelM | |||||||
|         } |         } | ||||||
|         // 判断违章等级是否存在 |         // 判断违章等级是否存在 | ||||||
|         Long count = this.lambdaQuery() |         Long count = this.lambdaQuery() | ||||||
|             .eq(HseViolationLevel::getViolationLevel, violationLevel) |             .eq(HseViolationLevel::getViolationLevel, violationLevel.getViolationLevel()) | ||||||
|             .count(); |             .count(); | ||||||
|         if (count > 0) { |         if (count > 0) { | ||||||
|             throw new ServiceException("违章等级已存在", HttpStatus.BAD_REQUEST); |             throw new ServiceException("违章等级已存在", HttpStatus.BAD_REQUEST); | ||||||
| @ -284,8 +284,15 @@ public class HseViolationLevelServiceImpl extends ServiceImpl<HseViolationLevelM | |||||||
|         lqw.eq(ObjectUtils.isNotEmpty(projectId), HseViolationLevel::getProjectId, projectId); |         lqw.eq(ObjectUtils.isNotEmpty(projectId), HseViolationLevel::getProjectId, projectId); | ||||||
|         lqw.like(StringUtils.isNotBlank(violationLevel), HseViolationLevel::getViolationLevel, violationLevel); |         lqw.like(StringUtils.isNotBlank(violationLevel), HseViolationLevel::getViolationLevel, violationLevel); | ||||||
|         lqw.eq(StringUtils.isNotBlank(riskType), HseViolationLevel::getRiskType, riskType); |         lqw.eq(StringUtils.isNotBlank(riskType), HseViolationLevel::getRiskType, riskType); | ||||||
|         // todo |         if (StringUtils.isNotBlank(violationType)) { | ||||||
|         lqw.eq(StringUtils.isNotBlank(violationType), HseViolationLevel::getViolationType, violationType); |             lqw.likeRight(HseViolationLevel::getViolationType, violationType + ",") | ||||||
|  |                 .or() | ||||||
|  |                 .likeLeft(HseViolationLevel::getViolationType, "," + violationType) | ||||||
|  |                 .or() | ||||||
|  |                 .like(HseViolationLevel::getViolationType, "," + violationType + ",") | ||||||
|  |                 .or() | ||||||
|  |                 .eq(HseViolationLevel::getViolationType, violationType); | ||||||
|  |         } | ||||||
|         return lqw; |         return lqw; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile; | |||||||
|  |  | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| @ -79,6 +80,17 @@ public interface ISysOssService { | |||||||
|      */ |      */ | ||||||
|     SysOssUploadVo uploadFileUrlWithNoSave(String fileUrl, String filePath); |     SysOssUploadVo uploadFileUrlWithNoSave(String fileUrl, String filePath); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 通过 url 上传到对象存储服务,不保存文件信息到数据库 | ||||||
|  |      * | ||||||
|  |      * @param inputStream 要上传的文件输入流 | ||||||
|  |      * @param filePath    文件路径 | ||||||
|  |      * @param contentType 文件类型 | ||||||
|  |      * @param length      文件长度 | ||||||
|  |      * @return 上传成功后的 SysOssVo 对象,包含文件信息 | ||||||
|  |      */ | ||||||
|  |     SysOssUploadVo uploadFileUrlWithNoSave(InputStream inputStream, String filePath, String contentType, long length); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 上传文件到对象存储服务,并保存文件信息到数据库 |      * 上传文件到对象存储服务,并保存文件信息到数据库 | ||||||
|      * |      * | ||||||
|  | |||||||
| @ -291,6 +291,38 @@ public class SysOssServiceImpl implements ISysOssService, OssService { | |||||||
|         return uploadVo; |         return uploadVo; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 通过 url 上传到对象存储服务,不保存文件信息到数据库 | ||||||
|  |      * | ||||||
|  |      * @param inputStream 要上传的文件输入流 | ||||||
|  |      * @param filePath    文件路径 | ||||||
|  |      * @param contentType 文件类型 | ||||||
|  |      * @param length      文件长度 | ||||||
|  |      * @return 上传成功后的 SysOssVo 对象,包含文件信息 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public SysOssUploadVo uploadFileUrlWithNoSave(InputStream inputStream, String filePath, String contentType, long length) { | ||||||
|  |         UploadResult uploadResult; | ||||||
|  |         try { | ||||||
|  |             // 如果 length 不确定(如传 -1),就读取整个流算长度 | ||||||
|  |             if (length <= 0) { | ||||||
|  |                 byte[] bytes = IoUtil.readBytes(inputStream); | ||||||
|  |                 length = bytes.length; | ||||||
|  |                 inputStream = new ByteArrayInputStream(bytes); // 重置 InputStream | ||||||
|  |             } | ||||||
|  |             // 上传 | ||||||
|  |             OssClient storage = OssFactory.instance(); | ||||||
|  |             uploadResult = storage.upload(inputStream, filePath, length, contentType); | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             throw new ServiceException(e.getMessage()); | ||||||
|  |         } | ||||||
|  |         // 构建返回值 | ||||||
|  |         SysOssUploadVo uploadVo = new SysOssUploadVo(); | ||||||
|  |         uploadVo.setUrl(uploadResult.getUrl()); | ||||||
|  |         return uploadVo; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 上传文件到对象存储服务,并保存文件信息到数据库 |      * 上传文件到对象存储服务,并保存文件信息到数据库 | ||||||
|      * |      * | ||||||
|  | |||||||
| @ -180,23 +180,23 @@ values(1897844021656604679, '项目班组导出', 1897844021656604674, '5',  '#' | |||||||
|  |  | ||||||
| -- 菜单 SQL | -- 菜单 SQL | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1897844022982004737, '项目班组下的成员', '1897103538172985346', '1', 'projectTeamMember', 'project/projectTeamMember/index', 1, 0, 'C', '0', '0', 'project:projectTeamMember:list', '#', 103, 1, sysdate(), null, null, '项目班组下的成员菜单'); | values(1937072514748444673, '项目班组下的成员', '1897844021656604674', '1', 'projectTeamMember', 'project/projectTeamMember/index', 1, 0, 'C', '0', '0', 'project:projectTeamMember:list', '#', 103, 1, sysdate(), null, null, '项目班组下的成员菜单'); | ||||||
|  |  | ||||||
| -- 按钮 SQL | -- 按钮 SQL | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1897844022982004738, '项目班组下的成员查询', 1897844022982004737, '1',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:query',        '#', 103, 1, sysdate(), null, null, ''); | values(1937072514748444674, '项目班组下的成员查询', 1937072514748444673, '1',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1897844022982004739, '项目班组下的成员新增', 1897844022982004737, '2',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:add',          '#', 103, 1, sysdate(), null, null, ''); | values(1937072514748444675, '项目班组下的成员新增', 1937072514748444673, '2',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1897844022982004740, '项目班组下的成员修改', 1897844022982004737, '3',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:edit',         '#', 103, 1, sysdate(), null, null, ''); | values(1937072514748444676, '项目班组下的成员修改', 1937072514748444673, '3',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1897844022982004741, '项目班组下的成员删除', 1897844022982004737, '4',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:remove',       '#', 103, 1, sysdate(), null, null, ''); | values(1937072514748444677, '项目班组下的成员删除', 1937072514748444673, '4',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1897844022982004742, '项目班组下的成员导出', 1897844022982004737, '5',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:export',       '#', 103, 1, sysdate(), null, null, ''); | values(1937072514748444678, '项目班组下的成员导出', 1937072514748444673, '5',  '#', '', 1, 0, 'F', '0', '0', 'project:projectTeamMember:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
| -- 菜单 SQL | -- 菜单 SQL | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| @ -597,3 +597,123 @@ values(1935909171354439685, '等级与岗位关联删除', 1935909171354439681, | |||||||
|  |  | ||||||
| insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
| values(1935909171354439686, '等级与岗位关联导出', 1935909171354439681, '5',  '#', '', 1, 0, 'F', '0', '0', 'safety:violationLevelPost:export',       '#', 103, 1, sysdate(), null, null, ''); | values(1935909171354439686, '等级与岗位关联导出', 1935909171354439681, '5',  '#', '', 1, 0, 'F', '0', '0', 'safety:violationLevelPost:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | -- 菜单 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937085861401325569, '机械详情', '1898940240252375042', '1', 'machineryDetail', 'machinery/machineryDetail/index', 1, 0, 'C', '0', '0', 'machinery:machineryDetail:list', '#', 103, 1, sysdate(), null, null, '机械详情菜单'); | ||||||
|  |  | ||||||
|  | -- 按钮 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937085861401325570, '机械详情查询', 1937085861401325569, '1',  '#', '', 1, 0, 'F', '0', '0', 'machinery:machineryDetail:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937085861401325571, '机械详情新增', 1937085861401325569, '2',  '#', '', 1, 0, 'F', '0', '0', 'machinery:machineryDetail:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937085861401325572, '机械详情修改', 1937085861401325569, '3',  '#', '', 1, 0, 'F', '0', '0', 'machinery:machineryDetail:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937085861401325573, '机械详情删除', 1937085861401325569, '4',  '#', '', 1, 0, 'F', '0', '0', 'machinery:machineryDetail:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937085861401325574, '机械详情导出', 1937085861401325569, '5',  '#', '', 1, 0, 'F', '0', '0', 'machinery:machineryDetail:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | -- 菜单 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097586280235010, '安全巡检工单', '1902191175640604673', '1', 'safetyInspection', 'safety/safetyInspection/index', 1, 0, 'C', '0', '0', 'safety:safetyInspection:list', '#', 103, 1, sysdate(), null, null, '安全巡检工单菜单'); | ||||||
|  |  | ||||||
|  | -- 按钮 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097586280235011, '安全巡检工单查询', 1937097586280235010, '1',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyInspection:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097586280235012, '安全巡检工单新增', 1937097586280235010, '2',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyInspection:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097586280235013, '安全巡检工单修改', 1937097586280235010, '3',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyInspection:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097586280235014, '安全巡检工单删除', 1937097586280235010, '4',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyInspection:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097586280235015, '安全巡检工单导出', 1937097586280235010, '5',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyInspection:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | -- 菜单 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097992276279297, '安全周报', '1902191175640604673', '1', 'safetyWeeklyReport', 'safety/safetyWeeklyReport/index', 1, 0, 'C', '0', '0', 'safety:safetyWeeklyReport:list', '#', 103, 1, sysdate(), null, null, '安全周报菜单'); | ||||||
|  |  | ||||||
|  | -- 按钮 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097992276279298, '安全周报查询', 1937097992276279297, '1',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyWeeklyReport:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097992276279299, '安全周报新增', 1937097992276279297, '2',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyWeeklyReport:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097992276279300, '安全周报修改', 1937097992276279297, '3',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyWeeklyReport:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097992276279301, '安全周报删除', 1937097992276279297, '4',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyWeeklyReport:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937097992276279302, '安全周报导出', 1937097992276279297, '5',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyWeeklyReport:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | -- 菜单 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937098027248386049, '安全日志', '1902191175640604673', '1', 'safetyLog', 'safety/safetyLog/index', 1, 0, 'C', '0', '0', 'safety:safetyLog:list', '#', 103, 1, sysdate(), null, null, '安全日志菜单'); | ||||||
|  |  | ||||||
|  | -- 按钮 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937098027248386050, '安全日志查询', 1937098027248386049, '1',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyLog:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937098027248386051, '安全日志新增', 1937098027248386049, '2',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyLog:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937098027248386052, '安全日志修改', 1937098027248386049, '3',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyLog:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937098027248386053, '安全日志删除', 1937098027248386049, '4',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyLog:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937098027248386054, '安全日志导出', 1937098027248386049, '5',  '#', '', 1, 0, 'F', '0', '0', 'safety:safetyLog:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | -- 菜单 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100190854938626, '进度计划详情', '1925849078848049153', '1', 'progressPlanDetail', 'progress/progressPlanDetail/index', 1, 0, 'C', '0', '0', 'progress:progressPlanDetail:list', '#', 103, 1, sysdate(), null, null, '进度计划详情菜单'); | ||||||
|  |  | ||||||
|  | -- 按钮 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100190854938627, '进度计划详情查询', 1937100190854938626, '1',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressPlanDetail:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100190854938628, '进度计划详情新增', 1937100190854938626, '2',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressPlanDetail:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100190854938629, '进度计划详情修改', 1937100190854938626, '3',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressPlanDetail:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100190854938630, '进度计划详情删除', 1937100190854938626, '4',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressPlanDetail:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100190854938631, '进度计划详情导出', 1937100190854938626, '5',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressPlanDetail:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | -- 菜单 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100268151767042, '进度类别', '1925849078848049153', '1', 'progressCategory', 'progress/progressCategory/index', 1, 0, 'C', '0', '0', 'progress:progressCategory:list', '#', 103, 1, sysdate(), null, null, '进度类别菜单'); | ||||||
|  |  | ||||||
|  | -- 按钮 SQL | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100268151767043, '进度类别查询', 1937100268151767042, '1',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory:query',        '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100268151767044, '进度类别新增', 1937100268151767042, '2',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory:add',          '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100268151767045, '进度类别修改', 1937100268151767042, '3',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory:edit',         '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100268151767046, '进度类别删除', 1937100268151767042, '4',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory:remove',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  |  | ||||||
|  | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) | ||||||
|  | values(1937100268151767047, '进度类别导出', 1937100268151767042, '5',  '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory:export',       '#', 103, 1, sysdate(), null, null, ''); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user