Переглянути джерело

feat(risk): 集成风控品控平台业务模块

- 新增 ruoyi-risk 业务模块(人员/隐患/培训/巡检/舆情/事故等12个实体)
- 新增 ruoyi-ui 前端工作台与三段式布局
- 新增 sql 建表脚本
- 调整 application.yml 多环境配置
- 修复 sys_menu 菜单字段缺失
yangjingjing 2 місяців тому
батько
коміт
0f21724883
100 змінених файлів з 9809 додано та 16 видалено
  1. 2 0
      .gitignore
  2. 35 0
      pom.xml
  3. 6 0
      ruoyi-admin/pom.xml
  4. 5 1
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java
  5. 8 6
      ruoyi-admin/src/main/resources/application-dev.yml
  6. 6 4
      ruoyi-admin/src/main/resources/application-prod.yml
  7. 38 5
      ruoyi-admin/src/main/resources/application.yml
  8. 1 0
      ruoyi-modules/pom.xml
  9. 96 0
      ruoyi-modules/ruoyi-risk/pom.xml
  10. 60 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/config/MinioProperties.java
  11. 59 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/DashboardController.java
  12. 130 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskAccidentController.java
  13. 103 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskAuditFileController.java
  14. 110 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskDangerSourceController.java
  15. 116 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskEquipmentMaintenanceController.java
  16. 285 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskFileController.java
  17. 149 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskHiddenDangerController.java
  18. 125 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskInspectionTaskController.java
  19. 127 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPersonnelCertController.java
  20. 109 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPersonnelChangeController.java
  21. 189 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPersonnelController.java
  22. 149 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPublicOpinionController.java
  23. 109 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskSpecialEquipmentController.java
  24. 105 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskWarningController.java
  25. 121 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskWorkReportController.java
  26. 164 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskAccident.java
  27. 99 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskAuditFile.java
  28. 109 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskDangerSource.java
  29. 108 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskEquipmentMaintenance.java
  30. 139 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskHiddenDanger.java
  31. 144 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskInspectionRecord.java
  32. 175 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskInspectionTask.java
  33. 154 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPersonnel.java
  34. 94 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPersonnelCert.java
  35. 154 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPersonnelChange.java
  36. 98 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPublicOpinion.java
  37. 129 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskSpecialEquipment.java
  38. 119 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskWarning.java
  39. 164 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskWorkReport.java
  40. 180 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskAccidentBo.java
  41. 103 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskAuditFileBo.java
  42. 118 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskDangerSourceBo.java
  43. 102 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskEquipmentMaintenanceBo.java
  44. 150 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskHiddenDangerBo.java
  45. 179 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskInspectionTaskBo.java
  46. 165 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPersonnelBo.java
  47. 99 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPersonnelCertBo.java
  48. 165 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPersonnelChangeBo.java
  49. 106 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPublicOpinionBo.java
  50. 142 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskSpecialEquipmentBo.java
  51. 128 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskWarningBo.java
  52. 174 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskWorkReportBo.java
  53. 78 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/AccidentStatsVo.java
  54. 33 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/AccidentTrendVo.java
  55. 45 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/DashboardStatsVo.java
  56. 38 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/InspectionStatsVo.java
  57. 68 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/PublicOpinionStatsVo.java
  58. 38 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/PublicOpinionTrendVo.java
  59. 42 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RecentDangerVo.java
  60. 30 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RecentNoticeVo.java
  61. 27 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RecentTrainingVo.java
  62. 217 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskAccidentVo.java
  63. 140 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskAuditFileVo.java
  64. 152 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskDangerSourceVo.java
  65. 92 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskEquipmentMaintenanceVo.java
  66. 190 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskHiddenDangerVo.java
  67. 174 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskInspectionRecordVo.java
  68. 229 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskInspectionTaskVo.java
  69. 135 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPersonnelCertVo.java
  70. 201 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPersonnelChangeVo.java
  71. 209 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPersonnelVo.java
  72. 143 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPublicOpinionVo.java
  73. 185 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskSpecialEquipmentVo.java
  74. 165 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskWarningVo.java
  75. 221 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskWorkReportVo.java
  76. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskAccidentMapper.java
  77. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskAuditFileMapper.java
  78. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskDangerSourceMapper.java
  79. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskEquipmentMaintenanceMapper.java
  80. 32 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskHiddenDangerMapper.java
  81. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskInspectionRecordMapper.java
  82. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskInspectionTaskMapper.java
  83. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPersonnelCertMapper.java
  84. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPersonnelChangeMapper.java
  85. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPersonnelMapper.java
  86. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPublicOpinionMapper.java
  87. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskSpecialEquipmentMapper.java
  88. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskWarningMapper.java
  89. 14 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskWorkReportMapper.java
  90. 36 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IDashboardService.java
  91. 78 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskAccidentService.java
  92. 74 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskAuditFileService.java
  93. 66 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskDangerSourceService.java
  94. 74 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskEquipmentMaintenanceService.java
  95. 99 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskHiddenDangerService.java
  96. 78 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskInspectionTaskService.java
  97. 91 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPersonnelCertService.java
  98. 66 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPersonnelChangeService.java
  99. 82 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPersonnelService.java
  100. 95 0
      ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPublicOpinionService.java

+ 2 - 0
.gitignore

@@ -50,3 +50,5 @@ nbdist/
 !*/build/*.xml
 
 .flattened-pom.xml
+ruoyi-admin.jar
+.DS_Store

+ 35 - 0
pom.xml

@@ -357,6 +357,12 @@
                 <version>${revision}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-risk</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -377,12 +383,26 @@
                 <configuration>
                     <release>${java.version}</release>
                     <encoding>${project.build.sourceEncoding}</encoding>
+                    <fork>true</fork>
+                    <compilerArgs>
+                        <arg>-J-XX:+UseG1GC</arg>
+                    </compilerArgs>
                     <annotationProcessorPaths>
+                        <path>
+                            <groupId>com.github.therapi</groupId>
+                            <artifactId>therapi-runtime-javadoc</artifactId>
+                            <version>${therapi-javadoc.version}</version>
+                        </path>
                         <path>
                             <groupId>com.github.therapi</groupId>
                             <artifactId>therapi-runtime-javadoc-scribe</artifactId>
                             <version>${therapi-javadoc.version}</version>
                         </path>
+                        <path>
+                            <groupId>com.eclipsesource.minimal-json</groupId>
+                            <artifactId>minimal-json</artifactId>
+                            <version>0.9.5</version>
+                        </path>
                         <path>
                             <groupId>org.projectlombok</groupId>
                             <artifactId>lombok</artifactId>
@@ -398,6 +418,21 @@
                             <artifactId>mapstruct-plus-processor</artifactId>
                             <version>${mapstruct-plus.version}</version>
                         </path>
+                        <path>
+                            <groupId>io.github.linpeilie</groupId>
+                            <artifactId>mapstruct-plus-object-convert</artifactId>
+                            <version>${mapstruct-plus.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.mapstruct</groupId>
+                            <artifactId>mapstruct-processor</artifactId>
+                            <version>1.6.3</version>
+                        </path>
+                        <path>
+                            <groupId>com.squareup</groupId>
+                            <artifactId>javapoet</artifactId>
+                            <version>1.13.0</version>
+                        </path>
                         <path>
                             <groupId>org.projectlombok</groupId>
                             <artifactId>lombok-mapstruct-binding</artifactId>

+ 6 - 0
ruoyi-admin/pom.xml

@@ -93,6 +93,12 @@
             <artifactId>ruoyi-workflow</artifactId>
         </dependency>
 
+        <!--  风控平台模块  -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-risk</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>de.codecentric</groupId>
             <artifactId>spring-boot-admin-starter-client</artifactId>

+ 5 - 1
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java

@@ -10,7 +10,11 @@ import lombok.Data;
  * @author Lion Li
  */
 @Data
-@AutoMapper(target = SysTenantVo.class)
+// @AutoMapper(target = SysTenantVo.class)
+// 说明:暂时禁用 AutoMapper 注解,原因是 MapStruct Plus 注解处理器在跨模块编译时
+//       会生成 stub class(Unresolved compilation problem: TenantListVo cannot be resolved to a type),
+//       导致 Spring Boot 启动时 BeanCreationException: ClassNotFoundException: TenantListVo。
+//       多租户功能当前已禁用(tenant.enable=false),待需要恢复多租户时再启用此注解并重新构建。
 public class TenantListVo {
 
     /**

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

@@ -13,7 +13,7 @@ spring.boot.admin.client:
 
 --- # snail-job 配置
 snail-job:
-  enabled: true
+  enabled: false
   # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
   group: "ruoyi_group"
   # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
@@ -47,15 +47,15 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://localhost:3306/risk_control_platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
-          password: root
+          password: pass$123
 #        # 从库数据源
 #        slave:
 #          lazy: true
 #          type: ${spring.datasource.type}
 #          driverClassName: com.mysql.cj.jdbc.Driver
-#          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          url: jdbc:mysql://localhost:3306/risk_control?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
 #          username:
 #          password:
 #        oracle:
@@ -101,8 +101,8 @@ spring.data:
     port: 6379
     # 数据库索引
     database: 0
-    # redis 密码必须配置
-    password: ruoyi123
+    # redis 密码
+    # password: ruoyi123
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl
@@ -120,6 +120,8 @@ redisson:
   singleServerConfig:
     # 客户端名称 不能用中文
     clientName: RuoYi-Vue-Plus
+    # redis 密码
+    # password: ruoyi123
     # 最小空闲连接数
     connectionMinimumIdleSize: 8
     # 连接池大小

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

@@ -50,9 +50,9 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://localhost:3306/risk_control_platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
-          password: root
+          password: pass$123
 #        # 从库数据源
 #        slave:
 #          lazy: true
@@ -104,8 +104,8 @@ spring.data:
     port: 6379
     # 数据库索引
     database: 0
-    # redis 密码必须配置
-    password: ruoyi123
+    # redis 密码
+    # password: ruoyi123
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl
@@ -123,6 +123,8 @@ redisson:
   singleServerConfig:
     # 客户端名称 不能用中文
     clientName: RuoYi-Vue-Plus
+    # redis 密码
+    # password: ruoyi123
     # 最小空闲连接数
     connectionMinimumIdleSize: 32
     # 连接池大小

+ 38 - 5
ruoyi-admin/src/main/resources/application.yml

@@ -1,7 +1,7 @@
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8080
+  port: 9225
   servlet:
     # 应用的访问路径
     context-path: /
@@ -22,7 +22,7 @@ server:
 
 captcha:
   # 是否启用验证码校验
-  enable: true
+  enable: false
   # 验证码类型 math 数组计算 char 字符验证
   type: math
   # 数字验证码位数
@@ -72,9 +72,9 @@ spring:
   servlet:
     multipart:
       # 单个文件大小
-      max-file-size: 10MB
+      max-file-size: 50MB
       # 设置总上传的文件大小
-      max-request-size: 20MB
+      max-request-size: 100MB
   mvc:
     # 设置静态资源路径 防止所有请求都去查静态资源
     static-path-pattern: /static/**
@@ -91,6 +91,11 @@ spring:
     deserialization:
       # 允许对象忽略json中不存在的属性
       fail_on_unknown_properties: false
+  # 排除 MailSender 自动配置(jar 中 MailProperties 加载异常)
+  autoconfigure:
+    exclude:
+      - org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration
+      - org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration
 
 # Sa-Token配置
 sa-token:
@@ -116,11 +121,22 @@ security:
     - /*/api-docs
     - /*/api-docs/**
     - /warm-flow-ui/config
+    # 认证接口必须排除拦截,否则未登录用户无法登录
+    - /auth/login
+    - /auth/logout
+    - /auth/register
+    - /auth/code
+    - /auth/smsCode
+    - /auth/tenant/list
+    - /auth/social/callback/*
+    - /resource/sse/close
+    - /resource/sse
+    - /captchaImage
 
 # 多租户配置
 tenant:
   # 是否开启
-  enable: true
+  enable: false
   # 排除表
   excludes:
     - sys_menu
@@ -262,3 +278,20 @@ warm-flow:
   node-tooltip: true
   # 默认Authorization,如果有多个token,用逗号分隔
   token-name: ${sa-token.token-name},clientid
+
+--- # MinIO 文件存储配置
+minio:
+  # MinIO 服务端点
+  endpoint: http://106.55.100.207:9000
+  # 访问密钥
+  access-key: rjzytest
+  # 私有密钥(同 access-key)
+  secret-key: rjzytest
+  # 默认存储桶
+  bucket: rjzytest
+  # 是否使用 HTTPS
+  secure: false
+  # 公开访问 URL 前缀
+  public-url: http://106.55.100.207:9000/rjzytest
+  # 文件上传最大大小
+  max-file-size: 100MB

+ 1 - 0
ruoyi-modules/pom.xml

@@ -13,6 +13,7 @@
         <module>ruoyi-demo</module>
         <module>ruoyi-generator</module>
         <module>ruoyi-job</module>
+        <module>ruoyi-risk</module>
         <module>ruoyi-system</module>
         <module>ruoyi-workflow</module>
     </modules>

+ 96 - 0
ruoyi-modules/ruoyi-risk/pom.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>ruoyi-risk</artifactId>
+    <description>风控平台</description>
+
+    <dependencies>
+        <!-- 通用工具 -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-excel</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-ratelimiter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-satoken</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <!-- 系统模块 -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <!-- MinIO Java SDK:风控平台文件上传专用 -->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.5.7</version>
+            <exclusions>
+                <!-- 排除 minio 拉的低版本 bcprov,与主项目 1.83 冲突 -->
+                <exclusion>
+                    <groupId>org.bouncycastle</groupId>
+                    <artifactId>bcprov-jdk18on</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.bouncycastle</groupId>
+                    <artifactId>bcpkix-jdk18on</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.bouncycastle</groupId>
+                    <artifactId>bcutil-jdk18on</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+</project>

+ 60 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/config/MinioProperties.java

@@ -0,0 +1,60 @@
+package org.dromara.risk.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * MinIO 配置属性
+ * <p>
+ * 风控平台专用 MinIO 客户端配置,支持 application.yml 中以 minio 前缀覆盖默认值。
+ * </p>
+ *
+ * @author ruoyi
+ */
+@Slf4j
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "minio")
+public class MinioProperties {
+
+    /**
+     * 访问站点(Endpoint),默认风控平台测试环境
+     */
+    private String endpoint = "http://106.55.100.207:9000";
+
+    /**
+     * AccessKey
+     */
+    private String accessKey = "rjzytest";
+
+    /**
+     * SecretKey
+     */
+    private String secretKey = "rjzytest";
+
+    /**
+     * 桶名称(Bucket),默认 rjzytest
+     */
+    private String bucket = "rjzytest";
+
+    /**
+     * 公开访问URL前缀
+     */
+    private String publicUrl = "http://106.55.100.207:9000/rjzytest";
+
+    /**
+     * 注册 MinioClient Bean
+     */
+    @Bean
+    public MinioClient minioClient() {
+        log.info("[MinIO] 初始化 MinioClient, endpoint = {}, bucket = {}", endpoint, bucket);
+        return MinioClient.builder()
+            .endpoint(endpoint)
+            .credentials(accessKey, secretKey)
+            .build();
+    }
+}

+ 59 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/DashboardController.java

@@ -0,0 +1,59 @@
+package org.dromara.risk.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.risk.domain.vo.DashboardStatsVo;
+import org.dromara.risk.domain.vo.RecentDangerVo;
+import org.dromara.risk.domain.vo.RecentNoticeVo;
+import org.dromara.risk.domain.vo.RecentTrainingVo;
+import org.dromara.risk.service.IDashboardService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 风控平台 Dashboard 统计接口
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/dashboard")
+public class DashboardController {
+
+    private final IDashboardService dashboardService;
+
+    /**
+     * 获取工作台统计数据
+     */
+    @GetMapping("/stats")
+    public R<DashboardStatsVo> getStats() {
+        return R.ok(dashboardService.getStats());
+    }
+
+    /**
+     * 获取最新安全隐患列表
+     */
+    @GetMapping("/recent/dangers")
+    public R<List<RecentDangerVo>> recentDangers() {
+        return R.ok(dashboardService.getRecentDangers(5));
+    }
+
+    /**
+     * 获取近期安全培训列表
+     */
+    @GetMapping("/recent/trainings")
+    public R<List<RecentTrainingVo>> recentTrainings() {
+        return R.ok(dashboardService.getRecentTrainings(3));
+    }
+
+    /**
+     * 获取最近公告列表
+     */
+    @GetMapping("/recent/notices")
+    public R<List<RecentNoticeVo>> recentNotices() {
+        return R.ok(dashboardService.getRecentNotices(3));
+    }
+}

+ 130 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskAccidentController.java

