From 71a9cfafa427c95b8732b5427be8acd4b0a71c60 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Wed, 23 Jul 2025 11:16:37 +0800 Subject: [PATCH] =?UTF-8?q?[add]=20=E8=BF=9D=E8=A7=84=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/test/SpartaTest.java | 591 ------------------ .../org/dromara/test/ViolationRecordTest.java | 58 ++ .../cycle/IncSyncYs7DeviceCapturePicData.java | 2 +- .../job/once/FullSyncYs7DeviceData.java | 17 +- .../enums/RecognizerTypeEnum.java | 6 +- .../manager/spartamanager/SpartaConstant.java | 24 - .../manager/spartamanager/SpartaManager.java | 170 ----- .../spartamanager/SpartaProperties.java | 30 - .../spartamanager/SpartaRequestUtils.java | 110 ---- .../enums/SpartaHasTargetEnum.java | 22 - .../enums/SpartaRecTypeEnum.java | 69 -- .../spartamanager/vo/ImageStreamResult.java | 31 - .../spartamanager/vo/SpartaRecognizeVo.java | 29 - .../spartamanager/vo/SpartaTargetVo.java | 37 -- .../spartamanager/vo/SpartaTokenVo.java | 21 - .../impl/OthYs7DeviceImgServiceImpl.java | 6 +- .../safety/constant/HseSafetyConstant.java | 2 + .../HseViolationRecordController.java | 81 +++ .../safety/domain/HseViolationRecord.java | 112 ++++ .../HseViolationLevelCreateReq.java | 1 + .../HseViolationRecordCreateDto.java | 44 ++ .../HseViolationRecordCreateHandlerReq.java | 49 ++ .../HseViolationRecordQueryReq.java | 41 ++ .../violationrecord/HseViolationRecordVo.java | 145 +++++ .../mapper/HseViolationRecordMapper.java | 15 + .../service/IHseViolationLevelService.java | 10 +- .../service/IHseViolationRecordService.java | 97 +++ .../impl/HseRecognizeRecordServiceImpl.java | 25 +- .../impl/HseViolationLevelServiceImpl.java | 139 +++- .../impl/HseViolationRecordServiceImpl.java | 361 +++++++++++ .../system/service/ISysUserService.java | 8 + .../service/impl/SysUserServiceImpl.java | 18 + .../safety/HseViolationRecordMapper.xml | 7 + xinnengyuan/script/sql/menuInitValue.sql | 70 +-- xinnengyuan/script/sql/xinnengyuan.sql | 41 +- 35 files changed, 1259 insertions(+), 1230 deletions(-) delete mode 100644 xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/SpartaTest.java create mode 100644 xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/ViolationRecordTest.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaConstant.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaManager.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaProperties.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaRequestUtils.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaHasTargetEnum.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaRecTypeEnum.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/ImageStreamResult.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaRecognizeVo.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTargetVo.java delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTokenVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseViolationRecordController.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/HseViolationRecord.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateDto.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateHandlerReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordQueryReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/vo/violationrecord/HseViolationRecordVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/mapper/HseViolationRecordMapper.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationRecordService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationRecordServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseViolationRecordMapper.xml diff --git a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/SpartaTest.java b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/SpartaTest.java deleted file mode 100644 index 134cf11d..00000000 --- a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/SpartaTest.java +++ /dev/null @@ -1,591 +0,0 @@ -package org.dromara.test; - -import cn.hutool.json.JSONUtil; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.dromara.manager.spartamanager.SpartaManager; -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.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture; -import org.dromara.other.service.IOthYs7DeviceImgService; -import org.junit.jupiter.api.Test; -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.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Date; -import java.util.List; - -/** - * @author lcj - * @date 2025/6/20 19:40 - */ -@Slf4j -@SpringBootTest -public class SpartaTest { - - @Resource - private SpartaManager spartaManager; - - @Resource - private IOthYs7DeviceImgService othYs7DeviceImgService; - - @Test - public void test() { - String token = spartaManager.getToken(); - 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 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 size = target.getSize(); // 宽高 - List 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)); - } - - @Test - public void test4() throws IOException, URISyntaxException { - String url = "http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png"; - String targetStr = "[\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 344,\n" + - " 149\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3787,\n" + - " 3241\n" + - " ],\n" + - " \"score\": 0.9511\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 334,\n" + - " 147\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4276,\n" + - " 3590\n" + - " ],\n" + - " \"score\": 0.9498\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 330,\n" + - " 149\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3459,\n" + - " 3183\n" + - " ],\n" + - " \"score\": 0.9496\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 353,\n" + - " 148\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4226,\n" + - " 3714\n" + - " ],\n" + - " \"score\": 0.9495\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 339,\n" + - " 132\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4276,\n" + - " 2678\n" + - " ],\n" + - " \"score\": 0.9486\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 340,\n" + - " 145\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4565,\n" + - " 2982\n" + - " ],\n" + - " \"score\": 0.9486\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 335,\n" + - " 142\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3695,\n" + - " 3360\n" + - " ],\n" + - " \"score\": 0.9475\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 336,\n" + - " 145\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4446,\n" + - " 3357\n" + - " ],\n" + - " \"score\": 0.9473\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 338,\n" + - " 140\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4248,\n" + - " 2803\n" + - " ],\n" + - " \"score\": 0.9466\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 343,\n" + - " 155\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4565,\n" + - " 3769\n" + - " ],\n" + - " \"score\": 0.9464\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 346,\n" + - " 148\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4233,\n" + - " 2925\n" + - " ],\n" + - " \"score\": 0.9462\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 327,\n" + - " 159\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4000,\n" + - " 2484\n" + - " ],\n" + - " \"score\": 0.946\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 336,\n" + - " 145\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4906,\n" + - " 2908\n" + - " ],\n" + - " \"score\": 0.9457\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 339,\n" + - " 150\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3618,\n" + - " 3477\n" + - " ],\n" + - " \"score\": 0.9456\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 318,\n" + - " 147\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 5241,\n" + - " 3883\n" + - " ],\n" + - " \"score\": 0.9448\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 328,\n" + - " 147\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4934,\n" + - " 3702\n" + - " ],\n" + - " \"score\": 0.943\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 312,\n" + - " 142\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3633,\n" + - " 2557\n" + - " ],\n" + - " \"score\": 0.9428\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 340,\n" + - " 137\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4576,\n" + - " 2856\n" + - " ],\n" + - " \"score\": 0.9406\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 335,\n" + - " 138\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4316,\n" + - " 2548\n" + - " ],\n" + - " \"score\": 0.9398\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 345,\n" + - " 146\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4890,\n" + - " 3829\n" + - " ],\n" + - " \"score\": 0.9378\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 332,\n" + - " 153\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4126,\n" + - " 3304\n" + - " ],\n" + - " \"score\": 0.9371\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 325,\n" + - " 137\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3581,\n" + - " 2944\n" + - " ],\n" + - " \"score\": 0.9318\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 320,\n" + - " 145\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3879,\n" + - " 3123\n" + - " ],\n" + - " \"score\": 0.9304\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 343,\n" + - " 143\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4601,\n" + - " 3645\n" + - " ],\n" + - " \"score\": 0.9258\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 335,\n" + - " 142\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4673,\n" + - " 3528\n" + - " ],\n" + - " \"score\": 0.9255\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 312,\n" + - " 144\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4800,\n" + - " 3411\n" + - " ],\n" + - " \"score\": 0.923\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 337,\n" + - " 139\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4016,\n" + - " 3412\n" + - " ],\n" + - " \"score\": 0.9225\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 340,\n" + - " 141\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4605,\n" + - " 2729\n" + - " ],\n" + - " \"score\": 0.9191\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 298,\n" + - " 325\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3249,\n" + - " 2576\n" + - " ],\n" + - " \"score\": 0.9185\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 338,\n" + - " 156\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4537,\n" + - " 2451\n" + - " ],\n" + - " \"score\": 0.9118\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 334,\n" + - " 143\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4933,\n" + - " 2783\n" + - " ],\n" + - " \"score\": 0.9114\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 339,\n" + - " 141\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4464,\n" + - " 2308\n" + - " ],\n" + - " \"score\": 0.9107\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 343,\n" + - " 143\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3890,\n" + - " 3000\n" + - " ],\n" + - " \"score\": 0.9064\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 313,\n" + - " 139\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3593,\n" + - " 2810\n" + - " ],\n" + - " \"score\": 0.902\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 259,\n" + - " 131\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 4000,\n" + - " 2755\n" + - " ],\n" + - " \"score\": 0.8869\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 345,\n" + - " 149\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3901,\n" + - " 2864\n" + - " ],\n" + - " \"score\": 0.8841\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 345,\n" + - " 150\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 3945,\n" + - " 2610\n" + - " ],\n" + - " \"score\": 0.8632\n" + - " },\n" + - " {\n" + - " \"type\": \"pho\",\n" + - " \"size\": [\n" + - " 199,\n" + - " 110\n" + - " ],\n" + - " \"leftTopPoint\": [\n" + - " 5166,\n" + - " 3661\n" + - " ],\n" + - " \"score\": 0.8225\n" + - " }\n" + - " ]"; - List list = JSONUtil.toList(targetStr, SpartaTargetVo.class); - log.info("list:{}", list); - ImageStreamResult imageStreamResult = spartaManager.drawImageToStream(url, list); - log.info("imageStreamResult:{}", imageStreamResult); - try (OutputStream outputStream = new FileOutputStream("D:/images/save.png")) { - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = imageStreamResult.getInputStream().read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - } - } -} diff --git a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/ViolationRecordTest.java b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/ViolationRecordTest.java new file mode 100644 index 00000000..36a4b2b3 --- /dev/null +++ b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/ViolationRecordTest.java @@ -0,0 +1,58 @@ +package org.dromara.test; + +import jakarta.annotation.Resource; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto; +import org.dromara.safety.service.IHseViolationRecordService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author lcj + * @date 2025/7/22 15:36 + */ +@SpringBootTest +public class ViolationRecordTest { + + @Resource + private IHseViolationRecordService violationRecordService; + + @Test + void test() { + List list = new ArrayList<>(); + HseViolationRecordCreateDto dto1 = new HseViolationRecordCreateDto(); + dto1.setProjectId(1897160897167638529L); + dto1.setRecognizeId(1937451365735419905L); + dto1.setViolationType("3"); + dto1.setViolationTime(new Date()); + list.add(dto1); + HseViolationRecordCreateDto dto2 = new HseViolationRecordCreateDto(); + dto2.setProjectId(1897160897167638529L); + dto2.setRecognizeId(1937451365735419906L); + dto2.setViolationType("1,2,3"); + dto2.setViolationTime(new Date()); + list.add(dto2); + HseViolationRecordCreateDto dto3 = new HseViolationRecordCreateDto(); + dto3.setProjectId(1897160897167638529L); + dto3.setRecognizeId(1937451365735419907L); + dto3.setViolationType("2,7,8"); + dto3.setViolationTime(new Date()); + list.add(dto3); + HseViolationRecordCreateDto dto4 = new HseViolationRecordCreateDto(); + dto4.setProjectId(1897160897167638529L); + dto4.setRecognizeId(1937451365735419908L); + dto4.setViolationType("5,8"); + dto4.setViolationTime(new Date()); + list.add(dto4); + HseViolationRecordCreateDto dto5 = new HseViolationRecordCreateDto(); + dto5.setProjectId(1897160897167638529L); + dto5.setRecognizeId(1937451365735419909L); + dto5.setViolationType("3,9"); + dto5.setViolationTime(new Date()); + list.add(dto5); + violationRecordService.insertByMonitor(list); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceCapturePicData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceCapturePicData.java index c19c018e..7041bd8a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceCapturePicData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceCapturePicData.java @@ -26,7 +26,7 @@ import java.util.stream.Collectors; * @date 2025/6/18 15:59 */ @Slf4j -//@Component +@Component public class IncSyncYs7DeviceCapturePicData { @Resource diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java index 867f8d43..7ef3f861 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java @@ -29,12 +29,17 @@ public class FullSyncYs7DeviceData implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("开始同步摄像头设备数据"); - List ys7QueryDeviceList = ys7Manager.queryAllDeviceList(); - Boolean result = ys7DeviceService.saveOrUpdateByDeviceList(ys7QueryDeviceList); - if (result) { - log.info("摄像头设备数据同步成功"); - } else { - log.info("没有需要同步的设备"); + try { + List ys7QueryDeviceList = ys7Manager.queryAllDeviceList(); + Boolean result = ys7DeviceService.saveOrUpdateByDeviceList(ys7QueryDeviceList); + if (result) { + log.info("摄像头设备数据同步成功"); + } else { + log.info("没有需要同步的设备"); + } + } catch (Exception e) { + log.info("摄像头设备数据同步失败", e); } + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/recognizermanager/enums/RecognizerTypeEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/recognizermanager/enums/RecognizerTypeEnum.java index e827e54d..b4a8a13e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/recognizermanager/enums/RecognizerTypeEnum.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/recognizermanager/enums/RecognizerTypeEnum.java @@ -12,10 +12,10 @@ import java.util.stream.Collectors; @Getter public enum RecognizerTypeEnum { - HARDHAT("安全帽识别", "hardhat", ""), - VEST("反光背心", "vest", "1"), + HARDHAT("安全帽识别", "nohelmet", "1"), + VEST("反光背心识别", "novest", ""), SMOKING("吸烟识别", "smoking", "3"), - FIRE("火焰识别", "fire", "2"), + FIRE("火焰识别", "fire", "16"), PHO("光伏板识别", "pho", ""), SHELVES("光伏板支架识别", "shelves", ""), PILE("光伏板立柱识别", "pile", ""), diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaConstant.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaConstant.java deleted file mode 100644 index ded167be..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaConstant.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.dromara.manager.spartamanager; - -/** - * @author lcj - * @date 2025/6/20 19:05 - */ -public interface SpartaConstant { - - /** - * token redis 缓存 key 前缀 - */ - String TOKEN_REDIS_KEY = "sparta:token"; - - /** - * 获取 token api 路径 - */ - String GET_TOKEN_API_PATH_GET = "/token"; - - /** - * 识别 api 路径 - */ - String RECOGNIZE_API_PATH_GET = "/api/recognize"; - -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaManager.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaManager.java deleted file mode 100644 index 73e74680..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaManager.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.dromara.manager.spartamanager; - -import cn.hutool.core.io.FileUtil; -import jakarta.annotation.Resource; -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.springframework.data.redis.core.StringRedisTemplate; -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; - -/** - * @author lcj - * @date 2025/6/20 19:27 - */ -@Slf4j -@Component -public class SpartaManager { - - @Resource - private SpartaProperties spartaProperties; - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 获取token - * - * @return token - */ - public String getToken() { - String token = stringRedisTemplate.opsForValue().get(SpartaConstant.TOKEN_REDIS_KEY); - if (token != null) { - return token; - } - SpartaTokenVo tokenVo = SpartaRequestUtils.getToken( - spartaProperties.getUrl(), - spartaProperties.getClientId(), - spartaProperties.getClientSecret() - ); - token = tokenVo.getToken(); - Long expiresAt = tokenVo.getExpiresAt(); - // 当前时间戳(单位:秒) - 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; - } - - /** - * 识别图片 - * - * @param capUrl 图片地址 - * @param recTypeList 识别类型 - * @param async 是否异步 - * @param callBackUrl 回调地址 - * @param areaHigh 区域高 - * @return 识别结果 - */ - public SpartaRecognizeVo recognize(String capUrl, List 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 recTypeList) { - return recognize(capUrl, recTypeList, false, null, null); - } - - /** - * 绘制图片 - * - * @param imgUrl 图片地址 - * @param targets 识别结果 - * @return 绘制后的图片 - */ - public ImageStreamResult drawImageToStream(String imgUrl, List 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 (end == -1) { - return url.substring(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); - } -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaProperties.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaProperties.java deleted file mode 100644 index 7d1a552d..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaProperties.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.manager.spartamanager; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * @author lcj - * @date 2025/6/20 19:01 - */ -@Data -@Configuration -@ConfigurationProperties(prefix = "sparta") -public class SpartaProperties { - - /** - * 请求地址 - */ - private String url; - - /** - * 客户端id - */ - private String clientId; - - /** - * 客户端密钥 - */ - private String clientSecret; -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaRequestUtils.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaRequestUtils.java deleted file mode 100644 index d0dbd47b..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/SpartaRequestUtils.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.dromara.manager.spartamanager; - -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpStatus; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.exception.ServiceException; -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 java.util.HashMap; -import java.util.List; - -/** - * @author lcj - * @date 2025/6/20 19:06 - */ -@Slf4j -public class SpartaRequestUtils { - - /** - * 获取斯巴达 Token - * - * @param host 域名 - * @param clientId 客户端id - * @param clientSecret 客户端密钥 - * @return token - */ - public static SpartaTokenVo getToken(String host, String clientId, String clientSecret) { - HashMap paramMap = new HashMap<>(); - paramMap.put("clientId", clientId); - paramMap.put("clientSecret", clientSecret); - String errorMsg = "斯巴达 Token 请求失败"; - String url = host + SpartaConstant.GET_TOKEN_API_PATH_GET; - try (HttpResponse response = HttpRequest.get(url) - .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, "返回参数为空"); - } - log.info("斯巴达 Token 请求成功:{}", body); - JSONObject jsonObject = JSONUtil.parseObj(body); - SpartaTokenVo tokenVo = new SpartaTokenVo(); - tokenVo.setToken(jsonObject.get("token", String.class)); - tokenVo.setExpiresAt(jsonObject.get("expires_at", Long.class)); - 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 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 targetList = JSONUtil.toList(result.getJSONArray("targets"), SpartaTargetVo.class); - spartaRecognizeVo.setTargets(targetList); - } - return spartaRecognizeVo; - } - } -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaHasTargetEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaHasTargetEnum.java deleted file mode 100644 index a49cf867..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaHasTargetEnum.java +++ /dev/null @@ -1,22 +0,0 @@ -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; - } -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaRecTypeEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaRecTypeEnum.java deleted file mode 100644 index 778fe4ed..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/enums/SpartaRecTypeEnum.java +++ /dev/null @@ -1,69 +0,0 @@ -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", "1"), - SMOKE("吸烟识别", "smoke", "3"), - BELT("安全带识别", "belt", "2"), - 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; - - /** - * 描述:对应字典violation_level_type - */ - private final String code; - - SpartaRecTypeEnum(String text, String value, String code) { - this.text = text; - this.value = value; - this.code = code; - } - - 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 types) { - if (types == null || types.isEmpty()) { - return ""; - } - return types.stream() - .map(SpartaRecTypeEnum::getValue) - .collect(Collectors.joining(" ")); - } -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/ImageStreamResult.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/ImageStreamResult.java deleted file mode 100644 index 78c856bc..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/ImageStreamResult.java +++ /dev/null @@ -1,31 +0,0 @@ -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; - -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaRecognizeVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaRecognizeVo.java deleted file mode 100644 index 3b7e170d..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaRecognizeVo.java +++ /dev/null @@ -1,29 +0,0 @@ -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 originalImgSize; - - /** - * 目标信息 - */ - private List targets; - -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTargetVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTargetVo.java deleted file mode 100644 index e43eb041..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTargetVo.java +++ /dev/null @@ -1,37 +0,0 @@ -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 size; - - /** - * 目标在画面中左上角位置信息 - */ - private List leftTopPoint; - - /** - * 置信度得分(0~1) - */ - private Double score; -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTokenVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTokenVo.java deleted file mode 100644 index 318e9230..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/spartamanager/vo/SpartaTokenVo.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.manager.spartamanager.vo; - -import lombok.Data; - -/** - * @author lcj - * @date 2025/6/20 19:36 - */ -@Data -public class SpartaTokenVo { - - /** - * token - */ - private String token; - - /** - * 过期时间 - */ - private Long expiresAt; -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceImgServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceImgServiceImpl.java index 3d9b4767..502fbf40 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceImgServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceImgServiceImpl.java @@ -20,8 +20,6 @@ import org.dromara.manager.recognizermanager.enums.RecognizerTypeEnum; import org.dromara.manager.recognizermanager.vo.RecognizeImageStreamResult; import org.dromara.manager.recognizermanager.vo.RecognizeTargetVo; import org.dromara.manager.recognizermanager.vo.RecognizeVo; -import org.dromara.manager.spartamanager.enums.SpartaHasTargetEnum; -import org.dromara.manager.spartamanager.enums.SpartaRecTypeEnum; import org.dromara.other.constant.Ys7DeviceImgConstant; import org.dromara.other.domain.OthYs7DeviceImg; import org.dromara.other.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture; @@ -180,7 +178,7 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl recTypeList = JSONUtil.toList(deviceImg.getRecType(), String.class); - List list = recTypeList.stream().map(recType -> Objects.requireNonNull(SpartaRecTypeEnum.fromValue(recType)).getText()).toList(); + List list = recTypeList.stream().map(recType -> Objects.requireNonNull(RecognizerTypeEnum.fromValue(recType)).getText()).toList(); vo.setRecTypeList(list); return vo; }).toList(); @@ -214,7 +212,7 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl recTypes = List.of(RecognizerTypeEnum.HARDHAT, RecognizerTypeEnum.SMOKING, RecognizerTypeEnum.FIRE); RecognizeVo recognizeVo = recognizerManager.recognize(ossUrl, recTypes); - if (recognizeVo != null && recognizeVo.getHasTarget().equals(SpartaHasTargetEnum.YES.getValue())) { + if (recognizeVo != null && recognizeVo.getHasTarget().equals(RecognizerHasTargetEnum.YES.getValue())) { // 记录识别信息 HseRecognizeRecordCreateDto record = new HseRecognizeRecordCreateDto(); record.setCreateTime(new Date()); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/constant/HseSafetyConstant.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/constant/HseSafetyConstant.java index 57e90c98..c52e69a6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/constant/HseSafetyConstant.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/constant/HseSafetyConstant.java @@ -31,4 +31,6 @@ public interface HseSafetyConstant { return String.format("安全生产监督检查通知书(%s).docx", createDate); } + String VIOLATION_LEVEL_TYPE = "violation_level_type"; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseViolationRecordController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseViolationRecordController.java new file mode 100644 index 00000000..151caa8d --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseViolationRecordController.java @@ -0,0 +1,81 @@ +package org.dromara.safety.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateHandlerReq; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordQueryReq; +import org.dromara.safety.domain.vo.violationrecord.HseViolationRecordVo; +import org.dromara.safety.service.IHseViolationRecordService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 违规记录 + * + * @author lcj + * @date 2025-07-22 + */ +@Validated +@RestController +@RequestMapping("/safety/violationRecord") +public class HseViolationRecordController extends BaseController { + + @Resource + private IHseViolationRecordService hseViolationRecordService; + + /** + * 查询违规记录列表 + */ + @SaCheckPermission("safety:violationRecord:list") + @GetMapping("/list") + public TableDataInfo list(HseViolationRecordQueryReq req, PageQuery pageQuery) { + return hseViolationRecordService.queryPageList(req, pageQuery); + } + + /** + * 获取违规记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("safety:violationRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(hseViolationRecordService.queryById(id)); + } + + /** + * 新增违规记录处理人 + */ + @SaCheckPermission("safety:violationRecord:insertHandler") + @Log(title = "违规记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/handler") + public R insertHandler(@Validated @RequestBody HseViolationRecordCreateHandlerReq req) { + return toAjax(hseViolationRecordService.insertHandler(req)); + } + + /** + * 删除违规记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("safety:violationRecord:remove") + @Log(title = "违规记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(hseViolationRecordService.deleteWithValidByIds(List.of(ids))); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/HseViolationRecord.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/HseViolationRecord.java new file mode 100644 index 00000000..7e10ac29 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/HseViolationRecord.java @@ -0,0 +1,112 @@ +package org.dromara.safety.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 违规记录对象 hse_violation_record + * + * @author lcj + * @date 2025-07-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("hse_violation_record") +public class HseViolationRecord extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 违章等级id + */ + private Long levelId; + + /** + * 识别记录id + */ + private Long recognizeId; + + /** + * 违章类型 + */ + private String violationType; + + /** + * 违章时间 + */ + private Date violationTime; + + /** + * 违章处理人id + */ + private Long handlerId; + + /** + * 处理期限 + */ + private Date disposeDeadline; + + /** + * 处理时间 + */ + private Date disposeTime; + + /** + * 整改措施 + */ + private String measure; + + /** + * 整改时间 + */ + private Date rectificationTime; + + /** + * 复查情况 + */ + private String review; + + /** + * 复查状态(1通过 2未通过) + */ + private String reviewType; + + /** + * 复查时间 + */ + private Date reviewTime; + + /** + * 处理流程类型(0仅通知 1通知整改复查) + */ + private String processType; + + /** + * 工单状态(1通知 2整改 3复查) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationlevel/HseViolationLevelCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationlevel/HseViolationLevelCreateReq.java index ed918eb0..ba9d98f1 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationlevel/HseViolationLevelCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationlevel/HseViolationLevelCreateReq.java @@ -48,6 +48,7 @@ public class HseViolationLevelCreateReq implements Serializable { /** * 违章类型(多个逗号分隔) */ + @NotNull(message = "违章类型不能为空") private String violationType; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateDto.java new file mode 100644 index 00000000..b9b53b11 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateDto.java @@ -0,0 +1,44 @@ +package org.dromara.safety.domain.dto.violationrecord; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lcj + * @date 2025/7/22 14:28 + */ +@Data +public class HseViolationRecordCreateDto implements Serializable { + + @Serial + private static final long serialVersionUID = 5895177891570353747L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 识别记录id + */ + private Long recognizeId; + + /** + * 违章类型 + */ + private String violationType; + + /** + * 违章时间 + */ + private Date violationTime; + + /** + * 备注 + */ + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateHandlerReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateHandlerReq.java new file mode 100644 index 00000000..1069e23c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordCreateHandlerReq.java @@ -0,0 +1,49 @@ +package org.dromara.safety.domain.dto.violationrecord; + +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lcj + * @date 2025/7/22 11:07 + */ +@Data +public class HseViolationRecordCreateHandlerReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5274907523390625095L; + + /** + * 主键id + */ + @NotNull(message = "id不能为空") + private Long id; + + /** + * 违章处理人id + */ + @NotNull(message = "处理人不能为空") + private Long handlerId; + + /** + * 处理期限 + */ + @NotNull(message = "处理期限不能为空") + @Future(message = "处理期限不能小于当前时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date disposeDeadline; + + /** + * 备注 + */ + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordQueryReq.java new file mode 100644 index 00000000..5d0f37c3 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/violationrecord/HseViolationRecordQueryReq.java @@ -0,0 +1,41 @@ +package org.dromara.safety.domain.dto.violationrecord; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lcj + * @date 2025/7/22 11:06 + */ +@Data +public class HseViolationRecordQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 1084576574388146447L; + + /** + * 主键id + */ + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 违章类型 + */ + private String violationType; + + /** + * 违章时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date violationTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/vo/violationrecord/HseViolationRecordVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/vo/violationrecord/HseViolationRecordVo.java new file mode 100644 index 00000000..0a8b9d59 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/vo/violationrecord/HseViolationRecordVo.java @@ -0,0 +1,145 @@ +package org.dromara.safety.domain.vo.violationrecord; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.safety.domain.HseViolationRecord; +import org.dromara.safety.domain.vo.recognizerecord.HseRecognizeRecordVo; +import org.dromara.safety.domain.vo.violationlevel.HseViolationLevelVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 违规记录视图对象 hse_violation_record + * + * @author lcj + * @date 2025-07-22 + */ +@Data +@AutoMapper(target = HseViolationRecord.class) +public class HseViolationRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 违章等级id + */ + private Long levelId; + + /** + * 违章等级 + */ + private HseViolationLevelVo levelVo; + + /** + * 识别记录id + */ + private Long recognizeId; + + /** + * 识别记录 + */ + private HseRecognizeRecordVo recognizeVo; + + /** + * 违章类型 + */ + private String violationType; + + /** + * 违章时间 + */ + private Date violationTime; + + /** + * 违章处理人id + */ + private Long handlerId; + + /** + * 违章处理人名称 + */ + private String handlerName; + + /** + * 处理期限 + */ + private Date disposeDeadline; + + /** + * 处理时间 + */ + private Date disposeTime; + + /** + * 整改措施 + */ + private String measure; + + /** + * 整改时间 + */ + private Date rectificationTime; + + /** + * 复查情况 + */ + private String review; + + /** + * 复查状态(1通过 2未通过) + */ + private String reviewType; + + /** + * 复查时间 + */ + private Date reviewTime; + + /** + * 处理流程类型(0仅通知 1通知整改复查) + */ + private String processType; + + /** + * 工单状态(1通知 2整改 3复查) + */ + private String status; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 创建人名字 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 备注 + */ + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/mapper/HseViolationRecordMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/mapper/HseViolationRecordMapper.java new file mode 100644 index 00000000..ac780519 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/mapper/HseViolationRecordMapper.java @@ -0,0 +1,15 @@ +package org.dromara.safety.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.safety.domain.HseViolationRecord; +import org.dromara.safety.domain.vo.violationrecord.HseViolationRecordVo; + +/** + * 违规记录Mapper接口 + * + * @author lcj + * @date 2025-07-22 + */ +public interface HseViolationRecordMapper extends BaseMapperPlus { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationLevelService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationLevelService.java index 4cd79d87..e6a87f91 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationLevelService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationLevelService.java @@ -79,7 +79,15 @@ public interface IHseViolationLevelService extends IService { * @param violationLevel 违章等级对象 * @return 违章等级视图对象 */ - HseViolationLevelByPostVo getVo(HseViolationLevel violationLevel); + HseViolationLevelByPostVo getByPostVo(HseViolationLevel violationLevel); + + /** + * 获取违章等级视图对象 + * + * @param violationLevel 违章等级对象 + * @return 违章等级视图对象 + */ + HseViolationLevelVo getVo(HseViolationLevel violationLevel); /** * 获取违章等级查询条件封装 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationRecordService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationRecordService.java new file mode 100644 index 00000000..3a5f26a6 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseViolationRecordService.java @@ -0,0 +1,97 @@ +package org.dromara.safety.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.safety.domain.HseViolationRecord; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateHandlerReq; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordQueryReq; +import org.dromara.safety.domain.vo.violationrecord.HseViolationRecordVo; + +import java.util.Collection; +import java.util.List; + +/** + * 违规记录Service接口 + * + * @author lcj + * @date 2025-07-22 + */ +public interface IHseViolationRecordService extends IService { + + /** + * 查询违规记录 + * + * @param id 主键 + * @return 违规记录 + */ + HseViolationRecordVo queryById(Long id); + + /** + * 分页查询违规记录列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 违规记录分页列表 + */ + TableDataInfo queryPageList(HseViolationRecordQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的违规记录列表 + * + * @param req 查询条件 + * @return 违规记录列表 + */ + List queryList(HseViolationRecordQueryReq req); + + /** + * 新增违规记录信息 + * + * @param dto 违规记录信息 + */ + void insertByMonitor(List dto); + + /** + * 新增违章处理人 + * + * @param req 违章处理人 + * @return 是否新增成功 + */ + Boolean insertHandler(HseViolationRecordCreateHandlerReq req); + + /** + * 批量删除违规记录信息 + * + * @param ids 待删除的主键集合 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids); + + /** + * 获取违规记录视图对象 + * + * @param violationRecord 违规记录对象 + * @return 违规记录视图对象 + */ + HseViolationRecordVo getVo(HseViolationRecord violationRecord); + + /** + * 获取违规记录查询条件封装 + * + * @param req 违规记录查询条件 + * @return 违规记录查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(HseViolationRecordQueryReq req); + + /** + * 获取违规记录分页对象视图 + * + * @param violationRecordPage 违规记录分页对象 + * @return 违规记录分页对象视图 + */ + Page getVoPage(Page violationRecordPage); + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseRecognizeRecordServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseRecognizeRecordServiceImpl.java index 99ad0cf4..7d53157e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseRecognizeRecordServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseRecognizeRecordServiceImpl.java @@ -12,15 +12,17 @@ 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.common.satoken.utils.LoginHelper; +import org.dromara.manager.recognizermanager.enums.RecognizerTypeEnum; import org.dromara.manager.recognizermanager.vo.RecognizeTargetVo; -import org.dromara.manager.spartamanager.enums.SpartaRecTypeEnum; import org.dromara.project.service.IBusProjectService; import org.dromara.safety.domain.HseRecognizeRecord; import org.dromara.safety.domain.dto.recognizerecord.HseRecognizeRecordCreateDto; import org.dromara.safety.domain.dto.recognizerecord.HseRecognizeRecordQueryReq; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto; import org.dromara.safety.domain.vo.recognizerecord.HseRecognizeRecordVo; import org.dromara.safety.mapper.HseRecognizeRecordMapper; import org.dromara.safety.service.IHseRecognizeRecordService; +import org.dromara.safety.service.IHseViolationRecordService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,6 +48,9 @@ public class HseRecognizeRecordServiceImpl extends ServiceImpl targets = record.getTargets(); List codeList = targets.stream() .map(RecognizeTargetVo::getType).distinct() - .map(SpartaRecTypeEnum::fromValue).filter(Objects::nonNull) - .map(SpartaRecTypeEnum::getCode).filter(Objects::nonNull) + .map(RecognizerTypeEnum::fromValue).filter(Objects::nonNull) + .map(RecognizerTypeEnum::getCode).filter(Objects::nonNull) .toList(); String codeStr = String.join(",", codeList); entity.setViolationType(codeStr); @@ -123,6 +128,20 @@ public class HseRecognizeRecordServiceImpl extends ServiceImpl violationRecordList = new ArrayList<>(); + for (HseRecognizeRecord entity : entityList) { + HseViolationRecordCreateDto violationRecord = new HseViolationRecordCreateDto(); + if (entity.getProjectId() != null) { + violationRecord.setProjectId(entity.getProjectId()); + violationRecord.setRecognizeId(entity.getId()); + violationRecord.setViolationType(entity.getViolationType()); + violationRecord.setViolationTime(entity.getCreateTime()); + violationRecordList.add(violationRecord); + } + } + if (CollUtil.isNotEmpty(violationRecordList)) { + violationRecordService.insertByMonitor(violationRecordList); + } } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationLevelServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationLevelServiceImpl.java index e2197c91..202ae37c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationLevelServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationLevelServiceImpl.java @@ -13,6 +13,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.project.service.IBusProjectService; +import org.dromara.safety.constant.HseSafetyConstant; import org.dromara.safety.domain.HseViolationLevel; import org.dromara.safety.domain.HseViolationLevelPost; import org.dromara.safety.domain.dto.violationlevel.HseViolationLevelCreateReq; @@ -24,15 +25,14 @@ import org.dromara.safety.mapper.HseViolationLevelMapper; import org.dromara.safety.service.IHseViolationLevelPostService; import org.dromara.safety.service.IHseViolationLevelService; import org.dromara.system.domain.vo.SysPostVo; -import org.dromara.system.service.ISysPostService; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.service.ISysDictDataService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; /** * 违章等级Service业务层处理 @@ -51,7 +51,10 @@ public class HseViolationLevelServiceImpl extends ServiceImpl 0) { - throw new ServiceException("违章等级已存在", HttpStatus.BAD_REQUEST); + // 判断违章等级或风险等级是否存在 + List existList = this.lambdaQuery() + .eq(HseViolationLevel::getProjectId, projectId) + .and(wrapper -> wrapper + .eq(HseViolationLevel::getViolationLevel, violationLevel.getViolationLevel()) + .or() + .eq(HseViolationLevel::getRiskType, violationLevel.getRiskType()) + ) + .list(); + for (HseViolationLevel exist : existList) { + if (exist.getViolationLevel().equals(violationLevel.getViolationLevel())) { + throw new ServiceException("违章等级已存在", HttpStatus.BAD_REQUEST); + } + if (exist.getRiskType().equals(violationLevel.getRiskType())) { + throw new ServiceException("风险等级已存在", HttpStatus.BAD_REQUEST); + } + } + // 拆分 violationType + Set violationTypeList = Arrays.stream(req.getViolationType().split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toSet()); + if (CollUtil.isEmpty(violationTypeList)) { + throw new ServiceException("违章类型不能为空", HttpStatus.BAD_REQUEST); + } + // 判断违章类型是否存在 + List allViolationTypeList = this.lambdaQuery() + .select(HseViolationLevel::getViolationType) + .eq(HseViolationLevel::getProjectId, projectId) + .list().stream() + .flatMap(v -> Arrays.stream(v.getViolationType().split(","))) + .map(String::trim) + .distinct() + .toList(); + // 判断是否存在交集(只要一个存在就抛异常) + for (String type : violationTypeList) { + if (allViolationTypeList.contains(type)) { + String dictLabel = dictDataService.selectDictLabel(HseSafetyConstant.VIOLATION_LEVEL_TYPE, type); + throw new ServiceException("违章类型 [" + dictLabel + "] 已存在,不能重复添加", HttpStatus.BAD_REQUEST); + } } boolean result = this.save(violationLevel); if (!result) { @@ -158,6 +199,58 @@ public class HseViolationLevelServiceImpl extends ServiceImpl 0) { + throw new ServiceException("该项目已存在同名违章等级", HttpStatus.CONFLICT); + } + } + // 判断风险等级是否存在 + if (!oldViolationLevel.getRiskType().equals(violationLevel.getRiskType())) { + Long count = this.lambdaQuery() + .eq(HseViolationLevel::getProjectId, oldViolationLevel.getProjectId()) + .eq(HseViolationLevel::getRiskType, violationLevel.getRiskType()) + .count(); + if (count > 0) { + throw new ServiceException("该项目已存在同名风险等级", HttpStatus.CONFLICT); + } + } + Set newTypeSet = Arrays.stream(req.getViolationType().split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toSet()); + if (CollUtil.isEmpty(newTypeSet)) { + throw new ServiceException("违章类型不能为空", HttpStatus.BAD_REQUEST); + } + Set oldTypeSet = Arrays.stream(oldViolationLevel.getViolationType().split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toSet()); + // 如果新旧类型完全相同,则不需要校验 + if (!newTypeSet.equals(oldTypeSet)) { + // 查询其他记录的 violationType(排除当前这条记录) + List otherViolationTypes = this.lambdaQuery() + .select(HseViolationLevel::getViolationType) + .eq(HseViolationLevel::getProjectId, oldViolationLevel.getProjectId()) + .ne(HseViolationLevel::getId, id) + .list().stream() + .flatMap(v -> Arrays.stream(v.getViolationType().split(","))) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .distinct() + .toList(); + // 检查是否有交集 + for (String type : newTypeSet) { + if (otherViolationTypes.contains(type)) { + String dictLabel = dictDataService.selectDictLabel(HseSafetyConstant.VIOLATION_LEVEL_TYPE, type); + throw new ServiceException("违章类型 [" + dictLabel + "] 已存在,不能重复添加", HttpStatus.BAD_REQUEST); + } + } + } List postIdList = req.getPostIdList(); if (CollUtil.isNotEmpty(postIdList)) { List oldPostIdList = violationLevelPostService.lambdaQuery() @@ -251,7 +344,7 @@ public class HseViolationLevelServiceImpl extends ServiceImpl postIdList = levelPostList.stream().map(HseViolationLevelPost::getPost).toList(); - List postList = postService.selectPostByIds(postIdList); + List postList = postMapper.selectVoByIds(postIdList); vo.setPostList(postList); } return vo; } + /** + * 获取违章等级视图对象 + * + * @param violationLevel 违章等级对象 + * @return 违章等级视图对象 + */ + @Override + public HseViolationLevelVo getVo(HseViolationLevel violationLevel) { + HseViolationLevelVo vo = new HseViolationLevelVo(); + if (violationLevel == null) { + return vo; + } + BeanUtils.copyProperties(violationLevel, vo); + return vo; + } + /** * 获取违章等级查询条件封装 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationRecordServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationRecordServiceImpl.java new file mode 100644 index 00000000..17cac0be --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseViolationRecordServiceImpl.java @@ -0,0 +1,361 @@ +package org.dromara.safety.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +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.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.safety.domain.HseRecognizeRecord; +import org.dromara.safety.domain.HseViolationLevel; +import org.dromara.safety.domain.HseViolationLevelPost; +import org.dromara.safety.domain.HseViolationRecord; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateHandlerReq; +import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordQueryReq; +import org.dromara.safety.domain.vo.violationrecord.HseViolationRecordVo; +import org.dromara.safety.mapper.HseViolationRecordMapper; +import org.dromara.safety.service.IHseRecognizeRecordService; +import org.dromara.safety.service.IHseViolationLevelPostService; +import org.dromara.safety.service.IHseViolationLevelService; +import org.dromara.safety.service.IHseViolationRecordService; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 违规记录Service业务层处理 + * + * @author lcj + * @date 2025-07-22 + */ +@Slf4j +@Service +public class HseViolationRecordServiceImpl extends ServiceImpl + implements IHseViolationRecordService { + + @Resource + private ISysUserService userService; + + @Resource + private IHseViolationLevelService violationLevelService; + + @Lazy + @Resource + private IHseRecognizeRecordService recognizeRecordService; + + @Resource + private IHseViolationLevelPostService violationLevelPostService; + + /** + * 查询违规记录 + * + * @param id 主键 + * @return 违规记录 + */ + @Override + public HseViolationRecordVo queryById(Long id) { + HseViolationRecord violationRecord = this.getById(id); + if (violationRecord == null) { + throw new ServiceException("违规记录信息不存在", HttpStatus.NOT_FOUND); + } + return this.getVo(violationRecord); + } + + /** + * 分页查询违规记录列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 违规记录分页列表 + */ + @Override + public TableDataInfo queryPageList(HseViolationRecordQueryReq req, PageQuery pageQuery) { + Page violationRecordPage = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(violationRecordPage)); + } + + /** + * 查询符合条件的违规记录列表 + * + * @param req 查询条件 + * @return 违规记录列表 + */ + @Override + public List queryList(HseViolationRecordQueryReq req) { + LambdaQueryWrapper lqw = buildQueryWrapper(req); + return this.list(lqw).stream().map(this::getVo).toList(); + } + + /** + * 新增违规记录信息 + * + * @param dto 违规记录信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void insertByMonitor(List dto) { + if (CollUtil.isEmpty(dto)) { + return; + } + List violationRecordList = new ArrayList<>(); + // 1. 获取所有相关项目的风险等级配置 + Set projectIds = dto.stream() + .map(HseViolationRecordCreateDto::getProjectId) + .collect(Collectors.toSet()); + List violationLevelList = violationLevelService.lambdaQuery() + .in(HseViolationLevel::getProjectId, projectIds) + .list(); + + // 2. 构建 "项目 -> (违规类型 -> 等级ID)" 的映射 + Map> projectTypeToLevelIdMap = new HashMap<>(); + for (HseViolationLevel level : violationLevelList) { + Long projectId = level.getProjectId(); + String[] types = level.getViolationType().split(","); + Map typeMap = projectTypeToLevelIdMap.computeIfAbsent(projectId, k -> new HashMap<>()); + for (String type : types) { + typeMap.put(type.trim(), level.getId()); + } + } + // 3. 遍历DTO,按LevelId对ViolationType分组,然后创建记录 + for (HseViolationRecordCreateDto dtoItem : dto) { + if (dtoItem.getProjectId() == null) { + continue; + } + Map typeToLevelIdMap = projectTypeToLevelIdMap.get(dtoItem.getProjectId()); + if (typeToLevelIdMap == null) { + log.warn("项目[{}]中找不到任何违章等级定义", dtoItem.getProjectId()); + continue; + } + // 创建一个临时Map,用于根据LevelId对本次DTO中的types进行分组 + Map> levelIdToTypesMap = new HashMap<>(); + String[] typesFromDto = dtoItem.getViolationType().split(","); + for (String type : typesFromDto) { + type = type.trim(); + Long levelId = typeToLevelIdMap.get(type); + if (levelId == null) { + log.warn("项目[{}]中找不到违章类型[{}]对应的违章等级", dtoItem.getProjectId(), type); + continue; + } + // 将当前type添加到对应levelId的列表中 + levelIdToTypesMap.computeIfAbsent(levelId, k -> new ArrayList<>()).add(type); + } + // 4. 为每个分组(即每个LevelId)创建一条合并后的记录 + for (Map.Entry> entry : levelIdToTypesMap.entrySet()) { + Long levelId = entry.getKey(); + List groupedTypesList = entry.getValue(); + HseViolationRecord record = new HseViolationRecord(); + record.setProjectId(dtoItem.getProjectId()); + record.setRecognizeId(dtoItem.getRecognizeId()); + record.setViolationTime(dtoItem.getViolationTime()); + record.setRemark(dtoItem.getRemark()); + record.setLevelId(levelId); // 设置分组的LevelId + // 将分组后的types用逗号拼接,设置为合并后的ViolationType + record.setViolationType(String.join(",", groupedTypesList)); + violationRecordList.add(record); + } + } + // 批量保存 + if (CollUtil.isNotEmpty(violationRecordList)) { + violationRecordList.forEach(violationRecord -> violationRecord.setCreateBy(SystemConstants.SUPER_ADMIN_ID)); + boolean result = this.saveBatch(violationRecordList); + if (!result) { + throw new ServiceException("批量新增违规记录失败,数据库异常", HttpStatus.ERROR); + } + // 通知对应人员 + Set levelIds = violationRecordList.stream().map(HseViolationRecord::getLevelId).collect(Collectors.toSet()); + List levelPostList = violationLevelPostService.lambdaQuery() + .in(HseViolationLevelPost::getLevel, levelIds) + .list(); + List postIdList = levelPostList.stream().map(HseViolationLevelPost::getPost).distinct().toList(); + List userVoList = userService.selectUserListByPostList(postIdList); + if (CollUtil.isNotEmpty(userVoList)) { + // 通过 sse 向指定用户发送通知 + Set userIds = userVoList.stream().map(SysUserVo::getUserId).collect(Collectors.toSet()); + SseMessageDto messageDto = new SseMessageDto(); + messageDto.setUserIds(new ArrayList<>(userIds)); + for (HseViolationRecord violationRecord : violationRecordList) { + messageDto.setMessage("您有一份重要的违章需要处理!工单号为:" + violationRecord.getId()); + SseMessageUtils.publishMessage(messageDto); + } + } + } + } + + /** + * 新增违章处理人 + * + * @param req 违章处理人 + * @return 是否新增成功 + */ + @Override + public Boolean insertHandler(HseViolationRecordCreateHandlerReq req) { + Long id = req.getId(); + HseViolationRecord oldViolationRecord = this.getById(id); + if (oldViolationRecord == null) { + throw new ServiceException("违规记录信息不存在", HttpStatus.NOT_FOUND); + } + Long handlerId = req.getHandlerId(); + SysUserVo user = userService.selectUserById(handlerId); + if (user == null) { + throw new ServiceException("处理人信息不存在", HttpStatus.NOT_FOUND); + } + HseViolationRecord violationRecord = new HseViolationRecord(); + violationRecord.setId(id); + violationRecord.setHandlerId(handlerId); + violationRecord.setDisposeTime(req.getDisposeDeadline()); + violationRecord.setRemark(req.getRemark()); + boolean result = this.updateById(violationRecord); + if (!result) { + throw new ServiceException("更新处理人操作失败", HttpStatus.ERROR); + } + return true; + } + + /** + * 批量删除违规记录信息 + * + * @param ids 待删除的主键集合 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids) { + return this.removeBatchByIds(ids); + } + + /** + * 获取违规记录视图对象 + * + * @param violationRecord 违规记录对象 + * @return 违规记录视图对象 + */ + @Override + public HseViolationRecordVo getVo(HseViolationRecord violationRecord) { + HseViolationRecordVo violationRecordVo = new HseViolationRecordVo(); + if (violationRecord == null) { + return violationRecordVo; + } + BeanUtils.copyProperties(violationRecord, violationRecordVo); + // 关联等级 + Long levelId = violationRecord.getLevelId(); + if (ObjectUtils.isNotEmpty(levelId)) { + HseViolationLevel level = violationLevelService.getById(levelId); + violationRecordVo.setLevelVo(violationLevelService.getVo(level)); + } + // 关联识别记录 + Long recognizeId = violationRecord.getRecognizeId(); + if (ObjectUtils.isNotEmpty(recognizeId)) { + HseRecognizeRecord recognizeRecord = recognizeRecordService.getById(recognizeId); + violationRecordVo.setRecognizeVo(recognizeRecordService.getVo(recognizeRecord)); + } + // 关联违章人信息 + Long handlerId = violationRecord.getHandlerId(); + if (ObjectUtils.isNotEmpty(handlerId)) { + SysUserVo handler = userService.selectUserById(handlerId); + violationRecordVo.setHandlerName(handler.getNickName()); + } + return violationRecordVo; + } + + /** + * 获取违规记录查询条件封装 + * + * @param req 违规记录查询条件 + * @return 违规记录查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(HseViolationRecordQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (req == null) { + return lqw; + } + Long id = req.getId(); + Long projectId = req.getProjectId(); + String violationType = req.getViolationType(); + Date violationTime = req.getViolationTime(); + lqw.eq(ObjectUtils.isNotEmpty(id), HseViolationRecord::getId, id); + lqw.eq(ObjectUtils.isNotEmpty(projectId), HseViolationRecord::getProjectId, projectId); + lqw.eq(StringUtils.isNotBlank(violationType), HseViolationRecord::getViolationType, violationType); + if (violationTime != null) { + // 构造当天的起始和结束时间 + LocalDate localDate = violationTime.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + LocalDateTime startOfDay = localDate.atStartOfDay(); + LocalDateTime startOfNextDay = localDate.plusDays(1).atStartOfDay(); + Date start = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); + Date end = Date.from(startOfNextDay.atZone(ZoneId.systemDefault()).toInstant()); + lqw.ge(HseViolationRecord::getViolationTime, start) + .lt(HseViolationRecord::getViolationTime, end); + } + return lqw; + } + + /** + * 获取违规记录分页对象视图 + * + * @param violationRecordPage 违规记录分页对象 + * @return 违规记录分页对象视图 + */ + @Override + public Page getVoPage(Page violationRecordPage) { + List violationRecordList = violationRecordPage.getRecords(); + Page violationRecordVoPage = new Page<>( + violationRecordPage.getCurrent(), + violationRecordPage.getSize(), + violationRecordPage.getTotal()); + if (CollUtil.isEmpty(violationRecordList)) { + return violationRecordVoPage; + } + // 关联等级 + Set levelIds = violationRecordList.stream().map(HseViolationRecord::getLevelId).collect(Collectors.toSet()); + Map levelIdLevelMap = violationLevelService.listByIds(levelIds).stream() + .collect(Collectors.toMap(HseViolationLevel::getId, level -> level)); + // 关联识别记录 + Set recognizeIds = violationRecordList.stream().map(HseViolationRecord::getRecognizeId).collect(Collectors.toSet()); + Map recognizeIdRecognizeMap = recognizeRecordService.listByIds(recognizeIds).stream() + .collect(Collectors.toMap(HseRecognizeRecord::getId, recognize -> recognize)); + // 关联违章人信息 + List handlerIds = violationRecordList.stream().map(HseViolationRecord::getHandlerId).distinct().toList(); + Map handlerIdUserMap = userService.selectUserByIds(handlerIds, null).stream() + .collect(Collectors.toMap(SysUserVo::getUserId, user -> user)); + List violationRecordVoList = violationRecordList.stream().map(violationLevel -> { + HseViolationRecordVo vo = new HseViolationRecordVo(); + BeanUtils.copyProperties(violationLevel, vo); + // 关联等级 + if (CollUtil.isNotEmpty(levelIdLevelMap) && levelIdLevelMap.containsKey(violationLevel.getLevelId())) { + vo.setLevelVo(violationLevelService.getVo(levelIdLevelMap.get(violationLevel.getLevelId()))); + } + // 关联识别记录 + if (CollUtil.isNotEmpty(recognizeIdRecognizeMap) && recognizeIdRecognizeMap.containsKey(violationLevel.getRecognizeId())) { + vo.setRecognizeVo(recognizeRecordService.getVo(recognizeIdRecognizeMap.get(violationLevel.getRecognizeId()))); + } + // 违章人信息 + if (CollUtil.isNotEmpty(handlerIdUserMap) && handlerIdUserMap.containsKey(violationLevel.getHandlerId())) { + vo.setHandlerName(handlerIdUserMap.get(violationLevel.getHandlerId()).getNickName()); + } + return vo; + }).toList(); + violationRecordVoPage.setRecords(violationRecordVoList); + return violationRecordVoPage; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 0325a255..66e8388f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -219,4 +219,12 @@ public interface ISysUserService { * @return 结果 */ List selectUserListByDept(Long deptId); + + /** + * 通过岗位id列表查询岗位所有用户 + * + * @param postIds 岗位id列表 + * @return 结果 + */ + List selectUserListByPostList(List postIds); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 4333ef5a..3af324d5 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -614,6 +614,24 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return baseMapper.selectVoList(lqw); } + /** + * 通过岗位id列表查询岗位所有用户 + * + * @param postIds 岗位id列表 + * @return 结果 + */ + @Override + public List selectUserListByPostList(List postIds) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(SysUserPost::getPostId, postIds); + List userPostList = userPostMapper.selectList(lqw); + if (CollUtil.isNotEmpty(userPostList)){ + List userIds = userPostList.stream().map(SysUserPost::getUserId).distinct().toList(); + return baseMapper.selectVoByIds(userIds); + } + return List.of(); + } + /** * 通过用户ID查询用户账户 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseViolationRecordMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseViolationRecordMapper.xml new file mode 100644 index 00000000..7a4610aa --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseViolationRecordMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/xinnengyuan/script/sql/menuInitValue.sql b/xinnengyuan/script/sql/menuInitValue.sql index 59bccf90..89f32bd0 100644 --- a/xinnengyuan/script/sql/menuInitValue.sql +++ b/xinnengyuan/script/sql/menuInitValue.sql @@ -1743,44 +1743,34 @@ insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, values (1942399191372275718, '无人机配置导出', 1942399191372275713, '5', '#', '', 1, 0, 'F', '0', '0', 'drone:droneConfig: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 (1947491501058625537, '违规记录', '1935597155897143297', '1', 'violationRecord', 'safety/violationRecord/index', + 1, 0, 'C', '0', '0', 'safety:violationRecord:list', '#', 103, 1, sysdate(), null, null, '违规记录菜单'); -CREATE TABLE `bus_violation_record` -( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `pid` bigint DEFAULT '0' COMMENT '父级主键ID', - `project_id` bigint DEFAULT NULL COMMENT '项目id', - `level_id` bigint DEFAULT NULL COMMENT '违章等级主键ID', - `level` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '违章等级(字符串)', - `tour_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '违章类型(字典)', - `tour_id` bigint DEFAULT NULL COMMENT '违章详情(关联bus_tour)', - `data_source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据来源(violation_record_data_source)', - `select_people` bigint DEFAULT NULL COMMENT '选择人(后台用户ID)', - `openid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'openid(施工人员)', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '工单状态(1通知 2整改 3复查)', - `processing_period` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '处理期限(要求)', - `processing_period_practical` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '处理期限(实际)', - `measure` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '整改措施', - `review` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '复查情况', - `review_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '复查状态(1通过 2未通过)', - `rectification_time` datetime DEFAULT NULL COMMENT '整改时间', - `review_time` datetime DEFAULT NULL COMMENT '复查时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', - `created_at` datetime DEFAULT NULL COMMENT '创建时间', - `updated_at` datetime DEFAULT NULL COMMENT '更新时间', - `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', - `remark` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', - `wx_or_pc` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源:1pc 2小程序', - `picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片', - `processing_time` date DEFAULT NULL COMMENT '处理日期', - `is_dispose` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '是否处理(1待处理 2已处理)', - `labor_date` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '人工日期(数据来源人工才会有此日期)', - `sxt_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '摄像头名称', - PRIMARY KEY (`id`) USING BTREE, - KEY `select_people` (`select_people`) USING BTREE, - KEY `openid` (`openid`) USING BTREE -) ENGINE = InnoDB - AUTO_INCREMENT = 262 - DEFAULT CHARSET = utf8mb4 - COLLATE = utf8mb4_general_ci - ROW_FORMAT = DYNAMIC COMMENT ='工单管理/违规记录'; +-- 按钮 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 (1947491501058625538, '违规记录查询', 1947491501058625537, '1', '#', '', 1, 0, 'F', '0', '0', + 'safety:violationRecord: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 (1947491501058625539, '违规记录新增', 1947491501058625537, '2', '#', '', 1, 0, 'F', '0', '0', + 'safety:violationRecord: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 (1947491501058625540, '违规记录修改', 1947491501058625537, '3', '#', '', 1, 0, 'F', '0', '0', + 'safety:violationRecord: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 (1947491501058625541, '违规记录删除', 1947491501058625537, '4', '#', '', 1, 0, 'F', '0', '0', + 'safety:violationRecord: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 (1947491501058625542, '违规记录导出', 1947491501058625537, '5', '#', '', 1, 0, 'F', '0', '0', + 'safety:violationRecord:export', '#', 103, 1, sysdate(), null, null, ''); diff --git a/xinnengyuan/script/sql/xinnengyuan.sql b/xinnengyuan/script/sql/xinnengyuan.sql index e757b744..081e4999 100644 --- a/xinnengyuan/script/sql/xinnengyuan.sql +++ b/xinnengyuan/script/sql/xinnengyuan.sql @@ -1564,31 +1564,26 @@ CREATE TABLE `dro_drone_config` DROP TABLE IF EXISTS `hse_violation_record`; CREATE TABLE `hse_violation_record` ( - `id` bigint not null auto_increment comment '主键id', - `project_id` bigint not null comment '项目id', - `level_id` bigint DEFAULT NULL COMMENT '违章等级主键ID', - `level` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '违章等级(字符串)', - `tour_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '违章类型(字典)', - `tour_id` bigint DEFAULT NULL COMMENT '违章详情(关联bus_tour)', - `data_source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据来源(violation_record_data_source)', - `select_people` bigint DEFAULT NULL COMMENT '选择人(后台用户ID)', - `openid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'openid(施工人员)', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '工单状态(1通知 2整改 3复查)', - `processing_period` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '处理期限(要求)', - `processing_period_practical` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '处理期限(实际)', - `measure` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '整改措施', - `review` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '复查情况', - `review_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '复查状态(1通过 2未通过)', - `rectification_time` datetime DEFAULT NULL COMMENT '整改时间', - `review_time` datetime DEFAULT NULL COMMENT '复查时间', - `picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片', - `processing_time` date DEFAULT NULL COMMENT '处理日期', - `is_dispose` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '是否处理(1待处理 2已处理)', - `labor_date` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '人工日期(数据来源人工才会有此日期)', - `sxt_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '摄像头名称', - `remark` text null comment '备注', + `id` bigint not null auto_increment comment '主键id', + `project_id` bigint not null comment '项目id', + `level_id` bigint not null comment '违章等级id', + `recognize_id` bigint not null comment '识别记录id', + `violation_type` varchar(32) null comment '违章类型', + `violation_time` datetime null comment '违章时间', + `handler_id` bigint null comment '违章处理人id', + `dispose_deadline` date null comment '处理期限', + `dispose_time` datetime null comment '处理时间', + `measure` varchar(300) null comment '整改措施', + `rectification_time` datetime null comment '整改时间', + `review` varchar(255) null comment '复查情况', + `review_type` char(1) null comment '复查状态(1通过 2未通过)', + `review_time` datetime null comment '复查时间', + `process_type` char(1) default '1' not null comment '处理流程类型(0仅通知 1通知整改复查)', + `status` char(1) default '1' not null comment '工单状态(1通知 2整改 3复查)', + `remark` varchar(255) null comment '备注', `create_by` bigint null comment '创建者', `update_by` bigint null comment '更新者', + `create_dept` bigint null comment '创建部门', `create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间', `update_time` datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间', primary key (`id`) using btree,