luogang 10 сар өмнө
parent
commit
7044a21a65
100 өөрчлөгдсөн 6697 нэмэгдсэн , 138 устгасан
  1. 0 18
      pom.xml
  2. 0 30
      ruoyi-admin/pom.xml
  3. 2 0
      ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
  4. 6 4
      ruoyi-admin/src/main/resources/application-dev.yml
  5. 0 1
      ruoyi-modules/pom.xml
  6. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java
  7. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java
  8. 203 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsController.java
  9. 111 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsMediaController.java
  10. 105 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsObjectController.java
  11. 105 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsReportController.java
  12. 115 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenFlowDetailController.java
  13. 4 5
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorPointController.java
  14. 105 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorPointMediaController.java
  15. 105 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorTaskAlgorithmsController.java
  16. 105 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorTaskController.java
  17. 83 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEvents.java
  18. 58 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEventsMedia.java
  19. 56 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEventsObject.java
  20. 76 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEventsReport.java
  21. 100 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenFlowDetail.java
  22. 5 1
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorPoint.java
  23. 67 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorPointMedia.java
  24. 56 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorTask.java
  25. 41 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorTaskAlgorithms.java
  26. 84 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsBo.java
  27. 62 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsMediaBo.java
  28. 60 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsObjectBo.java
  29. 84 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsReportBo.java
  30. 102 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenFlowDetailBo.java
  31. 18 4
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorPointBo.java
  32. 73 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorPointMediaBo.java
  33. 42 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorTaskAlgorithmsBo.java
  34. 51 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorTaskBo.java
  35. 31 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/MonitorTreeVo.java
  36. 70 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsMediaVo.java
  37. 70 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsObjectVo.java
  38. 91 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsReportVo.java
  39. 106 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsVo.java
  40. 118 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenFlowDetailVo.java
  41. 81 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorPointMediaVo.java
  42. 17 6
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorPointVo.java
  43. 46 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorTaskAlgorithmsVo.java
  44. 78 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorTaskVo.java
  45. 50 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsMapper.java
  46. 16 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsMediaMapper.java
  47. 15 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsObjectMapper.java
  48. 15 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsReportMapper.java
  49. 19 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenFlowDetailMapper.java
  50. 15 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenMonitorPointMediaMapper.java
  51. 15 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenMonitorTaskAlgorithmsMapper.java
  52. 29 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenMonitorTaskMapper.java
  53. 80 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsMediaService.java
  54. 68 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsObjectService.java
  55. 68 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsReportService.java
  56. 119 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsService.java
  57. 74 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenFlowDetailService.java
  58. 68 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorPointMediaService.java
  59. 3 3
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorPointService.java
  60. 68 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorTaskAlgorithmsService.java
  61. 68 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorTaskService.java
  62. 145 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsMediaServiceImpl.java
  63. 133 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsObjectServiceImpl.java
  64. 137 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsReportServiceImpl.java
  65. 270 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsServiceImpl.java
  66. 149 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenFlowDetailServiceImpl.java
  67. 134 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorPointMediaServiceImpl.java
  68. 114 53
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorPointServiceImpl.java
  69. 129 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorTaskAlgorithmsServiceImpl.java
  70. 133 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorTaskServiceImpl.java
  71. 40 0
      ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/task/DemoTask.java
  72. 305 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsMapper.xml
  73. 7 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsMediaMapper.xml
  74. 7 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsObjectMapper.xml
  75. 7 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsReportMapper.xml
  76. 30 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenFlowDetailMapper.xml
  77. 7 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenMonitorPointMediaMapper.xml
  78. 7 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenMonitorTaskAlgorithmsMapper.xml
  79. 80 0
      ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenMonitorTaskMapper.xml
  80. 0 4
      traffic-ui/.env.development
  81. 0 5
      traffic-ui/.env.production
  82. 1 0
      traffic-ui/package.json
  83. 13 1
      traffic-ui/src/api/manage/monitorPoint/index.ts
  84. 45 0
      traffic-ui/src/api/manage/monitorPoint/types.ts
  85. 63 0
      traffic-ui/src/api/manage/monitorTask/index.ts
  86. 101 0
      traffic-ui/src/api/manage/monitorTask/types.ts
  87. 194 0
      traffic-ui/src/api/sense/events/index.ts
  88. 161 0
      traffic-ui/src/api/sense/events/types.ts
  89. 63 0
      traffic-ui/src/api/sense/eventsObject/index.ts
  90. 101 0
      traffic-ui/src/api/sense/eventsObject/types.ts
  91. 63 0
      traffic-ui/src/api/sense/eventsReport/index.ts
  92. 161 0
      traffic-ui/src/api/sense/eventsReport/types.ts
  93. 70 0
      traffic-ui/src/api/sense/flowDetail/index.ts
  94. 150 0
      traffic-ui/src/api/sense/flowDetail/types.ts
  95. BIN
      traffic-ui/src/assets/images/event.png
  96. 1 0
      traffic-ui/src/assets/images/monitor.svg
  97. 83 0
      traffic-ui/src/components/BaseChart/index.vue
  98. 2 1
      traffic-ui/src/layout/components/AppMain.vue
  99. 0 1
      traffic-ui/src/main.ts
  100. 4 0
      traffic-ui/src/types/components.d.ts

+ 0 - 18
pom.xml

@@ -354,22 +354,9 @@
 
             <dependency>
                 <groupId>org.dromara</groupId>
-                <artifactId>ruoyi-job</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-generator</artifactId>
                 <version>${revision}</version>
             </dependency>
-
-            <dependency>
-                <groupId>org.dromara</groupId>
-                <artifactId>ruoyi-demo</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-traffic</artifactId>
@@ -377,11 +364,6 @@
             </dependency>
 
             <!--  工作流模块  -->
-            <dependency>
-                <groupId>org.dromara</groupId>
-                <artifactId>ruoyi-workflow</artifactId>
-                <version>${revision}</version>
-            </dependency>
 
         </dependencies>
     </dependencyManagement>

+ 0 - 30
ruoyi-admin/pom.xml

@@ -69,35 +69,18 @@
             <artifactId>ruoyi-system</artifactId>
         </dependency>
 
-<!--        <dependency>-->
-<!--            <groupId>org.dromara</groupId>-->
-<!--            <artifactId>ruoyi-job</artifactId>-->
-<!--        </dependency>-->
 
         <!-- 代码生成-->
         <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-generator</artifactId>
         </dependency>
-
-        <!--  demo模块  -->
-        <dependency>
-            <groupId>org.dromara</groupId>
-            <artifactId>ruoyi-demo</artifactId>
-        </dependency>
-
-
         <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-traffic</artifactId>
         </dependency>
 
 
-        <!--  工作流模块  -->
-<!--        <dependency>-->
-<!--            <groupId>org.dromara</groupId>-->
-<!--            <artifactId>ruoyi-workflow</artifactId>-->
-<!--        </dependency>-->
 
         <dependency>
             <groupId>de.codecentric</groupId>
@@ -109,19 +92,6 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
-
-        <!-- skywalking 整合 logback -->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.skywalking</groupId>-->
-<!--            <artifactId>apm-toolkit-logback-1.x</artifactId>-->
-<!--            <version>${与你的agent探针版本保持一致}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.skywalking</groupId>-->
-<!--            <artifactId>apm-toolkit-trace</artifactId>-->
-<!--            <version>${与你的agent探针版本保持一致}</version>-->
-<!--        </dependency>-->
-
     </dependencies>
 
     <build>

+ 2 - 0
ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java

@@ -3,6 +3,7 @@ package org.dromara;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 启动程序
@@ -11,6 +12,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  */
 
 @SpringBootApplication