@@ -0,0 +1,130 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskAccidentBo;
+import org.dromara.risk.domain.vo.AccidentStatsVo;
+import org.dromara.risk.domain.vo.AccidentTrendVo;
+import org.dromara.risk.domain.vo.RiskAccidentVo;
+import org.dromara.risk.service.IRiskAccidentService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 事故上报
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/accident")
+public class RiskAccidentController extends BaseController {
+
+    private final IRiskAccidentService accidentService;
+
+    /**
+     * 查询事故列表
+     */
+    @SaCheckPermission("risk:accident:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskAccidentVo> list(RiskAccidentBo bo, PageQuery pageQuery) {
+        return accidentService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取事故详细信息
+     *
+     * @param id 事故ID
+     */
+    @SaCheckPermission("risk:accident:list")
+    @GetMapping("/{id}")
+    public R<RiskAccidentVo> getInfo(@NotNull(message = "事故ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(accidentService.queryById(id));
+    }
+
+    /**
+     * 新增事故
+     */
+    @SaCheckPermission("risk:accident:add")
+    @Log(title = "事故上报", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskAccidentBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            // 编号由系统生成,无需前端传入
+            bo.setAccidentCode(null);
+        }
+        return toAjax(accidentService.insertByBo(bo));
+    }
+
+    /**
+     * 修改事故
+     */
+    @SaCheckPermission("risk:accident:edit")
+    @Log(title = "事故上报", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskAccidentBo bo) {
+        return toAjax(accidentService.updateByBo(bo));
+    }
+
+    /**
+     * 删除事故
+     *
+     * @param ids 事故ID串
+     */
+    @SaCheckPermission("risk:accident:remove")
+    @Log(title = "事故上报", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "事故ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(accidentService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出事故列表
+     */
+    @SaCheckPermission("risk:accident:export")
+    @Log(title = "事故上报", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskAccidentBo bo, HttpServletResponse response) {
+        List<RiskAccidentVo> list = accidentService.queryList(bo);
+        ExcelUtil.exportExcel(list, "事故上报数据", RiskAccidentVo.class, response);
+    }
+
+    /**
+     * 查询事故统计数据(顶部 4 张卡片)
+     */
+    @SaCheckPermission("risk:accident:list")
+    @GetMapping("/stats")
+    public R<AccidentStatsVo> stats() {
+        return R.ok(accidentService.queryStats());
+    }
+
+    /**
+     * 查询近12个月事故趋势数据
+     */
+    @SaCheckPermission("risk:accident:list")
+    @GetMapping("/trend")
+    public R<List<AccidentTrendVo>> trend() {
+        return R.ok(accidentService.query12MonthTrend());
+    }
+
+}

+ 103 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskAuditFileController.java

@@ -0,0 +1,103 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskAuditFileBo;
+import org.dromara.risk.domain.vo.RiskAuditFileVo;
+import org.dromara.risk.service.IRiskAuditFileService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 审计文件
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/auditFile")
+public class RiskAuditFileController extends BaseController {
+
+    private final IRiskAuditFileService auditFileService;
+
+    /**
+     * 查询审计文件列表
+     */
+    @SaCheckPermission("risk:auditFile:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskAuditFileVo> list(RiskAuditFileBo bo, PageQuery pageQuery) {
+        return auditFileService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取审计文件详细信息
+     *
+     * @param id 文件ID
+     */
+    @SaCheckPermission("risk:auditFile:list")
+    @GetMapping("/{id}")
+    public R<RiskAuditFileVo> getInfo(@NotNull(message = "文件ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(auditFileService.queryById(id));
+    }
+
+    /**
+     * 新增审计文件(上传文件信息)
+     */
+    @SaCheckPermission("risk:auditFile:add")
+    @Log(title = "审计文件", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskAuditFileBo bo) {
+        return toAjax(auditFileService.insertByBo(bo));
+    }
+
+    /**
+     * 修改审计文件
+     */
+    @SaCheckPermission("risk:auditFile:edit")
+    @Log(title = "审计文件", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskAuditFileBo bo) {
+        return toAjax(auditFileService.updateByBo(bo));
+    }
+
+    /**
+     * 删除审计文件
+     *
+     * @param ids 文件ID串
+     */
+    @SaCheckPermission("risk:auditFile:remove")
+    @Log(title = "审计文件", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "文件ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(auditFileService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 根据人员变动ID查询文件列表
+     *
+     * @param changeId 人员变动ID
+     */
+    @SaCheckPermission("risk:auditFile:list")
+    @GetMapping("/listByChange/{changeId}")
+    public R<List<RiskAuditFileVo>> listByChangeId(@NotNull(message = "人员变动ID不能为空") @PathVariable("changeId") Long changeId) {
+        return R.ok(auditFileService.queryListByChangeId(changeId));
+    }
+
+}

+ 110 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskDangerSourceController.java

@@ -0,0 +1,110 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskDangerSourceBo;
+import org.dromara.risk.domain.vo.RiskDangerSourceVo;
+import org.dromara.risk.service.IRiskDangerSourceService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 危险源上报
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/dangerSource")
+public class RiskDangerSourceController extends BaseController {
+
+    private final IRiskDangerSourceService dangerSourceService;
+
+    /**
+     * 查询危险源列表
+     */
+    @SaCheckPermission("risk:dangerSource:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskDangerSourceVo> list(RiskDangerSourceBo bo, PageQuery pageQuery) {
+        return dangerSourceService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取危险源详细信息
+     *
+     * @param id 危险源ID
+     */
+    @SaCheckPermission("risk:dangerSource:list")
+    @GetMapping("/{id}")
+    public R<RiskDangerSourceVo> getInfo(@NotNull(message = "危险源ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(dangerSourceService.queryById(id));
+    }
+
+    /**
+     * 新增危险源
+     */
+    @SaCheckPermission("risk:dangerSource:add")
+    @Log(title = "危险源上报", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskDangerSourceBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            // 编号由系统生成,无需前端传入
+            bo.setSourceCode(null);
+        }
+        return toAjax(dangerSourceService.insertByBo(bo));
+    }
+
+    /**
+     * 修改危险源
+     */
+    @SaCheckPermission("risk:dangerSource:edit")
+    @Log(title = "危险源上报", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskDangerSourceBo bo) {
+        return toAjax(dangerSourceService.updateByBo(bo));
+    }
+
+    /**
+     * 删除危险源
+     *
+     * @param ids 危险源ID串
+     */
+    @SaCheckPermission("risk:dangerSource:remove")
+    @Log(title = "危险源上报", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "危险源ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(dangerSourceService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出危险源列表
+     */
+    @SaCheckPermission("risk:dangerSource:export")
+    @Log(title = "危险源上报", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskDangerSourceBo bo, HttpServletResponse response) {
+        List<RiskDangerSourceVo> list = dangerSourceService.queryList(bo);
+        ExcelUtil.exportExcel(list, "危险源数据", RiskDangerSourceVo.class, response);
+    }
+
+}

+ 116 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskEquipmentMaintenanceController.java

@@ -0,0 +1,116 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskEquipmentMaintenanceBo;
+import org.dromara.risk.domain.vo.RiskEquipmentMaintenanceVo;
+import org.dromara.risk.service.IRiskEquipmentMaintenanceService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 设备维护记录
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/equipmentMaintenance")
+public class RiskEquipmentMaintenanceController extends BaseController {
+
+    private final IRiskEquipmentMaintenanceService equipmentMaintenanceService;
+
+    /**
+     * 查询设备维护记录列表
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskEquipmentMaintenanceVo> list(RiskEquipmentMaintenanceBo bo, PageQuery pageQuery) {
+        return equipmentMaintenanceService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取设备维护记录详细信息
+     *
+     * @param id 记录ID
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:list")
+    @GetMapping("/{id}")
+    public R<RiskEquipmentMaintenanceVo> getInfo(@NotNull(message = "记录ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(equipmentMaintenanceService.queryById(id));
+    }
+
+    /**
+     * 新增设备维护记录
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:add")
+    @Log(title = "设备维护记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskEquipmentMaintenanceBo bo) {
+        return toAjax(equipmentMaintenanceService.insertByBo(bo));
+    }
+
+    /**
+     * 修改设备维护记录
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:edit")
+    @Log(title = "设备维护记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskEquipmentMaintenanceBo bo) {
+        return toAjax(equipmentMaintenanceService.updateByBo(bo));
+    }
+
+    /**
+     * 删除设备维护记录
+     *
+     * @param ids 记录ID串
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:remove")
+    @Log(title = "设备维护记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "记录ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(equipmentMaintenanceService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出设备维护记录列表
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:export")
+    @Log(title = "设备维护记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskEquipmentMaintenanceBo bo, HttpServletResponse response) {
+        List<RiskEquipmentMaintenanceVo> list = equipmentMaintenanceService.queryList(bo);
+        ExcelUtil.exportExcel(list, "设备维护记录数据", RiskEquipmentMaintenanceVo.class, response);
+    }
+
+    /**
+     * 根据设备ID查询维护记录列表
+     *
+     * @param equipmentId 设备ID
+     */
+    @SaCheckPermission("risk:equipmentMaintenance:list")
+    @GetMapping("/listByEquipment/{equipmentId}")
+    public R<List<RiskEquipmentMaintenanceVo>> listByEquipmentId(@NotNull(message = "设备ID不能为空") @PathVariable("equipmentId") Long equipmentId) {
+        return R.ok(equipmentMaintenanceService.queryListByEquipmentId(equipmentId));
+    }
+
+}

+ 285 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskFileController.java

@@ -0,0 +1,285 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.StrUtil;
+import io.minio.BucketExistsArgs;
+import io.minio.MakeBucketArgs;
+import io.minio.MinioClient;
+import io.minio.PutObjectArgs;
+import io.minio.RemoveObjectArgs;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.config.MinioProperties;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * 风控平台 文件上传 控制器
+ * <p>
+ * 直接使用 MinIO Java SDK 上传文件到 MinIO 服务器,适用于风控业务模块的附件管理。
+ * </p>
+ *
+ * @author ruoyi
+ */
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/file")
+public class RiskFileController extends BaseController {
+
+    /** 允许上传的文件扩展名集合(小写) */
+    private static final Set<String> ALLOWED_EXTS = Set.of(
+        "jpg", "jpeg", "png", "pdf", "doc", "docx", "xls", "xlsx"
+    );
+
+    /** 单个文件最大大小 100MB */
+    private static final long MAX_FILE_SIZE = 100L * 1024 * 1024;
+
+    private final MinioClient minioClient;
+    private final MinioProperties minioProperties;
+
+    /**
+     * 通用文件上传
+     *
+     * @param file 上传的文件
+     * @return { url, fileName, ossId, originalName }
+     */
+    @SaCheckPermission("risk:file:upload")
+    @Log(title = "风控文件上传", businessType = BusinessType.INSERT)
+    @RepeatSubmit(interval = 2000, message = "请勿重复上传")
+    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Map<String, String>> upload(@RequestPart("file") MultipartFile file) {
+        if (file == null || file.isEmpty()) {
+            return R.fail("上传文件不能为空");
+        }
+        try {
+            // 1. 校验文件大小
+            if (file.getSize() > MAX_FILE_SIZE) {
+                return R.fail("文件大小超过限制(最大100MB)");
+            }
+
+            String originalName = file.getOriginalFilename();
+            if (StrUtil.isBlank(originalName)) {
+                return R.fail("文件名不能为空");
+            }
+
+            // 2. 校验文件扩展名
+            String ext = getAndValidateExt(originalName);
+
+            // 3. 生成对象名: risk/{yyyy/MM/dd}/{uuid}.{ext}
+            String objectName = buildObjectName(ext);
+
+            // 4. 确保桶存在
+            ensureBucket();
+
+            // 5. 上传文件流
+            try (InputStream in = file.getInputStream()) {
+                minioClient.putObject(
+                    PutObjectArgs.builder()
+                        .bucket(minioProperties.getBucket())
+                        .object(objectName)
+                        .stream(in, file.getSize(), -1)
+                        .contentType(file.getContentType())
+                        .build()
+                );
+            }
+
+            // 6. 组装返回数据
+            String fileUrl = buildFileUrl(objectName);
+            String ossId = UUID.randomUUID().toString().replace("-", "");
+
+            Map<String, String> result = new HashMap<>(4);
+            result.put("url", fileUrl);
+            result.put("fileName", objectName);
+            result.put("ossId", ossId);
+            result.put("originalName", originalName);
+            return R.ok("文件上传成功", result);
+        } catch (ServiceException e) {
+            throw e;
+        } catch (Exception e) {
+            log.error("[MinIO] 文件上传失败", e);
+            return R.fail("文件上传失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 多文件上传
+     *
+     * @param files 文件数组
+     * @return { urls: string[] }
+     */
+    @SaCheckPermission("risk:file:upload")
+    @Log(title = "风控文件批量上传", businessType = BusinessType.INSERT)
+    @RepeatSubmit(interval = 3000, message = "请勿重复上传")
+    @PostMapping(value = "/uploads", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Map<String, Object>> uploads(@RequestPart("files") MultipartFile[] files) {
+        if (files == null || files.length == 0) {
+            return R.fail("上传文件不能为空");
+        }
+        List<String> urlList = new ArrayList<>(files.length);
+        List<String> failList = new ArrayList<>();
+        try {
+            ensureBucket();
+        } catch (Exception e) {
+            log.error("[MinIO] 检查桶是否存在失败", e);
+            return R.fail("初始化存储失败: " + e.getMessage());
+        }
+        for (MultipartFile file : files) {
+            try {
+                if (file.isEmpty() || file.getSize() > MAX_FILE_SIZE) {
+                    failList.add(file.getOriginalFilename());
+                    continue;
+                }
+                String originalName = file.getOriginalFilename();
+                if (StrUtil.isBlank(originalName)) {
+                    failList.add("");
+                    continue;
+                }
+                String ext = getAndValidateExt(originalName);
+                String objectName = buildObjectName(ext);
+                try (InputStream in = file.getInputStream()) {
+                    minioClient.putObject(
+                        PutObjectArgs.builder()
+                            .bucket(minioProperties.getBucket())
+                            .object(objectName)
+                            .stream(in, file.getSize(), -1)
+                            .contentType(file.getContentType())
+                            .build()
+                    );
+                }
+                urlList.add(buildFileUrl(objectName));
+            } catch (Exception e) {
+                log.error("[MinIO] 多文件上传时子文件失败: {}", file.getOriginalFilename(), e);
+                failList.add(file.getOriginalFilename());
+            }
+        }
+        Map<String, Object> data = new HashMap<>(3);
+        data.put("urls", urlList);
+        data.put("successCount", urlList.size());
+        data.put("failCount", failList.size());
+        if (!failList.isEmpty()) {
+            data.put("failedFiles", failList);
+        }
+        return R.ok("批量上传完成", data);
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param fileName 对象名(对象存储中的相对路径)
+     */
+    @SaCheckPermission("risk:file:remove")
+    @Log(title = "风控文件删除", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{fileName}")
+    public R<Map<String, Boolean>> remove(@PathVariable("fileName") String fileName) {
+        if (StrUtil.isBlank(fileName)) {
+            return R.fail("文件名不能为空");
+        }
+        try {
+            minioClient.removeObject(
+                RemoveObjectArgs.builder()
+                    .bucket(minioProperties.getBucket())
+                    .object(fileName)
+                    .build()
+            );
+            Map<String, Boolean> result = new HashMap<>(1);
+            result.put("success", true);
+            return R.ok("文件删除成功", result);
+        } catch (Exception e) {
+            log.error("[MinIO] 文件删除失败: {}", fileName, e);
+            Map<String, Boolean> result = new HashMap<>(1);
+            result.put("success", false);
+            return R.fail("文件删除失败: " + e.getMessage(), result);
+        }
+    }
+
+    /**
+     * 获取 MinIO 客户端配置
+     */
+    @GetMapping("/config")
+    public R<Map<String, String>> config() {
+        Map<String, String> data = new HashMap<>(3);
+        data.put("endpoint", minioProperties.getEndpoint());
+        data.put("bucket", minioProperties.getBucket());
+        data.put("publicUrl", minioProperties.getPublicUrl());
+        return R.ok(data);
+    }
+
+    // ============================ 私有方法 ============================
+
+    /**
+     * 校验并获取文件扩展名(小写)
+     */
+    private String getAndValidateExt(String originalName) {
+        int idx = originalName.lastIndexOf('.');
+        if (idx < 0 || idx == originalName.length() - 1) {
+            throw new ServiceException("文件类型不支持: " + originalName);
+        }
+        String ext = originalName.substring(idx + 1).toLowerCase();
+        if (!ALLOWED_EXTS.contains(ext)) {
+            throw new ServiceException("仅支持以下文件类型: " + ALLOWED_EXTS);
+        }
+        return ext;
+    }
+
+    /**
+     * 生成对象名: risk/yyyy/MM/dd/{uuid}.{ext}
+     */
+    private String buildObjectName(String ext) {
+        String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
+        String uuid = UUID.randomUUID().toString().replace("-", "");
+        return "risk/" + datePath + "/" + uuid + "." + ext;
+    }
+
+    /**
+     * 拼装完整访问URL
+     */
+    private String buildFileUrl(String objectName) {
+        String publicUrl = minioProperties.getPublicUrl();
+        if (publicUrl.endsWith("/")) {
+            return publicUrl + objectName;
+        }
+        return publicUrl + "/" + objectName;
+    }
+
+    /**
+     * 检查并创建桶
+     */
+    private void ensureBucket() throws Exception {
+        String bucket = minioProperties.getBucket();
+        boolean exists = minioClient.bucketExists(
+            BucketExistsArgs.builder().bucket(bucket).build()
+        );
+        if (!exists) {
+            minioClient.makeBucket(
+                MakeBucketArgs.builder().bucket(bucket).build()
+            );
+            log.info("[MinIO] 创建桶: {}", bucket);
+        }
+    }
+}

+ 149 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskHiddenDangerController.java

@@ -0,0 +1,149 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskHiddenDangerBo;
+import org.dromara.risk.domain.vo.RiskHiddenDangerVo;
+import org.dromara.risk.service.IRiskHiddenDangerService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 安全隐患
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/hiddenDanger")
+public class RiskHiddenDangerController extends BaseController {
+
+    private final IRiskHiddenDangerService hiddenDangerService;
+
+    /**
+     * 查询安全隐患列表
+     */
+    @SaCheckPermission("risk:hiddenDanger:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskHiddenDangerVo> list(RiskHiddenDangerBo bo, PageQuery pageQuery) {
+        return hiddenDangerService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取安全隐患详细信息
+     *
+     * @param id 隐患ID
+     */
+    @SaCheckPermission("risk:hiddenDanger:list")
+    @GetMapping("/{id}")
+    public R<RiskHiddenDangerVo> getInfo(@NotNull(message = "隐患ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(hiddenDangerService.queryById(id));
+    }
+
+    /**
+     * 新增安全隐患
+     */
+    @SaCheckPermission("risk:hiddenDanger:add")
+    @Log(title = "安全隐患", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskHiddenDangerBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            // 编号由系统生成,无需前端传入
+            bo.setDangerCode(null);
+        }
+        return toAjax(hiddenDangerService.insertByBo(bo));
+    }
+
+    /**
+     * 修改安全隐患
+     */
+    @SaCheckPermission("risk:hiddenDanger:edit")
+    @Log(title = "安全隐患", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskHiddenDangerBo bo) {
+        return toAjax(hiddenDangerService.updateByBo(bo));
+    }
+
+    /**
+     * 删除安全隐患
+     *
+     * @param ids 隐患ID串
+     */
+    @SaCheckPermission("risk:hiddenDanger:remove")
+    @Log(title = "安全隐患", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "隐患ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(hiddenDangerService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出安全隐患列表
+     */
+    @SaCheckPermission("risk:hiddenDanger:export")
+    @Log(title = "安全隐患", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskHiddenDangerBo bo, HttpServletResponse response) {
+        List<RiskHiddenDangerVo> list = hiddenDangerService.queryList(bo);
+        ExcelUtil.exportExcel(list, "安全隐患数据", RiskHiddenDangerVo.class, response);
+    }
+
+    /**
+     * 获取隐患统计数据
+     */
+    @SaCheckPermission("risk:hiddenDanger:list")
+    @GetMapping("/stats")
+    public R<Map<String, Object>> stats() {
+        return R.ok(hiddenDangerService.getStats());
+    }
+
+    /**
+     * 获取风险等级统计数据
+     */
+    @SaCheckPermission("risk:hiddenDanger:list")
+    @GetMapping("/stats/dangerLevel")
+    public R<Map<String, Object>> dangerLevelStats() {
+        return R.ok(hiddenDangerService.getRiskLevelStats());
+    }
+
+    /**
+     * 获取隐患类型统计数据
+     */
+    @SaCheckPermission("risk:hiddenDanger:list")
+    @GetMapping("/stats/dangerType")
+    public R<Map<String, Object>> dangerTypeStats() {
+        return R.ok(hiddenDangerService.getDangerTypeStats());
+    }
+
+    /**
+     * 处理隐患
+     */
+    @SaCheckPermission("risk:hiddenDanger:edit")
+    @Log(title = "安全隐患", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/handle/{id}")
+    public R<Void> handle(@PathVariable("id") Long id, @RequestBody RiskHiddenDangerBo bo) {
+        return toAjax(hiddenDangerService.handleDanger(id, bo.getHandleStatus(), bo.getHandlerName(), bo.getHandleResult()));
+    }
+
+}

+ 125 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskInspectionTaskController.java

@@ -0,0 +1,125 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskInspectionTaskBo;
+import org.dromara.risk.domain.vo.InspectionStatsVo;
+import org.dromara.risk.domain.vo.RiskInspectionTaskVo;
+import org.dromara.risk.domain.vo.RiskInspectionRecordVo;
+import org.dromara.risk.service.IRiskInspectionTaskService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 巡检任务
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/inspectionTask")
+public class RiskInspectionTaskController extends BaseController {
+
+    private final IRiskInspectionTaskService inspectionTaskService;
+
+    /**
+     * 查询巡检任务列表
+     */
+    @SaCheckPermission("risk:inspectionTask:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskInspectionTaskVo> list(RiskInspectionTaskBo bo, PageQuery pageQuery) {
+        return inspectionTaskService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取巡检任务详细信息(含巡检项目列表)
+     *
+     * @param id 任务ID
+     */
+    @SaCheckPermission("risk:inspectionTask:list")
+    @GetMapping("/{id}")
+    public R<RiskInspectionTaskVo> getInfo(@NotNull(message = "任务ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(inspectionTaskService.queryById(id));
+    }
+
+    /**
+     * 新增巡检任务
+     */
+    @SaCheckPermission("risk:inspectionTask:add")
+    @Log(title = "巡检任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskInspectionTaskBo bo) {
+        return toAjax(inspectionTaskService.insertByBo(bo));
+    }
+
+    /**
+     * 修改巡检任务
+     */
+    @SaCheckPermission("risk:inspectionTask:edit")
+    @Log(title = "巡检任务", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskInspectionTaskBo bo) {
+        return toAjax(inspectionTaskService.updateByBo(bo));
+    }
+
+    /**
+     * 删除巡检任务
+     *
+     * @param ids 任务ID串
+     */
+    @SaCheckPermission("risk:inspectionTask:remove")
+    @Log(title = "巡检任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "任务ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(inspectionTaskService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出巡检任务列表
+     */
+    @SaCheckPermission("risk:inspectionTask:export")
+    @Log(title = "巡检任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskInspectionTaskBo bo, HttpServletResponse response) {
+        List<RiskInspectionTaskVo> list = inspectionTaskService.queryList(bo);
+        ExcelUtil.exportExcel(list, "巡检任务数据", RiskInspectionTaskVo.class, response);
+    }
+
+    /**
+     * 查询统计数据(顶部4张卡片)
+     */
+    @SaCheckPermission("risk:inspectionTask:list")
+    @GetMapping("/stats")
+    public R<InspectionStatsVo> stats() {
+        return R.ok(inspectionTaskService.queryStats());
+    }
+
+    /**
+     * 查询任务的打卡记录列表
+     */
+    @SaCheckPermission("risk:inspectionTask:list")
+    @GetMapping("/records/{taskId}")
+    public R<List<RiskInspectionRecordVo>> records(@NotNull(message = "任务ID不能为空") @PathVariable("taskId") Long taskId) {
+        return R.ok(inspectionTaskService.queryRecordListByTaskId(taskId));
+    }
+
+}

+ 127 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPersonnelCertController.java

@@ -0,0 +1,127 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskPersonnelCertBo;
+import org.dromara.risk.domain.vo.RiskPersonnelCertVo;
+import org.dromara.risk.service.IRiskPersonnelCertService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 人员证书
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/personnelCert")
+public class RiskPersonnelCertController extends BaseController {
+
+    private final IRiskPersonnelCertService certService;
+
+    /**
+     * 查询人员证书列表
+     */
+    @SaCheckPermission("risk:personnelCert:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskPersonnelCertVo> list(RiskPersonnelCertBo bo, PageQuery pageQuery) {
+        return certService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 根据人员ID查询证书列表
+     *
+     * @param personnelId 人员ID
+     */
+    @SaCheckPermission("risk:personnelCert:list")
+    @GetMapping("/listByPersonnel/{personnelId}")
+    public R<List<RiskPersonnelCertVo>> listByPersonnel(@NotNull(message = "人员ID不能为空") @PathVariable("personnelId") Long personnelId) {
+        return R.ok(certService.queryListByPersonnelId(personnelId));
+    }
+
+    /**
+     * 获取人员证书详细信息
+     *
+     * @param id 证书ID
+     */
+    @SaCheckPermission("risk:personnelCert:list")
+    @GetMapping("/{id}")
+    public R<RiskPersonnelCertVo> getInfo(@NotNull(message = "证书ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(certService.queryById(id));
+    }
+
+    /**
+     * 新增人员证书
+     */
+    @SaCheckPermission("risk:personnelCert:add")
+    @Log(title = "人员证书", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskPersonnelCertBo bo) {
+        return toAjax(certService.insertByBo(bo));
+    }
+
+    /**
+     * 批量新增人员证书
+     */
+    @SaCheckPermission("risk:personnelCert:add")
+    @Log(title = "人员证书", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/batch")
+    public R<Void> addBatch(@RequestParam("personnelId") Long personnelId, @RequestBody List<RiskPersonnelCertBo> bos) {
+        return toAjax(certService.insertBatchByBo(personnelId, bos));
+    }
+
+    /**
+     * 修改人员证书
+     */
+    @SaCheckPermission("risk:personnelCert:edit")
+    @Log(title = "人员证书", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskPersonnelCertBo bo) {
+        return toAjax(certService.updateByBo(bo));
+    }
+
+    /**
+     * 删除人员证书
+     *
+     * @param ids 证书ID串
+     */
+    @SaCheckPermission("risk:personnelCert:remove")
+    @Log(title = "人员证书", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "证书ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(certService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出人员证书列表
+     */
+    @SaCheckPermission("risk:personnelCert:export")
+    @Log(title = "人员证书", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskPersonnelCertBo bo, HttpServletResponse response) {
+        List<RiskPersonnelCertVo> list = certService.queryList(bo);
+        ExcelUtil.exportExcel(list, "人员证书数据", RiskPersonnelCertVo.class, response);
+    }
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPersonnelChangeController.java

@@ -0,0 +1,109 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskPersonnelChangeBo;
+import org.dromara.risk.domain.vo.RiskPersonnelChangeVo;
+import org.dromara.risk.service.IRiskPersonnelChangeService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 人员变动
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/personnelChange")
+public class RiskPersonnelChangeController extends BaseController {
+
+    private final IRiskPersonnelChangeService personnelChangeService;
+
+    /**
+     * 查询人员变动列表
+     */
+    @SaCheckPermission("risk:personnelChange:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskPersonnelChangeVo> list(RiskPersonnelChangeBo bo, PageQuery pageQuery) {
+        return personnelChangeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取人员变动详细信息
+     *
+     * @param id 人员变动ID
+     */
+    @SaCheckPermission("risk:personnelChange:list")
+    @GetMapping("/{id}")
+    public R<RiskPersonnelChangeVo> getInfo(@NotNull(message = "人员变动ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(personnelChangeService.queryById(id));
+    }
+
+    /**
+     * 新增人员变动
+     */
+    @SaCheckPermission("risk:personnelChange:add")
+    @Log(title = "人员变动", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskPersonnelChangeBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            bo.setAuditStatus(null);
+        }
+        return toAjax(personnelChangeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改人员变动
+     */
+    @SaCheckPermission("risk:personnelChange:edit")
+    @Log(title = "人员变动", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskPersonnelChangeBo bo) {
+        return toAjax(personnelChangeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除人员变动
+     *
+     * @param ids 人员变动ID串
+     */
+    @SaCheckPermission("risk:personnelChange:remove")
+    @Log(title = "人员变动", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "人员变动ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(personnelChangeService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出人员变动列表
+     */
+    @SaCheckPermission("risk:personnelChange:export")
+    @Log(title = "人员变动", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskPersonnelChangeBo bo, HttpServletResponse response) {
+        List<RiskPersonnelChangeVo> list = personnelChangeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "人员变动数据", RiskPersonnelChangeVo.class, response);
+    }
+
+}

+ 189 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPersonnelController.java

@@ -0,0 +1,189 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskPersonnelBo;
+import org.dromara.risk.domain.bo.RiskPersonnelCertBo;
+import org.dromara.risk.domain.vo.RiskPersonnelVo;
+import org.dromara.risk.service.IRiskPersonnelService;
+import org.dromara.risk.service.IRiskPersonnelCertService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 人员信息
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/personnel")
+public class RiskPersonnelController extends BaseController {
+
+    private final IRiskPersonnelService personnelService;
+    private final IRiskPersonnelCertService certService;
+
+    /**
+     * 查询人员信息列表
+     */
+    @SaCheckPermission("risk:personnel:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskPersonnelVo> list(RiskPersonnelBo bo, PageQuery pageQuery) {
+        return personnelService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取人员信息详细信息
+     *
+     * @param id 人员ID
+     */
+    @SaCheckPermission("risk:personnel:list")
+    @GetMapping("/{id}")
+    public R<RiskPersonnelVo> getInfo(@NotNull(message = "人员ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(personnelService.queryById(id));
+    }
+
+    /**
+     * 新增人员信息
+     */
+    @SaCheckPermission("risk:personnel:add")
+    @Log(title = "人员信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskPersonnelBo bo) {
+        return toAjax(personnelService.insertByBo(bo));
+    }
+
+    /**
+     * 修改人员信息
+     */
+    @SaCheckPermission("risk:personnel:edit")
+    @Log(title = "人员信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskPersonnelBo bo) {
+        return toAjax(personnelService.updateByBo(bo));
+    }
+
+    /**
+     * 删除人员信息
+     *
+     * @param ids 人员ID串
+     */
+    @SaCheckPermission("risk:personnel:remove")
+    @Log(title = "人员信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "人员ID不能为空") @PathVariable Long[] ids) {
+        // 级联删除该人员下的所有证书
+        for (Long id : ids) {
+            certService.deleteByPersonnelId(id);
+        }
+        return toAjax(personnelService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 保存人员信息(含证书列表),适用于新增和修改
+     * 请求体格式: { personnel: {...}, certList: [...] }
+     */
+    @SaCheckPermission("risk:personnel:add")
+    @Log(title = "人员信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/saveWithCerts")
+    public R<Long> saveWithCerts(@RequestBody Map<String, Object> payload) {
+        RiskPersonnelBo personnel = org.springframework.beans.BeanUtils
+            .instantiateClass(RiskPersonnelBo.class);
+        if (payload.get("personnel") instanceof java.util.Map) {
+            @SuppressWarnings("unchecked")
+            java.util.Map<String, Object> map = (java.util.Map<String, Object>) payload.get("personnel");
+            BeanUtil.fillBeanWithMap(map, personnel, true);
+        }
+        // 新增
+        if (personnel.getId() == null) {
+            personnelService.insertByBo(personnel);
+        } else {
+            // 修改
+            personnelService.updateByBo(personnel);
+            // 先删除该人员下的所有证书
+            certService.deleteByPersonnelId(personnel.getId());
+        }
+        // 批量插入证书
+        Object certObj = payload.get("certList");
+        if (certObj instanceof java.util.List) {
+            java.util.List<?> rawList = (java.util.List<?>) certObj;
+            java.util.List<RiskPersonnelCertBo> certBos = new java.util.ArrayList<>();
+            for (Object o : rawList) {
+                if (o instanceof java.util.Map) {
+                    RiskPersonnelCertBo bo = org.springframework.beans.BeanUtils
+                        .instantiateClass(RiskPersonnelCertBo.class);
+                    @SuppressWarnings("unchecked")
+                    java.util.Map<String, Object> m = (java.util.Map<String, Object>) o;
+                    BeanUtil.fillBeanWithMap(m, bo, true);
+                    // certName 必填,缺失时回退到 certType,再缺失则用默认名
+                    if (cn.hutool.core.util.StrUtil.isBlank(bo.getCertName())) {
+                        if (cn.hutool.core.util.StrUtil.isNotBlank(bo.getCertType())) {
+                            bo.setCertName(bo.getCertType());
+                        } else {
+                            bo.setCertName("岗位证书");
+                        }
+                    }
+                    certBos.add(bo);
+                }
+            }
+            if (!certBos.isEmpty()) {
+                certService.insertBatchByBo(personnel.getId(), certBos);
+            }
+        }
+        return R.ok(personnel.getId());
+    }
+
+    /**
+     * 导出人员信息列表
+     */
+    @SaCheckPermission("risk:personnel:export")
+    @Log(title = "人员信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskPersonnelBo bo, HttpServletResponse response) {
+        List<RiskPersonnelVo> list = personnelService.queryList(bo);
+        ExcelUtil.exportExcel(list, "人员信息数据", RiskPersonnelVo.class, response);
+    }
+
+    /**
+     * 校验身份证号是否合法
+     */
+    @SaCheckPermission("risk:personnel:list")
+    @GetMapping("/validateIdCard/{idCard}")
+    public R<Boolean> validateIdCard(@PathVariable("idCard") String idCard) {
+        return R.ok(personnelService.validateIdCard(idCard));
+    }
+
+    /**
+     * 根据身份证号计算年龄
+     */
+    @SaCheckPermission("risk:personnel:list")
+    @GetMapping("/calculateAge/{idCard}")
+    public R<Integer> calculateAge(@PathVariable("idCard") String idCard) {
+        Integer age = personnelService.calculateAge(idCard);
+        return R.ok(ObjectUtil.isNotNull(age) ? age : 0);
+    }
+
+}

+ 149 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskPublicOpinionController.java

@@ -0,0 +1,149 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskPublicOpinionBo;
+import org.dromara.risk.domain.vo.PublicOpinionStatsVo;
+import org.dromara.risk.domain.vo.PublicOpinionTrendVo;
+import org.dromara.risk.domain.vo.RiskPublicOpinionVo;
+import org.dromara.risk.service.IRiskPublicOpinionService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 舆情推送
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/publicOpinion")
+public class RiskPublicOpinionController extends BaseController {
+
+    private final IRiskPublicOpinionService publicOpinionService;
+
+    /**
+     * 查询舆情列表
+     */
+    @SaCheckPermission("risk:publicOpinion:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskPublicOpinionVo> list(RiskPublicOpinionBo bo, PageQuery pageQuery) {
+        return publicOpinionService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取舆情详细信息
+     *
+     * @param id 舆情ID
+     */
+    @SaCheckPermission("risk:publicOpinion:list")
+    @GetMapping("/{id}")
+    public R<RiskPublicOpinionVo> getInfo(@NotNull(message = "舆情ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(publicOpinionService.queryById(id));
+    }
+
+    /**
+     * 新增舆情
+     */
+    @SaCheckPermission("risk:publicOpinion:add")
+    @Log(title = "舆情推送", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskPublicOpinionBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            bo.setStatus("待处理");
+        }
+        return toAjax(publicOpinionService.insertByBo(bo));
+    }
+
+    /**
+     * 修改舆情
+     */
+    @SaCheckPermission("risk:publicOpinion:edit")
+    @Log(title = "舆情推送", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskPublicOpinionBo bo) {
+        return toAjax(publicOpinionService.updateByBo(bo));
+    }
+
+    /**
+     * 删除舆情
+     *
+     * @param ids 舆情ID串
+     */
+    @SaCheckPermission("risk:publicOpinion:remove")
+    @Log(title = "舆情推送", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "舆情ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(publicOpinionService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出舆情列表
+     */
+    @SaCheckPermission("risk:publicOpinion:export")
+    @Log(title = "舆情推送", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskPublicOpinionBo bo, HttpServletResponse response) {
+        List<RiskPublicOpinionVo> list = publicOpinionService.queryList(bo);
+        ExcelUtil.exportExcel(list, "舆情推送数据", RiskPublicOpinionVo.class, response);
+    }
+
+    /**
+     * 处理舆情
+     */
+    @SaCheckPermission("risk:publicOpinion:handle")
+    @Log(title = "舆情推送", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/handle/{id}")
+    public R<Void> handle(@PathVariable("id") Long id, @RequestBody RiskPublicOpinionBo bo) {
+        return toAjax(publicOpinionService.handleOpinion(id, bo.getStatus(), bo.getHandleResult()));
+    }
+
+    /**
+     * 查询舆情统计数据
+     */
+    @SaCheckPermission("risk:publicOpinion:list")
+    @GetMapping("/stats")
+    public R<PublicOpinionStatsVo> stats() {
+        return R.ok(publicOpinionService.queryStats());
+    }
+
+    /**
+     * 查询近七天舆情趋势
+     */
+    @SaCheckPermission("risk:publicOpinion:list")
+    @GetMapping("/trend")
+    public R<List<PublicOpinionTrendVo>> trend() {
+        return R.ok(publicOpinionService.query7DayTrend());
+    }
+
+    /**
+     * 查询重大舆情明细
+     */
+    @SaCheckPermission("risk:publicOpinion:list")
+    @GetMapping("/major")
+    public R<List<RiskPublicOpinionVo>> major(RiskPublicOpinionBo bo) {
+        return R.ok(publicOpinionService.queryMajorOpinionList(bo));
+    }
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskSpecialEquipmentController.java

@@ -0,0 +1,109 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskSpecialEquipmentBo;
+import org.dromara.risk.domain.vo.RiskSpecialEquipmentVo;
+import org.dromara.risk.service.IRiskSpecialEquipmentService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 特种设备
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/specialEquipment")
+public class RiskSpecialEquipmentController extends BaseController {
+
+    private final IRiskSpecialEquipmentService specialEquipmentService;
+
+    /**
+     * 查询特种设备列表
+     */
+    @SaCheckPermission("risk:specialEquipment:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskSpecialEquipmentVo> list(RiskSpecialEquipmentBo bo, PageQuery pageQuery) {
+        return specialEquipmentService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取特种设备详细信息
+     *
+     * @param id 设备ID
+     */
+    @SaCheckPermission("risk:specialEquipment:list")
+    @GetMapping("/{id}")
+    public R<RiskSpecialEquipmentVo> getInfo(@NotNull(message = "设备ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(specialEquipmentService.queryById(id));
+    }
+
+    /**
+     * 新增特种设备
+     */
+    @SaCheckPermission("risk:specialEquipment:add")
+    @Log(title = "特种设备", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskSpecialEquipmentBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            bo.setEquipmentCode(null);
+        }
+        return toAjax(specialEquipmentService.insertByBo(bo));
+    }
+
+    /**
+     * 修改特种设备
+     */
+    @SaCheckPermission("risk:specialEquipment:edit")
+    @Log(title = "特种设备", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskSpecialEquipmentBo bo) {
+        return toAjax(specialEquipmentService.updateByBo(bo));
+    }
+
+    /**
+     * 删除特种设备
+     *
+     * @param ids 设备ID串
+     */
+    @SaCheckPermission("risk:specialEquipment:remove")
+    @Log(title = "特种设备", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "设备ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(specialEquipmentService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出特种设备列表
+     */
+    @SaCheckPermission("risk:specialEquipment:export")
+    @Log(title = "特种设备", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskSpecialEquipmentBo bo, HttpServletResponse response) {
+        List<RiskSpecialEquipmentVo> list = specialEquipmentService.queryList(bo);
+        ExcelUtil.exportExcel(list, "特种设备数据", RiskSpecialEquipmentVo.class, response);
+    }
+
+}

+ 105 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskWarningController.java

@@ -0,0 +1,105 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskWarningBo;
+import org.dromara.risk.domain.vo.RiskWarningVo;
+import org.dromara.risk.service.IRiskWarningService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 风险警示
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/warning")
+public class RiskWarningController extends BaseController {
+
+    private final IRiskWarningService warningService;
+
+    /**
+     * 查询风险警示列表
+     */
+    @SaCheckPermission("risk:warning:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskWarningVo> list(RiskWarningBo bo, PageQuery pageQuery) {
+        return warningService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取风险警示详细信息
+     *
+     * @param id 警示ID
+     */
+    @SaCheckPermission("risk:warning:list")
+    @GetMapping("/{id}")
+    public R<RiskWarningVo> getInfo(@NotNull(message = "警示ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(warningService.queryById(id));
+    }
+
+    /**
+     * 新增风险警示(发布警示)
+     */
+    @SaCheckPermission("risk:warning:add")
+    @Log(title = "风险警示", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskWarningBo bo) {
+        return toAjax(warningService.insertByBo(bo));
+    }
+
+    /**
+     * 修改风险警示
+     */
+    @SaCheckPermission("risk:warning:edit")
+    @Log(title = "风险警示", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskWarningBo bo) {
+        return toAjax(warningService.updateByBo(bo));
+    }
+
+    /**
+     * 删除风险警示
+     *
+     * @param ids 警示ID串
+     */
+    @SaCheckPermission("risk:warning:remove")
+    @Log(title = "风险警示", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "警示ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(warningService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 导出风险警示列表
+     */
+    @SaCheckPermission("risk:warning:export")
+    @Log(title = "风险警示", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskWarningBo bo, HttpServletResponse response) {
+        List<RiskWarningVo> list = warningService.queryList(bo);
+        ExcelUtil.exportExcel(list, "风险警示数据", RiskWarningVo.class, response);
+    }
+
+}

+ 121 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/controller/RiskWorkReportController.java

@@ -0,0 +1,121 @@
+package org.dromara.risk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.risk.domain.bo.RiskWorkReportBo;
+import org.dromara.risk.domain.vo.RiskWorkReportVo;
+import org.dromara.risk.service.IRiskWorkReportService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 作业上报
+ *
+ * @author ruoyi
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/risk/workReport")
+public class RiskWorkReportController extends BaseController {
+
+    private final IRiskWorkReportService workReportService;
+
+    /**
+     * 查询作业上报列表
+     */
+    @SaCheckPermission("risk:workReport:list")
+    @GetMapping("/list")
+    public TableDataInfo<RiskWorkReportVo> list(RiskWorkReportBo bo, PageQuery pageQuery) {
+        return workReportService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取作业上报详细信息
+     *
+     * @param id 作业上报ID
+     */
+    @SaCheckPermission("risk:workReport:list")
+    @GetMapping("/{id}")
+    public R<RiskWorkReportVo> getInfo(@NotNull(message = "作业上报ID不能为空") @PathVariable("id") Long id) {
+        return R.ok(workReportService.queryById(id));
+    }
+
+    /**
+     * 新增作业上报
+     */
+    @SaCheckPermission("risk:workReport:add")
+    @Log(title = "作业上报", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody RiskWorkReportBo bo) {
+        if (ObjectUtil.isNull(bo.getId())) {
+            // 新增时清空ID,由系统生成
+            bo.setId(null);
+        }
+        return toAjax(workReportService.insertByBo(bo));
+    }
+
+    /**
+     * 修改作业上报
+     */
+    @SaCheckPermission("risk:workReport:edit")
+    @Log(title = "作业上报", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody RiskWorkReportBo bo) {
+        return toAjax(workReportService.updateByBo(bo));
+    }
+
+    /**
+     * 删除作业上报
+     *
+     * @param ids 作业上报ID串
+     */
+    @SaCheckPermission("risk:workReport:remove")
+    @Log(title = "作业上报", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "作业上报ID不能为空") @PathVariable Long[] ids) {
+        return toAjax(workReportService.deleteWithValidByIds(Arrays.asList(ids)));
+    }
+
+    /**
+     * 审核作业上报
+     */
+    @SaCheckPermission("risk:workReport:review")
+    @Log(title = "作业上报", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/review")
+    public R<Void> review(@Validated @RequestBody RiskWorkReportBo bo) {
+        return toAjax(workReportService.reviewWorkReport(bo.getId(), bo.getAuditStatus(), bo.getAuditorName(), bo.getAuditOpinion()));
+    }
+
+    /**
+     * 导出作业上报列表
+     */
+    @SaCheckPermission("risk:workReport:export")
+    @Log(title = "作业上报", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(RiskWorkReportBo bo, HttpServletResponse response) {
+        List<RiskWorkReportVo> list = workReportService.queryList(bo);
+        ExcelUtil.exportExcel(list, "作业上报数据", RiskWorkReportVo.class, response);
+    }
+
+}

+ 164 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskAccident.java

@@ -0,0 +1,164 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 事故上报对象 risk_accident
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_accident")
+public class RiskAccident extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 事故编号
+     */
+    private String accidentCode;
+
+    /**
+     * 事故标题
+     */
+    private String accidentTitle;
+
+    /**
+     * 事故类型
+     */
+    private String accidentType;
+
+    /**
+     * 事故等级
+     */
+    private String accidentLevel;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 事故地点
+     */
+    private String accidentLocation;
+
+    /**
+     * 事故时间
+     */
+    private Date accidentTime;
+
+    /**
+     * 事故原因
+     */
+    private String accidentCause;
+
+    /**
+     * 事故描述
+     */
+    private String accidentDesc;
+
+    /**
+     * 死亡人数
+     */
+    private Integer deathCount;
+
+    /**
+     * 受伤人数
+     */
+    private Integer injuryCount;
+
+    /**
+     * 损失金额
+     */
+    private BigDecimal lossAmount;
+
+    /**
+     * 上报人ID
+     */
+    private Long reporterId;
+
+    /**
+     * 上报人
+     */
+    private String reporterName;
+
+    /**
+     * 上报时间
+     */
+    private Date reportTime;
+
+    /**
+     * 处理状态
+     */
+    private String handleStatus;
+
+    /**
+     * 处理人ID
+     */
+    private Long handlerId;
+
+    /**
+     * 处理人
+     */
+    private String handlerName;
+
+    /**
+     * 处理措施
+     */
+    private String handleMeasures;
+
+    /**
+     * 调查结果
+     */
+    private String investigationResult;
+
+    /**
+     * 改进措施
+     */
+    private String improvementMeasures;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 涉及人员
+     */
+    private String participants;
+
+    /**
+     * 现场照片
+     */
+    private String photoList;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 99 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskAuditFile.java

@@ -0,0 +1,99 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 审计文件对象 risk_audit_file
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_audit_file")
+public class RiskAuditFile extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 文件编号
+     */
+    private String fileCode;
+
+    /**
+     * 关联人员变动ID
+     */
+    private Long changeId;
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    private String fileType;
+
+    /**
+     * 文件URL
+     */
+    private String fileUrl;
+
+    /**
+     * 文件大小(字节)
+     */
+    private Long fileSize;
+
+    /**
+     * 上传人ID
+     */
+    private Long uploadBy;
+
+    /**
+     * 上传人
+     */
+    private String uploadName;
+
+    /**
+     * 上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 审核结果
+     */
+    private String auditResult;
+
+    /**
+     * 审核意见
+     */
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskDangerSource.java

@@ -0,0 +1,109 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 危险源对象 risk_danger_source
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_danger_source")
+public class RiskDangerSource extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 危险源编号
+     */
+    private String sourceCode;
+
+    /**
+     * 危险源名称
+     */
+    private String sourceName;
+
+    /**
+     * 危险源类型
+     */
+    private String sourceType;
+
+    /**
+     * 风险等级
+     */
+    private String riskLevel;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 位置
+     */
+    private String location;
+
+    /**
+     * 危险源描述
+     */
+    private String sourceDesc;
+
+    /**
+     * 管控措施
+     */
+    private String controlMeasures;
+
+    /**
+     * 上报时间
+     */
+    private Date reportTime;
+
+    /**
+     * 责任人ID
+     */
+    private Long responsibleId;
+
+    /**
+     * 责任人
+     */
+    private String responsibleName;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 108 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskEquipmentMaintenance.java

@@ -0,0 +1,108 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 特种设备维护记录对象 risk_equipment_maintenance
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_equipment_maintenance")
+public class RiskEquipmentMaintenance extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 设备ID
+     */
+    private Long equipmentId;
+
+    /**
+     * 设备编号
+     */
+    private String equipmentCode;
+
+    /**
+     * 设备名称
+     */
+    private String equipmentName;
+
+    /**
+     * 维护状态(待维护/维护中/已维护)
+     */
+    private String maintenanceStatus;
+
+    /**
+     * 预计开始时间
+     */
+    private Date planStartTime;
+
+    /**
+     * 预计结束时间
+     */
+    private Date planEndTime;
+
+    /**
+     * 实际开始时间
+     */
+    private Date actualStartTime;
+
+    /**
+     * 实际结束时间
+     */
+    private Date actualEndTime;
+
+    /**
+     * 维护人员
+     */
+    private String maintainerName;
+
+    /**
+     * 现场人员
+     */
+    private String siteName;
+
+    /**
+     * 维护内容
+     */
+    private String maintenanceContent;
+
+    /**
+     * 维护结果
+     */
+    private String maintenanceResult;
+
+    /**
+     * 维护照片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 139 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskHiddenDanger.java

@@ -0,0 +1,139 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 安全隐患对象 risk_hidden_danger
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_hidden_danger")
+public class RiskHiddenDanger extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 隐患编号
+     */
+    private String dangerCode;
+
+    /**
+     * 隐患标题
+     */
+    private String dangerTitle;
+
+    /**
+     * 隐患类型
+     */
+    private String dangerType;
+
+    /**
+     * 风险等级
+     */
+    private String dangerLevel;
+
+    /**
+     * 隐患来源
+     */
+    private String dangerSource;
+
+    /**
+     * 隐患描述
+     */
+    private String dangerDesc;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 发现人ID
+     */
+    private Long discovererId;
+
+    /**
+     * 发现人
+     */
+    private String discovererName;
+
+    /**
+     * 发现时间
+     */
+    private Date discoverTime;
+
+    /**
+     * 处理状态
+     */
+    private String handleStatus;
+
+    /**
+     * 处理人ID
+     */
+    private Long handlerId;
+
+    /**
+     * 处理人
+     */
+    private String handlerName;
+
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+
+    /**
+     * 处理结果
+     */
+    private String handleResult;
+
+    /**
+     * 处理措施
+     */
+    private String handleMeasures;
+
+    /**
+     * 完成时间
+     */
+    private Date finishTime;
+
+    /**
+     * 现场照片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 144 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskInspectionRecord.java

@@ -0,0 +1,144 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 巡检记录对象 risk_inspection_record
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_inspection_record")
+public class RiskInspectionRecord extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 记录编号
+     */
+    private String recordCode;
+
+    /**
+     * 任务ID
+     */
+    private Long taskId;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 签到时间
+     */
+    private Date checkInTime;
+
+    /**
+     * 签退时间
+     */
+    private Date checkOutTime;
+
+    /**
+     * 签到位置
+     */
+    private String checkInLocation;
+
+    /**
+     * 签到经度
+     */
+    private BigDecimal checkInLng;
+
+    /**
+     * 签到纬度
+     */
+    private BigDecimal checkInLat;
+
+    /**
+     * 签到照片
+     */
+    private String checkInPhoto;
+
+    /**
+     * 签退位置
+     */
+    private String checkOutLocation;
+
+    /**
+     * 签退经度
+     */
+    private BigDecimal checkOutLng;
+
+    /**
+     * 签退纬度
+     */
+    private BigDecimal checkOutLat;
+
+    /**
+     * 签退照片
+     */
+    private String checkOutPhoto;
+
+    /**
+     * 巡检人ID
+     */
+    private Long inspectorId;
+
+    /**
+     * 巡检人
+     */
+    private String inspectorName;
+
+    /**
+     * 记录状态
+     */
+    private String recordStatus;
+
+    /**
+     * 问题数
+     */
+    private Integer problemCount;
+
+    /**
+     * 总数
+     */
+    private Integer totalCount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 175 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskInspectionTask.java

@@ -0,0 +1,175 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 巡检任务对象 risk_inspection_task
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_inspection_task")
+public class RiskInspectionTask extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 任务编号
+     */
+    private String taskCode;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 任务类型
+     */
+    private String taskType;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 计划开始时间
+     */
+    private Date planStartTime;
+
+    /**
+     * 计划结束时间
+     */
+    private Date planEndTime;
+
+    /**
+     * 实际开始时间
+     */
+    private Date actualStartTime;
+
+    /**
+     * 实际结束时间
+     */
+    private Date actualEndTime;
+
+    /**
+     * 巡检人ID
+     */
+    private Long inspectorId;
+
+    /**
+     * 巡检人
+     */
+    private String inspectorName;
+
+    /**
+     * 任务状态
+     */
+    private String taskStatus;
+
+    /**
+     * 项目数
+     */
+    private Integer itemCount;
+
+    /**
+     * 已完成数
+     */
+    private Integer completedCount;
+
+    /**
+     * 合格率
+     */
+    private BigDecimal passRate;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+    /**
+     * 位置区域
+     */
+    private String location;
+
+    /**
+     * 经度
+     */
+    private java.math.BigDecimal lng;
+
+    /**
+     * 纬度
+     */
+    private java.math.BigDecimal lat;
+
+    /**
+     * 巡检周期(每日/每周/每月)
+     */
+    private String cycle;
+
+    /**
+     * 是否开启扫码打卡(0否 1是)
+     */
+    private String scanEnabled;
+
+    /**
+     * 打卡方式(常规/扫码)
+     */
+    private String checkMethod;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    private String auditorName;
+
+    /**
+     * 执行星期(每周模式,逗号分隔)
+     */
+    private String dayOfWeek;
+
+    /**
+     * 执行日期(每月模式,逗号分隔)
+     */
+    private String dayOfMonth;
+
+    /**
+     * 执行时间段(每日模式)
+     */
+    private String timeSlot;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 154 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPersonnel.java

@@ -0,0 +1,154 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 人员对象 risk_personnel
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_personnel")
+public class RiskPersonnel extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 人员编号
+     */
+    private String personnelCode;
+
+    /**
+     * 姓名
+     */
+    private String personnelName;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 部门
+     */
+    private String department;
+
+    /**
+     * 岗位
+     */
+    private String position;
+
+    /**
+     * 保险状态
+     */
+    private String insuranceStatus;
+
+    /**
+     * 保险有效期开始
+     */
+    private Date insuranceStartDate;
+
+    /**
+     * 保险有效期结束
+     */
+    private Date insuranceExpireDate;
+
+    /**
+     * 工种
+     */
+    private String jobType;
+
+    /**
+     * 入职日期
+     */
+    private Date entryDate;
+
+    /**
+     * 离职日期
+     */
+    private Date leaveDate;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 健康状况
+     */
+    private String healthStatus;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 紧急联系人
+     */
+    private String emergencyContact;
+
+    /**
+     * 紧急联系电话
+     */
+    private String emergencyPhone;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 94 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPersonnelCert.java

@@ -0,0 +1,94 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 人员证书对象 risk_personnel_cert
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_personnel_cert")
+public class RiskPersonnelCert extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 人员ID
+     */
+    private Long personnelId;
+
+    /**
+     * 人员姓名
+     */
+    private String personnelName;
+
+    /**
+     * 证书类型
+     */
+    private String certType;
+
+    /**
+     * 证书名称
+     */
+    private String certName;
+
+    /**
+     * 证书编号
+     */
+    private String certNo;
+
+    /**
+     * 颁发机构
+     */
+    private String issueOrg;
+
+    /**
+     * 颁发日期
+     */
+    private Date issueDate;
+
+    /**
+     * 过期日期
+     */
+    private Date expireDate;
+
+    /**
+     * 证书状态
+     */
+    private String certStatus;
+
+    /**
+     * 证书附件
+     */
+    private String certFile;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 154 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPersonnelChange.java

@@ -0,0 +1,154 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 人员变动对象 risk_personnel_change
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_personnel_change")
+public class RiskPersonnelChange extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 变动编号
+     */
+    private String changeCode;
+
+    /**
+     * 人员ID
+     */
+    private Long personnelId;
+
+    /**
+     * 人员姓名
+     */
+    private String personnelName;
+
+    /**
+     * 变动类型
+     */
+    private String changeType;
+
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+
+    /**
+     * 变动日期
+     */
+    private Date changeDate;
+
+    /**
+     * 离职日期
+     */
+    private Date leaveDate;
+
+    /**
+     * 变动前门店ID
+     */
+    private Long beforeStoreId;
+
+    /**
+     * 变动前门店
+     */
+    private String beforeStoreName;
+
+    /**
+     * 变动前部门
+     */
+    private String beforeDept;
+
+    /**
+     * 变动前岗位
+     */
+    private String beforePosition;
+
+    /**
+     * 变动后门店ID
+     */
+    private Long afterStoreId;
+
+    /**
+     * 变动后门店
+     */
+    private String afterStoreName;
+
+    /**
+     * 变动后部门
+     */
+    private String afterDept;
+
+    /**
+     * 变动后岗位
+     */
+    private String afterPosition;
+
+    /**
+     * 经办人ID
+     */
+    private Long handlerId;
+
+    /**
+     * 经办人
+     */
+    private String handlerName;
+
+    /**
+     * 审核状态
+     */
+    private String auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    private String auditorName;
+
+    /**
+     * 审核时间
+     */
+    private Date auditTime;
+
+    /**
+     * 审核意见
+     */
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 98 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskPublicOpinion.java

@@ -0,0 +1,98 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 舆情推送对象 risk_public_opinion
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_public_opinion")
+public class RiskPublicOpinion extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 舆情标题
+     */
+    private String opinionTitle;
+
+    /**
+     * 舆情来源
+     */
+    private String source;
+
+    /**
+     * 发布时间
+     */
+    private Date publishTime;
+
+    /**
+     * 风险等级(重大/较大/一般)
+     */
+    private String riskLevel;
+
+    /**
+     * 负责人
+     */
+    private String responsiblePerson;
+
+    /**
+     * 舆情链接
+     */
+    private String opinionLink;
+
+    /**
+     * 舆情内容
+     */
+    private String opinionContent;
+
+    /**
+     * 处置建议
+     */
+    private String disposalSuggestion;
+
+    /**
+     * 状态(待处理/处理中/已处理)
+     */
+    private String status;
+
+    /**
+     * 处理结果
+     */
+    private String handleResult;
+
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 129 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskSpecialEquipment.java

@@ -0,0 +1,129 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 特种设备对象 risk_special_equipment
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_special_equipment")
+public class RiskSpecialEquipment extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 设备编号
+     */
+    private String equipmentCode;
+
+    /**
+     * 设备名称
+     */
+    private String equipmentName;
+
+    /**
+     * 设备类型
+     */
+    private String equipmentType;
+
+    /**
+     * 型号
+     */
+    private String model;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 制造商
+     */
+    private String manufacturer;
+
+    /**
+     * 生产日期
+     */
+    private Date manufactureDate;
+
+    /**
+     * 采购日期
+     */
+    private Date purchaseDate;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 安装位置
+     */
+    private String location;
+
+    /**
+     * 安装日期
+     */
+    private Date installDate;
+
+    /**
+     * 使用状态
+     */
+    private String useStatus;
+
+    /**
+     * 检验状态
+     */
+    private String inspectionStatus;
+
+    /**
+     * 下次检验日期
+     */
+    private Date nextInspectionDate;
+
+    /**
+     * 负责人ID
+     */
+    private Long responsibleId;
+
+    /**
+     * 负责人
+     */
+    private String responsibleName;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 119 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskWarning.java

@@ -0,0 +1,119 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 风险警示对象 risk_warning
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_warning")
+public class RiskWarning extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 警示编号
+     */
+    private String warningCode;
+
+    /**
+     * 警示标题
+     */
+    private String warningTitle;
+
+    /**
+     * 警示类型
+     */
+    private String warningType;
+
+    /**
+     * 警示等级
+     */
+    private String warningLevel;
+
+    /**
+     * 警示来源
+     */
+    private String warningSource;
+
+    /**
+     * 警示内容
+     */
+    private String warningContent;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 发布时间
+     */
+    private Date releaseTime;
+
+    /**
+     * 过期时间
+     */
+    private Date expireTime;
+
+    /**
+     * 发布人ID
+     */
+    private Long releaserId;
+
+    /**
+     * 发布人
+     */
+    private String releaserName;
+
+    /**
+     * 发布范围
+     */
+    private String publishScope;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+    /**
+     * 阅读数
+     */
+    private Integer readCount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 164 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskWorkReport.java

@@ -0,0 +1,164 @@
+package org.dromara.risk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.dromara.common.tenant.core.TenantEntity;
+
+/**
+ * 作业上报对象 risk_work_report
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("risk_work_report")
+public class RiskWorkReport extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 上报编号
+     */
+    private String reportCode;
+
+    /**
+     * 作业类型
+     */
+    private String workType;
+
+    /**
+     * 作业标题
+     */
+    private String workTitle;
+
+    /**
+     * 作业内容
+     */
+    private String workContent;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 作业位置
+     */
+    private String workLocation;
+
+    /**
+     * 作业开始时间
+     */
+    private Date workStartTime;
+
+    /**
+     * 作业结束时间
+     */
+    private Date workEndTime;
+
+    /**
+     * 上报人ID
+     */
+    private Long reporterId;
+
+    /**
+     * 上报人
+     */
+    private String reporterName;
+
+    /**
+     * 上报时间
+     */
+    private Date reportTime;
+
+    /**
+     * 联系电话
+     */
+    private String contactPhone;
+
+    /**
+     * 现场施工图片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 施工证件URL
+     */
+    private String certFile;
+
+    /**
+     * 施工证件名称
+     */
+    private String certName;
+
+    /**
+     * 参与人员
+     */
+    private String participants;
+
+    /**
+     * 风险措施
+     */
+    private String riskMeasures;
+
+    /**
+     * 作业结果
+     */
+    private String workResult;
+
+    /**
+     * 审核状态
+     */
+    private String auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    private String auditorName;
+
+    /**
+     * 审核时间
+     */
+    private Date auditTime;
+
+    /**
+     * 审核意见
+     */
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}

+ 180 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskAccidentBo.java

@@ -0,0 +1,180 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskAccident;
+
+/**
+ * 事故上报业务对象 risk_accident
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskAccident.class, reverseConvertGenerate = false)
+public class RiskAccidentBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 事故编号
+     */
+    @Size(min = 0, max = 500, message = "事故编号长度不能超过{max}个字符")
+    private String accidentCode;
+
+    /**
+     * 事故标题
+     */
+    @NotBlank(message = "事故标题不能为空")
+    @Size(min = 0, max = 500, message = "事故标题长度不能超过{max}个字符")
+    private String accidentTitle;
+
+    /**
+     * 事故类型
+     */
+    @NotBlank(message = "事故类型不能为空")
+    @Size(min = 0, max = 500, message = "事故类型长度不能超过{max}个字符")
+    private String accidentType;
+
+    /**
+     * 事故等级
+     */
+    @NotBlank(message = "事故等级不能为空")
+    @Size(min = 0, max = 500, message = "事故等级长度不能超过{max}个字符")
+    private String accidentLevel;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 事故地点
+     */
+    @NotBlank(message = "事故地点不能为空")
+    @Size(min = 0, max = 500, message = "事故地点长度不能超过{max}个字符")
+    private String accidentLocation;
+
+    /**
+     * 事故时间
+     */
+    @NotNull(message = "事故时间不能为空")
+    private Date accidentTime;
+
+    /**
+     * 事故原因
+     */
+    @Size(min = 0, max = 500, message = "事故原因长度不能超过{max}个字符")
+    private String accidentCause;
+
+    /**
+     * 事故描述
+     */
+    @Size(min = 0, max = 500, message = "事故描述长度不能超过{max}个字符")
+    private String accidentDesc;
+
+    /**
+     * 死亡人数
+     */
+    private Integer deathCount;
+
+    /**
+     * 受伤人数
+     */
+    private Integer injuryCount;
+
+    /**
+     * 损失金额
+     */
+    private BigDecimal lossAmount;
+
+    /**
+     * 上报人ID
+     */
+    private Long reporterId;
+
+    /**
+     * 上报人
+     */
+    @Size(min = 0, max = 500, message = "上报人长度不能超过{max}个字符")
+    private String reporterName;
+
+    /**
+     * 上报时间
+     */
+    @NotNull(message = "上报时间不能为空")
+    private Date reportTime;
+
+    /**
+     * 处理状态
+     */
+    @Size(min = 0, max = 500, message = "处理状态长度不能超过{max}个字符")
+    private String handleStatus;
+
+    /**
+     * 处理人ID
+     */
+    private Long handlerId;
+
+    /**
+     * 处理人
+     */
+    @Size(min = 0, max = 500, message = "处理人长度不能超过{max}个字符")
+    private String handlerName;
+
+    /**
+     * 处理措施
+     */
+    @Size(min = 0, max = 500, message = "处理措施长度不能超过{max}个字符")
+    private String handleMeasures;
+
+    /**
+     * 调查结果
+     */
+    @Size(min = 0, max = 500, message = "调查结果长度不能超过{max}个字符")
+    private String investigationResult;
+
+    /**
+     * 改进措施
+     */
+    @Size(min = 0, max = 500, message = "改进措施长度不能超过{max}个字符")
+    private String improvementMeasures;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 涉及人员
+     */
+    @Size(min = 0, max = 500, message = "涉及人员长度不能超过{max}个字符")
+    private String participants;
+
+    /**
+     * 现场照片(URL列表)
+     */
+    private String photoList;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 103 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskAuditFileBo.java

@@ -0,0 +1,103 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskAuditFile;
+
+/**
+ * 审计文件业务对象 risk_audit_file
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskAuditFile.class, reverseConvertGenerate = false)
+public class RiskAuditFileBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 文件编号
+     */
+    @Size(min = 0, max = 500, message = "文件编号长度不能超过{max}个字符")
+    private String fileCode;
+
+    /**
+     * 关联人员变动ID
+     */
+    private Long changeId;
+
+    /**
+     * 文件名
+     */
+    @NotBlank(message = "文件名不能为空")
+    @Size(min = 0, max = 500, message = "文件名长度不能超过{max}个字符")
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    @Size(min = 0, max = 500, message = "文件类型长度不能超过{max}个字符")
+    private String fileType;
+
+    /**
+     * 文件URL
+     */
+    @NotBlank(message = "文件URL不能为空")
+    @Size(min = 0, max = 500, message = "文件URL长度不能超过{max}个字符")
+    private String fileUrl;
+
+    /**
+     * 文件大小(字节)
+     */
+    private Long fileSize;
+
+    /**
+     * 上传人ID
+     */
+    private Long uploadBy;
+
+    /**
+     * 上传人
+     */
+    @Size(min = 0, max = 500, message = "上传人长度不能超过{max}个字符")
+    private String uploadName;
+
+    /**
+     * 上传时间
+     */
+    @NotNull(message = "上传时间不能为空")
+    private Date uploadTime;
+
+    /**
+     * 审核结果
+     */
+    @Size(min = 0, max = 500, message = "审核结果长度不能超过{max}个字符")
+    private String auditResult;
+
+    /**
+     * 审核意见
+     */
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 118 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskDangerSourceBo.java

@@ -0,0 +1,118 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskDangerSource;
+
+/**
+ * 危险源业务对象 risk_danger_source
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskDangerSource.class, reverseConvertGenerate = false)
+public class RiskDangerSourceBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 危险源编号
+     */
+    @Size(min = 0, max = 500, message = "危险源编号长度不能超过{max}个字符")
+    private String sourceCode;
+
+    /**
+     * 危险源名称
+     */
+    @NotBlank(message = "危险源名称不能为空")
+    @Size(min = 0, max = 500, message = "危险源名称长度不能超过{max}个字符")
+    private String sourceName;
+
+    /**
+     * 危险源类型
+     */
+    @NotBlank(message = "危险源类型不能为空")
+    @Size(min = 0, max = 500, message = "危险源类型长度不能超过{max}个字符")
+    private String sourceType;
+
+    /**
+     * 风险等级
+     */
+    @NotBlank(message = "风险等级不能为空")
+    @Size(min = 0, max = 500, message = "风险等级长度不能超过{max}个字符")
+    private String riskLevel;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 位置
+     */
+    @Size(min = 0, max = 500, message = "位置长度不能超过{max}个字符")
+    private String location;
+
+    /**
+     * 危险源描述
+     */
+    @Size(min = 0, max = 500, message = "危险源描述长度不能超过{max}个字符")
+    private String sourceDesc;
+
+    /**
+     * 管控措施
+     */
+    @Size(min = 0, max = 500, message = "管控措施长度不能超过{max}个字符")
+    private String controlMeasures;
+
+    /**
+     * 上报时间
+     */
+    @NotNull(message = "上报时间不能为空")
+    private Date reportTime;
+
+    /**
+     * 责任人ID
+     */
+    private Long responsibleId;
+
+    /**
+     * 责任人
+     */
+    @Size(min = 0, max = 500, message = "责任人长度不能超过{max}个字符")
+    private String responsibleName;
+
+    /**
+     * 状态
+     */
+    @Size(min = 0, max = 500, message = "状态长度不能超过{max}个字符")
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 102 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskEquipmentMaintenanceBo.java

@@ -0,0 +1,102 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskEquipmentMaintenance;
+
+import java.util.Date;
+
+/**
+ * 设备维护业务对象 risk_equipment_maintenance
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskEquipmentMaintenance.class, reverseConvertGenerate = false)
+public class RiskEquipmentMaintenanceBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 设备ID
+     */
+    @NotNull(message = "设备ID不能为空")
+    private Long equipmentId;
+
+    /**
+     * 设备编号
+     */
+    private String equipmentCode;
+
+    /**
+     * 设备名称
+     */
+    private String equipmentName;
+
+    /**
+     * 维护状态(待维护/维护中/已维护)
+     */
+    @NotBlank(message = "请选择维护状态")
+    private String maintenanceStatus;
+
+    /**
+     * 预计开始时间
+     */
+    private Date planStartTime;
+
+    /**
+     * 预计结束时间
+     */
+    private Date planEndTime;
+
+    /**
+     * 实际开始时间
+     */
+    private Date actualStartTime;
+
+    /**
+     * 实际结束时间
+     */
+    private Date actualEndTime;
+
+    /**
+     * 维护人员
+     */
+    @NotBlank(message = "请输入维护人员")
+    private String maintainerName;
+
+    /**
+     * 现场人员
+     */
+    @NotBlank(message = "请输入现场人员")
+    private String siteName;
+
+    /**
+     * 维护内容
+     */
+    private String maintenanceContent;
+
+    /**
+     * 维护结果
+     */
+    private String maintenanceResult;
+
+    /**
+     * 维护照片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 150 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskHiddenDangerBo.java

@@ -0,0 +1,150 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskHiddenDanger;
+
+/**
+ * 安全隐患业务对象 risk_hidden_danger
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskHiddenDanger.class, reverseConvertGenerate = false)
+public class RiskHiddenDangerBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 隐患编号
+     */
+    @Size(min = 0, max = 500, message = "隐患编号长度不能超过{max}个字符")
+    private String dangerCode;
+
+    /**
+     * 隐患标题
+     */
+    @NotBlank(message = "隐患标题不能为空")
+    @Size(min = 0, max = 500, message = "隐患标题长度不能超过{max}个字符")
+    private String dangerTitle;
+
+    /**
+     * 隐患类型
+     */
+    @NotBlank(message = "隐患类型不能为空")
+    @Size(min = 0, max = 500, message = "隐患类型长度不能超过{max}个字符")
+    private String dangerType;
+
+    /**
+     * 风险等级
+     */
+    @NotBlank(message = "风险等级不能为空")
+    @Size(min = 0, max = 500, message = "风险等级长度不能超过{max}个字符")
+    private String dangerLevel;
+
+    /**
+     * 隐患来源
+     */
+    @Size(min = 0, max = 500, message = "隐患来源长度不能超过{max}个字符")
+    private String dangerSource;
+
+    /**
+     * 隐患描述
+     */
+    @Size(min = 0, max = 500, message = "隐患描述长度不能超过{max}个字符")
+    private String dangerDesc;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 发现人ID
+     */
+    private Long discovererId;
+
+    /**
+     * 发现人
+     */
+    @Size(min = 0, max = 500, message = "发现人长度不能超过{max}个字符")
+    private String discovererName;
+
+    /**
+     * 发现时间
+     */
+    @NotNull(message = "发现时间不能为空")
+    private Date discoverTime;
+
+    /**
+     * 处理状态
+     */
+    @Size(min = 0, max = 500, message = "处理状态长度不能超过{max}个字符")
+    private String handleStatus;
+
+    /**
+     * 处理人ID
+     */
+    private Long handlerId;
+
+    /**
+     * 处理人
+     */
+    @Size(min = 0, max = 500, message = "处理人长度不能超过{max}个字符")
+    private String handlerName;
+
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+
+    /**
+     * 处理结果
+     */
+    @Size(min = 0, max = 500, message = "处理结果长度不能超过{max}个字符")
+    private String handleResult;
+
+    /**
+     * 处理措施
+     */
+    @Size(min = 0, max = 500, message = "处理措施长度不能超过{max}个字符")
+    private String handleMeasures;
+
+    /**
+     * 完成时间
+     */
+    private Date finishTime;
+
+    /**
+     * 现场照片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 179 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskInspectionTaskBo.java

@@ -0,0 +1,179 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskInspectionTask;
+
+/**
+ * 巡检任务业务对象 risk_inspection_task
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskInspectionTask.class, reverseConvertGenerate = false)
+public class RiskInspectionTaskBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 任务编号
+     */
+    @Size(min = 0, max = 500, message = "任务编号长度不能超过{max}个字符")
+    private String taskCode;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank(message = "任务名称不能为空")
+    @Size(min = 0, max = 500, message = "任务名称长度不能超过{max}个字符")
+    private String taskName;
+
+    /**
+     * 任务类型
+     */
+    @NotBlank(message = "任务类型不能为空")
+    @Size(min = 0, max = 500, message = "任务类型长度不能超过{max}个字符")
+    private String taskType;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 计划开始时间
+     */
+    @NotNull(message = "计划开始时间不能为空")
+    private Date planStartTime;
+
+    /**
+     * 计划结束时间
+     */
+    @NotNull(message = "计划结束时间不能为空")
+    private Date planEndTime;
+
+    /**
+     * 实际开始时间
+     */
+    private Date actualStartTime;
+
+    /**
+     * 实际结束时间
+     */
+    private Date actualEndTime;
+
+    /**
+     * 巡检人ID
+     */
+    private Long inspectorId;
+
+    /**
+     * 巡检人
+     */
+    @Size(min = 0, max = 500, message = "巡检人长度不能超过{max}个字符")
+    private String inspectorName;
+
+    /**
+     * 任务状态
+     */
+    @Size(min = 0, max = 500, message = "任务状态长度不能超过{max}个字符")
+    private String taskStatus;
+
+    /**
+     * 项目数
+     */
+    private Integer itemCount;
+
+    /**
+     * 已完成数
+     */
+    private Integer completedCount;
+
+    /**
+     * 合格率
+     */
+    private BigDecimal passRate;
+
+    /**
+     * 位置区域
+     */
+    private String location;
+
+    /**
+     * 经度
+     */
+    private java.math.BigDecimal lng;
+
+    /**
+     * 纬度
+     */
+    private java.math.BigDecimal lat;
+
+    /**
+     * 巡检周期(每日/每周/每月)
+     */
+    private String cycle;
+
+    /**
+     * 是否开启扫码打卡
+     */
+    private String scanEnabled;
+
+    /**
+     * 打卡方式(常规/扫码)
+     */
+    private String checkMethod;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    private String auditorName;
+
+    /**
+     * 执行星期
+     */
+    private String dayOfWeek;
+
+    /**
+     * 执行日期
+     */
+    private String dayOfMonth;
+
+    /**
+     * 执行时间段
+     */
+    private String timeSlot;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 165 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPersonnelBo.java

@@ -0,0 +1,165 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskPersonnel;
+
+/**
+ * 人员业务对象 risk_personnel
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskPersonnel.class, reverseConvertGenerate = false)
+public class RiskPersonnelBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 人员编号
+     */
+    @Size(min = 0, max = 500, message = "人员编号长度不能超过{max}个字符")
+    private String personnelCode;
+
+    /**
+     * 姓名
+     */
+    @NotBlank(message = "姓名不能为空")
+    @Size(min = 0, max = 500, message = "姓名长度不能超过{max}个字符")
+    private String personnelName;
+
+    /**
+     * 性别
+     */
+    @Size(min = 0, max = 500, message = "性别长度不能超过{max}个字符")
+    private String gender;
+
+    /**
+     * 身份证号
+     */
+    @Size(min = 0, max = 500, message = "身份证号长度不能超过{max}个字符")
+    private String idCard;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 手机号
+     */
+    @Size(min = 0, max = 500, message = "手机号长度不能超过{max}个字符")
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    @Size(min = 0, max = 500, message = "邮箱长度不能超过{max}个字符")
+    private String email;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 部门
+     */
+    @Size(min = 0, max = 500, message = "部门长度不能超过{max}个字符")
+    private String department;
+
+    /**
+     * 岗位
+     */
+    @Size(min = 0, max = 500, message = "岗位长度不能超过{max}个字符")
+    private String position;
+
+    /**
+     * 保险状态
+     */
+    private String insuranceStatus;
+
+    /**
+     * 保险有效期开始
+     */
+    private Date insuranceStartDate;
+
+    /**
+     * 保险有效期结束
+     */
+    private Date insuranceExpireDate;
+
+    /**
+     * 工种
+     */
+    @Size(min = 0, max = 500, message = "工种长度不能超过{max}个字符")
+    private String jobType;
+
+    /**
+     * 入职日期
+     */
+    private Date entryDate;
+
+    /**
+     * 离职日期
+     */
+    private Date leaveDate;
+
+    /**
+     * 状态
+     */
+    @Size(min = 0, max = 500, message = "状态长度不能超过{max}个字符")
+    private String status;
+
+    /**
+     * 健康状况
+     */
+    @Size(min = 0, max = 500, message = "健康状况长度不能超过{max}个字符")
+    private String healthStatus;
+
+    /**
+     * 地址
+     */
+    @Size(min = 0, max = 500, message = "地址长度不能超过{max}个字符")
+    private String address;
+
+    /**
+     * 紧急联系人
+     */
+    @Size(min = 0, max = 500, message = "紧急联系人长度不能超过{max}个字符")
+    private String emergencyContact;
+
+    /**
+     * 紧急联系电话
+     */
+    @Size(min = 0, max = 500, message = "紧急联系电话长度不能超过{max}个字符")
+    private String emergencyPhone;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 99 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPersonnelCertBo.java

@@ -0,0 +1,99 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskPersonnelCert;
+
+/**
+ * 人员证书业务对象 risk_personnel_cert
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskPersonnelCert.class, reverseConvertGenerate = false)
+public class RiskPersonnelCertBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 人员ID
+     */
+    @NotNull(message = "人员ID不能为空")
+    private Long personnelId;
+
+    /**
+     * 人员姓名
+     */
+    @Size(min = 0, max = 500, message = "人员姓名长度不能超过{max}个字符")
+    private String personnelName;
+
+    /**
+     * 证书类型
+     */
+    @NotBlank(message = "证书类型不能为空")
+    @Size(min = 0, max = 500, message = "证书类型长度不能超过{max}个字符")
+    private String certType;
+
+    /**
+     * 证书名称
+     */
+    @NotBlank(message = "证书名称不能为空")
+    @Size(min = 0, max = 500, message = "证书名称长度不能超过{max}个字符")
+    private String certName;
+
+    /**
+     * 证书编号
+     */
+    @Size(min = 0, max = 500, message = "证书编号长度不能超过{max}个字符")
+    private String certNo;
+
+    /**
+     * 颁发机构
+     */
+    @Size(min = 0, max = 500, message = "颁发机构长度不能超过{max}个字符")
+    private String issueOrg;
+
+    /**
+     * 颁发日期
+     */
+    private Date issueDate;
+
+    /**
+     * 过期日期
+     */
+    private Date expireDate;
+
+    /**
+     * 证书状态
+     */
+    @Size(min = 0, max = 500, message = "证书状态长度不能超过{max}个字符")
+    private String certStatus;
+
+    /**
+     * 证书附件
+     */
+    @Size(min = 0, max = 500, message = "证书附件长度不能超过{max}个字符")
+    private String certFile;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 165 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPersonnelChangeBo.java

@@ -0,0 +1,165 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskPersonnelChange;
+
+/**
+ * 人员变动业务对象 risk_personnel_change
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskPersonnelChange.class, reverseConvertGenerate = false)
+public class RiskPersonnelChangeBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 变动编号
+     */
+    @Size(min = 0, max = 500, message = "变动编号长度不能超过{max}个字符")
+    private String changeCode;
+
+    /**
+     * 人员ID
+     */
+    @NotNull(message = "人员ID不能为空")
+    private Long personnelId;
+
+    /**
+     * 人员姓名
+     */
+    @Size(min = 0, max = 500, message = "人员姓名长度不能超过{max}个字符")
+    private String personnelName;
+
+    /**
+     * 变动类型
+     */
+    @NotBlank(message = "变动类型不能为空")
+    @Size(min = 0, max = 500, message = "变动类型长度不能超过{max}个字符")
+    private String changeType;
+
+    /**
+     * 变动原因
+     */
+    @Size(min = 0, max = 500, message = "变动原因长度不能超过{max}个字符")
+    private String changeReason;
+
+    /**
+     * 变动日期
+     */
+    @NotNull(message = "变动日期不能为空")
+    private Date changeDate;
+
+    /**
+     * 离职日期
+     */
+    private Date leaveDate;
+
+    /**
+     * 变动前门店ID
+     */
+    private Long beforeStoreId;
+
+    /**
+     * 变动前门店
+     */
+    @Size(min = 0, max = 500, message = "变动前门店长度不能超过{max}个字符")
+    private String beforeStoreName;
+
+    /**
+     * 变动前部门
+     */
+    @Size(min = 0, max = 500, message = "变动前部门长度不能超过{max}个字符")
+    private String beforeDept;
+
+    /**
+     * 变动前岗位
+     */
+    @Size(min = 0, max = 500, message = "变动前岗位长度不能超过{max}个字符")
+    private String beforePosition;
+
+    /**
+     * 变动后门店ID
+     */
+    private Long afterStoreId;
+
+    /**
+     * 变动后门店
+     */
+    @Size(min = 0, max = 500, message = "变动后门店长度不能超过{max}个字符")
+    private String afterStoreName;
+
+    /**
+     * 变动后部门
+     */
+    @Size(min = 0, max = 500, message = "变动后部门长度不能超过{max}个字符")
+    private String afterDept;
+
+    /**
+     * 变动后岗位
+     */
+    @Size(min = 0, max = 500, message = "变动后岗位长度不能超过{max}个字符")
+    private String afterPosition;
+
+    /**
+     * 经办人ID
+     */
+    private Long handlerId;
+
+    /**
+     * 经办人
+     */
+    @Size(min = 0, max = 500, message = "经办人长度不能超过{max}个字符")
+    private String handlerName;
+
+    /**
+     * 审核状态
+     */
+    @Size(min = 0, max = 500, message = "审核状态长度不能超过{max}个字符")
+    private String auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    @Size(min = 0, max = 500, message = "审核人长度不能超过{max}个字符")
+    private String auditorName;
+
+    /**
+     * 审核时间
+     */
+    private Date auditTime;
+
+    /**
+     * 审核意见
+     */
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 106 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskPublicOpinionBo.java

@@ -0,0 +1,106 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskPublicOpinion;
+
+/**
+ * 舆情推送业务对象 risk_public_opinion
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskPublicOpinion.class, reverseConvertGenerate = false)
+public class RiskPublicOpinionBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 舆情标题
+     */
+    @NotBlank(message = "舆情标题不能为空")
+    @Size(min = 0, max = 200, message = "舆情标题长度不能超过{max}个字符")
+    private String opinionTitle;
+
+    /**
+     * 舆情来源
+     */
+    @NotBlank(message = "舆情来源不能为空")
+    @Size(min = 0, max = 100, message = "舆情来源长度不能超过{max}个字符")
+    private String source;
+
+    /**
+     * 发布时间
+     */
+    @NotNull(message = "发布时间不能为空")
+    private Date publishTime;
+
+    /**
+     * 风险等级
+     */
+    @NotBlank(message = "风险等级不能为空")
+    @Size(min = 0, max = 20, message = "风险等级长度不能超过{max}个字符")
+    private String riskLevel;
+
+    /**
+     * 负责人
+     */
+    @Size(min = 0, max = 50, message = "负责人长度不能超过{max}个字符")
+    private String responsiblePerson;
+
+    /**
+     * 舆情链接
+     */
+    @Size(min = 0, max = 500, message = "舆情链接长度不能超过{max}个字符")
+    private String opinionLink;
+
+    /**
+     * 舆情内容
+     */
+    @Size(min = 0, max = 2000, message = "舆情内容长度不能超过{max}个字符")
+    private String opinionContent;
+
+    /**
+     * 处置建议
+     */
+    @Size(min = 0, max = 1000, message = "处置建议长度不能超过{max}个字符")
+    private String disposalSuggestion;
+
+    /**
+     * 状态(待处理/处理中/已处理)
+     */
+    @Size(min = 0, max = 20, message = "状态长度不能超过{max}个字符")
+    private String status;
+
+    /**
+     * 处理结果
+     */
+    @Size(min = 0, max = 1000, message = "处理结果长度不能超过{max}个字符")
+    private String handleResult;
+
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 142 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskSpecialEquipmentBo.java

@@ -0,0 +1,142 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskSpecialEquipment;
+
+/**
+ * 特种设备业务对象 risk_special_equipment
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskSpecialEquipment.class, reverseConvertGenerate = false)
+public class RiskSpecialEquipmentBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 设备编号
+     */
+    @Size(min = 0, max = 500, message = "设备编号长度不能超过{max}个字符")
+    private String equipmentCode;
+
+    /**
+     * 设备名称
+     */
+    @NotBlank(message = "设备名称不能为空")
+    @Size(min = 0, max = 500, message = "设备名称长度不能超过{max}个字符")
+    private String equipmentName;
+
+    /**
+     * 设备类型
+     */
+    @NotBlank(message = "设备类型不能为空")
+    @Size(min = 0, max = 500, message = "设备类型长度不能超过{max}个字符")
+    private String equipmentType;
+
+    /**
+     * 型号
+     */
+    @Size(min = 0, max = 500, message = "型号长度不能超过{max}个字符")
+    private String model;
+
+    /**
+     * 规格
+     */
+    @Size(min = 0, max = 500, message = "规格长度不能超过{max}个字符")
+    private String specification;
+
+    /**
+     * 制造商
+     */
+    @Size(min = 0, max = 500, message = "制造商长度不能超过{max}个字符")
+    private String manufacturer;
+
+    /**
+     * 生产日期
+     */
+    private Date manufactureDate;
+
+    /**
+     * 采购日期
+     */
+    private Date purchaseDate;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 安装位置
+     */
+    @Size(min = 0, max = 500, message = "安装位置长度不能超过{max}个字符")
+    private String location;
+
+    /**
+     * 设备照片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 安装日期
+     */
+    private Date installDate;
+
+    /**
+     * 使用状态
+     */
+    @Size(min = 0, max = 500, message = "使用状态长度不能超过{max}个字符")
+    private String useStatus;
+
+    /**
+     * 检验状态
+     */
+    @Size(min = 0, max = 500, message = "检验状态长度不能超过{max}个字符")
+    private String inspectionStatus;
+
+    /**
+     * 下次检验日期
+     */
+    private Date nextInspectionDate;
+
+    /**
+     * 负责人ID
+     */
+    private Long responsibleId;
+
+    /**
+     * 负责人
+     */
+    @Size(min = 0, max = 500, message = "负责人长度不能超过{max}个字符")
+    private String responsibleName;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 128 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskWarningBo.java

@@ -0,0 +1,128 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskWarning;
+
+/**
+ * 风险警示业务对象 risk_warning
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskWarning.class, reverseConvertGenerate = false)
+public class RiskWarningBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 警示编号
+     */
+    @Size(min = 0, max = 500, message = "警示编号长度不能超过{max}个字符")
+    private String warningCode;
+
+    /**
+     * 警示标题
+     */
+    @NotBlank(message = "警示标题不能为空")
+    @Size(min = 0, max = 500, message = "警示标题长度不能超过{max}个字符")
+    private String warningTitle;
+
+    /**
+     * 警示类型
+     */
+    @NotBlank(message = "警示类型不能为空")
+    @Size(min = 0, max = 500, message = "警示类型长度不能超过{max}个字符")
+    private String warningType;
+
+    /**
+     * 警示等级
+     */
+    @NotBlank(message = "警示等级不能为空")
+    @Size(min = 0, max = 500, message = "警示等级长度不能超过{max}个字符")
+    private String warningLevel;
+
+    /**
+     * 警示来源
+     */
+    @Size(min = 0, max = 500, message = "警示来源长度不能超过{max}个字符")
+    private String warningSource;
+
+    /**
+     * 警示内容
+     */
+    @Size(min = 0, max = 500, message = "警示内容长度不能超过{max}个字符")
+    private String warningContent;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 发布时间
+     */
+    @NotNull(message = "发布时间不能为空")
+    private Date releaseTime;
+
+    /**
+     * 过期时间
+     */
+    private Date expireTime;
+
+    /**
+     * 发布人ID
+     */
+    private Long releaserId;
+
+    /**
+     * 发布人
+     */
+    @Size(min = 0, max = 500, message = "发布人长度不能超过{max}个字符")
+    private String releaserName;
+
+    /**
+     * 发布范围
+     */
+    @Size(min = 0, max = 500, message = "发布范围长度不能超过{max}个字符")
+    private String publishScope;
+
+    /**
+     * 状态
+     */
+    @Size(min = 0, max = 500, message = "状态长度不能超过{max}个字符")
+    private String status;
+
+    /**
+     * 阅读数
+     */
+    private Integer readCount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 174 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskWorkReportBo.java

@@ -0,0 +1,174 @@
+package org.dromara.risk.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.risk.domain.RiskWorkReport;
+
+/**
+ * 作业上报业务对象 risk_work_report
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = RiskWorkReport.class, reverseConvertGenerate = false)
+public class RiskWorkReportBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 上报编号
+     */
+    @Size(min = 0, max = 500, message = "上报编号长度不能超过{max}个字符")
+    private String reportCode;
+
+    /**
+     * 作业类型
+     */
+    @NotBlank(message = "作业类型不能为空")
+    @Size(min = 0, max = 500, message = "作业类型长度不能超过{max}个字符")
+    private String workType;
+
+    /**
+     * 作业标题
+     */
+    @NotBlank(message = "作业标题不能为空")
+    @Size(min = 0, max = 500, message = "作业标题长度不能超过{max}个字符")
+    private String workTitle;
+
+    /**
+     * 作业内容
+     */
+    @Size(min = 0, max = 500, message = "作业内容长度不能超过{max}个字符")
+    private String workContent;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @Size(min = 0, max = 500, message = "门店名称长度不能超过{max}个字符")
+    private String storeName;
+
+    /**
+     * 作业位置
+     */
+    @Size(min = 0, max = 500, message = "作业位置长度不能超过{max}个字符")
+    private String workLocation;
+
+    /**
+     * 作业开始时间
+     */
+    private Date workStartTime;
+
+    /**
+     * 作业结束时间
+     */
+    private Date workEndTime;
+
+    /**
+     * 上报人ID
+     */
+    private Long reporterId;
+
+    /**
+     * 上报人
+     */
+    @Size(min = 0, max = 500, message = "上报人长度不能超过{max}个字符")
+    private String reporterName;
+
+    /**
+     * 上报时间
+     */
+    @NotNull(message = "上报时间不能为空")
+    private Date reportTime;
+
+    /**
+     * 联系电话
+     */
+    private String contactPhone;
+
+    /**
+     * 现场施工图片(JSON数组)
+     */
+    private String photoList;
+
+    /**
+     * 施工证件URL
+     */
+    private String certFile;
+
+    /**
+     * 施工证件名称
+     */
+    private String certName;
+
+    /**
+     * 参与人员
+     */
+    @Size(min = 0, max = 500, message = "参与人员长度不能超过{max}个字符")
+    private String participants;
+
+    /**
+     * 风险措施
+     */
+    @Size(min = 0, max = 500, message = "风险措施长度不能超过{max}个字符")
+    private String riskMeasures;
+
+    /**
+     * 作业结果
+     */
+    @Size(min = 0, max = 500, message = "作业结果长度不能超过{max}个字符")
+    private String workResult;
+
+    /**
+     * 审核状态
+     */
+    @Size(min = 0, max = 500, message = "审核状态长度不能超过{max}个字符")
+    private String auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    @Size(min = 0, max = 500, message = "审核人长度不能超过{max}个字符")
+    private String auditorName;
+
+    /**
+     * 审核时间
+     */
+    private Date auditTime;
+
+    /**
+     * 审核意见
+     */
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 关键词搜索
+     */
+    private String keyword;
+
+}

+ 78 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/AccidentStatsVo.java

@@ -0,0 +1,78 @@
+package org.dromara.risk.domain.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 事故上报 统计视图对象
+ *
+ * @author ruoyi
+ */
+@Data
+public class AccidentStatsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 本月上报事故总数
+     */
+    private Long monthTotal;
+
+    /**
+     * 上月上报事故总数
+     */
+    private Long lastMonthTotal;
+
+    /**
+     * 本月较上月环比变化率(单位 %)
+     */
+    private Double monthRate;
+
+    /**
+     * 调查中事故总数
+     */
+    private Long investigating;
+
+    /**
+     * 上月调查中事故总数
+     */
+    private Long lastMonthInvestigating;
+
+    /**
+     * 调查中较上月环比变化率(单位 %)
+     */
+    private Double investigatingRate;
+
+    /**
+     * 已结束事故总数
+     */
+    private Long finished;
+
+    /**
+     * 上月已结束事故总数
+     */
+    private Long lastMonthFinished;
+
+    /**
+     * 已结束较上月环比变化率(单位 %)
+     */
+    private Double finishedRate;
+
+    /**
+     * 待考核事故总数
+     */
+    private Long pendingAssess;
+
+    /**
+     * 上月待考核事故总数
+     */
+    private Long lastMonthPendingAssess;
+
+    /**
+     * 待考核较上月环比变化率(单位 %)
+     */
+    private Double pendingAssessRate;
+
+}

+ 33 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/AccidentTrendVo.java

@@ -0,0 +1,33 @@
+package org.dromara.risk.domain.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 事故上报 近12个月趋势视图对象
+ *
+ * @author ruoyi
+ */
+@Data
+public class AccidentTrendVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 月份(格式 yyyy-MM)
+     */
+    private String month;
+
+    /**
+     * 当月上报表数
+     */
+    private Long reportCount;
+
+    /**
+     * 当月已结束数
+     */
+    private Long finishedCount;
+
+}

+ 45 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/DashboardStatsVo.java

@@ -0,0 +1,45 @@
+package org.dromara.risk.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Dashboard 工作台统计 VO
+ *
+ * @author ruoyi
+ */
+@Data
+public class DashboardStatsVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 安全隐患总数 */
+    private Integer dangerTotal;
+
+    /** 较昨日增减比例(%) */
+    private Double dangerDayRatio;
+
+    /** 昨日隐患总数 */
+    private Integer dangerYesterdayTotal;
+
+    /** 已处理隐患数 */
+    private Integer dangerHandled;
+
+    /** 待处理隐患数 */
+    private Integer dangerPending;
+
+    /** 特种设备总数 */
+    private Integer equipmentTotal;
+
+    /** 维护中的特种设备数 */
+    private Integer equipmentMaintaining;
+
+    /** 隐患类型分布 */
+    private List<Map<String, Object>> dangerTypeStats;
+
+    /** 月度隐患趋势 */
+    private List<Map<String, Object>> monthlyTrend;
+}

+ 38 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/InspectionStatsVo.java

@@ -0,0 +1,38 @@
+package org.dromara.risk.domain.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 巡检管理 统计视图对象
+ *
+ * @author ruoyi
+ */
+@Data
+public class InspectionStatsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 今日应打卡任务总数
+     */
+    private Long todayShould;
+
+    /**
+     * 今日已打卡任务总数
+     */
+    private Long todayChecked;
+
+    /**
+     * 异常打卡任务数
+     */
+    private Long abnormal;
+
+    /**
+     * 未打卡任务数
+     */
+    private Long unchecked;
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/PublicOpinionStatsVo.java

@@ -0,0 +1,68 @@
+package org.dromara.risk.domain.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 舆情推送 统计视图对象
+ *
+ * @author ruoyi
+ */
+@Data
+public class PublicOpinionStatsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 今日舆情总数
+     */
+    private Long todayTotal;
+
+    /**
+     * 昨日舆情总数
+     */
+    private Long yesterdayTotal;
+
+    /**
+     * 今日较昨日增长率(单位 %)
+     */
+    private Double todayGrowth;
+
+    /**
+     * 今日重大舆情数
+     */
+    private Long majorTotal;
+
+    /**
+     * 昨日重大舆情数
+     */
+    private Long majorYesterday;
+
+    /**
+     * 重大舆情较昨日变化量
+     */
+    private Long majorChange;
+
+    /**
+     * 今日已处理舆情数
+     */
+    private Long handledTotal;
+
+    /**
+     * 今日总待处理基数
+     */
+    private Long handleBase;
+
+    /**
+     * 处理率(单位 %)
+     */
+    private Double handleRate;
+
+    /**
+     * 待处理舆情数
+     */
+    private Long pendingTotal;
+
+}

+ 38 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/PublicOpinionTrendVo.java

@@ -0,0 +1,38 @@
+package org.dromara.risk.domain.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 舆情推送 近七天趋势视图对象
+ *
+ * @author ruoyi
+ */
+@Data
+public class PublicOpinionTrendVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 日期(格式 yyyy-MM-dd)
+     */
+    private String date;
+
+    /**
+     * 当日总舆情数
+     */
+    private Long totalCount;
+
+    /**
+     * 当日重大舆情数
+     */
+    private Long majorCount;
+
+    /**
+     * 当日已处理舆情数
+     */
+    private Long handledCount;
+
+}

+ 42 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RecentDangerVo.java

@@ -0,0 +1,42 @@
+package org.dromara.risk.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 最近安全隐患(首页用)
+ *
+ * @author ruoyi
+ */
+@Data
+public class RecentDangerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 隐患编号 */
+    private String dangerCode;
+
+    /** 隐患标题 */
+    private String dangerTitle;
+
+    /** 隐患位置(用 storeName 代替) */
+    private String location;
+
+    /** 隐患类型 */
+    private String dangerType;
+
+    /** 风险等级 */
+    private String dangerLevel;
+
+    /** 上报时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date reportTime;
+
+    /** 处理状态 */
+    private String handleStatus;
+}

+ 30 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RecentNoticeVo.java

@@ -0,0 +1,30 @@
+package org.dromara.risk.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 最近公告(首页用)
+ *
+ * @author ruoyi
+ */
+@Data
+public class RecentNoticeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 公告标题 */
+    private String title;
+
+    /** 公告摘要 */
+    private String summary;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date publishTime;
+}

+ 27 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RecentTrainingVo.java

@@ -0,0 +1,27 @@
+package org.dromara.risk.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 近期安全培训(首页用)
+ *
+ * @author ruoyi
+ */
+@Data
+public class RecentTrainingVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 培训名称 */
+    private String trainingName;
+
+    /** 培训时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date trainingTime;
+}

+ 217 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskAccidentVo.java

@@ -0,0 +1,217 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskAccident;
+
+/**
+ * 事故上报视图对象 risk_accident
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskAccident.class)
+public class RiskAccidentVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 事故编号
+     */
+    @ExcelProperty(value = "事故编号")
+    private String accidentCode;
+
+    /**
+     * 事故标题
+     */
+    @ExcelProperty(value = "事故标题")
+    private String accidentTitle;
+
+    /**
+     * 事故类型
+     */
+    @ExcelProperty(value = "事故类型")
+    private String accidentType;
+
+    /**
+     * 事故等级
+     */
+    @ExcelProperty(value = "事故等级")
+    private String accidentLevel;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 事故地点
+     */
+    @ExcelProperty(value = "事故地点")
+    private String accidentLocation;
+
+    /**
+     * 事故时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "事故时间")
+    private Date accidentTime;
+
+    /**
+     * 事故原因
+     */
+    @ExcelProperty(value = "事故原因")
+    private String accidentCause;
+
+    /**
+     * 事故描述
+     */
+    @ExcelProperty(value = "事故描述")
+    private String accidentDesc;
+
+    /**
+     * 死亡人数
+     */
+    @ExcelProperty(value = "死亡人数")
+    private Integer deathCount;
+
+    /**
+     * 受伤人数
+     */
+    @ExcelProperty(value = "受伤人数")
+    private Integer injuryCount;
+
+    /**
+     * 损失金额
+     */
+    @ExcelProperty(value = "损失金额")
+    private BigDecimal lossAmount;
+
+    /**
+     * 上报人ID
+     */
+    @ExcelProperty(value = "上报人ID")
+    private Long reporterId;
+
+    /**
+     * 上报人
+     */
+    @ExcelProperty(value = "上报人")
+    private String reporterName;
+
+    /**
+     * 上报时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "上报时间")
+    private Date reportTime;
+
+    /**
+     * 处理状态
+     */
+    @ExcelProperty(value = "处理状态")
+    private String handleStatus;
+
+    /**
+     * 处理人ID
+     */
+    @ExcelProperty(value = "处理人ID")
+    private Long handlerId;
+
+    /**
+     * 处理人
+     */
+    @ExcelProperty(value = "处理人")
+    private String handlerName;
+
+    /**
+     * 处理措施
+     */
+    @ExcelProperty(value = "处理措施")
+    private String handleMeasures;
+
+    /**
+     * 调查结果
+     */
+    @ExcelProperty(value = "调查结果")
+    private String investigationResult;
+
+    /**
+     * 改进措施
+     */
+    @ExcelProperty(value = "改进措施")
+    private String improvementMeasures;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 涉及人员
+     */
+    private String participants;
+
+    /**
+     * 现场照片
+     */
+    private String photoList;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 140 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskAuditFileVo.java

@@ -0,0 +1,140 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskAuditFile;
+
+/**
+ * 审计文件视图对象 risk_audit_file
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskAuditFile.class)
+public class RiskAuditFileVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 文件编号
+     */
+    @ExcelProperty(value = "文件编号")
+    private String fileCode;
+
+    /**
+     * 关联人员变动ID
+     */
+    @ExcelProperty(value = "关联人员变动ID")
+    private Long changeId;
+
+    /**
+     * 文件名
+     */
+    @ExcelProperty(value = "文件名")
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    @ExcelProperty(value = "文件类型")
+    private String fileType;
+
+    /**
+     * 文件URL
+     */
+    @ExcelProperty(value = "文件URL")
+    private String fileUrl;
+
+    /**
+     * 文件大小(字节)
+     */
+    @ExcelProperty(value = "文件大小(字节)")
+    private Long fileSize;
+
+    /**
+     * 上传人ID
+     */
+    @ExcelProperty(value = "上传人ID")
+    private Long uploadBy;
+
+    /**
+     * 上传人
+     */
+    @ExcelProperty(value = "上传人")
+    private String uploadName;
+
+    /**
+     * 上传时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "上传时间")
+    private Date uploadTime;
+
+    /**
+     * 审核结果
+     */
+    @ExcelProperty(value = "审核结果")
+    private String auditResult;
+
+    /**
+     * 审核意见
+     */
+    @ExcelProperty(value = "审核意见")
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 152 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskDangerSourceVo.java

@@ -0,0 +1,152 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskDangerSource;
+
+/**
+ * 危险源视图对象 risk_danger_source
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskDangerSource.class)
+public class RiskDangerSourceVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 危险源编号
+     */
+    @ExcelProperty(value = "危险源编号")
+    private String sourceCode;
+
+    /**
+     * 危险源名称
+     */
+    @ExcelProperty(value = "危险源名称")
+    private String sourceName;
+
+    /**
+     * 危险源类型
+     */
+    @ExcelProperty(value = "危险源类型")
+    private String sourceType;
+
+    /**
+     * 风险等级
+     */
+    @ExcelProperty(value = "风险等级")
+    private String riskLevel;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 位置
+     */
+    @ExcelProperty(value = "位置")
+    private String location;
+
+    /**
+     * 危险源描述
+     */
+    @ExcelProperty(value = "危险源描述")
+    private String sourceDesc;
+
+    /**
+     * 管控措施
+     */
+    @ExcelProperty(value = "管控措施")
+    private String controlMeasures;
+
+    /**
+     * 上报时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "上报时间")
+    private Date reportTime;
+
+    /**
+     * 责任人ID
+     */
+    @ExcelProperty(value = "责任人ID")
+    private Long responsibleId;
+
+    /**
+     * 责任人
+     */
+    @ExcelProperty(value = "责任人")
+    private String responsibleName;
+
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 92 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskEquipmentMaintenanceVo.java

@@ -0,0 +1,92 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.risk.domain.RiskEquipmentMaintenance;
+
+/**
+ * 设备维护视图对象 risk_equipment_maintenance
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskEquipmentMaintenance.class)
+public class RiskEquipmentMaintenanceVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    @ExcelProperty(value = "设备ID")
+    private Long equipmentId;
+
+    @ExcelProperty(value = "设备编号")
+    private String equipmentCode;
+
+    @ExcelProperty(value = "设备名称")
+    private String equipmentName;
+
+    @ExcelProperty(value = "维护状态")
+    private String maintenanceStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "预计开始时间")
+    private Date planStartTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "预计结束时间")
+    private Date planEndTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "实际开始时间")
+    private Date actualStartTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "实际结束时间")
+    private Date actualEndTime;
+
+    @ExcelProperty(value = "维护人员")
+    private String maintainerName;
+
+    @ExcelProperty(value = "现场人员")
+    private String siteName;
+
+    @ExcelProperty(value = "维护内容")
+    private String maintenanceContent;
+
+    @ExcelProperty(value = "维护结果")
+    private String maintenanceResult;
+
+    @ExcelProperty(value = "维护照片")
+    private String photoList;
+
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 190 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskHiddenDangerVo.java

@@ -0,0 +1,190 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskHiddenDanger;
+
+/**
+ * 安全隐患视图对象 risk_hidden_danger
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskHiddenDanger.class)
+public class RiskHiddenDangerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 隐患编号
+     */
+    @ExcelProperty(value = "隐患编号")
+    private String dangerCode;
+
+    /**
+     * 隐患标题
+     */
+    @ExcelProperty(value = "隐患标题")
+    private String dangerTitle;
+
+    /**
+     * 隐患类型
+     */
+    @ExcelProperty(value = "隐患类型")
+    private String dangerType;
+
+    /**
+     * 风险等级
+     */
+    @ExcelProperty(value = "风险等级")
+    private String dangerLevel;
+
+    /**
+     * 隐患来源
+     */
+    @ExcelProperty(value = "隐患来源")
+    private String dangerSource;
+
+    /**
+     * 隐患描述
+     */
+    @ExcelProperty(value = "隐患描述")
+    private String dangerDesc;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 发现人ID
+     */
+    @ExcelProperty(value = "发现人ID")
+    private Long discovererId;
+
+    /**
+     * 发现人
+     */
+    @ExcelProperty(value = "发现人")
+    private String discovererName;
+
+    /**
+     * 发现时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "发现时间")
+    private Date discoverTime;
+
+    /**
+     * 处理状态
+     */
+    @ExcelProperty(value = "处理状态")
+    private String handleStatus;
+
+    /**
+     * 处理人ID
+     */
+    @ExcelProperty(value = "处理人ID")
+    private Long handlerId;
+
+    /**
+     * 处理人
+     */
+    @ExcelProperty(value = "处理人")
+    private String handlerName;
+
+    /**
+     * 处理时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "处理时间")
+    private Date handleTime;
+
+    /**
+     * 处理结果
+     */
+    @ExcelProperty(value = "处理结果")
+    private String handleResult;
+
+    /**
+     * 处理措施
+     */
+    @ExcelProperty(value = "处理措施")
+    private String handleMeasures;
+
+    /**
+     * 完成时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "完成时间")
+    private Date finishTime;
+
+    /**
+     * 现场照片(JSON数组)
+     */
+    @ExcelProperty(value = "现场照片")
+    private String photoList;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 174 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskInspectionRecordVo.java

@@ -0,0 +1,174 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.risk.domain.RiskInspectionRecord;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 巡检打卡记录视图对象 risk_inspection_record
+ *
+ * @author ruoyi
+ */
+@Data
+@AutoMapper(target = RiskInspectionRecord.class)
+public class RiskInspectionRecordVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 任务ID
+     */
+    @ExcelProperty(value = "任务ID")
+    private Long taskId;
+
+    /**
+     * 任务名称
+     */
+    @ExcelProperty(value = "任务名称")
+    private String taskName;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 打卡时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "打卡时间")
+    private Date checkInTime;
+
+    /**
+     * 离开时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date checkOutTime;
+
+    /**
+     * 打卡地点
+     */
+    @ExcelProperty(value = "打卡地点")
+    private String checkInLocation;
+
+    /**
+     * 打卡经度
+     */
+    private BigDecimal checkInLng;
+
+    /**
+     * 打卡纬度
+     */
+    private BigDecimal checkInLat;
+
+    /**
+     * 打卡照片
+     */
+    private String checkInPhoto;
+
+    /**
+     * 离开地点
+     */
+    private String checkOutLocation;
+
+    /**
+     * 离开经度
+     */
+    private BigDecimal checkOutLng;
+
+    /**
+     * 离开纬度
+     */
+    private BigDecimal checkOutLat;
+
+    /**
+     * 离开照片
+     */
+    private String checkOutPhoto;
+
+    /**
+     * 打卡人ID
+     */
+    private Long inspectorId;
+
+    /**
+     * 打卡人
+     */
+    @ExcelProperty(value = "打卡人")
+    private String inspectorName;
+
+    /**
+     * 记录状态(已打卡/未打卡/异常打卡)
+     */
+    @ExcelProperty(value = "记录状态")
+    private String recordStatus;
+
+    /**
+     * 打卡结果(正常/异常)
+     */
+    @ExcelProperty(value = "打卡结果")
+    private String checkResult;
+
+    /**
+     * 打卡地点(冗余字段)
+     */
+    private String location;
+
+    /**
+     * 问题数
+     */
+    @ExcelProperty(value = "问题数")
+    private Integer problemCount;
+
+    /**
+     * 总数
+     */
+    @ExcelProperty(value = "总数")
+    private Integer totalCount;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 229 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskInspectionTaskVo.java

@@ -0,0 +1,229 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskInspectionTask;
+
+/**
+ * 巡检任务视图对象 risk_inspection_task
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskInspectionTask.class)
+public class RiskInspectionTaskVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 任务编号
+     */
+    @ExcelProperty(value = "任务编号")
+    private String taskCode;
+
+    /**
+     * 任务名称
+     */
+    @ExcelProperty(value = "任务名称")
+    private String taskName;
+
+    /**
+     * 任务类型
+     */
+    @ExcelProperty(value = "任务类型")
+    private String taskType;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 计划开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "计划开始时间")
+    private Date planStartTime;
+
+    /**
+     * 计划结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "计划结束时间")
+    private Date planEndTime;
+
+    /**
+     * 实际开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "实际开始时间")
+    private Date actualStartTime;
+
+    /**
+     * 实际结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "实际结束时间")
+    private Date actualEndTime;
+
+    /**
+     * 巡检人ID
+     */
+    @ExcelProperty(value = "巡检人ID")
+    private Long inspectorId;
+
+    /**
+     * 巡检人
+     */
+    @ExcelProperty(value = "巡检人")
+    private String inspectorName;
+
+    /**
+     * 任务状态
+     */
+    @ExcelProperty(value = "任务状态")
+    private String taskStatus;
+
+    /**
+     * 项目数
+     */
+    @ExcelProperty(value = "项目数")
+    private Integer itemCount;
+
+    /**
+     * 已完成数
+     */
+    @ExcelProperty(value = "已完成数")
+    private Integer completedCount;
+
+    /**
+     * 合格率
+     */
+    @ExcelProperty(value = "合格率")
+    private BigDecimal passRate;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 位置区域
+     */
+    @ExcelProperty(value = "位置区域")
+    private String location;
+
+    /**
+     * 经度
+     */
+    @ExcelProperty(value = "经度")
+    private java.math.BigDecimal lng;
+
+    /**
+     * 纬度
+     */
+    @ExcelProperty(value = "纬度")
+    private java.math.BigDecimal lat;
+
+    /**
+     * 巡检周期
+     */
+    @ExcelProperty(value = "巡检周期")
+    private String cycle;
+
+    /**
+     * 是否开启扫码打卡
+     */
+    @ExcelProperty(value = "扫码打卡")
+    private String scanEnabled;
+
+    /**
+     * 打卡方式
+     */
+    @ExcelProperty(value = "打卡方式")
+    private String checkMethod;
+
+    /**
+     * 审核人ID
+     */
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private String auditorName;
+
+    /**
+     * 执行星期
+     */
+    private String dayOfWeek;
+
+    /**
+     * 执行日期
+     */
+    private String dayOfMonth;
+
+    /**
+     * 执行时间段
+     */
+    private String timeSlot;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 135 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPersonnelCertVo.java

@@ -0,0 +1,135 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskPersonnelCert;
+
+/**
+ * 人员证书视图对象 risk_personnel_cert
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskPersonnelCert.class)
+public class RiskPersonnelCertVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 人员ID
+     */
+    @ExcelProperty(value = "人员ID")
+    private Long personnelId;
+
+    /**
+     * 人员姓名
+     */
+    @ExcelProperty(value = "人员姓名")
+    private String personnelName;
+
+    /**
+     * 证书类型
+     */
+    @ExcelProperty(value = "证书类型")
+    private String certType;
+
+    /**
+     * 证书名称
+     */
+    @ExcelProperty(value = "证书名称")
+    private String certName;
+
+    /**
+     * 证书编号
+     */
+    @ExcelProperty(value = "证书编号")
+    private String certNo;
+
+    /**
+     * 颁发机构
+     */
+    @ExcelProperty(value = "颁发机构")
+    private String issueOrg;
+
+    /**
+     * 颁发日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "颁发日期")
+    private Date issueDate;
+
+    /**
+     * 过期日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "过期日期")
+    private Date expireDate;
+
+    /**
+     * 证书状态
+     */
+    @ExcelProperty(value = "证书状态")
+    private String certStatus;
+
+    /**
+     * 证书附件
+     */
+    @ExcelProperty(value = "证书附件")
+    private String certFile;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 201 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPersonnelChangeVo.java

@@ -0,0 +1,201 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskPersonnelChange;
+
+/**
+ * 人员变动视图对象 risk_personnel_change
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskPersonnelChange.class)
+public class RiskPersonnelChangeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 变动编号
+     */
+    @ExcelProperty(value = "变动编号")
+    private String changeCode;
+
+    /**
+     * 人员ID
+     */
+    @ExcelProperty(value = "人员ID")
+    private Long personnelId;
+
+    /**
+     * 人员姓名
+     */
+    @ExcelProperty(value = "人员姓名")
+    private String personnelName;
+
+    /**
+     * 变动类型
+     */
+    @ExcelProperty(value = "变动类型")
+    private String changeType;
+
+    /**
+     * 变动原因
+     */
+    @ExcelProperty(value = "变动原因")
+    private String changeReason;
+
+    /**
+     * 变动日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "变动日期")
+    private Date changeDate;
+
+    /**
+     * 变动前门店ID
+     */
+    @ExcelProperty(value = "变动前门店ID")
+    private Long beforeStoreId;
+
+    /**
+     * 变动前门店
+     */
+    @ExcelProperty(value = "变动前门店")
+    private String beforeStoreName;
+
+    /**
+     * 变动前部门
+     */
+    @ExcelProperty(value = "变动前部门")
+    private String beforeDept;
+
+    /**
+     * 变动前岗位
+     */
+    @ExcelProperty(value = "变动前岗位")
+    private String beforePosition;
+
+    /**
+     * 变动后门店ID
+     */
+    @ExcelProperty(value = "变动后门店ID")
+    private Long afterStoreId;
+
+    /**
+     * 变动后门店
+     */
+    @ExcelProperty(value = "变动后门店")
+    private String afterStoreName;
+
+    /**
+     * 变动后部门
+     */
+    @ExcelProperty(value = "变动后部门")
+    private String afterDept;
+
+    /**
+     * 变动后岗位
+     */
+    @ExcelProperty(value = "变动后岗位")
+    private String afterPosition;
+
+    /**
+     * 经办人ID
+     */
+    @ExcelProperty(value = "经办人ID")
+    private Long handlerId;
+
+    /**
+     * 经办人
+     */
+    @ExcelProperty(value = "经办人")
+    private String handlerName;
+
+    /**
+     * 审核状态
+     */
+    @ExcelProperty(value = "审核状态")
+    private String auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    @ExcelProperty(value = "审核人ID")
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private String auditorName;
+
+    /**
+     * 审核时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "审核时间")
+    private Date auditTime;
+
+    /**
+     * 审核意见
+     */
+    @ExcelProperty(value = "审核意见")
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 209 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPersonnelVo.java

@@ -0,0 +1,209 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskPersonnel;
+
+/**
+ * 人员视图对象 risk_personnel
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskPersonnel.class)
+public class RiskPersonnelVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 人员编号
+     */
+    @ExcelProperty(value = "人员编号")
+    private String personnelCode;
+
+    /**
+     * 姓名
+     */
+    @ExcelProperty(value = "姓名")
+    private String personnelName;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别")
+    private String gender;
+
+    /**
+     * 身份证号
+     */
+    @ExcelProperty(value = "身份证号")
+    private String idCard;
+
+    /**
+     * 年龄
+     */
+    @ExcelProperty(value = "年龄")
+    private Integer age;
+
+    /**
+     * 手机号
+     */
+    @ExcelProperty(value = "手机号")
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    @ExcelProperty(value = "邮箱")
+    private String email;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 部门
+     */
+    @ExcelProperty(value = "部门")
+    private String department;
+
+    /**
+     * 岗位
+     */
+    @ExcelProperty(value = "岗位")
+    private String position;
+
+    /**
+     * 保险状态
+     */
+    @ExcelProperty(value = "保险状态")
+    private String insuranceStatus;
+
+    /**
+     * 保险有效期开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "保险有效期开始")
+    private Date insuranceStartDate;
+
+    /**
+     * 保险有效期结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "保险有效期结束")
+    private Date insuranceExpireDate;
+
+    /**
+     * 工种
+     */
+    @ExcelProperty(value = "工种")
+    private String jobType;
+
+    /**
+     * 入职日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "入职日期")
+    private Date entryDate;
+
+    /**
+     * 离职日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "离职日期")
+    private Date leaveDate;
+
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private String status;
+
+    /**
+     * 健康状况
+     */
+    @ExcelProperty(value = "健康状况")
+    private String healthStatus;
+
+    /**
+     * 地址
+     */
+    @ExcelProperty(value = "地址")
+    private String address;
+
+    /**
+     * 紧急联系人
+     */
+    @ExcelProperty(value = "紧急联系人")
+    private String emergencyContact;
+
+    /**
+     * 紧急联系电话
+     */
+    @ExcelProperty(value = "紧急联系电话")
+    private String emergencyPhone;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 143 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskPublicOpinionVo.java

@@ -0,0 +1,143 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskPublicOpinion;
+
+/**
+ * 舆情推送视图对象 risk_public_opinion
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskPublicOpinion.class)
+public class RiskPublicOpinionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 舆情标题
+     */
+    @ExcelProperty(value = "舆情标题")
+    private String opinionTitle;
+
+    /**
+     * 舆情来源
+     */
+    @ExcelProperty(value = "舆情来源", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "risk_opinion_source")
+    private String source;
+
+    /**
+     * 发布时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "发布时间")
+    private Date publishTime;
+
+    /**
+     * 风险等级(重大/较大/一般)
+     */
+    @ExcelProperty(value = "风险等级", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "risk_opinion_level")
+    private String riskLevel;
+
+    /**
+     * 负责人
+     */
+    @ExcelProperty(value = "负责人")
+    private String responsiblePerson;
+
+    /**
+     * 舆情链接
+     */
+    @ExcelProperty(value = "舆情链接")
+    private String opinionLink;
+
+    /**
+     * 舆情内容
+     */
+    @ExcelProperty(value = "舆情内容")
+    private String opinionContent;
+
+    /**
+     * 处置建议
+     */
+    @ExcelProperty(value = "处置建议")
+    private String disposalSuggestion;
+
+    /**
+     * 状态(待处理/处理中/已处理)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "risk_opinion_status")
+    private String status;
+
+    /**
+     * 处理结果
+     */
+    @ExcelProperty(value = "处理结果")
+    private String handleResult;
+
+    /**
+     * 处理时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "处理时间")
+    private Date handleTime;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 185 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskSpecialEquipmentVo.java

@@ -0,0 +1,185 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskSpecialEquipment;
+
+/**
+ * 特种设备视图对象 risk_special_equipment
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskSpecialEquipment.class)
+public class RiskSpecialEquipmentVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 设备编号
+     */
+    @ExcelProperty(value = "设备编号")
+    private String equipmentCode;
+
+    /**
+     * 设备名称
+     */
+    @ExcelProperty(value = "设备名称")
+    private String equipmentName;
+
+    /**
+     * 设备类型
+     */
+    @ExcelProperty(value = "设备类型")
+    private String equipmentType;
+
+    /**
+     * 型号
+     */
+    @ExcelProperty(value = "型号")
+    private String model;
+
+    /**
+     * 规格
+     */
+    @ExcelProperty(value = "规格")
+    private String specification;
+
+    /**
+     * 制造商
+     */
+    @ExcelProperty(value = "制造商")
+    private String manufacturer;
+
+    /**
+     * 生产日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "生产日期")
+    private Date manufactureDate;
+
+    /**
+     * 采购日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "采购日期")
+    private Date purchaseDate;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 安装位置
+     */
+    @ExcelProperty(value = "安装位置")
+    private String location;
+
+    /**
+     * 设备照片(JSON数组)
+     */
+    @ExcelProperty(value = "设备照片")
+    private String photoList;
+
+    /**
+     * 安装日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "安装日期")
+    private Date installDate;
+
+    /**
+     * 使用状态
+     */
+    @ExcelProperty(value = "使用状态")
+    private String useStatus;
+
+    /**
+     * 检验状态
+     */
+    @ExcelProperty(value = "检验状态")
+    private String inspectionStatus;
+
+    /**
+     * 下次检验日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "下次检验日期")
+    private Date nextInspectionDate;
+
+    /**
+     * 负责人ID
+     */
+    @ExcelProperty(value = "负责人ID")
+    private Long responsibleId;
+
+    /**
+     * 负责人
+     */
+    @ExcelProperty(value = "负责人")
+    private String responsibleName;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 165 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskWarningVo.java

@@ -0,0 +1,165 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskWarning;
+
+/**
+ * 风险警示视图对象 risk_warning
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskWarning.class)
+public class RiskWarningVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 警示编号
+     */
+    @ExcelProperty(value = "警示编号")
+    private String warningCode;
+
+    /**
+     * 警示标题
+     */
+    @ExcelProperty(value = "警示标题")
+    private String warningTitle;
+
+    /**
+     * 警示类型
+     */
+    @ExcelProperty(value = "警示类型")
+    private String warningType;
+
+    /**
+     * 警示等级
+     */
+    @ExcelProperty(value = "警示等级")
+    private String warningLevel;
+
+    /**
+     * 警示来源
+     */
+    @ExcelProperty(value = "警示来源")
+    private String warningSource;
+
+    /**
+     * 警示内容
+     */
+    @ExcelProperty(value = "警示内容")
+    private String warningContent;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 发布时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "发布时间")
+    private Date releaseTime;
+
+    /**
+     * 过期时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "过期时间")
+    private Date expireTime;
+
+    /**
+     * 发布人ID
+     */
+    @ExcelProperty(value = "发布人ID")
+    private Long releaserId;
+
+    /**
+     * 发布人
+     */
+    @ExcelProperty(value = "发布人")
+    private String releaserName;
+
+    /**
+     * 发布范围
+     */
+    @ExcelProperty(value = "发布范围")
+    private String publishScope;
+
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private String status;
+
+    /**
+     * 阅读数
+     */
+    @ExcelProperty(value = "阅读数")
+    private Integer readCount;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 221 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskWorkReportVo.java

@@ -0,0 +1,221 @@
+package org.dromara.risk.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.risk.domain.RiskWorkReport;
+
+/**
+ * 作业上报视图对象 risk_work_report
+ *
+ * @author ruoyi
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = RiskWorkReport.class)
+public class RiskWorkReportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 上报编号
+     */
+    @ExcelProperty(value = "上报编号")
+    private String reportCode;
+
+    /**
+     * 作业类型
+     */
+    @ExcelProperty(value = "作业类型")
+    private String workType;
+
+    /**
+     * 作业标题
+     */
+    @ExcelProperty(value = "作业标题")
+    private String workTitle;
+
+    /**
+     * 作业内容
+     */
+    @ExcelProperty(value = "作业内容")
+    private String workContent;
+
+    /**
+     * 门店ID
+     */
+    @ExcelProperty(value = "门店ID")
+    private Long storeId;
+
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String storeName;
+
+    /**
+     * 作业位置
+     */
+    @ExcelProperty(value = "作业位置")
+    private String workLocation;
+
+    /**
+     * 作业开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "作业开始时间")
+    private Date workStartTime;
+
+    /**
+     * 作业结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "作业结束时间")
+    private Date workEndTime;
+
+    /**
+     * 上报人ID
+     */
+    @ExcelProperty(value = "上报人ID")
+    private Long reporterId;
+
+    /**
+     * 上报人
+     */
+    @ExcelProperty(value = "上报人")
+    private String reporterName;
+
+    /**
+     * 上报时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "上报时间")
+    private Date reportTime;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String contactPhone;
+
+    /**
+     * 现场施工图片(JSON数组)
+     */
+    @ExcelProperty(value = "现场施工图片")
+    private String photoList;
+
+    /**
+     * 施工证件URL
+     */
+    @ExcelProperty(value = "施工证件URL")
+    private String certFile;
+
+    /**
+     * 施工证件名称
+     */
+    @ExcelProperty(value = "施工证件名称")
+    private String certName;
+
+    /**
+     * 参与人员
+     */
+    @ExcelProperty(value = "参与人员")
+    private String participants;
+
+    /**
+     * 风险措施
+     */
+    @ExcelProperty(value = "风险措施")
+    private String riskMeasures;
+
+    /**
+     * 作业结果
+     */
+    @ExcelProperty(value = "作业结果")
+    private String workResult;
+
+    /**
+     * 审核状态
+     */
+    @ExcelProperty(value = "审核状态")
+    private String auditStatus;
+
+    /**
+     * 审核人ID
+     */
+    @ExcelProperty(value = "审核人ID")
+    private Long auditorId;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private String auditorName;
+
+    /**
+     * 审核时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "审核时间")
+    private Date auditTime;
+
+    /**
+     * 审核意见
+     */
+    @ExcelProperty(value = "审核意见")
+    private String auditOpinion;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建部门
+     */
+    @ExcelProperty(value = "创建部门")
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskAccidentMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskAccident;
+import org.dromara.risk.domain.vo.RiskAccidentVo;
+
+/**
+ * 事故上报 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskAccidentMapper extends BaseMapperPlus<RiskAccident, RiskAccidentVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskAuditFileMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskAuditFile;
+import org.dromara.risk.domain.vo.RiskAuditFileVo;
+
+/**
+ * 审计文件 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskAuditFileMapper extends BaseMapperPlus<RiskAuditFile, RiskAuditFileVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskDangerSourceMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskDangerSource;
+import org.dromara.risk.domain.vo.RiskDangerSourceVo;
+
+/**
+ * 危险源 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskDangerSourceMapper extends BaseMapperPlus<RiskDangerSource, RiskDangerSourceVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskEquipmentMaintenanceMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskEquipmentMaintenance;
+import org.dromara.risk.domain.vo.RiskEquipmentMaintenanceVo;
+
+/**
+ * 设备维护记录 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskEquipmentMaintenanceMapper extends BaseMapperPlus<RiskEquipmentMaintenance, RiskEquipmentMaintenanceVo> {
+
+}

+ 32 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskHiddenDangerMapper.java

@@ -0,0 +1,32 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskHiddenDanger;
+import org.dromara.risk.domain.vo.RiskHiddenDangerVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 安全隐患 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskHiddenDangerMapper extends BaseMapperPlus<RiskHiddenDanger, RiskHiddenDangerVo> {
+
+    /**
+     * 按月统计隐患趋势(上报数 + 已处理数)
+     */
+    List<Map<String, Object>> selectMonthlyTrend();
+
+    /**
+     * 统计昨日隐患总数
+     */
+    int countYesterdayDangers();
+
+    /**
+     * 按隐患类型分组统计
+     */
+    List<Map<String, Object>> countByDangerType();
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskInspectionRecordMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskInspectionRecord;
+import org.dromara.risk.domain.vo.RiskInspectionRecordVo;
+
+/**
+ * 巡检打卡记录 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskInspectionRecordMapper extends BaseMapperPlus<RiskInspectionRecord, RiskInspectionRecordVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskInspectionTaskMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskInspectionTask;
+import org.dromara.risk.domain.vo.RiskInspectionTaskVo;
+
+/**
+ * 巡检任务 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskInspectionTaskMapper extends BaseMapperPlus<RiskInspectionTask, RiskInspectionTaskVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPersonnelCertMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskPersonnelCert;
+import org.dromara.risk.domain.vo.RiskPersonnelCertVo;
+
+/**
+ * 人员证书 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskPersonnelCertMapper extends BaseMapperPlus<RiskPersonnelCert, RiskPersonnelCertVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPersonnelChangeMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskPersonnelChange;
+import org.dromara.risk.domain.vo.RiskPersonnelChangeVo;
+
+/**
+ * 人员变动 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskPersonnelChangeMapper extends BaseMapperPlus<RiskPersonnelChange, RiskPersonnelChangeVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPersonnelMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskPersonnel;
+import org.dromara.risk.domain.vo.RiskPersonnelVo;
+
+/**
+ * 人员信息 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskPersonnelMapper extends BaseMapperPlus<RiskPersonnel, RiskPersonnelVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskPublicOpinionMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskPublicOpinion;
+import org.dromara.risk.domain.vo.RiskPublicOpinionVo;
+
+/**
+ * 舆情推送 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskPublicOpinionMapper extends BaseMapperPlus<RiskPublicOpinion, RiskPublicOpinionVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskSpecialEquipmentMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskSpecialEquipment;
+import org.dromara.risk.domain.vo.RiskSpecialEquipmentVo;
+
+/**
+ * 特种设备 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskSpecialEquipmentMapper extends BaseMapperPlus<RiskSpecialEquipment, RiskSpecialEquipmentVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskWarningMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskWarning;
+import org.dromara.risk.domain.vo.RiskWarningVo;
+
+/**
+ * 风险警示 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskWarningMapper extends BaseMapperPlus<RiskWarning, RiskWarningVo> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/mapper/RiskWorkReportMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.risk.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.risk.domain.RiskWorkReport;
+import org.dromara.risk.domain.vo.RiskWorkReportVo;
+
+/**
+ * 作业上报 数据层
+ *
+ * @author ruoyi
+ */
+public interface RiskWorkReportMapper extends BaseMapperPlus<RiskWorkReport, RiskWorkReportVo> {
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IDashboardService.java

@@ -0,0 +1,36 @@
+package org.dromara.risk.service;
+
+import org.dromara.risk.domain.vo.DashboardStatsVo;
+import org.dromara.risk.domain.vo.RecentDangerVo;
+import org.dromara.risk.domain.vo.RecentNoticeVo;
+import org.dromara.risk.domain.vo.RecentTrainingVo;
+
+import java.util.List;
+
+/**
+ * Dashboard 统计 Service
+ *
+ * @author ruoyi
+ */
+public interface IDashboardService {
+
+    /**
+     * 获取工作台统计数据
+     */
+    DashboardStatsVo getStats();
+
+    /**
+     * 获取最新安全隐患列表
+     */
+    List<RecentDangerVo> getRecentDangers(int limit);
+
+    /**
+     * 获取近期安全培训列表
+     */
+    List<RecentTrainingVo> getRecentTrainings(int limit);
+
+    /**
+     * 获取最近公告列表
+     */
+    List<RecentNoticeVo> getRecentNotices(int limit);
+}

+ 78 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskAccidentService.java

@@ -0,0 +1,78 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskAccidentBo;
+import org.dromara.risk.domain.vo.AccidentStatsVo;
+import org.dromara.risk.domain.vo.AccidentTrendVo;
+import org.dromara.risk.domain.vo.RiskAccidentVo;
+
+import java.util.List;
+
+/**
+ * 事故上报 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskAccidentService {
+
+    /**
+     * 查询事故
+     *
+     * @param id 事故主键
+     * @return 事故
+     */
+    RiskAccidentVo queryById(Long id);
+
+    /**
+     * 查询事故列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 事故分页列表
+     */
+    TableDataInfo<RiskAccidentVo> queryPageList(RiskAccidentBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询事故列表
+     *
+     * @param bo 查询条件
+     * @return 事故集合
+     */
+    List<RiskAccidentVo> queryList(RiskAccidentBo bo);
+
+    /**
+     * 新增事故
+     *
+     * @param bo 事故业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskAccidentBo bo);
+
+    /**
+     * 修改事故
+     *
+     * @param bo 事故业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskAccidentBo bo);
+
+    /**
+     * 校验并批量删除事故
+     *
+     * @param ids 需要删除的事故主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+    /**
+     * 查询统计数据
+     */
+    AccidentStatsVo queryStats();
+
+    /**
+     * 查询近12个月趋势
+     */
+    List<AccidentTrendVo> query12MonthTrend();
+
+}

+ 74 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskAuditFileService.java

@@ -0,0 +1,74 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskAuditFileBo;
+import org.dromara.risk.domain.vo.RiskAuditFileVo;
+
+import java.util.List;
+
+/**
+ * 审计文件 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskAuditFileService {
+
+    /**
+     * 查询审计文件
+     *
+     * @param id 审计文件主键
+     * @return 审计文件
+     */
+    RiskAuditFileVo queryById(Long id);
+
+    /**
+     * 查询审计文件列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 审计文件分页列表
+     */
+    TableDataInfo<RiskAuditFileVo> queryPageList(RiskAuditFileBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询审计文件列表
+     *
+     * @param bo 查询条件
+     * @return 审计文件集合
+     */
+    List<RiskAuditFileVo> queryList(RiskAuditFileBo bo);
+
+    /**
+     * 根据人员变动ID查询文件列表
+     *
+     * @param changeId 人员变动ID
+     * @return 审计文件集合
+     */
+    List<RiskAuditFileVo> queryListByChangeId(Long changeId);
+
+    /**
+     * 新增审计文件
+     *
+     * @param bo 审计文件业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskAuditFileBo bo);
+
+    /**
+     * 修改审计文件
+     *
+     * @param bo 审计文件业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskAuditFileBo bo);
+
+    /**
+     * 校验并批量删除审计文件
+     *
+     * @param ids 需要删除的审计文件主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+}

+ 66 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskDangerSourceService.java

@@ -0,0 +1,66 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskDangerSourceBo;
+import org.dromara.risk.domain.vo.RiskDangerSourceVo;
+
+import java.util.List;
+
+/**
+ * 危险源 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskDangerSourceService {
+
+    /**
+     * 查询危险源
+     *
+     * @param id 危险源主键
+     * @return 危险源
+     */
+    RiskDangerSourceVo queryById(Long id);
+
+    /**
+     * 查询危险源列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 危险源分页列表
+     */
+    TableDataInfo<RiskDangerSourceVo> queryPageList(RiskDangerSourceBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询危险源列表
+     *
+     * @param bo 查询条件
+     * @return 危险源集合
+     */
+    List<RiskDangerSourceVo> queryList(RiskDangerSourceBo bo);
+
+    /**
+     * 新增危险源
+     *
+     * @param bo 危险源业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskDangerSourceBo bo);
+
+    /**
+     * 修改危险源
+     *
+     * @param bo 危险源业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskDangerSourceBo bo);
+
+    /**
+     * 校验并批量删除危险源
+     *
+     * @param ids 需要删除的危险源主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+}

+ 74 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskEquipmentMaintenanceService.java

@@ -0,0 +1,74 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskEquipmentMaintenanceBo;
+import org.dromara.risk.domain.vo.RiskEquipmentMaintenanceVo;
+
+import java.util.List;
+
+/**
+ * 设备维护记录 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskEquipmentMaintenanceService {
+
+    /**
+     * 查询设备维护记录
+     *
+     * @param id 设备维护记录主键
+     * @return 设备维护记录
+     */
+    RiskEquipmentMaintenanceVo queryById(Long id);
+
+    /**
+     * 查询设备维护记录列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 设备维护记录分页列表
+     */
+    TableDataInfo<RiskEquipmentMaintenanceVo> queryPageList(RiskEquipmentMaintenanceBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询设备维护记录列表
+     *
+     * @param bo 查询条件
+     * @return 设备维护记录集合
+     */
+    List<RiskEquipmentMaintenanceVo> queryList(RiskEquipmentMaintenanceBo bo);
+
+    /**
+     * 根据设备ID查询维护记录列表
+     *
+     * @param equipmentId 设备ID
+     * @return 设备维护记录集合
+     */
+    List<RiskEquipmentMaintenanceVo> queryListByEquipmentId(Long equipmentId);
+
+    /**
+     * 新增设备维护记录
+     *
+     * @param bo 设备维护记录业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskEquipmentMaintenanceBo bo);
+
+    /**
+     * 修改设备维护记录
+     *
+     * @param bo 设备维护记录业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskEquipmentMaintenanceBo bo);
+
+    /**
+     * 校验并批量删除设备维护记录
+     *
+     * @param ids 需要删除的设备维护记录主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+}

+ 99 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskHiddenDangerService.java

@@ -0,0 +1,99 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskHiddenDangerBo;
+import org.dromara.risk.domain.vo.RiskHiddenDangerVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 安全隐患 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskHiddenDangerService {
+
+    /**
+     * 查询安全隐患
+     *
+     * @param id 隐患主键
+     * @return 安全隐患
+     */
+    RiskHiddenDangerVo queryById(Long id);
+
+    /**
+     * 查询安全隐患列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 安全隐患分页列表
+     */
+    TableDataInfo<RiskHiddenDangerVo> queryPageList(RiskHiddenDangerBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询安全隐患列表
+     *
+     * @param bo 查询条件
+     * @return 安全隐患集合
+     */
+    List<RiskHiddenDangerVo> queryList(RiskHiddenDangerBo bo);
+
+    /**
+     * 新增安全隐患
+     *
+     * @param bo 安全隐患业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskHiddenDangerBo bo);
+
+    /**
+     * 修改安全隐患
+     *
+     * @param bo 安全隐患业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskHiddenDangerBo bo);
+
+    /**
+     * 校验并批量删除安全隐患
+     *
+     * @param ids 需要删除的隐患主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+    /**
+     * 获取隐患状态统计数据
+     *
+     * @return 统计数据
+     */
+    Map<String, Object> getStats();
+
+    /**
+     * 获取风险等级统计数据
+     *
+     * @return 统计数据
+     */
+    Map<String, Object> getRiskLevelStats();
+
+    /**
+     * 获取隐患类型统计数据
+     *
+     * @return 统计数据
+     */
+    Map<String, Object> getDangerTypeStats();
+
+    /**
+     * 处理隐患(更新状态为处理中/已处理)
+     *
+     * @param id           隐患主键
+     * @param status       处理状态
+     * @param handler      处理人
+     * @param handleResult 处理结果
+     * @return 结果
+     */
+    int handleDanger(Long id, String status, String handler, String handleResult);
+
+}

+ 78 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskInspectionTaskService.java

@@ -0,0 +1,78 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskInspectionTaskBo;
+import org.dromara.risk.domain.vo.InspectionStatsVo;
+import org.dromara.risk.domain.vo.RiskInspectionTaskVo;
+import org.dromara.risk.domain.vo.RiskInspectionRecordVo;
+
+import java.util.List;
+
+/**
+ * 巡检任务 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskInspectionTaskService {
+
+    /**
+     * 查询巡检任务
+     *
+     * @param id 任务主键
+     * @return 巡检任务
+     */
+    RiskInspectionTaskVo queryById(Long id);
+
+    /**
+     * 查询巡检任务列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 巡检任务分页列表
+     */
+    TableDataInfo<RiskInspectionTaskVo> queryPageList(RiskInspectionTaskBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询巡检任务列表
+     *
+     * @param bo 查询条件
+     * @return 巡检任务集合
+     */
+    List<RiskInspectionTaskVo> queryList(RiskInspectionTaskBo bo);
+
+    /**
+     * 新增巡检任务(同时维护巡检项目列表)
+     *
+     * @param bo 巡检任务业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskInspectionTaskBo bo);
+
+    /**
+     * 修改巡检任务(同时维护巡检项目列表)
+     *
+     * @param bo 巡检任务业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskInspectionTaskBo bo);
+
+    /**
+     * 校验并批量删除巡检任务
+     *
+     * @param ids 需要删除的任务主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+    /**
+     * 查询任务的打卡记录列表
+     */
+    List<RiskInspectionRecordVo> queryRecordListByTaskId(Long taskId);
+
+    /**
+     * 查询统计数据(顶部4张卡片)
+     */
+    InspectionStatsVo queryStats();
+
+}

+ 91 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPersonnelCertService.java

@@ -0,0 +1,91 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskPersonnelCertBo;
+import org.dromara.risk.domain.vo.RiskPersonnelCertVo;
+
+import java.util.List;
+
+/**
+ * 人员证书 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskPersonnelCertService {
+
+    /**
+     * 查询人员证书
+     *
+     * @param id 证书主键
+     * @return 人员证书
+     */
+    RiskPersonnelCertVo queryById(Long id);
+
+    /**
+     * 查询人员证书列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 人员证书分页列表
+     */
+    TableDataInfo<RiskPersonnelCertVo> queryPageList(RiskPersonnelCertBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询人员证书列表
+     *
+     * @param bo 查询条件
+     * @return 人员证书集合
+     */
+    List<RiskPersonnelCertVo> queryList(RiskPersonnelCertBo bo);
+
+    /**
+     * 根据人员ID查询证书列表
+     *
+     * @param personnelId 人员ID
+     * @return 人员证书集合
+     */
+    List<RiskPersonnelCertVo> queryListByPersonnelId(Long personnelId);
+
+    /**
+     * 新增人员证书
+     *
+     * @param bo 人员证书业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskPersonnelCertBo bo);
+
+    /**
+     * 批量新增人员证书
+     *
+     * @param personnelId 人员ID
+     * @param bos         证书业务对象集合
+     * @return 结果
+     */
+    int insertBatchByBo(Long personnelId, List<RiskPersonnelCertBo> bos);
+
+    /**
+     * 修改人员证书
+     *
+     * @param bo 人员证书业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskPersonnelCertBo bo);
+
+    /**
+     * 校验并批量删除人员证书
+     *
+     * @param ids 需要删除的证书主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+    /**
+     * 根据人员ID删除该人员下所有证书
+     *
+     * @param personnelId 人员ID
+     * @return 结果
+     */
+    int deleteByPersonnelId(Long personnelId);
+
+}

+ 66 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPersonnelChangeService.java

@@ -0,0 +1,66 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskPersonnelChangeBo;
+import org.dromara.risk.domain.vo.RiskPersonnelChangeVo;
+
+import java.util.List;
+
+/**
+ * 人员变动 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskPersonnelChangeService {
+
+    /**
+     * 查询人员变动
+     *
+     * @param id 人员变动主键
+     * @return 人员变动
+     */
+    RiskPersonnelChangeVo queryById(Long id);
+
+    /**
+     * 查询人员变动列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 人员变动分页列表
+     */
+    TableDataInfo<RiskPersonnelChangeVo> queryPageList(RiskPersonnelChangeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询人员变动列表
+     *
+     * @param bo 查询条件
+     * @return 人员变动集合
+     */
+    List<RiskPersonnelChangeVo> queryList(RiskPersonnelChangeBo bo);
+
+    /**
+     * 新增人员变动
+     *
+     * @param bo 人员变动业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskPersonnelChangeBo bo);
+
+    /**
+     * 修改人员变动
+     *
+     * @param bo 人员变动业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskPersonnelChangeBo bo);
+
+    /**
+     * 校验并批量删除人员变动
+     *
+     * @param ids 需要删除的人员变动主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+}

+ 82 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPersonnelService.java

@@ -0,0 +1,82 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskPersonnelBo;
+import org.dromara.risk.domain.vo.RiskPersonnelVo;
+
+import java.util.List;
+
+/**
+ * 人员信息 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskPersonnelService {
+
+    /**
+     * 查询人员信息
+     *
+     * @param id 人员主键
+     * @return 人员信息
+     */
+    RiskPersonnelVo queryById(Long id);
+
+    /**
+     * 查询人员信息列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 人员信息分页列表
+     */
+    TableDataInfo<RiskPersonnelVo> queryPageList(RiskPersonnelBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询人员信息列表
+     *
+     * @param bo 查询条件
+     * @return 人员信息集合
+     */
+    List<RiskPersonnelVo> queryList(RiskPersonnelBo bo);
+
+    /**
+     * 新增人员信息
+     *
+     * @param bo 人员信息业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskPersonnelBo bo);
+
+    /**
+     * 修改人员信息
+     *
+     * @param bo 人员信息业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskPersonnelBo bo);
+
+    /**
+     * 校验并批量删除人员信息
+     *
+     * @param ids 需要删除的人员主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+    /**
+     * 校验身份证号是否合法
+     *
+     * @param idCard 身份证号
+     * @return 校验结果
+     */
+    boolean validateIdCard(String idCard);
+
+    /**
+     * 根据身份证号计算年龄
+     *
+     * @param idCard 身份证号
+     * @return 年龄
+     */
+    Integer calculateAge(String idCard);
+
+}

+ 95 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/IRiskPublicOpinionService.java

@@ -0,0 +1,95 @@
+package org.dromara.risk.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.risk.domain.bo.RiskPublicOpinionBo;
+import org.dromara.risk.domain.vo.RiskPublicOpinionVo;
+import org.dromara.risk.domain.vo.PublicOpinionStatsVo;
+import org.dromara.risk.domain.vo.PublicOpinionTrendVo;
+
+import java.util.List;
+
+/**
+ * 舆情推送 业务层
+ *
+ * @author ruoyi
+ */
+public interface IRiskPublicOpinionService {
+
+    /**
+     * 查询舆情
+     *
+     * @param id 舆情主键
+     * @return 舆情
+     */
+    RiskPublicOpinionVo queryById(Long id);
+
+    /**
+     * 查询舆情列表(分页)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 舆情分页列表
+     */
+    TableDataInfo<RiskPublicOpinionVo> queryPageList(RiskPublicOpinionBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询舆情列表
+     *
+     * @param bo 查询条件
+     * @return 舆情集合
+     */
+    List<RiskPublicOpinionVo> queryList(RiskPublicOpinionBo bo);
+
+    /**
+     * 新增舆情
+     *
+     * @param bo 舆情业务对象
+     * @return 结果
+     */
+    int insertByBo(RiskPublicOpinionBo bo);
+
+    /**
+     * 修改舆情
+     *
+     * @param bo 舆情业务对象
+     * @return 结果
+     */
+    int updateByBo(RiskPublicOpinionBo bo);
+
+    /**
+     * 校验并批量删除舆情
+     *
+     * @param ids 需要删除的舆情主键集合
+     * @return 结果
+     */
+    int deleteWithValidByIds(List<Long> ids);
+
+    /**
+     * 处理舆情(更新状态及处理结果)
+     *
+     * @param id             舆情主键
+     * @param status         状态
+     * @param handleResult   处理结果
+     * @return 结果
+     */
+    int handleOpinion(Long id, String status, String handleResult);
+
+    /**
+     * 查询舆情统计数据
+     * 包含:今日总数、昨日总数、重大舆情、已处理、待处理等
+     */
+    PublicOpinionStatsVo queryStats();
+
+    /**
+     * 查询近七天舆情趋势数据
+     * 包含每天:总舆情数、重大舆情数、已处理数
+     */
+    List<PublicOpinionTrendVo> query7DayTrend();
+
+    /**
+     * 查询重大舆情明细列表
+     */
+    List<RiskPublicOpinionVo> queryMajorOpinionList(RiskPublicOpinionBo bo);
+
+}

Деякі файли не було показано, через те що забагато файлів було змінено