+@EnableScheduling
 public class DromaraApplication {
 
     public static void main(String[] args) {

+ 6 - 4
ruoyi-admin/src/main/resources/application-dev.yml

@@ -42,9 +42,10 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://172.192.10.105:30002/sense_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          url: jdbc:mysql://172.192.10.105:30002/sense_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://localhost:3306/sense_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
-          password: root
+          password: root6666
 #          driverClassName: dm.jdbc.driver.DmDriver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
@@ -97,9 +98,10 @@ spring:
 spring.data:
   redis:
     # 地址
-    host: 172.192.10.105
+#    host: 172.192.10.105
+    host: 127.0.0.1
     # 端口,默认为6379
-    port: 30013
+    port: 6379
     # 数据库索引
     database: 10
     # redis 密码必须配置

+ 0 - 1
ruoyi-modules/pom.xml

@@ -11,7 +11,6 @@
 
     <modules>
         <module>ruoyi-generator</module>
-<!--        <module>ruoyi-job</module>-->
         <module>ruoyi-system</module>
         <module>ruoyi-traffic</module>
     </modules>

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java

@@ -74,5 +74,9 @@ public class SysArea  extends BaseEntity {
      * 祖级列表
      */
     private String ancestors;
+    /**
+     * 当前区域层级
+     */
+    private Integer areaLevel;
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java

@@ -11,7 +11,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.system.domain.SysArea;
 
 /**
- * 部门业务对象 sys_dept
+ * 部门业务对象 sys_Area
  *
  * @author Michelle.Chung
  */

+ 203 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsController.java

@@ -0,0 +1,203 @@
+package org.dromara.controller;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenEventsVo;
+import org.dromara.domain.bo.SenEventsBo;
+import org.dromara.service.ISenEventsService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 事件信息
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/events")
+public class SenEventsController extends BaseController {
+
+    private final ISenEventsService senEventsService;
+
+    /**
+     * 查询事件信息列表
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenEventsVo> list(SenEventsBo bo, PageQuery pageQuery) {
+        return senEventsService.queryPageList(bo, pageQuery);
+    }
+    /**
+     * 查询最新的事件数据
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventsCount")
+    public R<HashMap<String,Object>> eventsCount() {
+        return R.ok(senEventsService.eventsCount());
+    }
+
+    /**
+     * 导出事件信息列表
+     */
+    @SaCheckPermission("manage:events:export")
+    @Log(title = "事件信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenEventsBo bo, HttpServletResponse response) {
+        List<SenEventsVo> list = senEventsService.queryList(bo);
+        ExcelUtil.exportExcel(list, "事件信息", SenEventsVo.class, response);
+    }
+
+    /**
+     * 获取事件信息详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("manage:events:query")
+    @GetMapping("/{id}")
+    public R<SenEventsVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senEventsService.queryById(id));
+    }
+
+    /**
+     * 新增事件信息
+     */
+    @SaCheckPermission("manage:events:add")
+    @Log(title = "事件信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenEventsBo bo) {
+        return toAjax(senEventsService.insertByBo(bo));
+    }
+
+    /**
+     * 修改事件信息
+     */
+    @SaCheckPermission("manage:events:edit")
+    @Log(title = "事件信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenEventsBo bo) {
+        return toAjax(senEventsService.updateByBo(bo));
+    }
+
+    /**
+     * 删除事件信息
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("manage:events:remove")
+    @Log(title = "事件信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senEventsService.deleteWithValidByIds(List.of(ids), true));
+    }
+    /**
+     * 重点事件统计
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/importantEventsStat")
+    public R<List<HashMap<String,Object>>> importantEventsStat(@RequestParam String dateType) {
+        return R.ok(senEventsService.importantEventsStat(dateType));
+    }
+    /**
+     * 机占非TOP10
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/motorInLanesTop10")
+    public R<HashMap<String,Object>> motorInLanesTop10(@RequestParam String dateType) {
+        return R.ok(senEventsService.motorInLanesTop10(dateType));
+    }
+    /**
+     * 事件占比TOP10(%)
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventPercentTop10")
+    public R<List<Map<String,Object>>> eventPercentTop10() {
+        return R.ok(senEventsService.eventPercentTop10());
+    }
+    /**
+     * 近30日事件统计
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventMonthCount")
+    public R<List<Map<String,Object>>> eventMonthCount() {
+        return R.ok(senEventsService.eventMonthCount());
+    }
+    /**
+     * 每日事件统计
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventDayCount")
+    public R<List<Map<String, Object>>> eventDayCount() {
+        return R.ok(senEventsService.eventDayCount());
+    }
+    /**
+     * 监控点位违反统计
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/pointEventsStat")
+    public R<List<HashMap<String,Object>>> pointEventsStat(@RequestParam String dateType) {
+        return R.ok(senEventsService.pointEventsStat(dateType));
+    }
+    /**
+     * 区域违法分布
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/regionEventsStat")
+    public R<List<HashMap<String,Object>>> regionEventsStat(@RequestParam String dateType) {
+        return R.ok(senEventsService.regionEventsStat(dateType));
+    }
+    /**
+     * 每分钟事件统计
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/minuteEventsStat")
+    public R<List<HashMap<String,Object>>> minuteEventsStat(@RequestParam String eventType) {
+        return R.ok(senEventsService.minuteEventsStat(eventType));
+    }
+    /**
+     * 交通违法数据来源分析
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventsDatasourceStat")
+    public R<List<HashMap<String,Object>>> eventsDatasourceStat(@RequestParam String dateType) {
+        return R.ok(senEventsService.eventsDatasourceStat(dateType));
+    }
+    /**
+     * 交通违法分布式时间
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventsHourStat")
+    public R<List<HashMap<String,Object>>> eventsHourStat(@RequestParam String dateType) {
+        return R.ok(senEventsService.eventsHourStat(dateType));
+    }
+    /**
+     * 交通违法处置分析
+     */
+    @SaCheckPermission("manage:events:list")
+    @GetMapping("/eventsDealRateStat")
+    public R<List<HashMap<String,Object>>> eventsDealRateStat(@RequestParam String dateType) {
+        return R.ok(senEventsService.eventsDealRateStat(dateType));
+    }
+}

+ 111 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsMediaController.java

@@ -0,0 +1,111 @@
+package org.dromara.controller;
+
+import java.util.List;
+
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.log.enums.BusinessType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenEventsMediaVo;
+import org.dromara.domain.bo.SenEventsMediaBo;
+import org.dromara.service.ISenEventsMediaService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 事件媒介
+
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/dromara/eventsMedia")
+public class SenEventsMediaController extends BaseController {
+
+    private final ISenEventsMediaService senEventsMediaService;
+
+    /**
+     * 查询事件媒介
+列表
+     */
+    @SaCheckPermission("dromara:eventsMedia:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenEventsMediaVo> list(SenEventsMediaBo bo, PageQuery pageQuery) {
+        return senEventsMediaService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出事件媒介列表
+     */
+    @SaCheckPermission("dromara:eventsMedia:export")
+    @Log(title = "事件媒介 ", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenEventsMediaBo bo, HttpServletResponse response) {
+        List<SenEventsMediaVo> list = senEventsMediaService.queryList(bo);
+        ExcelUtil.exportExcel(list, "事件媒介 ", SenEventsMediaVo.class, response);
+    }
+
+    /**
+     * 获取事件媒介
+详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("dromara:eventsMedia:query")
+    @GetMapping("/{id}")
+    public R<SenEventsMediaVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senEventsMediaService.queryById(id));
+    }
+
+    /**
+     * 新增事件媒介
+
+     */
+    @SaCheckPermission("dromara:eventsMedia:add")
+    @Log(title = "事件媒介 ", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenEventsMediaBo bo) {
+        return toAjax(senEventsMediaService.insertByBo(bo));
+    }
+
+    /**
+     * 修改事件媒介
+
+     */
+    @SaCheckPermission("dromara:eventsMedia:edit")
+    @Log(title = "事件媒介 ", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenEventsMediaBo bo) {
+        return toAjax(senEventsMediaService.updateByBo(bo));
+    }
+
+    /**
+     * 删除事件媒介
+
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("dromara:eventsMedia:remove")
+    @Log(title = "事件媒介 ", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senEventsMediaService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsObjectController.java

@@ -0,0 +1,105 @@
+package org.dromara.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenEventsObjectVo;
+import org.dromara.domain.bo.SenEventsObjectBo;
+import org.dromara.service.ISenEventsObjectService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 事件对象
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/dromara/eventsObject")
+public class SenEventsObjectController extends BaseController {
+
+    private final ISenEventsObjectService senEventsObjectService;
+
+    /**
+     * 查询事件对象列表
+     */
+    @SaCheckPermission("dromara:eventsObject:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenEventsObjectVo> list(SenEventsObjectBo bo, PageQuery pageQuery) {
+        return senEventsObjectService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出事件对象列表
+     */
+    @SaCheckPermission("dromara:eventsObject:export")
+    @Log(title = "事件对象", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenEventsObjectBo bo, HttpServletResponse response) {
+        List<SenEventsObjectVo> list = senEventsObjectService.queryList(bo);
+        ExcelUtil.exportExcel(list, "事件对象", SenEventsObjectVo.class, response);
+    }
+
+    /**
+     * 获取事件对象详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("dromara:eventsObject:query")
+    @GetMapping("/{id}")
+    public R<SenEventsObjectVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senEventsObjectService.queryById(id));
+    }
+
+    /**
+     * 新增事件对象
+     */
+    @SaCheckPermission("dromara:eventsObject:add")
+    @Log(title = "事件对象", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenEventsObjectBo bo) {
+        return toAjax(senEventsObjectService.insertByBo(bo));
+    }
+
+    /**
+     * 修改事件对象
+     */
+    @SaCheckPermission("dromara:eventsObject:edit")
+    @Log(title = "事件对象", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenEventsObjectBo bo) {
+        return toAjax(senEventsObjectService.updateByBo(bo));
+    }
+
+    /**
+     * 删除事件对象
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("dromara:eventsObject:remove")
+    @Log(title = "事件对象", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senEventsObjectService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenEventsReportController.java

@@ -0,0 +1,105 @@
+package org.dromara.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenEventsReportVo;
+import org.dromara.domain.bo.SenEventsReportBo;
+import org.dromara.service.ISenEventsReportService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 推送记录
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/sense/eventsReport")
+public class SenEventsReportController extends BaseController {
+
+    private final ISenEventsReportService senEventsReportService;
+
+    /**
+     * 查询推送记录列表
+     */
+    @SaCheckPermission("sense:eventsReport:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenEventsReportVo> list(SenEventsReportBo bo, PageQuery pageQuery) {
+        return senEventsReportService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出推送记录列表
+     */
+    @SaCheckPermission("sense:eventsReport:export")
+    @Log(title = "推送记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenEventsReportBo bo, HttpServletResponse response) {
+        List<SenEventsReportVo> list = senEventsReportService.queryList(bo);
+        ExcelUtil.exportExcel(list, "推送记录", SenEventsReportVo.class, response);
+    }
+
+    /**
+     * 获取推送记录详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("sense:eventsReport:query")
+    @GetMapping("/{id}")
+    public R<SenEventsReportVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senEventsReportService.queryById(id));
+    }
+
+    /**
+     * 新增推送记录
+     */
+    @SaCheckPermission("sense:eventsReport:add")
+    @Log(title = "推送记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenEventsReportBo bo) {
+        return toAjax(senEventsReportService.insertByBo(bo));
+    }
+
+    /**
+     * 修改推送记录
+     */
+    @SaCheckPermission("sense:eventsReport:edit")
+    @Log(title = "推送记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenEventsReportBo bo) {
+        return toAjax(senEventsReportService.updateByBo(bo));
+    }
+
+    /**
+     * 删除推送记录
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("sense:eventsReport:remove")
+    @Log(title = "推送记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senEventsReportService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 115 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenFlowDetailController.java

@@ -0,0 +1,115 @@
+package org.dromara.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenFlowDetailVo;
+import org.dromara.domain.bo.SenFlowDetailBo;
+import org.dromara.service.ISenFlowDetailService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 流量明细
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/sense/flowDetail")
+public class SenFlowDetailController extends BaseController {
+
+    private final ISenFlowDetailService senFlowDetailService;
+
+    /**
+     * 查询流量明细列表
+     */
+    @SaCheckPermission("sense:flowDetail:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenFlowDetailVo> list(SenFlowDetailBo bo, PageQuery pageQuery) {
+        return senFlowDetailService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出流量明细列表
+     */
+    @SaCheckPermission("sense:flowDetail:export")
+    @Log(title = "流量明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenFlowDetailBo bo, HttpServletResponse response) {
+        List<SenFlowDetailVo> list = senFlowDetailService.queryList(bo);
+        ExcelUtil.exportExcel(list, "流量明细", SenFlowDetailVo.class, response);
+    }
+
+    /**
+     * 获取流量明细详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("sense:flowDetail:query")
+    @GetMapping("/{id}")
+    public R<SenFlowDetailVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senFlowDetailService.queryById(id));
+    }
+
+    /**
+     * 新增流量明细
+     */
+    @SaCheckPermission("sense:flowDetail:add")
+    @Log(title = "流量明细", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenFlowDetailBo bo) {
+        return toAjax(senFlowDetailService.insertByBo(bo));
+    }
+
+    /**
+     * 修改流量明细
+     */
+    @SaCheckPermission("sense:flowDetail:edit")
+    @Log(title = "流量明细", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenFlowDetailBo bo) {
+        return toAjax(senFlowDetailService.updateByBo(bo));
+    }
+
+    /**
+     * 删除流量明细
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("sense:flowDetail:remove")
+    @Log(title = "流量明细", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senFlowDetailService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 获取流量前3的路段流量折线图数据
+     */
+    @SaCheckPermission("sense:flowDetail:list")
+    @GetMapping("/lineCharts")
+    public R<List<Map<String,Object>>> lineCharts() {
+        return R.ok(senFlowDetailService.lineCharts());
+    }
+}

+ 4 - 5
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorPointController.java

@@ -2,13 +2,12 @@ package org.dromara.controller;
 
 import java.util.List;
 
-import cn.hutool.core.lang.tree.Tree;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.system.domain.bo.SysAreaBo;
-import org.dromara.system.service.ISysAreaService;
+import org.dromara.domain.SenMonitorPoint;
+import org.dromara.system.domain.SysArea;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -53,8 +52,8 @@ public class SenMonitorPointController extends BaseController {
      */
     @SaCheckPermission("manage:monitorPoint:list")
     @GetMapping("/getListByAreaTree")
-    public R<List<Tree<Long>>> areaTree(SenMonitorPointBo pointBo) {
-        return R.ok(senMonitorPointService.selectAreaTreeList(pointBo));
+    public R<List<SenMonitorPoint>> getListByAreaTree(SenMonitorPointBo bo) {
+        return R.ok(senMonitorPointService.getListByAreaId(bo));
     }
     /**
      * 导出监控点位信息列表

+ 105 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorPointMediaController.java

@@ -0,0 +1,105 @@
+package org.dromara.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenMonitorPointMediaVo;
+import org.dromara.domain.bo.SenMonitorPointMediaBo;
+import org.dromara.service.ISenMonitorPointMediaService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 监控点位视频媒介
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/monitorPointMedia")
+public class SenMonitorPointMediaController extends BaseController {
+
+    private final ISenMonitorPointMediaService senMonitorPointMediaService;
+
+    /**
+     * 查询监控点位视频媒介列表
+     */
+    @SaCheckPermission("manage:monitorPointMedia:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenMonitorPointMediaVo> list(SenMonitorPointMediaBo bo, PageQuery pageQuery) {
+        return senMonitorPointMediaService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出监控点位视频媒介列表
+     */
+    @SaCheckPermission("manage:monitorPointMedia:export")
+    @Log(title = "监控点位视频媒介", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenMonitorPointMediaBo bo, HttpServletResponse response) {
+        List<SenMonitorPointMediaVo> list = senMonitorPointMediaService.queryList(bo);
+        ExcelUtil.exportExcel(list, "监控点位视频媒介", SenMonitorPointMediaVo.class, response);
+    }
+
+    /**
+     * 获取监控点位视频媒介详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("manage:monitorPointMedia:query")
+    @GetMapping("/{id}")
+    public R<SenMonitorPointMediaVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senMonitorPointMediaService.queryById(id));
+    }
+
+    /**
+     * 新增监控点位视频媒介
+     */
+    @SaCheckPermission("manage:monitorPointMedia:add")
+    @Log(title = "监控点位视频媒介", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenMonitorPointMediaBo bo) {
+        return toAjax(senMonitorPointMediaService.insertByBo(bo));
+    }
+
+    /**
+     * 修改监控点位视频媒介
+     */
+    @SaCheckPermission("manage:monitorPointMedia:edit")
+    @Log(title = "监控点位视频媒介", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenMonitorPointMediaBo bo) {
+        return toAjax(senMonitorPointMediaService.updateByBo(bo));
+    }
+
+    /**
+     * 删除监控点位视频媒介
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("manage:monitorPointMedia:remove")
+    @Log(title = "监控点位视频媒介", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senMonitorPointMediaService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorTaskAlgorithmsController.java

@@ -0,0 +1,105 @@
+package org.dromara.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenMonitorTaskAlgorithmsVo;
+import org.dromara.domain.bo.SenMonitorTaskAlgorithmsBo;
+import org.dromara.service.ISenMonitorTaskAlgorithmsService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 监控点任务-算法配置
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/dromara/monitorTaskAlgorithms")
+public class SenMonitorTaskAlgorithmsController extends BaseController {
+
+    private final ISenMonitorTaskAlgorithmsService senMonitorTaskAlgorithmsService;
+
+    /**
+     * 查询监控点任务-算法配置列表
+     */
+    @SaCheckPermission("dromara:monitorTaskAlgorithms:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenMonitorTaskAlgorithmsVo> list(SenMonitorTaskAlgorithmsBo bo, PageQuery pageQuery) {
+        return senMonitorTaskAlgorithmsService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出监控点任务-算法配置列表
+     */
+    @SaCheckPermission("dromara:monitorTaskAlgorithms:export")
+    @Log(title = "监控点任务-算法配置", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenMonitorTaskAlgorithmsBo bo, HttpServletResponse response) {
+        List<SenMonitorTaskAlgorithmsVo> list = senMonitorTaskAlgorithmsService.queryList(bo);
+        ExcelUtil.exportExcel(list, "监控点任务-算法配置", SenMonitorTaskAlgorithmsVo.class, response);
+    }
+
+    /**
+     * 获取监控点任务-算法配置详细信息
+     *
+     * @param taskId 主键
+     */
+    @SaCheckPermission("dromara:monitorTaskAlgorithms:query")
+    @GetMapping("/{taskId}")
+    public R<SenMonitorTaskAlgorithmsVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long taskId) {
+        return R.ok(senMonitorTaskAlgorithmsService.queryById(taskId));
+    }
+
+    /**
+     * 新增监控点任务-算法配置
+     */
+    @SaCheckPermission("dromara:monitorTaskAlgorithms:add")
+    @Log(title = "监控点任务-算法配置", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenMonitorTaskAlgorithmsBo bo) {
+        return toAjax(senMonitorTaskAlgorithmsService.insertByBo(bo));
+    }
+
+    /**
+     * 修改监控点任务-算法配置
+     */
+    @SaCheckPermission("dromara:monitorTaskAlgorithms:edit")
+    @Log(title = "监控点任务-算法配置", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenMonitorTaskAlgorithmsBo bo) {
+        return toAjax(senMonitorTaskAlgorithmsService.updateByBo(bo));
+    }
+
+    /**
+     * 删除监控点任务-算法配置
+     *
+     * @param taskIds 主键串
+     */
+    @SaCheckPermission("dromara:monitorTaskAlgorithms:remove")
+    @Log(title = "监控点任务-算法配置", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{taskIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] taskIds) {
+        return toAjax(senMonitorTaskAlgorithmsService.deleteWithValidByIds(List.of(taskIds), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/controller/SenMonitorTaskController.java

@@ -0,0 +1,105 @@
+package org.dromara.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.domain.vo.SenMonitorTaskVo;
+import org.dromara.domain.bo.SenMonitorTaskBo;
+import org.dromara.service.ISenMonitorTaskService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 任务管理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/monitorTask")
+public class SenMonitorTaskController extends BaseController {
+
+    private final ISenMonitorTaskService senMonitorTaskService;
+
+    /**
+     * 查询任务管理列表
+     */
+    @SaCheckPermission("manage:monitorTask:list")
+    @GetMapping("/list")
+    public TableDataInfo<SenMonitorTaskVo> list(SenMonitorTaskBo bo, PageQuery pageQuery) {
+        return senMonitorTaskService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出任务管理列表
+     */
+    @SaCheckPermission("manage:monitorTask:export")
+    @Log(title = "任务管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SenMonitorTaskBo bo, HttpServletResponse response) {
+        List<SenMonitorTaskVo> list = senMonitorTaskService.queryList(bo);
+        ExcelUtil.exportExcel(list, "任务管理", SenMonitorTaskVo.class, response);
+    }
+
+    /**
+     * 获取任务管理详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("manage:monitorTask:query")
+    @GetMapping("/{id}")
+    public R<SenMonitorTaskVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(senMonitorTaskService.queryById(id));
+    }
+
+    /**
+     * 新增任务管理
+     */
+    @SaCheckPermission("manage:monitorTask:add")
+    @Log(title = "任务管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SenMonitorTaskBo bo) {
+        return toAjax(senMonitorTaskService.insertByBo(bo));
+    }
+
+    /**
+     * 修改任务管理
+     */
+    @SaCheckPermission("manage:monitorTask:edit")
+    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SenMonitorTaskBo bo) {
+        return toAjax(senMonitorTaskService.updateByBo(bo));
+    }
+
+    /**
+     * 删除任务管理
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("manage:monitorTask:remove")
+    @Log(title = "任务管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(senMonitorTaskService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 83 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEvents.java

@@ -0,0 +1,83 @@
+package org.dromara.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 事件信息对象 sen_events
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@TableName("sen_events")
+public class SenEvents implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 事件分类(字典event_category)
+     */
+    private String eventCategory;
+
+    /**
+     * 事件名称
+     */
+    private String eventName;
+
+    /**
+     * 事件类型(字典event_type)
+     */
+    private String eventType;
+
+    /**
+     * 监控点id
+     */
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    private String pointName;
+
+    /**
+     * 区域id
+     */
+    private String areaId;
+
+    /**
+     * 区域名称
+     */
+    private String areaName;
+
+    /**
+     * 事件对象类型(交通、城管、社区)
+     */
+    private String eventObj;
+
+    /**
+     * 处理状态
+     */
+    private String dealStatus;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+}

+ 58 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEventsMedia.java

@@ -0,0 +1,58 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+
+import java.io.Serial;
+
+/**
+ * 事件媒介
+对象 sen_events_media
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sen_events_media")
+public class SenEventsMedia extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 事件id
+     */
+    private Long eventId;
+
+    /**
+     * 媒介文件类型(1-图片、2-视频)
+     */
+    private String mediaType;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件存储路径
+     */
+    private String filePath;
+
+    /**
+     * 如果是视频,记录视频的时长
+     */
+    private Date duration;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEventsObject.java

@@ -0,0 +1,56 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 事件对象对象 sen_events_object
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sen_events_object")
+public class SenEventsObject extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 事件id
+     */
+    private Long eventId;
+
+    /**
+     * 对象类型(如人、车等)
+     */
+    private String objectType;
+
+    /**
+     * 事件类型(字典event_type)
+     */
+    private String eventType;
+
+    /**
+     * 对象标识(如车牌号、人脸特征码等)
+     */
+    private String objectId;
+
+    /**
+     * 对象属性(如品牌)
+     */
+    private String objectAttr;
+
+
+}

+ 76 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenEventsReport.java

@@ -0,0 +1,76 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 推送记录对象 sen_events_report
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sen_events_report")
+public class SenEventsReport extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 上报平台
+     */
+    private String reportPlatform;
+
+    /**
+     * 监控点id
+     */
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    private String pointName;
+
+    /**
+     * 事件名称
+     */
+    private String eventName;
+
+    /**
+     * 数据详情
+     */
+    private String dataContent;
+
+    /**
+     * 数据类型
+     */
+    private String dataType;
+
+    /**
+     * 上报状态(0-发送成功1-发送失败)
+     */
+    private String reportStatus;
+
+    /**
+     * 描述
+     */
+    private String reportDesc;
+
+    /**
+     * 重试次数
+     */
+    private Integer dealStatus;
+
+
+}

+ 100 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenFlowDetail.java

@@ -0,0 +1,100 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 流量明细对象 sen_flow_detail
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@TableName("sen_flow_detail")
+public class SenFlowDetail implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 任务编号
+     */
+    private Long taskId;
+
+    /**
+     * 监控点id
+     */
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    private String pointName;
+
+    /**
+     * 车道号
+     */
+    private String laneNumber;
+
+    /**
+     * 车流量
+     */
+    private String vehicleCount;
+
+    /**
+     * 平均数据(km/h)
+     */
+    private String averageSpeed;
+
+    /**
+     * 排队长度(s)
+     */
+    private String queueTime;
+
+    /**
+     * 空间占有率
+     */
+    private String spaceRate;
+
+    /**
+     * 时间占有率
+     */
+    private String timeRate;
+
+    /**
+     * 车头时距(s)
+     */
+    private String headwayTime;
+
+    /**
+     * 车头间距
+     */
+    private String headwayDistance;
+
+    /**
+     * 车辆类型与行驶方向数
+     */
+    private String vehicleRemark;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+}

+ 5 - 1
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorPoint.java

@@ -32,7 +32,7 @@ public class SenMonitorPoint extends BaseEntity {
     /**
      * 行政区域
      */
-    private String areaId;
+    private Long areaId;
 
     /**
      * 监控点名称
@@ -40,6 +40,10 @@ public class SenMonitorPoint extends BaseEntity {
     private String pointName;
 
     /**
+     * 视频类型(1-实时视频 2-离线视频)
+     */
+    private String videoType;
+    /**
      * 场景类型(1-高速公路 2-城市道路)
      */
     private String sceneType;

+ 67 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorPointMedia.java

@@ -0,0 +1,67 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+
+import java.io.Serial;
+
+/**
+ * 监控点位视频媒介对象 sen_monitor_point_media
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sen_monitor_point_media")
+public class SenMonitorPointMedia extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 监控点id
+     */
+    private Long pointId;
+
+    /**
+     * 视频类型(1-实时视频2-离线视频)
+     */
+    private String videoType;
+
+    /**
+     * 设备编号
+     */
+    private String deviceNo;
+
+    /**
+     * 实时流地址
+     */
+    private String streamUrl;
+
+    /**
+     * 离线视频名称
+     */
+    private String fileName;
+
+    /**
+     * 离线视频存储路径
+     */
+    private String filePath;
+
+    /**
+     * 离线视频校准时间
+     */
+    private Date adjustTime;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorTask.java

@@ -0,0 +1,56 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 任务管理对象 sen_monitor_task
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sen_monitor_task")
+public class SenMonitorTask extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务编号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 监控点媒介id
+     */
+    private Long mediaId;
+
+    /**
+     * 监控点位id
+     */
+    private Long pointId;
+
+    /**
+     * 视频类型(1-实时视频2-离线视频)
+     */
+    private String videoType;
+
+    /**
+     * 完成进度
+     */
+    private String progress;
+
+    /**
+     * 任务状态(1-未开始 2-分析中3-分析完成)
+     */
+    private String status;
+
+
+}

+ 41 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/SenMonitorTaskAlgorithms.java

@@ -0,0 +1,41 @@
+package org.dromara.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 监控点任务-算法配置对象 sen_monitor_task_algorithms
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sen_monitor_task_algorithms")
+public class SenMonitorTaskAlgorithms extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务id
+     */
+    @TableId(value = "task_id")
+    private Long taskId;
+
+    /**
+     * 算法id
+     */
+    private Long algorithmId;
+
+    /**
+     * 算法感兴趣绘制区域内容
+     */
+    private String configContent;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsBo.java

@@ -0,0 +1,84 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenEvents;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 事件信息业务对象 sen_events
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenEvents.class, reverseConvertGenerate = false)
+public class SenEventsBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 事件分类(字典event_category)
+     */
+    @NotBlank(message = "事件分类(字典event_category)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String eventCategory;
+
+    /**
+     * 事件名称
+     */
+    @NotBlank(message = "事件名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String eventName;
+
+    /**
+     * 事件类型(字典event_type)
+     */
+    @NotBlank(message = "事件类型(字典event_type)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String eventType;
+
+    /**
+     * 监控点id
+     */
+    @NotNull(message = "监控点id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    @NotBlank(message = "监控点名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pointName;
+
+    /**
+     * 区域id
+     */
+    @NotBlank(message = "区域id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String areaId;
+
+    /**
+     * 区域名称
+     */
+    @NotBlank(message = "区域名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String areaName;
+
+    /**
+     * 事件对象类型(交通、城管、社区)
+     */
+    @NotBlank(message = "事件对象类型(交通、城管、社区)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String eventObj;
+
+    /**
+     * 处理状态
+     */
+    @NotBlank(message = "处理状态不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dealStatus;
+
+
+}

+ 62 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsMediaBo.java

@@ -0,0 +1,62 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenEventsMedia;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+
+/**
+ * 事件媒介
+业务对象 sen_events_media
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenEventsMedia.class, reverseConvertGenerate = false)
+public class SenEventsMediaBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 事件id
+     */
+    @NotNull(message = "事件id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long eventId;
+
+    /**
+     * 媒介文件类型(1-图片、2-视频)
+     */
+    @NotBlank(message = "媒介文件类型(1-图片、2-视频)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String mediaType;
+
+    /**
+     * 文件名称
+     */
+    @NotBlank(message = "文件名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String fileName;
+
+    /**
+     * 文件存储路径
+     */
+    @NotBlank(message = "文件存储路径不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String filePath;
+
+    /**
+     * 如果是视频,记录视频的时长
+     */
+    @NotNull(message = "如果是视频,记录视频的时长不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date duration;
+
+
+}

+ 60 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsObjectBo.java

@@ -0,0 +1,60 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenEventsObject;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 事件对象业务对象 sen_events_object
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenEventsObject.class, reverseConvertGenerate = false)
+public class SenEventsObjectBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 事件id
+     */
+    @NotNull(message = "事件id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long eventId;
+
+    /**
+     * 对象类型(如人、车等)
+     */
+    @NotBlank(message = "对象类型(如人、车等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String objectType;
+
+    /**
+     * 事件类型(字典event_type)
+     */
+    @NotBlank(message = "事件类型(字典event_type)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String eventType;
+
+    /**
+     * 对象标识(如车牌号、人脸特征码等)
+     */
+    @NotBlank(message = "对象标识(如车牌号、人脸特征码等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String objectId;
+
+    /**
+     * 对象属性(如品牌)
+     */
+    @NotBlank(message = "对象属性(如品牌)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String objectAttr;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenEventsReportBo.java

@@ -0,0 +1,84 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenEventsReport;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 推送记录业务对象 sen_events_report
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenEventsReport.class, reverseConvertGenerate = false)
+public class SenEventsReportBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 上报平台
+     */
+    @NotBlank(message = "上报平台不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reportPlatform;
+
+    /**
+     * 监控点id
+     */
+    @NotNull(message = "监控点id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    @NotBlank(message = "监控点名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pointName;
+
+    /**
+     * 事件名称
+     */
+    @NotBlank(message = "事件名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String eventName;
+
+    /**
+     * 数据详情
+     */
+    @NotBlank(message = "数据详情不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataContent;
+
+    /**
+     * 数据类型
+     */
+    @NotBlank(message = "数据类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataType;
+
+    /**
+     * 上报状态(0-发送成功1-发送失败)
+     */
+    @NotBlank(message = "上报状态(0-发送成功1-发送失败)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reportStatus;
+
+    /**
+     * 描述
+     */
+    @NotBlank(message = "描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reportDesc;
+
+    /**
+     * 重试次数
+     */
+    @NotNull(message = "重试次数不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer dealStatus;
+
+
+}

+ 102 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenFlowDetailBo.java

@@ -0,0 +1,102 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenFlowDetail;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 流量明细业务对象 sen_flow_detail
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenFlowDetail.class, reverseConvertGenerate = false)
+public class SenFlowDetailBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 任务编号
+     */
+    @NotBlank(message = "任务编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long taskId;
+
+    /**
+     * 监控点id
+     */
+    @NotNull(message = "监控点id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    @NotBlank(message = "监控点名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pointName;
+
+    /**
+     * 车道号
+     */
+    @NotBlank(message = "车道号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String laneNumber;
+
+    /**
+     * 车流量
+     */
+    @NotBlank(message = "车流量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String vehicleCount;
+
+    /**
+     * 平均数据(km/h)
+     */
+    @NotBlank(message = "平均数据(km/h)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String averageSpeed;
+
+    /**
+     * 排队长度(s)
+     */
+    @NotBlank(message = "排队长度(s)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String queueTime;
+
+    /**
+     * 空间占有率
+     */
+    @NotBlank(message = "空间占有率不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String spaceRate;
+
+    /**
+     * 时间占有率
+     */
+    @NotBlank(message = "时间占有率不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String timeRate;
+
+    /**
+     * 车头时距(s)
+     */
+    @NotBlank(message = "车头时距(s)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String headwayTime;
+
+    /**
+     * 车头间距
+     */
+    @NotBlank(message = "车头间距不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String headwayDistance;
+
+    /**
+     * 车辆类型与行驶方向数
+     */
+    @NotBlank(message = "车辆类型与行驶方向数不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String vehicleRemark;
+
+
+}

+ 18 - 4
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorPointBo.java

@@ -1,6 +1,5 @@
 package org.dromara.domain.bo;
 
-import com.alibaba.excel.annotation.ExcelProperty;
 import org.dromara.common.translation.annotation.Translation;
 import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.domain.SenMonitorPoint;
@@ -36,20 +35,35 @@ public class SenMonitorPointBo extends BaseEntity {
     /**
      * 行政区域
      */
-    @NotBlank(message = "行政区域不能为空", groups = {AddGroup.class, EditGroup.class})
-    private String areaId;
+    @NotNull(message = "行政区域不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long areaId;
     /**
      * 行政区域名称
      */
     @Translation(type = TransConstant.AREA_ID_TO_NAME, mapper = "areaId")
     private String areaName;
     /**
+     * 视频类型(1-实时视频 2-离线视频)
+     */
+    @NotBlank(message = "视频类型不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String videoType;
+    /**
      * 场景类型(1-高速公路 2-城市道路)
      */
-    @NotBlank(message = "场景类型(1-高速公路 2-城市道路)不能为空", groups = {AddGroup.class, EditGroup.class})
+    @NotBlank(message = "场景类型不能为空", groups = {AddGroup.class, EditGroup.class})
     private String sceneType;
 
     /**
+     * 设备编号
+     */
+    private String deviceNo;
+
+    /**
+     * 实时流地址
+     */
+    private String streamUrl;
+
+    /**
      * 经度
      */
     @NotBlank(message = "经度不能为空", groups = {AddGroup.class, EditGroup.class})

+ 73 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorPointMediaBo.java

@@ -0,0 +1,73 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenMonitorPointMedia;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+
+/**
+ * 监控点位视频媒介业务对象 sen_monitor_point_media
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenMonitorPointMedia.class, reverseConvertGenerate = false)
+public class SenMonitorPointMediaBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 监控点id
+     */
+    @NotNull(message = "监控点id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long pointId;
+
+    /**
+     * 视频类型(1-实时视频2-离线视频)
+     */
+    @NotBlank(message = "视频类型(1-实时视频2-离线视频)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String videoType;
+
+    /**
+     * 设备编号
+     */
+    @NotBlank(message = "设备编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String deviceNo;
+
+    /**
+     * 实时流地址
+     */
+    @NotBlank(message = "实时流地址不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String streamUrl;
+
+    /**
+     * 离线视频名称
+     */
+    @NotBlank(message = "离线视频名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String fileName;
+
+    /**
+     * 离线视频存储路径
+     */
+    @NotBlank(message = "离线视频存储路径不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String filePath;
+
+    /**
+     * 离线视频校准时间
+     */
+    @NotNull(message = "离线视频校准时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date adjustTime;
+
+
+}

+ 42 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorTaskAlgorithmsBo.java

@@ -0,0 +1,42 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenMonitorTaskAlgorithms;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 监控点任务-算法配置业务对象 sen_monitor_task_algorithms
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenMonitorTaskAlgorithms.class, reverseConvertGenerate = false)
+public class SenMonitorTaskAlgorithmsBo extends BaseEntity {
+
+    /**
+     * 任务id
+     */
+    @NotNull(message = "任务id不能为空", groups = { EditGroup.class })
+    private Long taskId;
+
+    /**
+     * 算法id
+     */
+    @NotNull(message = "算法id不能为空", groups = { EditGroup.class })
+    private Long algorithmId;
+
+    /**
+     * 算法感兴趣绘制区域内容
+     */
+    @NotBlank(message = "算法感兴趣绘制区域内容不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String configContent;
+
+
+}

+ 51 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/bo/SenMonitorTaskBo.java

@@ -0,0 +1,51 @@
+package org.dromara.domain.bo;
+
+import org.dromara.domain.SenMonitorTask;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 任务管理业务对象 sen_monitor_task
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SenMonitorTask.class, reverseConvertGenerate = false)
+public class SenMonitorTaskBo extends BaseEntity {
+
+    /**
+     * 任务编号
+     */
+    private Long id;
+
+    /**
+     * 监控点媒介id
+     */
+    private Long mediaId;
+
+    /**
+     * 监控点位id
+     */
+    private Long pointId;
+
+    /**
+     * 视频类型(1-实时视频2-离线视频)
+     */
+    private String videoType;
+
+    /**
+     * 完成进度
+     */
+    private String progress;
+
+    /**
+     * 任务状态(1-未开始 2-分析中3-分析完成)
+     */
+    private String status;
+
+
+}

+ 31 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/MonitorTreeVo.java

@@ -0,0 +1,31 @@
+package org.dromara.domain.vo;
+
+import lombok.Data;
+import org.dromara.domain.SenMonitorPoint;
+import org.dromara.system.domain.SysArea;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author luogang
+ */
+@Data
+public class MonitorTreeVo {
+    private Long areaId;
+    private String areaName;
+    private Long parentId;
+    private Integer areaLevel;
+    private List<MonitorTreeVo> children;
+//    private List<SenMonitorPoint> monitorPoints;
+
+    public MonitorTreeVo(SysArea area) {
+        this.areaId = area.getAreaId();
+        this.areaName = area.getAreaName();
+        this.parentId = area.getParentId();
+        this.areaLevel = area.getAreaLevel();
+        this.children =new ArrayList<>();
+//        this.monitorPoints=new ArrayList<>();
+    }
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsMediaVo.java

@@ -0,0 +1,70 @@
+package org.dromara.domain.vo;
+
+import java.util.Date;
+
+import org.dromara.domain.SenEventsMedia;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 事件媒介
+视图对象 sen_events_media
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenEventsMedia.class)
+public class SenEventsMediaVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 事件id
+     */
+    @ExcelProperty(value = "事件id")
+    private Long eventId;
+
+    /**
+     * 媒介文件类型(1-图片、2-视频)
+     */
+    @ExcelProperty(value = "媒介文件类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1=-图片、2-视频")
+    private String mediaType;
+
+    /**
+     * 文件名称
+     */
+    @ExcelProperty(value = "文件名称")
+    private String fileName;
+
+    /**
+     * 文件存储路径
+     */
+    @ExcelProperty(value = "文件存储路径")
+    private String filePath;
+
+    /**
+     * 如果是视频,记录视频的时长
+     */
+    @ExcelProperty(value = "如果是视频,记录视频的时长")
+    private Date duration;
+
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsObjectVo.java

@@ -0,0 +1,70 @@
+package org.dromara.domain.vo;
+
+import org.dromara.domain.SenEventsObject;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 事件对象视图对象 sen_events_object
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenEventsObject.class)
+public class SenEventsObjectVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 事件id
+     */
+    @ExcelProperty(value = "事件id")
+    private Long eventId;
+
+    /**
+     * 对象类型(如人、车等)
+     */
+    @ExcelProperty(value = "对象类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=人、车等")
+    private String objectType;
+
+    /**
+     * 事件类型(字典event_type)
+     */
+    @ExcelProperty(value = "事件类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "event_type")
+    private String eventType;
+
+    /**
+     * 对象标识(如车牌号、人脸特征码等)
+     */
+    @ExcelProperty(value = "对象标识", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=车牌号、人脸特征码等")
+    private String objectId;
+
+    /**
+     * 对象属性(如品牌)
+     */
+    @ExcelProperty(value = "对象属性", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=品牌")
+    private String objectAttr;
+
+
+}

+ 91 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsReportVo.java

@@ -0,0 +1,91 @@
+package org.dromara.domain.vo;
+
+import org.dromara.domain.SenEventsReport;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 推送记录视图对象 sen_events_report
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenEventsReport.class)
+public class SenEventsReportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 上报平台
+     */
+    @ExcelProperty(value = "上报平台")
+    private String reportPlatform;
+
+    /**
+     * 监控点id
+     */
+    @ExcelProperty(value = "监控点id")
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    @ExcelProperty(value = "监控点名称")
+    private String pointName;
+
+    /**
+     * 事件名称
+     */
+    @ExcelProperty(value = "事件名称")
+    private String eventName;
+
+    /**
+     * 数据详情
+     */
+    @ExcelProperty(value = "数据详情")
+    private String dataContent;
+
+    /**
+     * 数据类型
+     */
+    @ExcelProperty(value = "数据类型")
+    private String dataType;
+
+    /**
+     * 上报状态(0-发送成功1-发送失败)
+     */
+    @ExcelProperty(value = "上报状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=-发送成功1-发送失败")
+    private String reportStatus;
+
+    /**
+     * 描述
+     */
+    @ExcelProperty(value = "描述")
+    private String reportDesc;
+
+    /**
+     * 重试次数
+     */
+    @ExcelProperty(value = "重试次数")
+    private Integer dealStatus;
+
+
+}

+ 106 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenEventsVo.java

@@ -0,0 +1,106 @@
+package org.dromara.domain.vo;
+
+import org.dromara.domain.SenEvents;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 事件信息视图对象 sen_events
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenEvents.class)
+public class SenEventsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 事件分类(字典event_category)
+     */
+    @ExcelProperty(value = "事件分类", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "event_category")
+    private String eventCategory;
+
+    /**
+     * 事件名称
+     */
+    @ExcelProperty(value = "事件名称")
+    private String eventName;
+
+    /**
+     * 事件类型(字典event_type)
+     */
+    @ExcelProperty(value = "事件类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "字=典event_type")
+    private String eventType;
+
+    /**
+     * 监控点id
+     */
+    @ExcelProperty(value = "监控点id")
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    @ExcelProperty(value = "监控点名称")
+    private String pointName;
+
+    /**
+     * 区域id
+     */
+    @ExcelProperty(value = "区域id")
+    private String areaId;
+
+    /**
+     * 区域名称
+     */
+    @ExcelProperty(value = "区域名称")
+    private String areaName;
+
+    /**
+     * 事件对象类型(交通、城管、社区)
+     */
+    @ExcelProperty(value = "事件对象类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "交=通、城管、社区")
+    private String eventObj;
+
+    /**
+     * 处理状态
+     */
+    @ExcelProperty(value = "处理状态")
+    private String dealStatus;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    @ExcelProperty(value = "创建人")
+    private Long createBy;
+
+
+}

+ 118 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenFlowDetailVo.java

@@ -0,0 +1,118 @@
+package org.dromara.domain.vo;
+
+import org.dromara.domain.SenFlowDetail;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 流量明细视图对象 sen_flow_detail
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenFlowDetail.class)
+public class SenFlowDetailVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 任务编号
+     */
+    @ExcelProperty(value = "任务编号")
+    private Long taskId;
+
+    /**
+     * 监控点id
+     */
+    @ExcelProperty(value = "监控点id")
+    private Long pointId;
+
+    /**
+     * 监控点名称
+     */
+    @ExcelProperty(value = "监控点名称")
+    private String pointName;
+
+    /**
+     * 车道号
+     */
+    @ExcelProperty(value = "车道号")
+    private String laneNumber;
+
+    /**
+     * 车流量
+     */
+    @ExcelProperty(value = "车流量")
+    private String vehicleCount;
+
+    /**
+     * 平均数据(km/h)
+     */
+    @ExcelProperty(value = "平均数据", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "k=m/h")
+    private String averageSpeed;
+
+    /**
+     * 排队长度(s)
+     */
+    @ExcelProperty(value = "排队长度", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "s=")
+    private String queueTime;
+
+    /**
+     * 空间占有率
+     */
+    @ExcelProperty(value = "空间占有率")
+    private String spaceRate;
+
+    /**
+     * 时间占有率
+     */
+    @ExcelProperty(value = "时间占有率")
+    private String timeRate;
+
+    /**
+     * 车头时距(s)
+     */
+    @ExcelProperty(value = "车头时距", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "s=")
+    private String headwayTime;
+
+    /**
+     * 车头间距
+     */
+    @ExcelProperty(value = "车头间距")
+    private String headwayDistance;
+
+    /**
+     * 车辆类型与行驶方向数
+     */
+    @ExcelProperty(value = "车辆类型与行驶方向数")
+    private String vehicleRemark;
+
+    /**
+     * 时间
+     */
+    @ExcelProperty(value = "时间")
+    private Date createTime;
+
+
+}

+ 81 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorPointMediaVo.java

@@ -0,0 +1,81 @@
+package org.dromara.domain.vo;
+
+import java.util.Date;
+
+import org.dromara.domain.SenMonitorPointMedia;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 监控点位视频媒介视图对象 sen_monitor_point_media
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenMonitorPointMedia.class)
+public class SenMonitorPointMediaVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 监控点id
+     */
+    @ExcelProperty(value = "监控点id")
+    private Long pointId;
+
+    /**
+     * 视频类型(1-实时视频2-离线视频)
+     */
+    @ExcelProperty(value = "视频类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "video_type")
+    private String videoType;
+
+    /**
+     * 设备编号
+     */
+    @ExcelProperty(value = "设备编号")
+    private String deviceNo;
+
+    /**
+     * 实时流地址
+     */
+    @ExcelProperty(value = "实时流地址")
+    private String streamUrl;
+
+    /**
+     * 离线视频名称
+     */
+    @ExcelProperty(value = "离线视频名称")
+    private String fileName;
+
+    /**
+     * 离线视频存储路径
+     */
+    @ExcelProperty(value = "离线视频存储路径")
+    private String filePath;
+
+    /**
+     * 离线视频校准时间
+     */
+    @ExcelProperty(value = "离线视频校准时间")
+    private Date adjustTime;
+
+
+}

+ 17 - 6
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorPointVo.java

@@ -31,22 +31,33 @@ public class SenMonitorPointVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
-
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private String pointId;
     /**
      * 监控点名称
      */
     @ExcelProperty(value = "监控点名称")
     private String pointName;
 
-//    /**
-//     * 行政区域
-//     */
-//    @ExcelProperty(value = "行政区域")
-//    private String areaId;
+    /**
+     * 行政区域
+     */
+    @ExcelProperty(value = "行政区域id")
+    private Long areaId;
 
     @ExcelProperty(value = "行政区域")
     @Translation(type = TransConstant.AREA_ID_TO_NAME, mapper = "areaId")
     private String areaName;
+
+    /**
+     * 视频类型(1-实时视频 2-离线视频)
+     */
+    @ExcelProperty(value = "视频类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "video_type")
+    private String videoType;
     /**
      * 场景类型(1-高速公路 2-城市道路)
      */

+ 46 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorTaskAlgorithmsVo.java

@@ -0,0 +1,46 @@
+package org.dromara.domain.vo;
+
+import org.dromara.domain.SenMonitorTaskAlgorithms;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 监控点任务-算法配置视图对象 sen_monitor_task_algorithms
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenMonitorTaskAlgorithms.class)
+public class SenMonitorTaskAlgorithmsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务id
+     */
+    @ExcelProperty(value = "任务id")
+    private Long taskId;
+
+    /**
+     * 算法id
+     */
+    @ExcelProperty(value = "算法id")
+    private Long algorithmId;
+
+    /**
+     * 算法感兴趣绘制区域内容
+     */
+    @ExcelProperty(value = "算法感兴趣绘制区域内容")
+    private String configContent;
+
+
+}

+ 78 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/domain/vo/SenMonitorTaskVo.java

@@ -0,0 +1,78 @@
+package org.dromara.domain.vo;
+
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.domain.SenMonitorTask;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 任务管理视图对象 sen_monitor_task
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SenMonitorTask.class)
+public class SenMonitorTaskVo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务编号
+     */
+    private Long id;
+
+    /**
+     * 监控点媒介id
+     */
+    private Long mediaId;
+
+    /**
+     * 监控点位id
+     */
+    private Long pointId;
+
+    /**
+     * 监控点位名称
+     */
+    private String pointName;
+
+    /**
+     * 离线视频文件名
+     */
+    private String fileName;
+
+    /**
+     * 配置事件类型
+     */
+    private String eventTypes;
+
+    /**
+     * 视频类型(1-实时视频2-离线视频)
+     */
+    private String videoType;
+
+    /**
+     * 完成进度
+     */
+    private String progress;
+
+    /**
+     * 任务状态(1-未开始 2-分析中3-分析完成)
+     */
+    private String status;
+
+
+}

+ 50 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsMapper.java

@@ -0,0 +1,50 @@
+package org.dromara.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.domain.SenEvents;
+import org.dromara.domain.vo.SenEventsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 事件信息Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Mapper
+public interface SenEventsMapper extends BaseMapperPlus<SenEvents, SenEventsVo> {
+
+    HashMap<String, Object> selectEventsCount();
+
+    List<HashMap<String,Object>> importantEventsStat(@Param(Constants.WRAPPER) Wrapper<SenEvents> queryWrapper);
+
+    List<HashMap<String, Object>> motorInLanesTop10(@Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+
+    HashMap<String, Object> motorInLanesCount(@Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+
+    List<Map<String,Object>> eventPercentTop10();
+
+    List<Map<String, Object>> eventMonthCount();
+
+    List<Map<String, Object>> eventDayCount();
+
+    List<HashMap<String, Object>> pointEventsStat(@Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+
+    List<HashMap<String, Object>> regionEventsStat(@Param("dateType") String dateType);
+
+    List<HashMap<String, Object>> minuteEventsStat(@Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+
+    List<HashMap<String, Object>> eventsDatasourceStat(@Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+
+    List<HashMap<String, Object>> eventsHourStat( @Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+
+    List<HashMap<String, Object>> eventsDealRateStat(@Param(Constants.WRAPPER) LambdaQueryWrapper<SenEvents> queryWrapper);
+}

+ 16 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsMediaMapper.java

@@ -0,0 +1,16 @@
+package org.dromara.mapper;
+
+import org.dromara.domain.SenEventsMedia;
+import org.dromara.domain.vo.SenEventsMediaVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 事件媒介
+Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface SenEventsMediaMapper extends BaseMapperPlus<SenEventsMedia, SenEventsMediaVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsObjectMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.mapper;
+
+import org.dromara.domain.SenEventsObject;
+import org.dromara.domain.vo.SenEventsObjectVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 事件对象Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface SenEventsObjectMapper extends BaseMapperPlus<SenEventsObject, SenEventsObjectVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenEventsReportMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.mapper;
+
+import org.dromara.domain.SenEventsReport;
+import org.dromara.domain.vo.SenEventsReportVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 推送记录Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface SenEventsReportMapper extends BaseMapperPlus<SenEventsReport, SenEventsReportVo> {
+
+}

+ 19 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenFlowDetailMapper.java

@@ -0,0 +1,19 @@
+package org.dromara.mapper;
+
+import org.dromara.domain.SenFlowDetail;
+import org.dromara.domain.vo.SenFlowDetailVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 流量明细Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface SenFlowDetailMapper extends BaseMapperPlus<SenFlowDetail, SenFlowDetailVo> {
+
+    List<Map<String, Object>> lineCharts();
+}

+ 15 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenMonitorPointMediaMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.mapper;
+
+import org.dromara.domain.SenMonitorPointMedia;
+import org.dromara.domain.vo.SenMonitorPointMediaVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 监控点位视频媒介Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+public interface SenMonitorPointMediaMapper extends BaseMapperPlus<SenMonitorPointMedia, SenMonitorPointMediaVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenMonitorTaskAlgorithmsMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.mapper;
+
+import org.dromara.domain.SenMonitorTaskAlgorithms;
+import org.dromara.domain.vo.SenMonitorTaskAlgorithmsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 监控点任务-算法配置Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface SenMonitorTaskAlgorithmsMapper extends BaseMapperPlus<SenMonitorTaskAlgorithms, SenMonitorTaskAlgorithmsVo> {
+
+}

+ 29 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/mapper/SenMonitorTaskMapper.java

@@ -0,0 +1,29 @@
+package org.dromara.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.domain.SenEvents;
+import org.dromara.domain.SenFlowDetail;
+import org.dromara.domain.SenMonitorTask;
+import org.dromara.domain.vo.SenMonitorTaskVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 任务管理Mapper接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@Mapper
+public interface SenMonitorTaskMapper extends BaseMapperPlus<SenMonitorTask, SenMonitorTaskVo> {
+
+    Page<SenMonitorTaskVo> selectVoPageWrapper(Page<SenMonitorTaskVo>  page, @Param("ew") Wrapper<SenMonitorTask> queryWrapper);
+
+    List<SenEvents> selectScheduledTask();
+
+    List<SenFlowDetail> selectFlowTask();
+}

+ 80 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsMediaService.java

@@ -0,0 +1,80 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenEventsMediaVo;
+import org.dromara.domain.bo.SenEventsMediaBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 事件媒介
+Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenEventsMediaService {
+
+    /**
+     * 查询事件媒介
+
+     *
+     * @param id 主键
+     * @return 事件媒介
+
+     */
+    SenEventsMediaVo queryById(Long id);
+
+    /**
+     * 分页查询事件媒介
+列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事件媒介
+分页列表
+     */
+    TableDataInfo<SenEventsMediaVo> queryPageList(SenEventsMediaBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的事件媒介
+列表
+     *
+     * @param bo 查询条件
+     * @return 事件媒介
+列表
+     */
+    List<SenEventsMediaVo> queryList(SenEventsMediaBo bo);
+
+    /**
+     * 新增事件媒介
+
+     *
+     * @param bo 事件媒介
+
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenEventsMediaBo bo);
+
+    /**
+     * 修改事件媒介
+
+     *
+     * @param bo 事件媒介
+
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenEventsMediaBo bo);
+
+    /**
+     * 校验并批量删除事件媒介
+信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 68 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsObjectService.java

@@ -0,0 +1,68 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenEventsObjectVo;
+import org.dromara.domain.bo.SenEventsObjectBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 事件对象Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenEventsObjectService {
+
+    /**
+     * 查询事件对象
+     *
+     * @param id 主键
+     * @return 事件对象
+     */
+    SenEventsObjectVo queryById(Long id);
+
+    /**
+     * 分页查询事件对象列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事件对象分页列表
+     */
+    TableDataInfo<SenEventsObjectVo> queryPageList(SenEventsObjectBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的事件对象列表
+     *
+     * @param bo 查询条件
+     * @return 事件对象列表
+     */
+    List<SenEventsObjectVo> queryList(SenEventsObjectBo bo);
+
+    /**
+     * 新增事件对象
+     *
+     * @param bo 事件对象
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenEventsObjectBo bo);
+
+    /**
+     * 修改事件对象
+     *
+     * @param bo 事件对象
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenEventsObjectBo bo);
+
+    /**
+     * 校验并批量删除事件对象信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 68 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsReportService.java

@@ -0,0 +1,68 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenEventsReportVo;
+import org.dromara.domain.bo.SenEventsReportBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 推送记录Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenEventsReportService {
+
+    /**
+     * 查询推送记录
+     *
+     * @param id 主键
+     * @return 推送记录
+     */
+    SenEventsReportVo queryById(Long id);
+
+    /**
+     * 分页查询推送记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 推送记录分页列表
+     */
+    TableDataInfo<SenEventsReportVo> queryPageList(SenEventsReportBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的推送记录列表
+     *
+     * @param bo 查询条件
+     * @return 推送记录列表
+     */
+    List<SenEventsReportVo> queryList(SenEventsReportBo bo);
+
+    /**
+     * 新增推送记录
+     *
+     * @param bo 推送记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenEventsReportBo bo);
+
+    /**
+     * 修改推送记录
+     *
+     * @param bo 推送记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenEventsReportBo bo);
+
+    /**
+     * 校验并批量删除推送记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 119 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenEventsService.java

@@ -0,0 +1,119 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenEventsVo;
+import org.dromara.domain.bo.SenEventsBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 事件信息Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenEventsService {
+
+    /**
+     * 查询事件信息
+     *
+     * @param id 主键
+     * @return 事件信息
+     */
+    SenEventsVo queryById(Long id);
+
+    /**
+     * 分页查询事件信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事件信息分页列表
+     */
+    TableDataInfo<SenEventsVo> queryPageList(SenEventsBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的事件信息列表
+     *
+     * @param bo 查询条件
+     * @return 事件信息列表
+     */
+    List<SenEventsVo> queryList(SenEventsBo bo);
+
+    /**
+     * 新增事件信息
+     *
+     * @param bo 事件信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenEventsBo bo);
+
+    /**
+     * 修改事件信息
+     *
+     * @param bo 事件信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenEventsBo bo);
+
+    /**
+     * 校验并批量删除事件信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+    /**
+     * 查询事件数量
+     */
+    HashMap<String, Object> eventsCount();
+    /**
+     * 重点事件统计
+     */
+    List<HashMap<String,Object>> importantEventsStat(String dateType);
+
+    /**
+     * 机占非TOP10
+     */
+   HashMap<String, Object> motorInLanesTop10(String dateType);
+    /**
+     * 事件占比TOP10(%)
+     */
+    List<Map<String,Object>> eventPercentTop10();
+    /**
+     * 近30日事件统计
+     */
+    List<Map<String, Object>> eventMonthCount();
+    /**
+     * 每日事件统计
+     */
+    List<Map<String, Object>> eventDayCount();
+    /**
+     * 监控点位违反统计
+     */
+    List<HashMap<String, Object>> pointEventsStat(String dateType);
+    /**
+     * 区域违法分布
+     */
+    List<HashMap<String, Object>> regionEventsStat(String dateType);
+    /**
+     * 每分钟事件统计
+     */
+    List<HashMap<String, Object>> minuteEventsStat(String eventType);
+    /**
+     * 交通违法数据来源分析
+     */
+    List<HashMap<String, Object>> eventsDatasourceStat(String dateType);
+    /**
+     * 交通违法分布式时间
+     */
+    List<HashMap<String, Object>> eventsHourStat(String dateType);
+    /**
+     * 交通违法处置分析
+     */
+    List<HashMap<String, Object>> eventsDealRateStat(String dateType);
+}

+ 74 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenFlowDetailService.java

@@ -0,0 +1,74 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenFlowDetailVo;
+import org.dromara.domain.bo.SenFlowDetailBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 流量明细Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenFlowDetailService {
+
+    /**
+     * 查询流量明细
+     *
+     * @param id 主键
+     * @return 流量明细
+     */
+    SenFlowDetailVo queryById(Long id);
+
+    /**
+     * 分页查询流量明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 流量明细分页列表
+     */
+    TableDataInfo<SenFlowDetailVo> queryPageList(SenFlowDetailBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的流量明细列表
+     *
+     * @param bo 查询条件
+     * @return 流量明细列表
+     */
+    List<SenFlowDetailVo> queryList(SenFlowDetailBo bo);
+
+    /**
+     * 新增流量明细
+     *
+     * @param bo 流量明细
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenFlowDetailBo bo);
+
+    /**
+     * 修改流量明细
+     *
+     * @param bo 流量明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenFlowDetailBo bo);
+
+    /**
+     * 校验并批量删除流量明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 获取流量前3的路段流量折线图数据
+     */
+    List<Map<String, Object>> lineCharts();
+}

+ 68 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorPointMediaService.java

@@ -0,0 +1,68 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenMonitorPointMediaVo;
+import org.dromara.domain.bo.SenMonitorPointMediaBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 监控点位视频媒介Service接口
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+public interface ISenMonitorPointMediaService {
+
+    /**
+     * 查询监控点位视频媒介
+     *
+     * @param id 主键
+     * @return 监控点位视频媒介
+     */
+    SenMonitorPointMediaVo queryById(Long id);
+
+    /**
+     * 分页查询监控点位视频媒介列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 监控点位视频媒介分页列表
+     */
+    TableDataInfo<SenMonitorPointMediaVo> queryPageList(SenMonitorPointMediaBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的监控点位视频媒介列表
+     *
+     * @param bo 查询条件
+     * @return 监控点位视频媒介列表
+     */
+    List<SenMonitorPointMediaVo> queryList(SenMonitorPointMediaBo bo);
+
+    /**
+     * 新增监控点位视频媒介
+     *
+     * @param bo 监控点位视频媒介
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenMonitorPointMediaBo bo);
+
+    /**
+     * 修改监控点位视频媒介
+     *
+     * @param bo 监控点位视频媒介
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenMonitorPointMediaBo bo);
+
+    /**
+     * 校验并批量删除监控点位视频媒介信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 3 - 3
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorPointService.java

@@ -1,11 +1,11 @@
 package org.dromara.service;
 
-import cn.hutool.core.lang.tree.Tree;
+import org.dromara.domain.SenMonitorPoint;
 import org.dromara.domain.vo.SenMonitorPointVo;
 import org.dromara.domain.bo.SenMonitorPointBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.system.domain.bo.SysAreaBo;
+import org.dromara.system.domain.SysArea;
 
 import java.util.Collection;
 import java.util.List;
@@ -68,5 +68,5 @@ public interface ISenMonitorPointService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
-    List<Tree<Long>> selectAreaTreeList(SenMonitorPointBo bo);
+    List<SenMonitorPoint> getListByAreaId(SenMonitorPointBo bo);
 }

+ 68 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorTaskAlgorithmsService.java

@@ -0,0 +1,68 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenMonitorTaskAlgorithmsVo;
+import org.dromara.domain.bo.SenMonitorTaskAlgorithmsBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 监控点任务-算法配置Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenMonitorTaskAlgorithmsService {
+
+    /**
+     * 查询监控点任务-算法配置
+     *
+     * @param taskId 主键
+     * @return 监控点任务-算法配置
+     */
+    SenMonitorTaskAlgorithmsVo queryById(Long taskId);
+
+    /**
+     * 分页查询监控点任务-算法配置列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 监控点任务-算法配置分页列表
+     */
+    TableDataInfo<SenMonitorTaskAlgorithmsVo> queryPageList(SenMonitorTaskAlgorithmsBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的监控点任务-算法配置列表
+     *
+     * @param bo 查询条件
+     * @return 监控点任务-算法配置列表
+     */
+    List<SenMonitorTaskAlgorithmsVo> queryList(SenMonitorTaskAlgorithmsBo bo);
+
+    /**
+     * 新增监控点任务-算法配置
+     *
+     * @param bo 监控点任务-算法配置
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenMonitorTaskAlgorithmsBo bo);
+
+    /**
+     * 修改监控点任务-算法配置
+     *
+     * @param bo 监控点任务-算法配置
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenMonitorTaskAlgorithmsBo bo);
+
+    /**
+     * 校验并批量删除监控点任务-算法配置信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 68 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/ISenMonitorTaskService.java

@@ -0,0 +1,68 @@
+package org.dromara.service;
+
+import org.dromara.domain.vo.SenMonitorTaskVo;
+import org.dromara.domain.bo.SenMonitorTaskBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 任务管理Service接口
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+public interface ISenMonitorTaskService {
+
+    /**
+     * 查询任务管理
+     *
+     * @param id 主键
+     * @return 任务管理
+     */
+    SenMonitorTaskVo queryById(Long id);
+
+    /**
+     * 分页查询任务管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 任务管理分页列表
+     */
+    TableDataInfo<SenMonitorTaskVo> queryPageList(SenMonitorTaskBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的任务管理列表
+     *
+     * @param bo 查询条件
+     * @return 任务管理列表
+     */
+    List<SenMonitorTaskVo> queryList(SenMonitorTaskBo bo);
+
+    /**
+     * 新增任务管理
+     *
+     * @param bo 任务管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SenMonitorTaskBo bo);
+
+    /**
+     * 修改任务管理
+     *
+     * @param bo 任务管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SenMonitorTaskBo bo);
+
+    /**
+     * 校验并批量删除任务管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 145 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsMediaServiceImpl.java

@@ -0,0 +1,145 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenEventsMediaBo;
+import org.dromara.domain.vo.SenEventsMediaVo;
+import org.dromara.domain.SenEventsMedia;
+import org.dromara.mapper.SenEventsMediaMapper;
+import org.dromara.service.ISenEventsMediaService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 事件媒介
+Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenEventsMediaServiceImpl implements ISenEventsMediaService {
+
+    private final SenEventsMediaMapper baseMapper;
+
+    /**
+     * 查询事件媒介
+
+     *
+     * @param id 主键
+     * @return 事件媒介
+
+     */
+    @Override
+    public SenEventsMediaVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询事件媒介
+列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事件媒介
+分页列表
+     */
+    @Override
+    public TableDataInfo<SenEventsMediaVo> queryPageList(SenEventsMediaBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenEventsMedia> lqw = buildQueryWrapper(bo);
+        Page<SenEventsMediaVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的事件媒介
+列表
+     *
+     * @param bo 查询条件
+     * @return 事件媒介
+列表
+     */
+    @Override
+    public List<SenEventsMediaVo> queryList(SenEventsMediaBo bo) {
+        LambdaQueryWrapper<SenEventsMedia> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenEventsMedia> buildQueryWrapper(SenEventsMediaBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenEventsMedia> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getEventId() != null, SenEventsMedia::getEventId, bo.getEventId());
+        lqw.eq(StringUtils.isNotBlank(bo.getMediaType()), SenEventsMedia::getMediaType, bo.getMediaType());
+        lqw.like(StringUtils.isNotBlank(bo.getFileName()), SenEventsMedia::getFileName, bo.getFileName());
+        lqw.eq(StringUtils.isNotBlank(bo.getFilePath()), SenEventsMedia::getFilePath, bo.getFilePath());
+        lqw.eq(bo.getDuration() != null, SenEventsMedia::getDuration, bo.getDuration());
+        return lqw;
+    }
+
+    /**
+     * 新增事件媒介
+
+     *
+     * @param bo 事件媒介
+
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenEventsMediaBo bo) {
+        SenEventsMedia add = MapstructUtils.convert(bo, SenEventsMedia.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改事件媒介
+
+     *
+     * @param bo 事件媒介
+
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenEventsMediaBo bo) {
+        SenEventsMedia update = MapstructUtils.convert(bo, SenEventsMedia.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenEventsMedia entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除事件媒介
+信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 133 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsObjectServiceImpl.java

@@ -0,0 +1,133 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenEventsObjectBo;
+import org.dromara.domain.vo.SenEventsObjectVo;
+import org.dromara.domain.SenEventsObject;
+import org.dromara.mapper.SenEventsObjectMapper;
+import org.dromara.service.ISenEventsObjectService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 事件对象Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenEventsObjectServiceImpl implements ISenEventsObjectService {
+
+    private final SenEventsObjectMapper baseMapper;
+
+    /**
+     * 查询事件对象
+     *
+     * @param id 主键
+     * @return 事件对象
+     */
+    @Override
+    public SenEventsObjectVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询事件对象列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事件对象分页列表
+     */
+    @Override
+    public TableDataInfo<SenEventsObjectVo> queryPageList(SenEventsObjectBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenEventsObject> lqw = buildQueryWrapper(bo);
+        Page<SenEventsObjectVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的事件对象列表
+     *
+     * @param bo 查询条件
+     * @return 事件对象列表
+     */
+    @Override
+    public List<SenEventsObjectVo> queryList(SenEventsObjectBo bo) {
+        LambdaQueryWrapper<SenEventsObject> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenEventsObject> buildQueryWrapper(SenEventsObjectBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenEventsObject> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getEventId() != null, SenEventsObject::getEventId, bo.getEventId());
+        lqw.eq(StringUtils.isNotBlank(bo.getObjectType()), SenEventsObject::getObjectType, bo.getObjectType());
+        lqw.eq(StringUtils.isNotBlank(bo.getEventType()), SenEventsObject::getEventType, bo.getEventType());
+        lqw.eq(StringUtils.isNotBlank(bo.getObjectId()), SenEventsObject::getObjectId, bo.getObjectId());
+        lqw.eq(StringUtils.isNotBlank(bo.getObjectAttr()), SenEventsObject::getObjectAttr, bo.getObjectAttr());
+        return lqw;
+    }
+
+    /**
+     * 新增事件对象
+     *
+     * @param bo 事件对象
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenEventsObjectBo bo) {
+        SenEventsObject add = MapstructUtils.convert(bo, SenEventsObject.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改事件对象
+     *
+     * @param bo 事件对象
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenEventsObjectBo bo) {
+        SenEventsObject update = MapstructUtils.convert(bo, SenEventsObject.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenEventsObject entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除事件对象信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 137 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsReportServiceImpl.java

@@ -0,0 +1,137 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenEventsReportBo;
+import org.dromara.domain.vo.SenEventsReportVo;
+import org.dromara.domain.SenEventsReport;
+import org.dromara.mapper.SenEventsReportMapper;
+import org.dromara.service.ISenEventsReportService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 推送记录Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenEventsReportServiceImpl implements ISenEventsReportService {
+
+    private final SenEventsReportMapper baseMapper;
+
+    /**
+     * 查询推送记录
+     *
+     * @param id 主键
+     * @return 推送记录
+     */
+    @Override
+    public SenEventsReportVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询推送记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 推送记录分页列表
+     */
+    @Override
+    public TableDataInfo<SenEventsReportVo> queryPageList(SenEventsReportBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenEventsReport> lqw = buildQueryWrapper(bo);
+        Page<SenEventsReportVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的推送记录列表
+     *
+     * @param bo 查询条件
+     * @return 推送记录列表
+     */
+    @Override
+    public List<SenEventsReportVo> queryList(SenEventsReportBo bo) {
+        LambdaQueryWrapper<SenEventsReport> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenEventsReport> buildQueryWrapper(SenEventsReportBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenEventsReport> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getReportPlatform()), SenEventsReport::getReportPlatform, bo.getReportPlatform());
+        lqw.eq(bo.getPointId() != null, SenEventsReport::getPointId, bo.getPointId());
+        lqw.like(StringUtils.isNotBlank(bo.getPointName()), SenEventsReport::getPointName, bo.getPointName());
+        lqw.like(StringUtils.isNotBlank(bo.getEventName()), SenEventsReport::getEventName, bo.getEventName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataContent()), SenEventsReport::getDataContent, bo.getDataContent());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataType()), SenEventsReport::getDataType, bo.getDataType());
+        lqw.eq(StringUtils.isNotBlank(bo.getReportStatus()), SenEventsReport::getReportStatus, bo.getReportStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getReportDesc()), SenEventsReport::getReportDesc, bo.getReportDesc());
+        lqw.eq(bo.getDealStatus() != null, SenEventsReport::getDealStatus, bo.getDealStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增推送记录
+     *
+     * @param bo 推送记录
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenEventsReportBo bo) {
+        SenEventsReport add = MapstructUtils.convert(bo, SenEventsReport.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改推送记录
+     *
+     * @param bo 推送记录
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenEventsReportBo bo) {
+        SenEventsReport update = MapstructUtils.convert(bo, SenEventsReport.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenEventsReport entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除推送记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 270 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenEventsServiceImpl.java

@@ -0,0 +1,270 @@
+package org.dromara.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.system.domain.SysDictData;
+import org.dromara.system.mapper.SysDictDataMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenEventsBo;
+import org.dromara.domain.vo.SenEventsVo;
+import org.dromara.domain.SenEvents;
+import org.dromara.mapper.SenEventsMapper;
+import org.dromara.service.ISenEventsService;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+
+/**
+ * 事件信息Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenEventsServiceImpl implements ISenEventsService {
+
+
+    private final SenEventsMapper baseMapper;
+
+    private final SysDictDataMapper dictMapper;
+
+    /**
+     * 查询事件信息
+     *
+     * @param id 主键
+     * @return 事件信息
+     */
+    @Override
+    public SenEventsVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询事件信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事件信息分页列表
+     */
+    @Override
+    public TableDataInfo<SenEventsVo> queryPageList(SenEventsBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenEvents> lqw = buildQueryWrapper(bo);
+        Page<SenEventsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的事件信息列表
+     *
+     * @param bo 查询条件
+     * @return 事件信息列表
+     */
+    @Override
+    public List<SenEventsVo> queryList(SenEventsBo bo) {
+        LambdaQueryWrapper<SenEvents> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenEvents> buildQueryWrapper(SenEventsBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenEvents> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getEventCategory()), SenEvents::getEventCategory, bo.getEventCategory());
+        lqw.like(StringUtils.isNotBlank(bo.getEventName()), SenEvents::getEventName, bo.getEventName());
+        lqw.eq(StringUtils.isNotBlank(bo.getEventType()), SenEvents::getEventType, bo.getEventType());
+        lqw.eq(bo.getPointId() != null, SenEvents::getPointId, bo.getPointId());
+        lqw.like(StringUtils.isNotBlank(bo.getPointName()), SenEvents::getPointName, bo.getPointName());
+        lqw.eq(StringUtils.isNotBlank(bo.getAreaId()), SenEvents::getAreaId, bo.getAreaId());
+        lqw.like(StringUtils.isNotBlank(bo.getAreaName()), SenEvents::getAreaName, bo.getAreaName());
+        lqw.eq(StringUtils.isNotBlank(bo.getEventObj()), SenEvents::getEventObj, bo.getEventObj());
+        lqw.eq(StringUtils.isNotBlank(bo.getDealStatus()), SenEvents::getDealStatus, bo.getDealStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增事件信息
+     *
+     * @param bo 事件信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenEventsBo bo) {
+        SenEvents add = MapstructUtils.convert(bo, SenEvents.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改事件信息
+     *
+     * @param bo 事件信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenEventsBo bo) {
+        SenEvents update = MapstructUtils.convert(bo, SenEvents.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenEvents entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除事件信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public HashMap<String, Object> eventsCount() {
+        HashMap<String, Object> result;
+        result = baseMapper.selectEventsCount();
+        LambdaQueryWrapper<SenEvents> lqw = Wrappers.lambdaQuery();
+        lqw.orderByDesc(SenEvents::getCreateTime);
+        PageQuery pageQuery = new PageQuery();
+        pageQuery.setPageNum(1);
+        pageQuery.setPageSize(5);
+        result.put("latestData", baseMapper.selectVoPage(pageQuery.build(), lqw).getRecords());
+        return result;
+    }
+    public LambdaQueryWrapper<SenEvents> buildDateWrapper(String dateType) {
+        LocalDateTime now = LocalDateTime.now();
+        Date startDate = null;
+        Date endDate = switch (dateType) {
+            case "1" -> {
+                startDate = Date.from(now.withHour(0).withMinute(0).withSecond(0).atZone(ZoneId.systemDefault()).toInstant());
+                yield Date.from(now.withHour(23).withMinute(59).withSecond(59).atZone(ZoneId.systemDefault()).toInstant());
+            }
+            case "7" -> {
+                startDate = Date.from(now.minusDays(7).withHour(0).withMinute(0).withSecond(0).atZone(ZoneId.systemDefault()).toInstant());
+                yield Date.from(now.withHour(23).withMinute(59).withSecond(59).atZone(ZoneId.systemDefault()).toInstant());
+            }
+            case "30" -> {
+                startDate = Date.from(now.minusDays(30).withHour(0).withMinute(0).withSecond(0).atZone(ZoneId.systemDefault()).toInstant());
+                yield Date.from(now.withHour(23).withMinute(59).withSecond(59).atZone(ZoneId.systemDefault()).toInstant());
+            }
+            default -> throw new IllegalArgumentException("Invalid time range: " + dateType);
+        };
+
+        LambdaQueryWrapper<SenEvents> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .ge(SenEvents::getCreateTime, startDate)
+                .le(SenEvents::getCreateTime, endDate);
+        return queryWrapper;
+    }
+    @Override
+    public List<HashMap<String, Object>> importantEventsStat(String dateType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper = buildDateWrapper(dateType);
+        queryWrapper
+                .eq(SenEvents::getEventCategory, 1);
+        return baseMapper.importantEventsStat(queryWrapper);
+    }
+
+    @Override
+    public HashMap<String, Object> motorInLanesTop10(String dateType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper = buildDateWrapper(dateType);
+        queryWrapper
+                .eq(SenEvents::getEventType, 10);
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("list", baseMapper.motorInLanesTop10(queryWrapper));
+        result.putAll(baseMapper.motorInLanesCount(queryWrapper));
+        return result;
+    }
+    /**
+     * 事件占比TOP10(%)
+     */
+    @Override
+    public List<Map<String,Object>> eventPercentTop10() {
+        return baseMapper.eventPercentTop10();
+    }
+    /**
+     * 近30日事件统计
+     */
+    @Override
+    public List<Map<String, Object>> eventMonthCount() {
+        return baseMapper.eventMonthCount();
+    }
+    /**
+     * 每日事件统计
+     */
+    @Override
+    public List<Map<String, Object>> eventDayCount() {
+        LambdaQueryWrapper<SysDictData> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysDictData::getDictType, "event_type");
+        return baseMapper.eventDayCount();
+    }
+    /**
+     * 监控点位违反统计
+     */
+    @Override
+    public List<HashMap<String, Object>> pointEventsStat(String dateType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper = buildDateWrapper(dateType);
+        return baseMapper.pointEventsStat(queryWrapper);
+    }
+    /**
+     * 区域违法分布
+     */
+    @Override
+    public List<HashMap<String, Object>> regionEventsStat(String dateType) {
+        return baseMapper.regionEventsStat(dateType);
+    }
+    /**
+     * 每分钟事件统计
+     */
+    @Override
+    public List<HashMap<String, Object>> minuteEventsStat(String eventType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper=new LambdaQueryWrapper<>();
+        queryWrapper.eq(SenEvents::getEventType, eventType);
+        return baseMapper.minuteEventsStat(queryWrapper);
+    }
+    /**
+     * 交通违法数据来源分析
+     */
+    @Override
+    public List<HashMap<String, Object>> eventsDatasourceStat(String dateType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper = buildDateWrapper(dateType);
+        return baseMapper.eventsDatasourceStat(queryWrapper);
+    }
+    /**
+     * 交通违法分布式时间
+     */
+    @Override
+    public List<HashMap<String, Object>> eventsHourStat(String dateType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper = buildDateWrapper(dateType);
+        return baseMapper.eventsHourStat(queryWrapper);
+    }
+    /**
+     * 交通违法处置分析
+     */
+    @Override
+    public List<HashMap<String, Object>> eventsDealRateStat(String dateType) {
+        LambdaQueryWrapper<SenEvents> queryWrapper = buildDateWrapper(dateType);
+        return baseMapper.eventsDealRateStat(queryWrapper);
+    }
+}

+ 149 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenFlowDetailServiceImpl.java

@@ -0,0 +1,149 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenFlowDetailBo;
+import org.dromara.domain.vo.SenFlowDetailVo;
+import org.dromara.domain.SenFlowDetail;
+import org.dromara.mapper.SenFlowDetailMapper;
+import org.dromara.service.ISenFlowDetailService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 流量明细Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenFlowDetailServiceImpl implements ISenFlowDetailService {
+
+    private final SenFlowDetailMapper baseMapper;
+
+    /**
+     * 查询流量明细
+     *
+     * @param id 主键
+     * @return 流量明细
+     */
+    @Override
+    public SenFlowDetailVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询流量明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 流量明细分页列表
+     */
+    @Override
+    public TableDataInfo<SenFlowDetailVo> queryPageList(SenFlowDetailBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenFlowDetail> lqw = buildQueryWrapper(bo);
+        Page<SenFlowDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的流量明细列表
+     *
+     * @param bo 查询条件
+     * @return 流量明细列表
+     */
+    @Override
+    public List<SenFlowDetailVo> queryList(SenFlowDetailBo bo) {
+        LambdaQueryWrapper<SenFlowDetail> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenFlowDetail> buildQueryWrapper(SenFlowDetailBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenFlowDetail> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getTaskId()!= null, SenFlowDetail::getTaskId, bo.getTaskId());
+        lqw.eq(bo.getPointId() != null, SenFlowDetail::getPointId, bo.getPointId());
+        lqw.like(StringUtils.isNotBlank(bo.getPointName()), SenFlowDetail::getPointName, bo.getPointName());
+        lqw.eq(StringUtils.isNotBlank(bo.getLaneNumber()), SenFlowDetail::getLaneNumber, bo.getLaneNumber());
+        lqw.eq(StringUtils.isNotBlank(bo.getVehicleCount()), SenFlowDetail::getVehicleCount, bo.getVehicleCount());
+        lqw.eq(StringUtils.isNotBlank(bo.getAverageSpeed()), SenFlowDetail::getAverageSpeed, bo.getAverageSpeed());
+        lqw.eq(StringUtils.isNotBlank(bo.getQueueTime()), SenFlowDetail::getQueueTime, bo.getQueueTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getSpaceRate()), SenFlowDetail::getSpaceRate, bo.getSpaceRate());
+        lqw.eq(StringUtils.isNotBlank(bo.getTimeRate()), SenFlowDetail::getTimeRate, bo.getTimeRate());
+        lqw.eq(StringUtils.isNotBlank(bo.getHeadwayTime()), SenFlowDetail::getHeadwayTime, bo.getHeadwayTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getHeadwayDistance()), SenFlowDetail::getHeadwayDistance, bo.getHeadwayDistance());
+        lqw.eq(StringUtils.isNotBlank(bo.getVehicleRemark()), SenFlowDetail::getVehicleRemark, bo.getVehicleRemark());
+        lqw.ge(StringUtils.isNotBlank((CharSequence) bo.getParams().get("startDate")),SenFlowDetail::getCreateTime, bo.getParams().get("startDate")).
+                le(StringUtils.isNotBlank((CharSequence) bo.getParams().get("endDate")),SenFlowDetail::getCreateTime, bo.getParams().get("endDate"));
+        return lqw;
+    }
+
+    /**
+     * 新增流量明细
+     *
+     * @param bo 流量明细
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenFlowDetailBo bo) {
+        SenFlowDetail add = MapstructUtils.convert(bo, SenFlowDetail.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改流量明细
+     *
+     * @param bo 流量明细
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenFlowDetailBo bo) {
+        SenFlowDetail update = MapstructUtils.convert(bo, SenFlowDetail.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenFlowDetail entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除流量明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+    /**
+     * 获取流量前3的路段流量折线图数据
+     */
+    @Override
+    public List<Map<String, Object>> lineCharts() {
+        return baseMapper.lineCharts();
+    }
+}

+ 134 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorPointMediaServiceImpl.java

@@ -0,0 +1,134 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenMonitorPointMediaBo;
+import org.dromara.domain.vo.SenMonitorPointMediaVo;
+import org.dromara.domain.SenMonitorPointMedia;
+import org.dromara.mapper.SenMonitorPointMediaMapper;
+import org.dromara.service.ISenMonitorPointMediaService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 监控点位视频媒介Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-18
+ */
+@RequiredArgsConstructor
+@Service
+public class SenMonitorPointMediaServiceImpl implements ISenMonitorPointMediaService {
+
+    private final SenMonitorPointMediaMapper baseMapper;
+
+    /**
+     * 查询监控点位视频媒介
+     *
+     * @param id 主键
+     * @return 监控点位视频媒介
+     */
+    @Override
+    public SenMonitorPointMediaVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询监控点位视频媒介列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 监控点位视频媒介分页列表
+     */
+    @Override
+    public TableDataInfo<SenMonitorPointMediaVo> queryPageList(SenMonitorPointMediaBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenMonitorPointMedia> lqw = buildQueryWrapper(bo);
+        Page<SenMonitorPointMediaVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的监控点位视频媒介列表
+     *
+     * @param bo 查询条件
+     * @return 监控点位视频媒介列表
+     */
+    @Override
+    public List<SenMonitorPointMediaVo> queryList(SenMonitorPointMediaBo bo) {
+        LambdaQueryWrapper<SenMonitorPointMedia> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenMonitorPointMedia> buildQueryWrapper(SenMonitorPointMediaBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenMonitorPointMedia> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getVideoType()), SenMonitorPointMedia::getVideoType, bo.getVideoType());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceNo()), SenMonitorPointMedia::getDeviceNo, bo.getDeviceNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getStreamUrl()), SenMonitorPointMedia::getStreamUrl, bo.getStreamUrl());
+        lqw.like(StringUtils.isNotBlank(bo.getFileName()), SenMonitorPointMedia::getFileName, bo.getFileName());
+        lqw.eq(StringUtils.isNotBlank(bo.getFilePath()), SenMonitorPointMedia::getFilePath, bo.getFilePath());
+        lqw.eq(bo.getAdjustTime() != null, SenMonitorPointMedia::getAdjustTime, bo.getAdjustTime());
+        return lqw;
+    }
+
+    /**
+     * 新增监控点位视频媒介
+     *
+     * @param bo 监控点位视频媒介
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenMonitorPointMediaBo bo) {
+        SenMonitorPointMedia add = MapstructUtils.convert(bo, SenMonitorPointMedia.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改监控点位视频媒介
+     *
+     * @param bo 监控点位视频媒介
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenMonitorPointMediaBo bo) {
+        SenMonitorPointMedia update = MapstructUtils.convert(bo, SenMonitorPointMedia.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenMonitorPointMedia entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除监控点位视频媒介信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 114 - 53
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorPointServiceImpl.java

@@ -1,21 +1,19 @@
 package org.dromara.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.tree.Tree;
-import cn.hutool.core.util.ObjectUtil;
-import org.dromara.common.core.constant.UserConstants;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.core.utils.TreeBuildUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.domain.SenMonitorPointMedia;
+import org.dromara.mapper.SenMonitorPointMediaMapper;
 import org.dromara.system.domain.SysArea;
-import org.dromara.system.domain.bo.SysAreaBo;
-import org.dromara.system.domain.vo.SysAreaVo;
+import org.dromara.system.mapper.SysAreaMapper;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.dromara.domain.bo.SenMonitorPointBo;
 import org.dromara.domain.vo.SenMonitorPointVo;
@@ -23,9 +21,8 @@ import org.dromara.domain.SenMonitorPoint;
 import org.dromara.mapper.SenMonitorPointMapper;
 import org.dromara.service.ISenMonitorPointService;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 监控点位信息Service业务层处理
@@ -38,6 +35,8 @@ import java.util.Collection;
 public class SenMonitorPointServiceImpl implements ISenMonitorPointService {
 
     private final SenMonitorPointMapper baseMapper;
+    private final SysAreaMapper areaMapper;
+    private final SenMonitorPointMediaMapper mediaMapper;
 
     /**
      * 查询监控点位信息
@@ -46,7 +45,7 @@ public class SenMonitorPointServiceImpl implements ISenMonitorPointService {
      * @return 监控点位信息
      */
     @Override
-    public SenMonitorPointVo queryById(Long pointId){
+    public SenMonitorPointVo queryById(Long pointId) {
         return baseMapper.selectVoById(pointId);
     }
 
@@ -97,6 +96,15 @@ public class SenMonitorPointServiceImpl implements ISenMonitorPointService {
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setPointId(add.getPointId());
+            //实时视频
+            if (Objects.equals(bo.getVideoType(), "1")) {
+                SenMonitorPointMedia media =new SenMonitorPointMedia();
+                media.setPointId(bo.getPointId());
+                media.setVideoType(bo.getVideoType());
+                media.setDeviceNo(bo.getDeviceNo());
+                media.setStreamUrl(bo.getStreamUrl());
+                mediaMapper.insert(media);
+            }
         }
         return flag;
     }
@@ -117,7 +125,7 @@ public class SenMonitorPointServiceImpl implements ISenMonitorPointService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(SenMonitorPoint entity){
+    private void validEntityBeforeSave(SenMonitorPoint entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -130,55 +138,108 @@ public class SenMonitorPointServiceImpl implements ISenMonitorPointService {
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
 
     @Override
-    public List<Tree<Long>> selectAreaTreeList(SenMonitorPointBo bo) {
-        SysAreaBo sysAreaBo = new SysAreaBo();
-        // 只查询未禁用区域
-        sysAreaBo.setStatus(UserConstants.DEPT_NORMAL);
-        LambdaQueryWrapper<SysArea> lqw = Wrappers.lambdaQuery();
-        lqw.eq(SysArea::getDelFlag, "0");
-        lqw.eq(StringUtils.isNotBlank(sysAreaBo.getStatus()), SysArea::getStatus, sysAreaBo.getStatus());
-        lqw.orderByAsc(SysArea::getParentId);
-        lqw.orderByAsc(SysArea::getOrderNum);
-        lqw.orderByAsc(SysArea::getAreaId);
-        List<SysAreaVo> areas = baseMapper.selectAreaList(lqw);
-        List<Tree<Long>> areaTrees =  buildAreaTreeSelect(areas);
-        for (Tree<Long> tree : areaTrees) {
-            if(tree.getWeight().equals(2)){
-                loadPointData(tree,bo);
-            }
-
+    public List<SenMonitorPoint> getListByAreaId(SenMonitorPointBo bo) {
+        List<SysArea> resultList = new ArrayList<>();
+        // 直接获取该节点的信息
+        SysArea root = areaMapper.selectOne(new LambdaQueryWrapper<SysArea>()
+                .eq(SysArea::getAreaId, bo.getAreaId()));
+        if (root != null) {
+            resultList.add(root);
         }
+        // 获取所有子节点
+        String ancestorPattern = "%" + bo.getAreaId() + "%";
+        List<SysArea> children = areaMapper.selectList(new LambdaQueryWrapper<SysArea>()
+                .like(StringUtils.isNotBlank(ancestorPattern), SysArea::getAncestors, ancestorPattern));
+        resultList.addAll(children);
+        List<Long> areaIds = resultList.stream()
+                .map(SysArea::getAreaId)
+                .toList();
+        return baseMapper.selectList(
+                Wrappers.<SenMonitorPoint>lambdaQuery()
+                        .in(SenMonitorPoint::getAreaId, areaIds)
+                        .like(StringUtils.isNotBlank(bo.getPointName()), SenMonitorPoint::getPointName, bo.getPointName())
+                        .orderByAsc(SenMonitorPoint::getPointId)
+        );
 
-        return buildAreaTreeSelect(areas);
-    }
-    /**
-     * 构建前端所需要下拉树结构
-     *
-     * @param areas 区域列表
-     * @return 下拉树结构列表
-     */
-    public List<Tree<Long>> buildAreaTreeSelect(List<SysAreaVo> areas) {
-        if (CollUtil.isEmpty(areas)) {
-            return CollUtil.newArrayList();
-        }
-        return TreeBuildUtils.build(areas, (area, tree) ->
-                tree.setId(area.getAreaId())
-                        .setParentId(area.getParentId())
-                        .setName(area.getAreaName())
-                        .setWeight(area.getAreaLevel()));
     }
-    public void loadPointData(Tree<Long> tree ,SenMonitorPointBo bo) {
-        LambdaQueryWrapper<SenMonitorPoint> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getPointName()), SenMonitorPoint::getPointName, bo.getPointName());
-        List<SenMonitorPointVo> points = baseMapper.selectVoList(lqw);
 
-//        tree.setId()
-    }
+
+//    @Override
+//    public MonitorTreeVo selectAreaTreeList(SenMonitorPointBo bo) {
+//        // 查询所有区域数据
+//        List<SysArea> allAreas = areaMapper.selectList(Wrappers.<SysArea>lambdaQuery().orderByAsc(SysArea::getOrderNum));
+//        // 构建节点映射表
+//        Map<Long, MonitorTreeVo> nodeMap = new HashMap<>();
+//        for (SysArea area : allAreas) {
+//            MonitorTreeVo node = new MonitorTreeVo(area);
+//            nodeMap.put(area.getAreaId(), node);
+//        }
+//
+//        // 构建树形结构
+//        for (SysArea area : allAreas) {
+//            Long parentId = area.getParentId();
+//            if (parentId != 0) {
+//                MonitorTreeVo parentNode = nodeMap.get(parentId);
+//                if (parentNode != null) {
+//                    parentNode.getChildren().add(nodeMap.get(area.getAreaId()));
+//                }
+//            }
+//        }
+//
+//        // 查找根节点
+//        MonitorTreeVo root = null;
+//        for (MonitorTreeVo node : nodeMap.values()) {
+//            if (node.getParentId() == 0) {
+//                if (root == null) {
+//                    root = node;
+//                }
+//            }
+//        }
+//
+//        // 关联监控点数据
+//        associateMonitorPoints(root, 3, bo);
+//        return root;
+//    }
+//
+//    private void associateMonitorPoints(MonitorTreeVo node, Integer level, SenMonitorPointBo bo) {
+//        if (node != null) {
+//            if (node.getAreaLevel().equals(level)) {
+//                List<SenMonitorPoint> points = baseMapper.selectList(
+//                        Wrappers.<SenMonitorPoint>lambdaQuery()
+//                                .eq(SenMonitorPoint::getAreaId, node.getAreaId())
+//                                .like(StringUtils.isNotBlank(bo.getPointName()),SenMonitorPoint::getPointName, bo.getPointName())
+//                                .orderByAsc(SenMonitorPoint::getPointId)
+//                );
+//                List<MonitorTreeVo> treePoints = getMonitorTreeVos(points);
+//                node.setChildren(treePoints);
+//
+//            }
+//            for (MonitorTreeVo child : node.getChildren()) {
+//                associateMonitorPoints(child, level, bo);
+//            }
+//        }
+//    }
+//
+//    @NotNull
+//    private static List<MonitorTreeVo> getMonitorTreeVos(List<SenMonitorPoint> points) {
+//        List<MonitorTreeVo> treePoints = new ArrayList<>();
+//        for (SenMonitorPoint point : points) {
+//            SysArea area = new SysArea();
+//            area.setAreaId(point.getPointId());
+//            area.setAreaName(point.getPointName());
+//            area.setParentId(point.getAreaId());
+//            area.setAreaLevel(4);
+//            MonitorTreeVo tree = new MonitorTreeVo(area);
+//            treePoints.add(tree);
+//        }
+//        return treePoints;
+//    }
+
 }

+ 129 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorTaskAlgorithmsServiceImpl.java

@@ -0,0 +1,129 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenMonitorTaskAlgorithmsBo;
+import org.dromara.domain.vo.SenMonitorTaskAlgorithmsVo;
+import org.dromara.domain.SenMonitorTaskAlgorithms;
+import org.dromara.mapper.SenMonitorTaskAlgorithmsMapper;
+import org.dromara.service.ISenMonitorTaskAlgorithmsService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 监控点任务-算法配置Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenMonitorTaskAlgorithmsServiceImpl implements ISenMonitorTaskAlgorithmsService {
+
+    private final SenMonitorTaskAlgorithmsMapper baseMapper;
+
+    /**
+     * 查询监控点任务-算法配置
+     *
+     * @param taskId 主键
+     * @return 监控点任务-算法配置
+     */
+    @Override
+    public SenMonitorTaskAlgorithmsVo queryById(Long taskId){
+        return baseMapper.selectVoById(taskId);
+    }
+
+    /**
+     * 分页查询监控点任务-算法配置列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 监控点任务-算法配置分页列表
+     */
+    @Override
+    public TableDataInfo<SenMonitorTaskAlgorithmsVo> queryPageList(SenMonitorTaskAlgorithmsBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenMonitorTaskAlgorithms> lqw = buildQueryWrapper(bo);
+        Page<SenMonitorTaskAlgorithmsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的监控点任务-算法配置列表
+     *
+     * @param bo 查询条件
+     * @return 监控点任务-算法配置列表
+     */
+    @Override
+    public List<SenMonitorTaskAlgorithmsVo> queryList(SenMonitorTaskAlgorithmsBo bo) {
+        LambdaQueryWrapper<SenMonitorTaskAlgorithms> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenMonitorTaskAlgorithms> buildQueryWrapper(SenMonitorTaskAlgorithmsBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenMonitorTaskAlgorithms> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getConfigContent()), SenMonitorTaskAlgorithms::getConfigContent, bo.getConfigContent());
+        return lqw;
+    }
+
+    /**
+     * 新增监控点任务-算法配置
+     *
+     * @param bo 监控点任务-算法配置
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenMonitorTaskAlgorithmsBo bo) {
+        SenMonitorTaskAlgorithms add = MapstructUtils.convert(bo, SenMonitorTaskAlgorithms.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setTaskId(add.getTaskId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改监控点任务-算法配置
+     *
+     * @param bo 监控点任务-算法配置
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenMonitorTaskAlgorithmsBo bo) {
+        SenMonitorTaskAlgorithms update = MapstructUtils.convert(bo, SenMonitorTaskAlgorithms.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenMonitorTaskAlgorithms entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除监控点任务-算法配置信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 133 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/service/impl/SenMonitorTaskServiceImpl.java

@@ -0,0 +1,133 @@
+package org.dromara.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.domain.bo.SenMonitorTaskBo;
+import org.dromara.domain.vo.SenMonitorTaskVo;
+import org.dromara.domain.SenMonitorTask;
+import org.dromara.mapper.SenMonitorTaskMapper;
+import org.dromara.service.ISenMonitorTaskService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 任务管理Service业务层处理
+ *
+ * @author luogang
+ * @date 2024-09-19
+ */
+@RequiredArgsConstructor
+@Service
+public class SenMonitorTaskServiceImpl implements ISenMonitorTaskService {
+
+    private final SenMonitorTaskMapper baseMapper;
+
+    /**
+     * 查询任务管理
+     *
+     * @param id 主键
+     * @return 任务管理
+     */
+    @Override
+    public SenMonitorTaskVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询任务管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 任务管理分页列表
+     */
+    @Override
+    public TableDataInfo<SenMonitorTaskVo> queryPageList(SenMonitorTaskBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SenMonitorTask> lqw = buildQueryWrapper(bo);
+        Page<SenMonitorTaskVo> result = baseMapper.selectVoPageWrapper(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的任务管理列表
+     *
+     * @param bo 查询条件
+     * @return 任务管理列表
+     */
+    @Override
+    public List<SenMonitorTaskVo> queryList(SenMonitorTaskBo bo) {
+        LambdaQueryWrapper<SenMonitorTask> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SenMonitorTask> buildQueryWrapper(SenMonitorTaskBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SenMonitorTask> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getMediaId() != null, SenMonitorTask::getMediaId, bo.getMediaId());
+        lqw.eq(bo.getPointId() != null, SenMonitorTask::getPointId, bo.getPointId());
+        lqw.eq(StringUtils.isNotBlank(bo.getVideoType()), SenMonitorTask::getVideoType, bo.getVideoType());
+        lqw.eq(StringUtils.isNotBlank(bo.getProgress()), SenMonitorTask::getProgress, bo.getProgress());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SenMonitorTask::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增任务管理
+     *
+     * @param bo 任务管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SenMonitorTaskBo bo) {
+        SenMonitorTask add = MapstructUtils.convert(bo, SenMonitorTask.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改任务管理
+     *
+     * @param bo 任务管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SenMonitorTaskBo bo) {
+        SenMonitorTask update = MapstructUtils.convert(bo, SenMonitorTask.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SenMonitorTask entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除任务管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 40 - 0
ruoyi-modules/ruoyi-traffic/src/main/java/org/dromara/task/DemoTask.java

@@ -0,0 +1,40 @@
+package org.dromara.task;
+
+import org.dromara.domain.SenEvents;
+import org.dromara.domain.SenFlowDetail;
+import org.dromara.mapper.SenEventsMapper;
+import org.dromara.mapper.SenFlowDetailMapper;
+import org.dromara.mapper.SenMonitorTaskMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+@Component
+@RequiredArgsConstructor
+public class DemoTask {
+    private static final Logger logger = LoggerFactory.getLogger(DemoTask.class);
+
+    private final SenMonitorTaskMapper taskMapper;
+    private final SenEventsMapper eventMapper;
+    private final SenFlowDetailMapper flowMapper;
+
+            @Scheduled(cron = "0 0/30 * * * ?")
+//    @Scheduled(cron = "0 15 10 ? * *")
+//    @Scheduled(cron = "*/10 * * * * *")
+    public void executeHourlyTask() {
+        List<SenEvents> taskList = taskMapper.selectScheduledTask();
+        for (SenEvents event : taskList) {
+            eventMapper.insert(event);
+        }
+        List<SenFlowDetail> flowList = taskMapper.selectFlowTask();
+        for (SenFlowDetail flowDetail : flowList) {
+            flowMapper.insert(flowDetail);
+        }
+
+    }
+
+}

+ 305 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsMapper.xml

@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenEventsMapper">
+
+    <select id="selectEventsCount" resultType="java.util.HashMap">
+        SELECT
+        COUNT(*) AS totalEvents,
+        SUM(CASE WHEN event_category = '1' THEN 1 ELSE 0 END) AS importantEvents,
+        SUM(CASE WHEN deal_status = '0' THEN 1 ELSE 0 END) AS unprocessedEvents
+        FROM
+        sen_events
+    </select>
+    <select id="importantEventsStat" resultType="java.util.HashMap">
+        SELECT
+        (SELECT dic.dict_label from sys_dict_data dic WHERE dic.dict_type='event_type' AND dic.dict_value=event_type)
+        AS name,
+        COUNT(event_type) AS value
+        FROM sen_events
+        ${ew.getCustomSqlSegment}
+        GROUP BY event_type
+    </select>
+    <select id="motorInLanesTop10" resultType="java.util.HashMap">
+        SELECT point_name AS pointName, COUNT(*) AS eventCount
+        FROM sen_events
+        ${ew.getCustomSqlSegment}
+        GROUP BY point_name
+        ORDER BY eventCount DESC
+        LIMIT 10
+    </select>
+    <select id="motorInLanesCount" resultType="java.util.HashMap">
+        SELECT COUNT(*) AS totalCount
+        FROM sen_events
+        ${ew.getCustomSqlSegment}
+    </select>
+    <select id="eventPercentTop10" resultType="java.util.Map">
+        WITH EventTypeCounts AS (
+        SELECT
+        event_type,
+        COUNT(*) AS event_count
+        FROM
+        sen_events
+        GROUP BY
+        event_type
+        )
+        SELECT
+        (SELECT dic.dict_label from sys_dict_data dic where dic.dict_type='event_type' AND dic.dict_value=event_type) AS
+        name,
+        event_count AS value
+        FROM
+        EventTypeCounts
+        ORDER BY
+        event_count DESC
+        LIMIT 10
+    </select>
+    <select id="eventMonthCount" resultType="java.util.Map">
+        -- 使用子查询来筛选近30日内的记录
+        WITH RecentEvents AS (
+        SELECT *
+        FROM sen_events
+        WHERE create_time >= NOW() - INTERVAL 30 DAY
+        ),
+
+        -- 计算每个事件类型的数量
+        EventTypeCounts AS (
+        SELECT
+        event_type,
+        COUNT(*) AS event_count
+        FROM
+        RecentEvents
+        GROUP BY
+        event_type
+        )
+
+        -- 最终查询
+        SELECT
+        (SELECT dic.dict_label from sys_dict_data dic where dic.dict_type='event_type' AND dic.dict_value=event_type) AS
+        name,
+        event_count AS value
+        FROM
+        EventTypeCounts
+        ORDER BY
+        event_count DESC
+    </select>
+    <select id="eventDayCount" resultType="java.util.Map">
+        -- 生成最近30天的日期序列
+        WITH DateList AS (
+        SELECT CURDATE() - INTERVAL n DAY AS date
+        FROM (
+        -- 生成0到29的数字序列
+        SELECT n
+        FROM (
+        SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
+        UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
+        UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11
+        UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
+        UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19
+        UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23
+        UNION ALL SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27
+        UNION ALL SELECT 28 UNION ALL SELECT 29
+        ) numbers(n)
+        ) AS dates
+        ),
+
+        -- 获取所有事件类型
+        EventTypes AS (
+        SELECT DISTINCT event_type
+        FROM sen_events
+        ),
+
+        -- 使用左连接来确保每一天都有记录,即使那天没有数据
+        FullData AS (
+        SELECT dl.date,
+        et.event_type,
+        COUNT(se.id) AS event_count
+        FROM DateList dl
+        CROSS JOIN EventTypes et
+        LEFT JOIN sen_events se ON dl.date = DATE(se.create_time) AND et.event_type = se.event_type
+        GROUP BY dl.date, et.event_type
+        )
+
+        -- 查询最近30天的每一天及其事件类型和计数
+        SELECT date, (SELECT dic.dict_label from sys_dict_data dic where dic.dict_type='event_type' AND
+        dic.dict_value=event_type) AS name, event_count AS value
+        FROM FullData
+        ORDER BY date ASC, event_type ASC;
+    </select>
+    <select id="pointEventsStat" resultType="java.util.HashMap">
+        SELECT
+        area_name,
+        COUNT( id ) AS event_count
+        FROM
+        sen_events
+        WHERE
+        area_name IS NOT NULL
+        <if test="ew.getSqlSegment != null and ew.getSqlSegment != ''">
+            AND ${ew.getSqlSegment}
+        </if>
+        GROUP BY
+        area_name
+        ORDER BY
+        event_count DESC
+        LIMIT 10
+    </select>
+    <select id="regionEventsStat" resultType="java.util.HashMap">
+        SELECT
+        sa2.area_name AS name,
+        COUNT( ev.id ) AS value
+        FROM
+        sen_events ev
+        LEFT JOIN sys_area sa ON sa.area_id = ev.area_id
+        LEFT JOIN sys_area sa2 ON sa2.area_id = sa.parent_id
+        WHERE ev.area_id IS NOT NULL
+        <if test="dateType == 1">
+            AND DATE(ev.create_time) = CURDATE()
+        </if>
+        <if test="dateType == 7">
+            AND ev.create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+        </if>
+        <if test="dateType == 30">
+            AND ev.create_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
+        </if>
+        GROUP BY
+        sa2.area_name
+        ORDER BY
+        value DESC
+        LIMIT 10
+    </select>
+    <select id="minuteEventsStat" resultType="java.util.HashMap">
+        SELECT
+        DATE_FORMAT(create_time, '%H:%i') AS time_format,
+        COUNT(id) AS count
+        FROM
+        sen_events
+        WHERE
+        create_time >= CURDATE()
+        AND create_time &lt; (CURDATE() + INTERVAL 1 DAY)
+        <if test="ew.getSqlSegment != null and ew.getSqlSegment != ''">
+            AND ${ew.getSqlSegment}
+        </if>
+        GROUP BY
+        DATE_FORMAT(create_time, '%H:%i')
+        ORDER BY
+        time_format
+    </select>
+    <select id="eventsDatasourceStat" resultType="java.util.HashMap">
+        SELECT
+        datasource,
+        COUNT(*) AS count
+        FROM
+        sen_events
+        WHERE
+        datasource IS NOT NULL
+        <if test="ew.getSqlSegment != null and ew.getSqlSegment != ''">
+            AND ${ew.getSqlSegment}
+        </if>
+        GROUP BY
+        datasource;
+    </select>
+    <select id="eventsHourStat" resultType="java.util.HashMap">
+        WITH -- 生成一天内的每个小时
+        Hours AS (
+        SELECT
+        CONCAT( LPAD( CAST( HOUR AS CHAR ), 2, '0' ), ':00:00' ) AS hour_of_day
+        FROM
+        (
+        SELECT
+        0 AS HOUR UNION ALL
+        SELECT
+        1 UNION ALL
+        SELECT
+        2 UNION ALL
+        SELECT
+        3 UNION ALL
+        SELECT
+        4 UNION ALL
+        SELECT
+        5 UNION ALL
+        SELECT
+        6 UNION ALL
+        SELECT
+        7 UNION ALL
+        SELECT
+        8 UNION ALL
+        SELECT
+        9 UNION ALL
+        SELECT
+        10 UNION ALL
+        SELECT
+        11 UNION ALL
+        SELECT
+        12 UNION ALL
+        SELECT
+        13 UNION ALL
+        SELECT
+        14 UNION ALL
+        SELECT
+        15 UNION ALL
+        SELECT
+        16 UNION ALL
+        SELECT
+        17 UNION ALL
+        SELECT
+        18 UNION ALL
+        SELECT
+        19 UNION ALL
+        SELECT
+        20 UNION ALL
+        SELECT
+        21 UNION ALL
+        SELECT
+        22 UNION ALL
+        SELECT
+        23
+        ) AS hours
+        ),-- 统计每小时内的事件数量
+        EventCounts AS (
+        SELECT
+        CONCAT( LPAD( HOUR ( create_time ), 2, '0' ), ':00:00' ) AS hour_of_day,
+        COUNT(*) AS num_events
+        FROM
+        sen_events
+        ${ew.getCustomSqlSegment}
+        GROUP BY
+        hour_of_day
+        ) -- 左连接生成的时间戳与事件统计
+        SELECT
+        h.hour_of_day AS hour,
+        COALESCE ( ec.num_events, 0 ) AS events
+        FROM
+        Hours h
+        LEFT JOIN EventCounts ec ON h.hour_of_day = ec.hour_of_day
+        ORDER BY
+        hour
+    </select>
+    <select id="eventsDealRateStat" resultType="java.util.HashMap">
+        WITH
+        -- 统计每个事件类型的总事件数和已处理事件数
+        EventStats AS (
+        SELECT
+        event_type,
+        COUNT(*) AS totalEvents,
+        SUM(CASE WHEN deal_status = 1 THEN 1 ELSE 0 END) AS dealtEvents
+        FROM
+        sen_events
+        ${ew.getCustomSqlSegment}
+        GROUP BY
+        event_type
+        )
+        -- 计算处理率
+        SELECT
+        dict.dict_label AS eventType,
+        totalEvents,
+        dealtEvents,
+        CASE
+        WHEN totalEvents > 0 THEN (dealtEvents * 100 / totalEvents) ELSE 0
+        END AS dealRate
+        FROM
+        EventStats se
+        LEFT JOIN sys_dict_data dict ON dict.dict_type='event_type' AND dict.dict_value = se.event_type
+        ORDER BY
+        dict.dict_label;
+    </select>
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsMediaMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenEventsMediaMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsObjectMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenEventsObjectMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenEventsReportMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenEventsReportMapper">
+
+</mapper>

+ 30 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenFlowDetailMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenFlowDetailMapper">
+
+    <select id="lineCharts" resultType="java.util.Map">
+        SELECT DATE
+        ( create_time ) AS date,
+        point_name,
+        SUM(
+        CAST( vehicle_count AS SIGNED )) AS daily_vehicle_count
+        FROM
+        sen_flow_detail
+        WHERE
+        point_id IN (
+        SELECT
+        point_id
+        FROM
+        ( SELECT point_id, SUM( CAST( vehicle_count AS SIGNED )) AS total_vehicle_count FROM sen_flow_detail GROUP BY point_id ORDER BY total_vehicle_count DESC LIMIT 3 ) AS top_points
+        )
+        AND MONTH ( create_time ) = MONTH ( CURRENT_DATE )
+        GROUP BY
+        DATE ( create_time ),
+        point_name
+        ORDER BY
+        DATE,
+        daily_vehicle_count DESC
+    </select>
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenMonitorPointMediaMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenMonitorPointMediaMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenMonitorTaskAlgorithmsMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenMonitorTaskAlgorithmsMapper">
+
+</mapper>

+ 80 - 0
ruoyi-modules/ruoyi-traffic/src/main/resources/mapper/SenMonitorTaskMapper.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.mapper.SenMonitorTaskMapper">
+
+    <select id="selectVoPageWrapper" resultType="org.dromara.domain.vo.SenMonitorTaskVo">
+        SELECT
+        sac.*,
+        (SELECT b.point_name from sen_monitor_point b where sac.point_id=b.point_id) AS point_name ,(SELECT c.file_name
+        from sen_monitor_point_media c WHERE sac.media_id=c.id) AS file_name,
+        GROUP_CONCAT(sa.algorithm_name ORDER BY sa.algorithm_name SEPARATOR ',') AS event_types
+        FROM
+        sen_monitor_task sac
+        LEFT JOIN
+        sen_monitor_task_algorithms d ON sac.id = d.task_id
+        LEFT JOIN
+        sen_algorithm_config sa ON d.algorithm_id = sa.id
+        ${ew.customSqlSegment}
+        GROUP BY
+        sac.id
+    </select>
+    <select id="selectScheduledTask" resultType="org.dromara.domain.SenEvents">
+        SELECT
+        DISTINCT(map.event_type),
+        map.event_category,
+        (SELECT dict.dict_label from sys_dict_data dict where dict.dict_type='event_type' AND dict_value = map.event_type) AS event_name,
+        b.point_id,
+        b.point_name,
+        b.area_id,
+        c.area_name,
+        '交通' AS event_obj,
+        0 AS deal_status,
+        CASE
+        WHEN RAND() lt; 0.25 THEN '电子警察'
+        WHEN RAND() lt; 0.50 THEN '普通卡口'
+        WHEN RAND() lt; 0.75 THEN '不文明驾驶'
+        ELSE '其他'
+        END AS datasource,
+        1 AS create_by,
+        SYSDATE() AS create_time
+        FROM
+        sen_monitor_task sac
+        LEFT JOIN
+        sen_monitor_task_algorithms d ON sac.id = d.task_id
+        LEFT JOIN
+        sen_algorithm_config sa ON d.algorithm_id = sa.id
+        LEFT JOIN
+        sen_monitor_point b ON b.point_id = sac.point_id
+        LEFT JOIN
+        sys_area c ON c.area_id  = b.area_id
+        LEFT JOIN
+        sen_map_tmp map ON map.algorithm_category = sa.algorithm_category
+        ORDER BY RAND()
+        LIMIT 60
+    </select>
+    <select id="selectFlowTask" resultType="org.dromara.domain.SenFlowDetail">
+        SELECT
+        sac.id AS task_id,
+        b.point_id,
+        b.point_name,
+        CAST(FLOOR(1 + RAND() * 3) AS CHAR) AS lane_number,
+        CAST(FLOOR(1 + RAND() * 50) AS CHAR) AS vehicle_count,
+        CAST(FLOOR(1 + RAND() * 50) AS CHAR) AS average_speed,
+        CAST(FLOOR(1 + RAND() * 50) AS CHAR) AS queue_time,
+        CAST(FLOOR(1 + RAND() * 100) AS CHAR) AS time_rate,
+        CAST(FLOOR(1 + RAND() * 100) AS CHAR) AS space_rate,
+        CAST(FLOOR(1 + RAND() * 20) AS CHAR) AS headway_time,
+        CAST(FLOOR(1 + RAND() * 40) AS CHAR) AS headway_distance,
+        CAST(FLOOR(1 + RAND() * 100) AS CHAR) AS vehicle_remark,
+        1 AS create_by,
+        SYSDATE() AS create_time
+        FROM
+        sen_monitor_task sac
+        LEFT JOIN
+        sen_monitor_point b ON b.point_id = sac.point_id
+        LEFT JOIN
+        sys_area c ON c.area_id = b.area_id
+    </select>
+</mapper>

+ 0 - 4
traffic-ui/.env.development

@@ -10,11 +10,7 @@ VITE_APP_BASE_API = '/dev-api'
 # 应用访问路径 例如使用前缀 /admin/
 VITE_APP_CONTEXT_PATH = '/'
 
-# 监控地址
-VITE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/applications'
 
-# powerjob 控制台地址
-VITE_APP_POWERJOB_ADMIN = 'http://localhost:7700/'
 
 VITE_APP_ENCRYPT = false
 

+ 0 - 5
traffic-ui/.env.production

@@ -7,11 +7,6 @@ VITE_APP_ENV = 'production'
 # 应用访问路径 例如使用前缀 /admin/
 VITE_APP_CONTEXT_PATH = '/'
 
-# 监控地址
-VITE_APP_MONITRO_ADMIN = '/admin/applications'
-
-# powerjob 控制台地址
-VITE_APP_POWERJOB_ADMIN = '/powerjob'
 
 # 生产环境
 VITE_APP_BASE_API = '/api'

+ 1 - 0
traffic-ui/package.json

@@ -47,6 +47,7 @@
     "didi": "9.0.2",
     "echarts": "^5.5.1",
     "element-plus": "2.7.5",
+    "element-resize-detector": "^1.2.4",
     "file-saver": "2.0.5",
     "fuse.js": "7.0.0",
     "highlight.js": "11.9.0",

+ 13 - 1
traffic-ui/src/api/manage/monitorPoint/index.ts

@@ -35,7 +35,7 @@ export const addMonitorPoint = (data: MonitorPointForm) => {
   return request({
     url: '/manage/monitorPoint',
     method: 'post',
-    data: data
+    data
   });
 };
 
@@ -61,3 +61,15 @@ export const delMonitorPoint = (pointId: string | number | Array<string | number
     method: 'delete'
   });
 };
+
+/**
+ * 根据监控点名称查询区域树监控
+ * @param
+ */
+export const getListByAreaTree = (params) => {
+  return request({
+    url: '/manage/monitorPoint/getListByAreaTree',
+    method: 'get',
+    params
+  });
+};

+ 45 - 0
traffic-ui/src/api/manage/monitorPoint/types.ts

@@ -36,6 +36,51 @@ export interface MonitorPointVO {
 }
 
 export interface MonitorPointForm extends BaseEntity {
+  /**
+   * 监控点名称
+   */
+  pointName: string;
+  /**
+   * 行政区域
+   */
+  areaId: number;
+
+  /**
+   * 视频类型(1-实时视频 2-离线视频)
+   */
+  videoType: string;
+  /**
+   * 场景类型(1-高速公路 2-城市道路)
+   */
+  sceneType: string;
+
+  /**
+   * 设备编号
+   */
+  deviceNo: string;
+  /**
+   * 实时流地址
+   */
+  streamUrl: string;
+  /**
+   * 经度
+   */
+  longitude: string;
+
+  /**
+   * 纬度
+   */
+  latitude: string;
+
+  /**
+   * 方向
+   */
+  direction: string;
+
+  /**
+   * 路口编号
+   */
+  intersectionId: string | number;
 }
 
 export interface MonitorPointQuery extends PageQuery {

+ 63 - 0
traffic-ui/src/api/manage/monitorTask/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { MonitorTaskVO, MonitorTaskForm, MonitorTaskQuery } from '@/api/manage/monitorTask/types';
+
+/**
+ * 查询任务管理列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listMonitorTask = (query?: MonitorTaskQuery): AxiosPromise<MonitorTaskVO[]> => {
+  return request({
+    url: '/manage/monitorTask/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询任务管理详细
+ * @param id
+ */
+export const getMonitorTask = (id: string | number): AxiosPromise<MonitorTaskVO> => {
+  return request({
+    url: '/manage/monitorTask/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增任务管理
+ * @param data
+ */
+export const addMonitorTask = (data: MonitorTaskForm) => {
+  return request({
+    url: '/manage/monitorTask',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改任务管理
+ * @param data
+ */
+export const updateMonitorTask = (data: MonitorTaskForm) => {
+  return request({
+    url: '/manage/monitorTask',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除任务管理
+ * @param id
+ */
+export const delMonitorTask = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/manage/monitorTask/' + id,
+    method: 'delete'
+  });
+};

+ 101 - 0
traffic-ui/src/api/manage/monitorTask/types.ts

@@ -0,0 +1,101 @@
+export interface MonitorTaskVO {
+  /**
+   * 任务编号
+   */
+  id: string | number;
+
+  /**
+   * 监控点媒介id
+   */
+  mediaId: string | number;
+
+  /**
+   * 监控点位id
+   */
+  pointId: string | number;
+
+  /**
+   * 视频类型(1-实时视频2-离线视频)
+   */
+  videoType: string | number;
+
+  /**
+   * 完成进度
+   */
+  progress: string;
+
+  /**
+   * 任务状态(1-未开始 2-分析中3-分析完成)
+   */
+  status: string;
+
+}
+
+export interface MonitorTaskForm extends BaseEntity {
+  /**
+   * 任务编号
+   */
+  id?: string | number;
+
+  /**
+   * 监控点媒介id
+   */
+  mediaId?: string | number;
+
+  /**
+   * 监控点位id
+   */
+  pointId?: string | number;
+
+  /**
+   * 视频类型(1-实时视频2-离线视频)
+   */
+  videoType?: string | number;
+
+  /**
+   * 完成进度
+   */
+  progress?: string;
+
+  /**
+   * 任务状态(1-未开始 2-分析中3-分析完成)
+   */
+  status?: string;
+
+}
+
+export interface MonitorTaskQuery extends PageQuery {
+
+  /**
+   * 监控点媒介id
+   */
+  mediaId?: string | number;
+
+  /**
+   * 监控点位id
+   */
+  pointId?: string | number;
+
+  /**
+   * 视频类型(1-实时视频2-离线视频)
+   */
+  videoType?: string | number;
+
+  /**
+   * 完成进度
+   */
+  progress?: string;
+
+  /**
+   * 任务状态(1-未开始 2-分析中3-分析完成)
+   */
+  status?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 194 - 0
traffic-ui/src/api/sense/events/index.ts

@@ -0,0 +1,194 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { EventsVO, EventsForm, EventsQuery } from '@/api/sense/events/types';
+
+/**
+ * 查询事件信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listEvents = (query?: EventsQuery): AxiosPromise<EventsVO[]> => {
+  return request({
+    url: '/manage/events/list',
+    method: 'get',
+    params: query
+  });
+};
+/**
+ * 查询事件信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const eventsCount = () => {
+  return request({
+    url: '/manage/events/eventsCount',
+    method: 'get',
+  });
+};
+/**
+ * 查询重点事件分类数据
+ */
+
+export const importantEventsStat = (params) => {
+  return request({
+    url: '/manage/events/importantEventsStat',
+    method: 'get',
+    params
+  });
+};
+/**
+ * 查询机占非TOP10数据
+ */
+
+export const motorInLanesTop10 = (params) => {
+  return request({
+    url: '/manage/events/motorInLanesTop10',
+    method: 'get',
+    params
+  });
+};
+
+/**
+ * 查询事件信息详细
+ * @param id
+ */
+export const getEvents = (id: string | number): AxiosPromise<EventsVO> => {
+  return request({
+    url: '/manage/events/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增事件信息
+ * @param data
+ */
+export const addEvents = (data: EventsForm) => {
+  return request({
+    url: '/manage/events',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改事件信息
+ * @param data
+ */
+export const updateEvents = (data: EventsForm) => {
+  return request({
+    url: '/manage/events',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除事件信息
+ * @param id
+ */
+export const delEvents = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/manage/events/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 事件占比TOP10(%)
+ */
+
+export const eventPercentTop10 = () => {
+  return request({
+    url: '/manage/events/eventPercentTop10',
+    method: 'get',
+  });
+};
+/**
+ * 近30日事件统计
+ */
+
+export const eventMonthCount = () => {
+  return request({
+    url: '/manage/events/eventMonthCount',
+    method: 'get',
+  });
+};
+/**
+ *每日事件统计
+ */
+
+export const eventDayCount = () => {
+  return request({
+    url: '/manage/events/eventDayCount',
+    method: 'get',
+  });
+};
+/**
+ *监控点位违反统计
+ */
+
+export const pointEventsStat = (params) => {
+  return request({
+    url: '/manage/events/pointEventsStat',
+    method: 'get',
+    params
+  });
+};
+/**
+ *区域违法分布
+ */
+
+export const regionEventsStat = (params) => {
+  return request({
+    url: '/manage/events/regionEventsStat',
+    method: 'get',
+    params
+  });
+};
+/**
+ *每分钟事件统计
+ */
+
+export const minuteEventsStat = (params) => {
+  return request({
+    url: '/manage/events/minuteEventsStat',
+    method: 'get',
+    params
+  });
+};
+/**
+ *交通违法数据来源分析
+ */
+
+export const eventsDatasourceStat = (params) => {
+  return request({
+    url: '/manage/events/eventsDatasourceStat',
+    method: 'get',
+    params
+  });
+};
+/**
+ *交通违法分布式时间
+ */
+
+export const eventsHourStat = (params) => {
+  return request({
+    url: '/manage/events/eventsHourStat',
+    method: 'get',
+    params
+  });
+};
+/**
+ *交通违法处置分析
+ */
+
+export const eventsDealRateStat = (params) => {
+  return request({
+    url: '/manage/events/eventsDealRateStat',
+    method: 'get',
+    params
+  });
+};

+ 161 - 0
traffic-ui/src/api/sense/events/types.ts

@@ -0,0 +1,161 @@
+export interface EventsVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 事件分类(字典event_category)
+   */
+  eventCategory: string;
+
+  /**
+   * 事件名称
+   */
+  eventName: string;
+
+  /**
+   * 事件类型(字典event_type)
+   */
+  eventType: string;
+
+  /**
+   * 监控点id
+   */
+  pointId: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName: string;
+
+  /**
+   * 区域id
+   */
+  areaId: string | number;
+
+  /**
+   * 区域名称
+   */
+  areaName: string;
+
+  /**
+   * 事件对象类型(交通、城管、社区)
+   */
+  eventObj: string;
+
+  /**
+   * 处理状态
+   */
+  dealStatus: string;
+
+}
+
+export interface EventsForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 事件分类(字典event_category)
+   */
+  eventCategory?: string;
+
+  /**
+   * 事件名称
+   */
+  eventName?: string;
+
+  /**
+   * 事件类型(字典event_type)
+   */
+  eventType?: string;
+
+  /**
+   * 监控点id
+   */
+  pointId?: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName?: string;
+
+  /**
+   * 区域id
+   */
+  areaId?: string | number;
+
+  /**
+   * 区域名称
+   */
+  areaName?: string;
+
+  /**
+   * 事件对象类型(交通、城管、社区)
+   */
+  eventObj?: string;
+
+  /**
+   * 处理状态
+   */
+  dealStatus?: string;
+
+}
+
+export interface EventsQuery extends PageQuery {
+
+  /**
+   * 事件分类(字典event_category)
+   */
+  eventCategory?: string;
+
+  /**
+   * 事件名称
+   */
+  eventName?: string;
+
+  /**
+   * 事件类型(字典event_type)
+   */
+  eventType?: string;
+
+  /**
+   * 监控点id
+   */
+  pointId?: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName?: string;
+
+  /**
+   * 区域id
+   */
+  areaId?: string | number;
+
+  /**
+   * 区域名称
+   */
+  areaName?: string;
+
+  /**
+   * 事件对象类型(交通、城管、社区)
+   */
+  eventObj?: string;
+
+  /**
+   * 处理状态
+   */
+  dealStatus?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
traffic-ui/src/api/sense/eventsObject/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { EventsObjectVO, EventsObjectForm, EventsObjectQuery } from '@/api/sense/eventsObject/types';
+
+/**
+ * 查询事件对象列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listEventsObject = (query?: EventsObjectQuery): AxiosPromise<EventsObjectVO[]> => {
+  return request({
+    url: '/dromara/eventsObject/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询事件对象详细
+ * @param id
+ */
+export const getEventsObject = (id: string | number): AxiosPromise<EventsObjectVO> => {
+  return request({
+    url: '/dromara/eventsObject/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增事件对象
+ * @param data
+ */
+export const addEventsObject = (data: EventsObjectForm) => {
+  return request({
+    url: '/dromara/eventsObject',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改事件对象
+ * @param data
+ */
+export const updateEventsObject = (data: EventsObjectForm) => {
+  return request({
+    url: '/dromara/eventsObject',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除事件对象
+ * @param id
+ */
+export const delEventsObject = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/dromara/eventsObject/' + id,
+    method: 'delete'
+  });
+};

+ 101 - 0
traffic-ui/src/api/sense/eventsObject/types.ts

@@ -0,0 +1,101 @@
+export interface EventsObjectVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 事件id
+   */
+  eventId: string | number;
+
+  /**
+   * 对象类型(如人、车等)
+   */
+  objectType: string;
+
+  /**
+   * 事件类型(字典event_type)
+   */
+  eventType: string;
+
+  /**
+   * 对象标识(如车牌号、人脸特征码等)
+   */
+  objectId: string | number;
+
+  /**
+   * 对象属性(如品牌)
+   */
+  objectAttr: string;
+
+}
+
+export interface EventsObjectForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 事件id
+   */
+  eventId?: string | number;
+
+  /**
+   * 对象类型(如人、车等)
+   */
+  objectType?: string;
+
+  /**
+   * 事件类型(字典event_type)
+   */
+  eventType?: string;
+
+  /**
+   * 对象标识(如车牌号、人脸特征码等)
+   */
+  objectId?: string | number;
+
+  /**
+   * 对象属性(如品牌)
+   */
+  objectAttr?: string;
+
+}
+
+export interface EventsObjectQuery extends PageQuery {
+
+  /**
+   * 事件id
+   */
+  eventId?: string | number;
+
+  /**
+   * 对象类型(如人、车等)
+   */
+  objectType?: string;
+
+  /**
+   * 事件类型(字典event_type)
+   */
+  eventType?: string;
+
+  /**
+   * 对象标识(如车牌号、人脸特征码等)
+   */
+  objectId?: string | number;
+
+  /**
+   * 对象属性(如品牌)
+   */
+  objectAttr?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
traffic-ui/src/api/sense/eventsReport/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { EventsReportVO, EventsReportForm, EventsReportQuery } from '@/api/sense/eventsReport/types';
+
+/**
+ * 查询推送记录列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listEventsReport = (query?: EventsReportQuery): AxiosPromise<EventsReportVO[]> => {
+  return request({
+    url: '/sense/eventsReport/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询推送记录详细
+ * @param id
+ */
+export const getEventsReport = (id: string | number): AxiosPromise<EventsReportVO> => {
+  return request({
+    url: '/sense/eventsReport/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增推送记录
+ * @param data
+ */
+export const addEventsReport = (data: EventsReportForm) => {
+  return request({
+    url: '/sense/eventsReport',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改推送记录
+ * @param data
+ */
+export const updateEventsReport = (data: EventsReportForm) => {
+  return request({
+    url: '/sense/eventsReport',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除推送记录
+ * @param id
+ */
+export const delEventsReport = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/sense/eventsReport/' + id,
+    method: 'delete'
+  });
+};

+ 161 - 0
traffic-ui/src/api/sense/eventsReport/types.ts

@@ -0,0 +1,161 @@
+export interface EventsReportVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 上报平台
+   */
+  reportPlatform: string;
+
+  /**
+   * 监控点id
+   */
+  pointId: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName: string;
+
+  /**
+   * 事件名称
+   */
+  eventName: string;
+
+  /**
+   * 数据详情
+   */
+  dataContent: string;
+
+  /**
+   * 数据类型
+   */
+  dataType: string;
+
+  /**
+   * 上报状态(0-发送成功1-发送失败)
+   */
+  reportStatus: string;
+
+  /**
+   * 描述
+   */
+  reportDesc: string;
+
+  /**
+   * 重试次数
+   */
+  dealStatus: number;
+
+}
+
+export interface EventsReportForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 上报平台
+   */
+  reportPlatform?: string;
+
+  /**
+   * 监控点id
+   */
+  pointId?: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName?: string;
+
+  /**
+   * 事件名称
+   */
+  eventName?: string;
+
+  /**
+   * 数据详情
+   */
+  dataContent?: string;
+
+  /**
+   * 数据类型
+   */
+  dataType?: string;
+
+  /**
+   * 上报状态(0-发送成功1-发送失败)
+   */
+  reportStatus?: string;
+
+  /**
+   * 描述
+   */
+  reportDesc?: string;
+
+  /**
+   * 重试次数
+   */
+  dealStatus?: number;
+
+}
+
+export interface EventsReportQuery extends PageQuery {
+
+  /**
+   * 上报平台
+   */
+  reportPlatform?: string;
+
+  /**
+   * 监控点id
+   */
+  pointId?: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName?: string;
+
+  /**
+   * 事件名称
+   */
+  eventName?: string;
+
+  /**
+   * 数据详情
+   */
+  dataContent?: string;
+
+  /**
+   * 数据类型
+   */
+  dataType?: string;
+
+  /**
+   * 上报状态(0-发送成功1-发送失败)
+   */
+  reportStatus?: string;
+
+  /**
+   * 描述
+   */
+  reportDesc?: string;
+
+  /**
+   * 重试次数
+   */
+  dealStatus?: number;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 70 - 0
traffic-ui/src/api/sense/flowDetail/index.ts

@@ -0,0 +1,70 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { FlowDetailVO, FlowDetailForm, FlowDetailQuery } from '@/api/sense/flowDetail/types';
+
+/**
+ * 查询流量明细列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listFlowDetail = (query?: FlowDetailQuery): AxiosPromise<FlowDetailVO[]> => {
+  return request({
+    url: '/sense/flowDetail/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询流量明细详细
+ * @param id
+ */
+export const getFlowDetail = (id: string | number): AxiosPromise<FlowDetailVO> => {
+  return request({
+    url: '/sense/flowDetail/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增流量明细
+ * @param data
+ */
+export const addFlowDetail = (data: FlowDetailForm) => {
+  return request({
+    url: '/sense/flowDetail',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改流量明细
+ * @param data
+ */
+export const updateFlowDetail = (data: FlowDetailForm) => {
+  return request({
+    url: '/sense/flowDetail',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除流量明细
+ * @param id
+ */
+export const delFlowDetail = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/sense/flowDetail/' + id,
+    method: 'delete'
+  });
+};
+// 获取流量前3的路段流量折线图数据
+export const lineCharts = () => {
+  return request({
+    url: '/sense/flowDetail/lineCharts',
+    method: 'get',
+  });
+};

+ 150 - 0
traffic-ui/src/api/sense/flowDetail/types.ts

@@ -0,0 +1,150 @@
+export interface FlowDetailVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 任务编号
+   */
+  taskId: string | number;
+
+  /**
+   * 监控点id
+   */
+  pointId: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName: string;
+
+  /**
+   * 车道号
+   */
+  laneNumber: string;
+
+  /**
+   * 车流量
+   */
+  vehicleCount: string;
+
+  /**
+   * 平均数据(km/h)
+   */
+  averageSpeed: string;
+
+  /**
+   * 排队长度(s)
+   */
+  queueTime: string;
+
+  /**
+   * 空间占有率
+   */
+  spaceRate: string;
+
+  /**
+   * 时间占有率
+   */
+  timeRate: string;
+
+  /**
+   * 车头时距(s)
+   */
+  headwayTime: string;
+
+  /**
+   * 车头间距
+   */
+  headwayDistance: string;
+
+  /**
+   * 车辆类型与行驶方向数
+   */
+  vehicleRemark: string;
+
+}
+
+export interface FlowDetailForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 任务编号
+   */
+  taskId?: string | number;
+
+  /**
+   * 监控点id
+   */
+  pointId?: string | number;
+
+  /**
+   * 监控点名称
+   */
+  pointName?: string;
+
+  /**
+   * 车道号
+   */
+  laneNumber?: string;
+
+  /**
+   * 车流量
+   */
+  vehicleCount?: string;
+
+  /**
+   * 平均数据(km/h)
+   */
+  averageSpeed?: string;
+
+  /**
+   * 排队长度(s)
+   */
+  queueTime?: string;
+
+  /**
+   * 空间占有率
+   */
+  spaceRate?: string;
+
+  /**
+   * 时间占有率
+   */
+  timeRate?: string;
+
+  /**
+   * 车头时距(s)
+   */
+  headwayTime?: string;
+
+  /**
+   * 车头间距
+   */
+  headwayDistance?: string;
+
+  /**
+   * 车辆类型与行驶方向数
+   */
+  vehicleRemark?: string;
+
+}
+
+export interface FlowDetailQuery extends PageQuery {
+
+  /**
+   * 监控点名称
+   */
+  pointName?: string;
+  /**
+     * 日期范围参数
+     */
+  params?: any;
+}
+
+
+

BIN
traffic-ui/src/assets/images/event.png


+ 1 - 0
traffic-ui/src/assets/images/monitor.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726646191940" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1460" width="64" height="64" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M164.23297 208.236672 43.751968 513.030469l536.292266 208.764698 198.491727-274.470165L164.23297 208.236672 164.23297 208.236672 164.23297 208.236672zM845.866439 554.503023l-61.178361 154.832368 101.369735 106.427938 107.083877-270.910083L845.866439 554.503023 845.866439 554.503023 845.866439 554.503023zM772.134157 506.254136 646.842593 680.792311l107.302865 41.75294 76.479859-193.525622L772.134157 506.254136 772.134157 506.254136 772.134157 506.254136zM119.638309 624.331391l70.702272 27.762297-27.762297 61.512982L33.790082 713.606671l0 53.53324 164.982542 0 0-1.779529 42.783409-93.155656 77.728292 30.509874 24.077372-60.428278-199.676715-78.352509L119.638309 624.331391 119.638309 624.331391 119.638309 624.331391zM119.638309 624.331391" fill="#d81e06" p-id="1461"></path></svg>

+ 83 - 0
traffic-ui/src/components/BaseChart/index.vue

@@ -0,0 +1,83 @@
+<template>
+  <div ref="chart" :style="style"></div>
+</template>
+
+<script lang="ts" setup>
+import * as echarts from 'echarts'
+import elementResizeDetectorMaker from 'element-resize-detector'
+
+const props = defineProps({
+  // 图表的宽度
+  width: {
+    type: String,
+    default: '600px'
+  },
+  // 图表的高度
+  height: {
+    type: String,
+    default: '400px'
+  },
+  // 图表的配置
+  option: {
+    type: Object,
+    required: true
+  }
+})
+
+const chart = shallowRef<any>()
+
+const style = computed(() => ({
+  width: props.width,
+  height: props.height
+}))
+
+// 初始化图表
+const initChart = () => {
+  // setTimeout(() => {
+  if (!chartInstance.value) {
+    chartInstance.value = echarts.init(chart.value)
+  }
+  chartInstance.value.clear();
+  props.option && chartInstance.value.setOption(props.option, true)
+
+  // }, 1000)
+
+}
+
+// 处理图表容器大小变化
+const handleResize = () => {
+  const erd = elementResizeDetectorMaker()
+  // 监听图表容器的大小变化
+  erd.listenTo(chart.value, () => {
+    // 改变图表尺寸
+    chartInstance.value?.resize()
+  })
+}
+
+const chartInstance = shallowRef<any>()
+
+watch(
+  () => props.option,
+  () => {
+    initChart()
+  },
+  { deep: true }
+)
+
+onMounted(() => {
+  initChart()
+  handleResize()
+})
+
+onBeforeUnmount(() => {
+  if (chartInstance.value) {
+    // 销毁图表实例
+    chartInstance.value.dispose()
+    chartInstance.value = null
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+/* 你可以在这里定义样式 */
+</style>

+ 2 - 1
traffic-ui/src/layout/components/AppMain.vue

@@ -43,7 +43,7 @@ watch(
 .app-main {
   /* 50= navbar  50  */
   // min-height: calc(100vh - 50px);
-  height:100%;
+  height:calc(100vh - 50px);
   width: 100%;
   position: relative;
   overflow-x: hidden;
@@ -58,6 +58,7 @@ watch(
   .app-main {
     /* 84 = navbar + tags-view = 50 + 34 */
     // min-height: calc(100vh - 84px);
+    height:calc(100vh - 84px);
 
   }
 

+ 0 - 1
traffic-ui/src/main.ts

@@ -3,7 +3,6 @@ import { createApp } from 'vue';
 import 'virtual:uno.css';
 import '@/assets/styles/index.scss';
 import 'element-plus/theme-chalk/dark/css-vars.css';
-
 // App、router、store
 import App from './App.vue';
 import store from './store';

+ 4 - 0
traffic-ui/src/types/components.d.ts

@@ -9,6 +9,7 @@ declare module 'vue' {
   export interface GlobalComponents {
     AMISRenderer: typeof import('./../components/AMISRenderer/index.vue')['default']
     ApprovalRecord: typeof import('./../components/Process/approvalRecord.vue')['default']
+    BaseChart: typeof import('./../components/BaseChart/index.vue')['default']
     BpmnDesign: typeof import('./../components/BpmnDesign/index.vue')['default']
     BpmnView: typeof import('./../components/BpmnView/index.vue')['default']
     Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
@@ -39,6 +40,7 @@ declare module 'vue' {
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
     ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
     ElLink: typeof import('element-plus/es')['ElLink']
@@ -47,7 +49,9 @@ declare module 'vue' {
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
     ElPopover: typeof import('element-plus/es')['ElPopover']
+    ElProgress: typeof import('element-plus/es')['ElProgress']
     ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
     ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно