Browse Source

20251201

invest1.1
wxc 2 months ago
commit
c32ef2b7e8
  1. 33
      .gitignore
  2. 5
      README.md
  3. 179
      connect.md
  4. BIN
      libs/authSDK/authSDK-3.0.3.jar
  5. 1
      libs/authSDK/installMavenJar.bat
  6. 1
      libs/words/installMavenJar.bat
  7. BIN
      libs/words/words-15.8.0.jar
  8. 299
      pom.xml
  9. BIN
      src/.DS_Store
  10. 21
      src/main/java/com/biutag/supervision/InvestBootApplication.java
  11. 34
      src/main/java/com/biutag/supervision/common/UserContextHolder.java
  12. 8
      src/main/java/com/biutag/supervision/common/validation/AddGroup.java
  13. 8
      src/main/java/com/biutag/supervision/common/validation/EditGroup.java
  14. 33
      src/main/java/com/biutag/supervision/config/CorsConfig.java
  15. 20
      src/main/java/com/biutag/supervision/config/FastDFSConfig.java
  16. 62
      src/main/java/com/biutag/supervision/config/GlobalExceptionHandler.java
  17. 92
      src/main/java/com/biutag/supervision/config/InterceptorConfig.java
  18. 22
      src/main/java/com/biutag/supervision/config/MybatisPlusConfig.java
  19. 31
      src/main/java/com/biutag/supervision/config/RedisCacheConfig.java
  20. 22
      src/main/java/com/biutag/supervision/config/ScheduledConfig.java
  21. 26
      src/main/java/com/biutag/supervision/config/SwaggerConfig.java
  22. 32
      src/main/java/com/biutag/supervision/constants/AppConstants.java
  23. 6
      src/main/java/com/biutag/supervision/constants/RedisKeyConstants.java
  24. 12
      src/main/java/com/biutag/supervision/constants/WorkDynamicConstants.java
  25. 32
      src/main/java/com/biutag/supervision/constants/enums/AccountabilityTargetEnum.java
  26. 25
      src/main/java/com/biutag/supervision/constants/enums/ApprovalFlowEnum.java
  27. 7
      src/main/java/com/biutag/supervision/constants/enums/ApproveStateEnum.java
  28. 10
      src/main/java/com/biutag/supervision/constants/enums/BlameType.java
  29. 49
      src/main/java/com/biutag/supervision/constants/enums/BusinessTypeEnum.java
  30. 20
      src/main/java/com/biutag/supervision/constants/enums/CaseVerifProblemNatureEnum.java
  31. 11
      src/main/java/com/biutag/supervision/constants/enums/CaseVerifSource.java
  32. 17
      src/main/java/com/biutag/supervision/constants/enums/ComfortStatus.java
  33. 11
      src/main/java/com/biutag/supervision/constants/enums/CountersignState.java
  34. 9
      src/main/java/com/biutag/supervision/constants/enums/DataUpdateMethodEnum.java
  35. 20
      src/main/java/com/biutag/supervision/constants/enums/DepartGroupEnum.java
  36. 18
      src/main/java/com/biutag/supervision/constants/enums/DepartGroupIdEnum.java
  37. 17
      src/main/java/com/biutag/supervision/constants/enums/DepartLevelEnum.java
  38. 10
      src/main/java/com/biutag/supervision/constants/enums/DistributionCycleEnum.java
  39. 17
      src/main/java/com/biutag/supervision/constants/enums/DistributionFlowEnum.java
  40. 23
      src/main/java/com/biutag/supervision/constants/enums/DistributionMethodEnum.java
  41. 22
      src/main/java/com/biutag/supervision/constants/enums/DistributionStateEnum.java
  42. 19
      src/main/java/com/biutag/supervision/constants/enums/FlowActionEnum.java
  43. 42
      src/main/java/com/biutag/supervision/constants/enums/FlowNodeEnum.java
  44. 24
      src/main/java/com/biutag/supervision/constants/enums/HostLevelEnums.java
  45. 38
      src/main/java/com/biutag/supervision/constants/enums/InitialPetition.java
  46. 26
      src/main/java/com/biutag/supervision/constants/enums/InspectCaseEnum.java
  47. 21
      src/main/java/com/biutag/supervision/constants/enums/InvolveProblemEnum.java
  48. 16
      src/main/java/com/biutag/supervision/constants/enums/IsRectifyEnum.java
  49. 25
      src/main/java/com/biutag/supervision/constants/enums/MailTrendSourcesEnum.java
  50. 17
      src/main/java/com/biutag/supervision/constants/enums/MenuEnum.java
  51. 20
      src/main/java/com/biutag/supervision/constants/enums/ModelDataTypeEnum.java
  52. 21
      src/main/java/com/biutag/supervision/constants/enums/ModelHandleDepartTypeEnum.java
  53. 22
      src/main/java/com/biutag/supervision/constants/enums/ModelTypeEnum.java
  54. 34
      src/main/java/com/biutag/supervision/constants/enums/NegativeLevelEnum.java
  55. 21
      src/main/java/com/biutag/supervision/constants/enums/NegativeTaskCategoryEnum.java
  56. 14
      src/main/java/com/biutag/supervision/constants/enums/NegativeTaskStatusEnum.java
  57. 12
      src/main/java/com/biutag/supervision/constants/enums/OrderEnum.java
  58. 55
      src/main/java/com/biutag/supervision/constants/enums/PersonTypeEnum.java
  59. 37
      src/main/java/com/biutag/supervision/constants/enums/PoliceTypeEnum.java
  60. 59
      src/main/java/com/biutag/supervision/constants/enums/ProblemSourcesEnum.java
  61. 26
      src/main/java/com/biutag/supervision/constants/enums/ProcessingStatusEnum.java
  62. 21
      src/main/java/com/biutag/supervision/constants/enums/RepeatEnum.java
  63. 18
      src/main/java/com/biutag/supervision/constants/enums/ReplyStateEnum.java
  64. 17
      src/main/java/com/biutag/supervision/constants/enums/RoleCodeEnum.java
  65. 25
      src/main/java/com/biutag/supervision/constants/enums/RpcApplyTypeEnum.java
  66. 19
      src/main/java/com/biutag/supervision/constants/enums/SpecialSupervisionEnum.java
  67. 15
      src/main/java/com/biutag/supervision/constants/enums/StatusEnum.java
  68. 10
      src/main/java/com/biutag/supervision/constants/enums/TaskStatusEnum.java
  69. 23
      src/main/java/com/biutag/supervision/constants/enums/TaskTypeEnum.java
  70. 16
      src/main/java/com/biutag/supervision/constants/enums/TestingAlcoholStateEnum.java
  71. 47
      src/main/java/com/biutag/supervision/constants/enums/TimeLimitEnum.java
  72. 29
      src/main/java/com/biutag/supervision/constants/enums/TrendEnum.java
  73. 7
      src/main/java/com/biutag/supervision/constants/enums/WorkStateEnum.java
  74. 7
      src/main/java/com/biutag/supervision/constants/enums/WorkStatusEnum.java
  75. 73
      src/main/java/com/biutag/supervision/controller/AppController.java
  76. 42
      src/main/java/com/biutag/supervision/controller/AuthController.java
  77. 54
      src/main/java/com/biutag/supervision/controller/CommonOpinionsControllers.java
  78. 91
      src/main/java/com/biutag/supervision/controller/FileController.java
  79. 102
      src/main/java/com/biutag/supervision/controller/LoginController.java
  80. 54
      src/main/java/com/biutag/supervision/controller/PoliceAvatarController.java
  81. 129
      src/main/java/com/biutag/supervision/controller/invertRecord/invertRecordController.java
  82. 137
      src/main/java/com/biutag/supervision/controller/price/PriceInformationController.java
  83. 80
      src/main/java/com/biutag/supervision/controller/report/ReportFlowController.java
  84. 480
      src/main/java/com/biutag/supervision/controller/report/ReportProjectController.java
  85. 83
      src/main/java/com/biutag/supervision/controller/serviceUnit/ServiceUnitController.java
  86. 141
      src/main/java/com/biutag/supervision/controller/system/DepartController.java
  87. 85
      src/main/java/com/biutag/supervision/controller/system/DepartMapingController.java
  88. 52
      src/main/java/com/biutag/supervision/controller/system/DictContentController.java
  89. 137
      src/main/java/com/biutag/supervision/controller/system/DictController.java
  90. 69
      src/main/java/com/biutag/supervision/controller/system/HandleResultMapingController.java
  91. 71
      src/main/java/com/biutag/supervision/controller/system/HolidayController.java
  92. 51
      src/main/java/com/biutag/supervision/controller/system/MenuController.java
  93. 291
      src/main/java/com/biutag/supervision/controller/system/PoliceController.java
  94. 66
      src/main/java/com/biutag/supervision/controller/system/ProblemTypeMapingController.java
  95. 62
      src/main/java/com/biutag/supervision/controller/system/RoleController.java
  96. 56
      src/main/java/com/biutag/supervision/controller/system/UserController.java
  97. 229
      src/main/java/com/biutag/supervision/controller/warning/WarningController.java
  98. 97
      src/main/java/com/biutag/supervision/controller/work/workController.java
  99. 11
      src/main/java/com/biutag/supervision/exception/AuthException.java
  100. 9
      src/main/java/com/biutag/supervision/flow/action/Action.java
  101. Some files were not shown because too many files have changed in this diff Show More

33
.gitignore vendored

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

5
README.md

@ -0,0 +1,5 @@
# 长沙公安政投资审计
## 技术栈
- JDK17
- SpringBoot 3
- MySQL

179
connect.md

@ -0,0 +1,179 @@
# 项目交接文档
## 1. 项目概述
- **项目名称**:InvestBoot 政府投资报审系统
- **项目描述**:政府投资项目报审管理系统,提供项目审批、预警管理、价格信息管理等功能
- **项目组**:com.biutag.supervision
## 2. 技术栈
### 2.1 核心框架
- Spring Boot 3.3.2
- MyBatis Plus 3.5.7
- Dynamic Datasource 4.3.1(多数据源)
- Redis Reactive
### 2.2 数据库
- MySQL(主要数据库)
- PostgreSQL(邮箱相关)
- 支持多种数据库:达梦(DM)、SQL Server、GBase
### 2.3 文件存储
- FastDFS 分布式文件系统
### 2.4 API文档
- Knife4j OpenAPI3(基于Swagger)
### 2.5 工具类
- Hutool 5.8.29
- EasyExcel 4.0.1
- Fastjson 2.0.53
- Aspose.Words 15.8.0(Word文档处理)
### 2.6 其他组件
- Lombok
- Druid 连接池
- Freemarker 模板引擎
- Logstash 日志编码
- JIT AuthSDK 3.0.3(数字证书)
## 3. 环境配置
### 3.1 开发环境
- JDK 17
- Maven 3.6+
- IDE:推荐 IntelliJ IDEA
### 3.2 配置文件
- 主配置文件:`application.yml`
- 环境配置文件:
- `application-local.yml`(本地开发环境)
- `application-dev.yml`(开发环境)
- `application-prod.yml`(生产环境)
### 3.3 数据库配置
- 主数据源(master):MySQL
- 从数据源(多个):用于不同业务模块
- Redis:缓存,端口6379
### 3.4 文件服务配置
- FastDFS:分布式文件存储
- 预览URL配置:`http://172.31.217.20:31664`
## 4. 项目结构
```
src/main/java/com/biutag/supervision/
├── InvestBootApplication.java # 应用启动类
├── common/ # 通用类
├── config/ # 配置类
├── constants/ # 常量定义
├── controller/ # 控制器层
├── exception/ # 异常处理
├── flow/ # 流程相关
├── job/ # 定时任务
├── mapper/ # 数据访问层
├── pojo/ # 数据模型
│ ├── domain/ # 领域模型
│ ├── dto/ # 数据传输对象
│ ├── entity/ # 实体类
│ ├── enums/ # 枚举类
│ ├── model/ # 模型类
│ ├── param/ # 参数类
│ └── vo/ # 视图对象
├── service/ # 业务逻辑层
├── support/ # 支持类
└── util/ # 工具类
```
## 5. 核心功能模块
### 5.1 认证与授权
- 登录认证:`LoginController`
- 用户角色权限管理:基于RBAC模型
- Token管理:Redis存储,有效期168小时
### 5.2 文件管理
- 文件上传下载:`FileController`
- 文件分类管理:`FileClassService`
- 文件存储:FastDFS分布式存储
### 5.3 项目预警管理
- 预警信息处理
- 预警相关接口:`controller/warning/`
### 5.4 价格信息库管理
- 价格信息录入与查询
- 相关接口:`controller/price/`
### 5.5 项目报审、报表管理
- 相关接口:`controller/report/ReportProjectController.java`
### 5.6 工作流管理
- 相关接口:`controller/report/ReportFlowController.java`
### 5.7 服务单位管理
- 服务单位信息维护
- 相关接口:`controller/serviceUnit/`
## 6. API文档
### 6.1 访问地址
### 6.2 接口分组
- plugin:插件相关接口
- 各功能模块独立接口组
## 7. 关键配置项
### 7.1 服务器配置
- 端口:8080
- 时区:Asia/Shanghai
### 7.2 文件上传配置
- 最大文件大小:100MB
- 最大请求大小:100MB
### 7.3 缓存配置
- Redis数据库索引:1
- 连接超时:10s
### 7.4 FastDFS配置
- Tracker列表:172.31.217.20:32060, 172.31.217.20:31882
- 连接超时:10000ms
## 8. 部署说明
### 8.1 打包方式
- Maven打包:`mvn clean package`
- 最终生成JAR包:`investBoot.jar`
### 8.2 环境切换
- 本地:`-Dspring.profiles.active=local`
- 开发:`-Dspring.profiles.active=dev`
- 生产:`-Dspring.profiles.active=prod`
### 8.3 运行命令
```
java -jar investBoot.jar --spring.profiles.active=环境名称
```
## 9. 注意事项
### 9.1 数据库配置
- 首次部署需要执行SQL脚本初始化数据库
- SQL脚本位置:`sql/`目录
### 9.2 外部依赖
- 需确保Redis服务正常运行
- 需确保FastDFS服务正常运行
- 部分证书相关功能依赖JIT AuthSDK
### 9.3 特殊配置
- Word文档处理功能依赖Aspose.Words,需注意许可证配置
- 视频检查相关功能依赖外部服务
## 10. 联系人信息

BIN
libs/authSDK/authSDK-3.0.3.jar

Binary file not shown.

1
libs/authSDK/installMavenJar.bat

@ -0,0 +1 @@
mvn install:install-file -DgroupId=cn.com.jit -DartifactId=authSDK -Dversion=3.0.3 -Dfile="authSDK-3.0.3.jar" -Dpackaging=jar

1
libs/words/installMavenJar.bat

@ -0,0 +1 @@
mvn install:install-file -DgroupId=com.aspose -DartifactId=aspose-words -Dversion=15.8.0 -Dfile="words-15.8.0.jar" -Dpackaging=jar

BIN
libs/words/words-15.8.0.jar

Binary file not shown.

299
pom.xml

@ -0,0 +1,299 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.biutag</groupId>
<artifactId>InvestBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>InvestBoot</name>
<description>政府投资报审</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- 达梦数据库驱动 -->
<!-- 达梦数据库驱动 -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.140</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- <optional>true</optional>-->
<!-- </dependency>-->
<!-- mysql JDBC驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- SQL Server JDBC驱动 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.8.1.jre11</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- gbase数据库 JDBC驱动 -->
<dependency>
<groupId>com.gbase</groupId>
<artifactId>gbase-jdbc</artifactId>
<scope>system</scope>
<version>8.3.81.53-build55.2.1-bin</version>
<systemPath>${project.basedir}/src/main/resources/lib/gbase-connector-java-8.3.81.53-build52.8-bin.jar
</systemPath>
</dependency>
<!-- dm数据库 JDBC驱动 -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.140</version>
</dependency>
<!-- postgresql JDBC驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.22</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.29</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>5.8.29</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
<!--knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.53</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.9</version>
</dependency>
<!-- word转换 -->
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>15.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 数字证书 -->
<dependency>
<groupId>cn.com.jit</groupId>
<artifactId>authSDK</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<!-- 本地跑时改成true,打包时改成false-->
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<!--打包跳过测试-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
<finalName>investBoot</finalName>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
</properties>
<activation>
<!-- 默认环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
</project>

BIN
src/.DS_Store vendored

Binary file not shown.

21
src/main/java/com/biutag/supervision/InvestBootApplication.java

@ -0,0 +1,21 @@
package com.biutag.supervision;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync
@EnableCaching
@EnableScheduling
@SpringBootApplication
@EnableAspectJAutoProxy
public class InvestBootApplication {
public static void main(String[] args) {
SpringApplication.run(InvestBootApplication.class, args);
}
}

34
src/main/java/com/biutag/supervision/common/UserContextHolder.java

@ -0,0 +1,34 @@
package com.biutag.supervision.common;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.Header;
import com.biutag.supervision.constants.RedisKeyConstants;
import com.biutag.supervision.exception.AuthException;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.util.SpringUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class UserContextHolder {
public static String getCurrentToken() {
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
return request.getHeader(Header.AUTHORIZATION.getValue());
}
public static UserAuth getCurrentUser() {
String authorization = getCurrentToken();
if (StrUtil.isBlank(authorization)) {
throw new AuthException();
}
UserAuth userAuth = (UserAuth) SpringUtil.getBean("redisTemplate", RedisTemplate.class).opsForValue().get(String.format(RedisKeyConstants.LOGIN_USERINFO_KEY, authorization));
return userAuth;
}
public static String getCurrentUserId() {
return getCurrentUser().getUserId();
}
}

8
src/main/java/com/biutag/supervision/common/validation/AddGroup.java

@ -0,0 +1,8 @@
package com.biutag.supervision.common.validation;
/**
* @author wxc
* @date 2024/11/7
*/
public interface AddGroup {
}

8
src/main/java/com/biutag/supervision/common/validation/EditGroup.java

@ -0,0 +1,8 @@
package com.biutag.supervision.common.validation;
/**
* @author wxc
* @date 2024/11/7
*/
public interface EditGroup {
}

33
src/main/java/com/biutag/supervision/config/CorsConfig.java

@ -0,0 +1,33 @@
package com.biutag.supervision.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* @author wxc
* @date 2025/4/12
*/
@Configuration
public class CorsConfig {
private CorsConfiguration corsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOriginPattern("*"); //允许所有域名访问
corsConfiguration.addAllowedHeader("*"); //允许所有请求头
corsConfiguration.addAllowedMethod("*"); //允许所有的请求类型
corsConfiguration.setMaxAge(3600L);
corsConfiguration.setAllowCredentials(true); //允许请求携带验证信息(cookie)
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
//存储request与跨域配置信息的容器,基于url的映射
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig());
return new CorsFilter(source);
}
}

20
src/main/java/com/biutag/supervision/config/FastDFSConfig.java

@ -0,0 +1,20 @@
package com.biutag.supervision.config;
import com.github.tobato.fastdfs.domain.conn.TrackerConnectionManager;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan("com.github.tobato.fastdfs")
@Configuration
public class FastDFSConfig {
@Autowired
private TrackerConnectionManager trackerConnectionManager;
@PostConstruct
public void init() {
trackerConnectionManager.initTracker();
}
}

62
src/main/java/com/biutag/supervision/config/GlobalExceptionHandler.java

@ -0,0 +1,62 @@
package com.biutag.supervision.config;
import com.biutag.supervision.exception.AuthException;
import com.biutag.supervision.pojo.Result;
import jakarta.validation.ValidationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.util.stream.Collectors;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
@ResponseBody
public Result<Object> handleException(Exception e) {
log.error("系统异常: {}", e.getMessage(), e);
return Result.failed(e.getMessage());
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(DataAccessException.class)
@ResponseBody
public Result<Object> handleDataAccessException(DataAccessException e) {
log.error("数据库异常: {}", e.getMessage(), e);
return Result.failed(String.format("数据库异常:%s", e.getMessage()));
}
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler(AuthException.class)
@ResponseBody
public Result<Object> handleAuthException(AuthException e) {
log.error("未授权", e);
return Result.failed(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getFieldErrors().stream().map(item -> "不能为空".equals(item.getDefaultMessage()) ? item.getField() + "-" + item.getDefaultMessage() : item.getDefaultMessage()).collect(Collectors.joining("; "));
log.error("参数错误: {}", message, e);
return Result.failed(HttpStatus.BAD_REQUEST.value(), String.format("参数错误:%s", message));
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ValidationException.class)
@ResponseBody
public Result<Object> handleValidationException(ValidationException e) {
log.error("参数错误", e);
return Result.failed(HttpStatus.BAD_REQUEST.value(), e.getMessage());
}
}

92
src/main/java/com/biutag/supervision/config/InterceptorConfig.java

@ -0,0 +1,92 @@
package com.biutag.supervision.config;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.Header;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.RedisKeyConstants;
import com.biutag.supervision.exception.AuthException;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.util.SpringUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author wxc
* @date 2024/1/8
*/
@Slf4j
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Value("${token.timeout}")
private Integer tokenTimeout;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new DefaultInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/api/**")
.excludePathPatterns("/crx/ajhc/**")
// 登录
.excludePathPatterns("/login", "/jit/**", "/app/login")
.excludePathPatterns("/file/stream/**", "/templates/**")
.excludePathPatterns("/datav/risk/**")
.excludePathPatterns("/score/**")
.excludePathPatterns("/common/**")
.excludePathPatterns("/app/**")
// excel导出
.excludePathPatterns("/serviceUnit/export","/reportProject/excelConditionVo","/data/petitionComplaint12337/export/result","/err","/sampling/export/samplingPoling", "/negative/books/export/**","/data/petitionComplaint/export/**","/confinement/export","/books/dataThread/export")
.excludePathPatterns(List.of("/doc.html", "/webjars/**", "/favicon.ico", "/v3/api-docs/**"));
registry.addInterceptor(new ApiInterceptor())
.addPathPatterns("/api/jwdc/**");
}
class DefaultInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("请求地址:{}", request.getRequestURI());
String authorization = request.getHeader(Header.AUTHORIZATION.getValue());
RedisTemplate<Object, Object> redisTemplate = SpringUtil.getBean("redisTemplate", RedisTemplate.class);
try {
if (StrUtil.isBlank(authorization) || Objects.isNull(redisTemplate.opsForValue().get(String.format(RedisKeyConstants.LOGIN_USERINFO_KEY, authorization)))) {
throw new AuthException();
}
} catch (RuntimeException e) {
throw new AuthException(e.getMessage());
}
// 更新 会话 有效期
redisTemplate.expire(String.format(RedisKeyConstants.LOGIN_USERINFO_KEY, authorization), tokenTimeout, TimeUnit.HOURS);
UserAuth user = UserContextHolder.getCurrentUser();
log.info("请求用户:{}", user.getNickName());
return true;
}
}
static class ApiInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("请求地址【API】:{}", request.getRequestURI());
String authorization = request.getHeader("Authorization");
if (!"565318a8ea367e03904e1c241048dd6c".equals(authorization)) {
throw new AuthException();
}
return true;
}
}
}

22
src/main/java/com/biutag/supervision/config/MybatisPlusConfig.java

@ -0,0 +1,22 @@
package com.biutag.supervision.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.biutag.supervision.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
return interceptor;
}
}

31
src/main/java/com/biutag/supervision/config/RedisCacheConfig.java

@ -0,0 +1,31 @@
package com.biutag.supervision.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import java.time.Duration;
/**
* @Auther: sh
* @Date: 2024/12/13 11:03
* @Description: 针对首页大屏的缓存
*/
@Configuration
public class RedisCacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 配置统一的缓存过期时间
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(24)); //
// 创建一个缓存管理器,使用默认配置,并为所有缓存设置统一的过期时间
RedisCacheManager res = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfiguration) // 设置所有缓存的默认过期时间
.build();
return res;
}
}

22
src/main/java/com/biutag/supervision/config/ScheduledConfig.java

@ -0,0 +1,22 @@
package com.biutag.supervision.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
* @author wxc
* @date 2024/10/17
*/
@Configuration
public class ScheduledConfig {
@Bean
public ScheduledTaskRegistrar scheduledTaskRegistrar(TaskScheduler taskScheduler) {
ScheduledTaskRegistrar scheduledTaskRegistrar = new ScheduledTaskRegistrar();
scheduledTaskRegistrar.setTaskScheduler(taskScheduler);
return scheduledTaskRegistrar;
}
}

26
src/main/java/com/biutag/supervision/config/SwaggerConfig.java

@ -0,0 +1,26 @@
package com.biutag.supervision.config;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title("长沙公安数字督察一体化平台接口文档")
.contact(new Contact())
.description("长沙公安数字督察一体化平台接口文档")
.version("v1")
.license(new License().name("长沙市公安局").url("")))
.externalDocs(new ExternalDocumentation()
.description("接口文档"));
}
}

32
src/main/java/com/biutag/supervision/constants/AppConstants.java

@ -0,0 +1,32 @@
package com.biutag.supervision.constants;
public class AppConstants {
public static final Integer TREE_ROOT_ID = 0;
// 单位
public static final String DICT_CONTENT_ROOT_PARENT_CODE = "-1";
public static final String DICT_PROBLEM_SOURCE_ROOT_PARENT_CODE = "-1";
// 管理员类型类型(超级管理员)
public static final String USER_TYPE_SUPER = "super";
// 单位
public static final String DEPART_ROOT_PID = "0";
// 单位根节点ID(长沙市公安局)
public static final String ROOT_DEPART_ID = "12630";
public static final String ROOT_DEPART_NAME = "长沙市公安局";
public static final String SIGN_RETURN_ACTION_NAME = "已退回";
public static final String UN_DEL = "0";
public static final String DEL = "1";
}

6
src/main/java/com/biutag/supervision/constants/RedisKeyConstants.java

@ -0,0 +1,6 @@
package com.biutag.supervision.constants;
public class RedisKeyConstants {
public final static String LOGIN_USERINFO_KEY = "login:userinfo:%s";
}

12
src/main/java/com/biutag/supervision/constants/WorkDynamicConstants.java

@ -0,0 +1,12 @@
package com.biutag.supervision.constants;
/**
* @Auther: sh
* @Date: 2025/1/14 10:27
* @Description: 动作动态常量
*/
public class WorkDynamicConstants {
public static final String DCGZDT = "督察工作动态";
public static final String SJGZDT = "审计工作动态";
}

32
src/main/java/com/biutag/supervision/constants/enums/AccountabilityTargetEnum.java

@ -0,0 +1,32 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/11/28
*/
@AllArgsConstructor
public enum AccountabilityTargetEnum {
PERSONAL("1", "涉及个人"),
DEPARTMENT("2", "涉及单位"),
PERSONAL_AND_DEPARTMENT("3", "涉及个人及单位");
@Getter
private String value;
@Getter
private String label;
public static String getLabel(String value) {
for (AccountabilityTargetEnum targetEnum : values()) {
if (targetEnum.getValue().equals(value)) {
return targetEnum.getLabel();
}
}
return "";
}
}

25
src/main/java/com/biutag/supervision/constants/enums/ApprovalFlowEnum.java

@ -0,0 +1,25 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ApprovalFlowEnum {
// 二级审批 所队一>二级机构
SECOND_APPROVAL("2", "二级审批"),
// 三级审批 所队一>二級机构一>市局
THREE_APPROVAL("3", "三级审批");
private String value;
private String label;
public static String getLabel(String value) {
for (ApprovalFlowEnum flowEnum : values()) {
if (flowEnum.getValue().equals(value)) {
return flowEnum.getLabel();
}
}
return "";
}
}

7
src/main/java/com/biutag/supervision/constants/enums/ApproveStateEnum.java

@ -0,0 +1,7 @@
package com.biutag.supervision.constants.enums;
public enum ApproveStateEnum {
approved,
rejected
}

10
src/main/java/com/biutag/supervision/constants/enums/BlameType.java

@ -0,0 +1,10 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2024/11/28
*/
public enum BlameType {
personal,
department
}

49
src/main/java/com/biutag/supervision/constants/enums/BusinessTypeEnum.java

@ -0,0 +1,49 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum BusinessTypeEnum {
JCJ_110("110接处警", "1", "110"),
JCJ_122("122接处警", "2", "122"),
RJCKFW("人境窗口服务", "3", "RJ"),
CJGFF("车驾管服务", "4", "CJG"),
JJCF("交警执法", "5", "JJ"),
ZFBA("执法办案", "6", "CF"),
ZXGZ("专项工作", "7", "ZX"),
ABWW("安保维稳", "8", "AB"),
JAFK("治安防控", "9", "ZA"),
XZGL("行政管理", "10", "XZ"),
FFJC("服务基层", "11", "FF"),
DWGL("队伍管理", "12", "DW"),
JWBZ("警务保障", "14", "SJ"),
QT("其他", "13", "QT");
private String label;
private String value;
private String key;
public static BusinessTypeEnum get(String value) {
for (BusinessTypeEnum businessTypeEnum : values()) {
if (businessTypeEnum.value.equals(value)) {
return businessTypeEnum;
}
}
return null;
}
public static BusinessTypeEnum getByLabel(String label) {
for (BusinessTypeEnum businessTypeEnum : values()) {
if (businessTypeEnum.label.equals(label)) {
return businessTypeEnum;
}
}
return null;
}
}

20
src/main/java/com/biutag/supervision/constants/enums/CaseVerifProblemNatureEnum.java

@ -0,0 +1,20 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/10/29
*/
@AllArgsConstructor
public enum CaseVerifProblemNatureEnum {
ZFBA("执法办案"),
FWGL("服务管理"),
JJJG("警纪警规");
@Getter
private String laebl;
}

11
src/main/java/com/biutag/supervision/constants/enums/CaseVerifSource.java

@ -0,0 +1,11 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2025/1/8
*/
public enum CaseVerifSource {
excel_import,
plugin
}

17
src/main/java/com/biutag/supervision/constants/enums/ComfortStatus.java

@ -0,0 +1,17 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2025/2/11
*/
public enum ComfortStatus {
approval,
// 已退回
returned,
// 待呈报
to_be_reported,
completed
}

11
src/main/java/com/biutag/supervision/constants/enums/CountersignState.java

@ -0,0 +1,11 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2024/11/26
*/
public enum CountersignState {
uncompleted,
completed
}

9
src/main/java/com/biutag/supervision/constants/enums/DataUpdateMethodEnum.java

@ -0,0 +1,9 @@
package com.biutag.supervision.constants.enums;
public enum DataUpdateMethodEnum {
// 增量更新
incremental,
// 覆盖更新
overwrite
}

20
src/main/java/com/biutag/supervision/constants/enums/DepartGroupEnum.java

@ -0,0 +1,20 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/10/29
*/
@AllArgsConstructor
@Getter
public enum DepartGroupEnum {
COUNTY_CITY_BUREAUS(3, "分县市局"),
BUREAU_AFFILIATED(4, "局属单位");
private Integer id;
private String label;
}

18
src/main/java/com/biutag/supervision/constants/enums/DepartGroupIdEnum.java

@ -0,0 +1,18 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2025/3/6
*/
@AllArgsConstructor
public enum DepartGroupIdEnum {
COUNTY_AND_CITY_BUREAUS("3");
@Getter
private String value;
}

17
src/main/java/com/biutag/supervision/constants/enums/DepartLevelEnum.java

@ -0,0 +1,17 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum DepartLevelEnum {
FIRST(0),
SECOND_CATEGORY(1),
SECOND(2),
THREE(3);
private Integer value;
}

10
src/main/java/com/biutag/supervision/constants/enums/DistributionCycleEnum.java

@ -0,0 +1,10 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2024/10/17
*/
public enum DistributionCycleEnum {
day,
weekly
}

17
src/main/java/com/biutag/supervision/constants/enums/DistributionFlowEnum.java

@ -0,0 +1,17 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/10/17
*/
@AllArgsConstructor
@Getter
public enum DistributionFlowEnum {
SECOND("2"),
THIRD("3");
private String value;
}

23
src/main/java/com/biutag/supervision/constants/enums/DistributionMethodEnum.java

@ -0,0 +1,23 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/10/17
*/
@AllArgsConstructor
@Getter
public enum DistributionMethodEnum {
// 问题下发
NEGATIVE_DISTRIBUTE("1"),
// 数据保存
DATA_SAVE("2"),
// 预警通知
WARNING_NOTIFICATION("3");
private String value;
}

22
src/main/java/com/biutag/supervision/constants/enums/DistributionStateEnum.java

@ -0,0 +1,22 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/10/17
*/
@AllArgsConstructor
public enum DistributionStateEnum {
// 未分发
UNDISTRIBUTED("0"),
// 已分发
DISTRIBUTED("1"),
// 已处置
HANDLED("2");
@Getter
private String value;
}

19
src/main/java/com/biutag/supervision/constants/enums/FlowActionEnum.java

@ -0,0 +1,19 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
public enum FlowActionEnum {
FIRST_DISTRIBUTE("first_distribute", "已下发"),
SECOND_APPROVE("second_approve", "已审批"),
FIRST_APPROVE("first_approve", "已审批");
@Getter
private String key;
@Getter
private String name;
}

42
src/main/java/com/biutag/supervision/constants/enums/FlowNodeEnum.java

@ -0,0 +1,42 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
@AllArgsConstructor
@Getter
public enum FlowNodeEnum {
FIRST_DISTRIBUTE("first_distribute"),
SECOND_SIGN("second_sign"),
SECOND_DISTRIBUTE("second_distribute"),
THREE_SIGN("three_sign"),
VERIFY("verify"),
SECOND_APPROVE("second_approve"),
FIRST_APPROVE("first_approve"),
SECOND_EXTENSION_APPROVE("second_extension_approve"),
FIRST_EXTENSION_APPROVE("first_extension_approve"),
COUNTERSIGN("countersign"),
COMPLETED("completed");
private String key;
public static List<String> getSignFlowKeys() {
return List.of(FIRST_DISTRIBUTE.getKey(), SECOND_SIGN.getKey(), SECOND_DISTRIBUTE.getKey(), THREE_SIGN.getKey());
}
public static boolean isSignFlow(String flowKey) {
return getSignFlowKeys().contains(flowKey);
}
/**
* 办结审批
* @return
*/
public static List<String> getApproveFlowKeys() {
return List.of(FIRST_DISTRIBUTE.getKey(), SECOND_SIGN.getKey(), SECOND_DISTRIBUTE.getKey(), THREE_SIGN.getKey());
}
}

24
src/main/java/com/biutag/supervision/constants/enums/HostLevelEnums.java

@ -0,0 +1,24 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum HostLevelEnums {
FIRST("1", "市局主办"),
SECOND("2", "二级机构主办"),
THREE("3", "三级机构主办");
private String value;
private String label;
public static String getLabel(String value) {
for (HostLevelEnums hostLevelEnums : values()) {
if (hostLevelEnums.getValue().equals(value)) {
return hostLevelEnums.getLabel();
}
}
return "";
}
}

38
src/main/java/com/biutag/supervision/constants/enums/InitialPetition.java

@ -0,0 +1,38 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
* @author wxc
* @date 2024/10/22
*/
@Getter
@AllArgsConstructor
public enum InitialPetition {
THE_FIRST("1", "初访"),
REPEAT("2", "重访");
private String value;
public String label;
public static String getValue(String str) {
if ("初".equals(str)) {
return THE_FIRST.getValue();
}
if ("重".equals(str)) {
return REPEAT.getValue();
}
for (InitialPetition value : values()) {
if (value.getLabel().equals(str)) {
return value.getValue();
}
}
return null;
}
}

26
src/main/java/com/biutag/supervision/constants/enums/InspectCaseEnum.java

@ -0,0 +1,26 @@
package com.biutag.supervision.constants.enums;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum InspectCaseEnum {
// 属实
TRUE("1", "属实"),
// 部分属实
PARTIALLY_TRUE("2", "部分属实"),
// 不属实
FALSE("3", "不属实");
private String value;
private String label;
public static boolean isItTure(String value) {
return TRUE.getValue().equals(value) || PARTIALLY_TRUE.getValue().equals(value);
}
}

21
src/main/java/com/biutag/supervision/constants/enums/InvolveProblemEnum.java

@ -0,0 +1,21 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/12/4
*/
@AllArgsConstructor
public enum InvolveProblemEnum {
// 自动回访不满意
ZDHFBMY("1", "自动回访不满意");
@Getter
private String value;
private String laebl;
}

16
src/main/java/com/biutag/supervision/constants/enums/IsRectifyEnum.java

@ -0,0 +1,16 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
// 是否整改
@AllArgsConstructor
@Getter
public enum IsRectifyEnum {
NOT("0"),
YES("1");
private String value;
}

25
src/main/java/com/biutag/supervision/constants/enums/MailTrendSourcesEnum.java

@ -0,0 +1,25 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum MailTrendSourcesEnum {
ONE(1, 21),
TWO(2, 22),
THREE(3, 23),
FOUR(4, 24);
private final int code; // 前端传来的code
private final int mappedCode; // 后端需要用到的code
public static int getMappedCodeByCode(int code) {
for (MailTrendSourcesEnum value : MailTrendSourcesEnum.values()) {
if (value.code == code) {
return value.getMappedCode();
}
}
throw new IllegalArgumentException("Invalid sourcesCode: " + code);
}
}

17
src/main/java/com/biutag/supervision/constants/enums/MenuEnum.java

@ -0,0 +1,17 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum MenuEnum {
CATALOGUE("M"),
MENU("C"),
BUTTON("A");
private String value;
public String value() {
return value;
}
}

20
src/main/java/com/biutag/supervision/constants/enums/ModelDataTypeEnum.java

@ -0,0 +1,20 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2025/3/7
*/
@AllArgsConstructor
public enum ModelDataTypeEnum {
// 预警问题
YJWT("1"),
// 提醒通知
TXTZ("2");
@Getter
private String value;
}

21
src/main/java/com/biutag/supervision/constants/enums/ModelHandleDepartTypeEnum.java

@ -0,0 +1,21 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2025/3/7
* 办理单位类型
*/
@AllArgsConstructor
public enum ModelHandleDepartTypeEnum {
// 涉及单位
SJDW("1"),
// 指定单位
ZDDW("2");
@Getter
private String value;
}

22
src/main/java/com/biutag/supervision/constants/enums/ModelTypeEnum.java

@ -0,0 +1,22 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/12/12
*/
@AllArgsConstructor
public enum ModelTypeEnum {
// 内部监督
NBJD("1"),
// 个人极端
GRJD("2");
@Getter
private String value;
}

34
src/main/java/com/biutag/supervision/constants/enums/NegativeLevelEnum.java

@ -0,0 +1,34 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/11/8
*/
@Getter
@AllArgsConstructor
public enum NegativeLevelEnum {
GENERAL_IMPACT("一般影响", "1", 0.0),
SERIOUS_IMPACT("严重影响", "2", 0.2),
SIGNIFICANT_IMPACT("重大影响", "3", 0.5);
private String lable;
private String value;
private Double score;
public static Double getScore(String value) {
for (NegativeLevelEnum negativeLevelEnum : values()) {
if (negativeLevelEnum.value.equals(value)) {
return negativeLevelEnum.score;
}
}
return 0.0;
}
}

21
src/main/java/com/biutag/supervision/constants/enums/NegativeTaskCategoryEnum.java

@ -0,0 +1,21 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
public enum NegativeTaskCategoryEnum {
// 批量导入
BATCH_IMPORT("0"),
// 导入记录
IMPORT("1"),
// 导出记录
EXPORT("2");
@Getter
private String value;
}

14
src/main/java/com/biutag/supervision/constants/enums/NegativeTaskStatusEnum.java

@ -0,0 +1,14 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
public enum NegativeTaskStatusEnum {
SUCCESS("0"),
FAIL("1"),
PADDING("2");
@Getter
private String value;
}

12
src/main/java/com/biutag/supervision/constants/enums/OrderEnum.java

@ -0,0 +1,12 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2024/11/8
*/
public enum OrderEnum {
// 正序
ascending,
// 倒叙
descending
}

55
src/main/java/com/biutag/supervision/constants/enums/PersonTypeEnum.java

@ -0,0 +1,55 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
import java.util.Objects;
/**
* @author wxc
* @date 2024/11/1
*/
@Getter
@AllArgsConstructor
public enum PersonTypeEnum {
police("1", "民警"),
works("2", "职工"),
aux("3", "辅警"),
clerk("4", "文员"),
xj("5", "协警");
private String value;
private String label;
public static List<String> getAuxPersonType() {
return List.of(works.getValue(), aux.getValue(), clerk.getValue(), xj.getValue());
}
public static PersonTypeEnum get(String value) {
for (PersonTypeEnum personTypeEnum : values()) {
if (personTypeEnum.getValue().equals(value)) {
return personTypeEnum;
}
}
return null;
}
public static PersonTypeEnum getByLabel(String value) {
for (PersonTypeEnum personTypeEnum : values()) {
if (personTypeEnum.getLabel().equals(value)) {
return personTypeEnum;
}
}
return null;
}
public static String getLabel(String value) {
PersonTypeEnum personTypeEnum = get(value);
if (Objects.isNull(personTypeEnum)) {
return null;
}
return personTypeEnum.getLabel();
}
}

37
src/main/java/com/biutag/supervision/constants/enums/PoliceTypeEnum.java

@ -0,0 +1,37 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/12/26
*/
@AllArgsConstructor
@Getter
public enum PoliceTypeEnum {
JL("警令", "1"),
ZG("政工", "2"),
JB("警保", "3"),
ZJJC("纪检监察", "4"),
JGDW("机关党委", "5"),
JGJW("机关纪委", "6"),
LDZX("六大中心", "7"),
JX("警校", "8"),
XZ("刑侦", "9"),
ZA("治安", "10");
private String label;
private String value;
public static PoliceTypeEnum getByLabel(String label) {
for (PoliceTypeEnum problemSourcesEnum : values()) {
if (problemSourcesEnum.label.equals(label)) {
return problemSourcesEnum;
}
}
return null;
}
}

59
src/main/java/com/biutag/supervision/constants/enums/ProblemSourcesEnum.java

@ -0,0 +1,59 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ProblemSourcesEnum {
XCDC("现场督察", "13"),
LMGZ("灵敏感知", "14"),
ZXDC("专项督察", "15"),
SPDC("视频督察", "16"),
A12389("12389", "17"),
SLDJB("市局领导交办", "18"),
ZDDJB("支队领导交办", "19"),
SJJB("上级交办", "20"),
GJXFPT("国家信访平台", "21"),
GABXF("公安部信访", "22"),
JZXX("局长信箱", "23"),
XF12337("12337信访", "24"),
XF_QT("信访投诉/其他", "25"),
SJJD("审计监督", "26"),
ZFTZSJ("政府投资审计", "27"),
ZFSACFSS("执法活动财物审计", "28"),
JJZRSJ("经济责任审计", "29"),
ZXSJ("专项审计", "30"),
JWDC("民意感知", "2"),
JYDC("警意调查", "3"),
CFJD("持法监督", "4"),
JCKH("检查考核", "8"),
QT("其他", "9");
private String label;
private String value;
public static ProblemSourcesEnum get(String value) {
for (ProblemSourcesEnum problemSourcesEnum : values()) {
if (problemSourcesEnum.value.equals(value)) {
return problemSourcesEnum;
}
}
return null;
}
public static ProblemSourcesEnum getByLabel(String label) {
for (ProblemSourcesEnum problemSourcesEnum : values()) {
if (problemSourcesEnum.label.equals(label)) {
return problemSourcesEnum;
}
}
return null;
}
}

26
src/main/java/com/biutag/supervision/constants/enums/ProcessingStatusEnum.java

@ -0,0 +1,26 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
public enum ProcessingStatusEnum {
signing("签收中"),
processing("办理中"),
approval("审批中"),
completed("已办结");
@Getter
private String label;
public static String getLabel(String name) {
for (ProcessingStatusEnum value : values()) {
if (value.name().equals(name)) {
return value.getLabel();
}
}
return null;
}
}

21
src/main/java/com/biutag/supervision/constants/enums/RepeatEnum.java

@ -0,0 +1,21 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum RepeatEnum {
FIRST_MAIL(1, "初访信件"),
REPEAT_MAIL(2, "重访信件");
private Integer id;
private String label;
}

18
src/main/java/com/biutag/supervision/constants/enums/ReplyStateEnum.java

@ -0,0 +1,18 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/12/7
*/
@AllArgsConstructor
public enum ReplyStateEnum {
UN_REPLIED("0"),
REPLIED("1");
@Getter
private String value;
}

17
src/main/java/com/biutag/supervision/constants/enums/RoleCodeEnum.java

@ -0,0 +1,17 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum RoleCodeEnum {
ADMIN("admin"),
FIRST_ADMIN("admin_1"),
SECOND_ADMIN("admin_1_1_1_2"),
THREE_ADMIN("admin_1_1_1_3");
private String code;
}

25
src/main/java/com/biutag/supervision/constants/enums/RpcApplyTypeEnum.java

@ -0,0 +1,25 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2025/2/7
*/
@AllArgsConstructor
public enum RpcApplyTypeEnum {
// 维权
RIGHTS_PROTECTION("1"),
// 抚慰
COMFORT("2"),
// 容错
FAULT_TOLERANT("3");
@Getter
private String value;
}

19
src/main/java/com/biutag/supervision/constants/enums/SpecialSupervisionEnum.java

@ -0,0 +1,19 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wxc
* @date 2024/12/24
*/
@Getter
@AllArgsConstructor
public enum SpecialSupervisionEnum {
// 黄赌警情
HDJQ("1");
private String value;
}

15
src/main/java/com/biutag/supervision/constants/enums/StatusEnum.java

@ -0,0 +1,15 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum StatusEnum {
ENABLE("1"),
DISABLE("0");
private String value;
}

10
src/main/java/com/biutag/supervision/constants/enums/TaskStatusEnum.java

@ -0,0 +1,10 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2025/4/7
*/
public enum TaskStatusEnum {
todo,
done
}

23
src/main/java/com/biutag/supervision/constants/enums/TaskTypeEnum.java

@ -0,0 +1,23 @@
package com.biutag.supervision.constants.enums;
/**
* @author wxc
* @date 2025/4/7
*/
public enum TaskTypeEnum {
// 测酒
testing_alcohol,
// 督察任务
inspection,
// 自查任务
selfexamination,
risk_personal,
// 问题随拍
problem_shooting
}

16
src/main/java/com/biutag/supervision/constants/enums/TestingAlcoholStateEnum.java

@ -0,0 +1,16 @@
package com.biutag.supervision.constants.enums;
/**
* 测酒状态
* @author wxc
* @date 2025/4/7
*/
public enum TestingAlcoholStateEnum {
// 未饮酒
not_drinking,
// 已饮酒
drink
}

47
src/main/java/com/biutag/supervision/constants/enums/TimeLimitEnum.java

@ -0,0 +1,47 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
// 办理时限
@Getter
@AllArgsConstructor
public enum TimeLimitEnum {
WORK_137("137工作制", "3+7", 1, 3, 7),
WORK_177("177工作制", "7+7", 1, 7, 7),
WORK_15_15("15+15工作制", "15+15", 1, 15, 15),
WORK_30_30("30+30工作制", "30+30", 1, 30, 30),
OTHER("其他", "other", null, null, null);
private String label;
private String value;
// 签收时长(天)
private Integer maxSignDuration;
// 办理时长(天)
private Integer maxHandleDuration;
// 最大延期时长(天)
private Integer maxExtensionDuration;
public static TimeLimitEnum get(String value) {
for (TimeLimitEnum timeLimitEnum : values()) {
if (timeLimitEnum.getValue().equals(value)) {
return timeLimitEnum;
}
}
throw new RuntimeException(String.format("办理时限字典[%s]未找到", value));
}
public static String getLabel(String value) {
try {
return get(value).getLabel();
} catch (RuntimeException e) {
return "";
}
}
}

29
src/main/java/com/biutag/supervision/constants/enums/TrendEnum.java

@ -0,0 +1,29 @@
package com.biutag.supervision.constants.enums;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
/**
* @Auther: sh
* @Date: 2024/11/16 19:34
* @Description:
*/
@Getter
@AllArgsConstructor
public enum TrendEnum {
DAY("日趋势", "1"),
WEEK("周趋势", "2"),
Month("月趋势", "3");
private String label;
private String value;
}

7
src/main/java/com/biutag/supervision/constants/enums/WorkStateEnum.java

@ -0,0 +1,7 @@
package com.biutag.supervision.constants.enums;
public enum WorkStateEnum {
todo,
done
}

7
src/main/java/com/biutag/supervision/constants/enums/WorkStatusEnum.java

@ -0,0 +1,7 @@
package com.biutag.supervision.constants.enums;
public enum WorkStatusEnum {
todo,
done
}

73
src/main/java/com/biutag/supervision/controller/AppController.java

@ -0,0 +1,73 @@
package com.biutag.supervision.controller;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import io.swagger.v3.oas.annotations.Operation;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
/**
* @author wxc
* @date 2025/4/18
*/
@Slf4j
@RequestMapping("app")
@Controller
public class AppController {
@Operation(summary = "数据入口")
@ResponseBody
@PostMapping("forward")
public String forward(@RequestBody Request request) {
log.info("APP 请求地址:{} 请求方式:{} 授权码:{}", request.getUrl(), request.getMethod(), request.getToken());
// if (Objects.nonNull(request.getBody())) {
// log.info("APP 请求参数:{}", request.getBody());
// }
HttpResponse httpResponse = HttpRequest.of(String.format("http://127.0.0.1:8080" + request.getUrl()))
.method(getMethod(request.getMethod()))
.auth(request.getToken())
.body(request.body)
.execute();
return httpResponse.body();
}
@Operation(summary = "文件预览")
@GetMapping("file/stream/forward")
public String fileSteamForward(String filepath) {
log.info("APP 文件预览,文件路径:{}", filepath);
return "forward:/file/stream" + filepath;
}
public Method getMethod(String method) {
if ("GET".equals(method)) {
return Method.GET;
}
if ("DELETE".equals(method)) {
return Method.DELETE;
}
if ("PUT".equals(method)) {
return Method.PUT;
}
return Method.POST;
}
@Setter
@Getter
public static class Request {
private String url;
private String method;
private String token;
private String body;
}
}

42
src/main/java/com/biutag/supervision/controller/AuthController.java

@ -0,0 +1,42 @@
package com.biutag.supervision.controller;
import cn.hutool.core.util.StrUtil;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.exception.AuthException;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.domain.Self;
import com.biutag.supervision.pojo.entity.Menu;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.vo.MenuTree;
import com.biutag.supervision.service.MenuService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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;
@Slf4j
@RequiredArgsConstructor
@RequestMapping("auth")
@RestController
public class AuthController {
private final MenuService menuService;
@GetMapping("self")
public Result<Self> self() {
String authorization = UserContextHolder.getCurrentToken();
if (StrUtil.isBlank(authorization)) {
throw new AuthException();
}
UserAuth user = UserContextHolder.getCurrentUser();
boolean superFlag = AppConstants.USER_TYPE_SUPER.equals(user.getUserType());
List<Menu> menus = superFlag ? menuService.listAll() : menuService.listMenuByCurrentUser();
List<String> perms = superFlag ? List.of("*") : menuService.listPermsByCurrentUser();
return Result.success(new Self().setUser(user).setMenus(MenuTree.buildTree(menus)).setPerms(perms));
}
}

54
src/main/java/com/biutag/supervision/controller/CommonOpinionsControllers.java

@ -0,0 +1,54 @@
package com.biutag.supervision.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.CommonOpinions;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.param.CommonOpinionsQueryParam;
import com.biutag.supervision.service.CommonOpinionsService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RequestMapping("commonOpinions")
@RestController
@RequiredArgsConstructor
public class CommonOpinionsControllers {
private final CommonOpinionsService commonOpinionsService;
@PostMapping
public Result save(@RequestBody CommonOpinions commonOpinions){
UserAuth user = UserContextHolder.getCurrentUser();
commonOpinions.setCrtUser(user.getNickName());
commonOpinions.setCrtId(user.getUserName());
commonOpinions.setCrtTime(LocalDateTime.now());
commonOpinionsService.save(commonOpinions);
return Result.success();
}
@GetMapping
public Result<List<CommonOpinions>> get(CommonOpinionsQueryParam queryParam){
UserAuth user = UserContextHolder.getCurrentUser();
List<CommonOpinions> commonOpinions= commonOpinionsService.list(new LambdaQueryWrapper<CommonOpinions>()
.like(StrUtil.isNotBlank(queryParam.getContent()),CommonOpinions::getContent,queryParam.getContent()
).eq(CommonOpinions::getCrtId,user.getUserName()).last("limit 100"));
return Result.success(commonOpinions);
}
@DeleteMapping
public Result del(@RequestBody CommonOpinions commonOpinions){
commonOpinionsService.remove(new LambdaQueryWrapper<CommonOpinions>().eq(CommonOpinions::getContent,commonOpinions.getContent()));
return Result.success();
}
}

91
src/main/java/com/biutag/supervision/controller/FileController.java

@ -0,0 +1,91 @@
package com.biutag.supervision.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import com.biutag.supervision.mapper.FileBase64Mapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.dto.FileBase64Dto;
import com.biutag.supervision.pojo.entity.FileBase64;
import com.biutag.supervision.pojo.vo.FileVo;
import com.biutag.supervision.service.FileService;
import com.biutag.supervision.util.ImgUtils;
import com.biutag.supervision.util.WordUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.Objects;
import java.util.Optional;
@Slf4j
@RequiredArgsConstructor
@RequestMapping("file")
@Controller
public class FileController {
private final FileService fileService;
private final FileBase64Mapper fileBase64Mapper;
@ResponseBody
@PostMapping("upload")
public Result<FileVo> upload(@RequestPart("file") MultipartFile file) throws IOException {
log.info("文件上传 upload------------------------------");
String filePath = fileService.upload(file);
return Result.success(new FileVo()
.setFileName(file.getOriginalFilename())
.setFilePath(filePath));
}
@ResponseBody
@PostMapping("upload/base64")
public Result<FileVo> upload(@RequestBody FileBase64Dto file) {
log.info("文件BASE64上传 upload------------------------------");
return Result.success(new FileVo()
.setFileName(file.getOriginalFilename())
.setFilePath(fileService.uploadBase64(file.getBase64(), file.getOriginalFilename())));
}
@GetMapping("stream/**")
public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = request.getRequestURI().substring(12);
if (filePath.toLowerCase().endsWith(".pdf")) {
response.setContentType("application/pdf");
} else {
response.setContentType("application/octet-stream");
}
InputStream is = fileService.download(filePath);
if (filePath.toLowerCase().endsWith(".doc")) {
is = WordUtil.convertDocx(is);
}
IoUtil.copy(is, response.getOutputStream());
}
@ResponseBody
@GetMapping("base64")
public Result<String> getBase64(String filepath) throws IOException {
if (StrUtil.isBlank(filepath)) {
return Result.success(null);
}
FileBase64 fileBase64 = fileBase64Mapper.selectById(filepath);
if (Objects.nonNull(fileBase64)) {
return Result.success(fileBase64.getBase64());
}
InputStream is = fileService.download(filepath);
String base64 = Base64.getEncoder().encodeToString(is.readAllBytes());
if (ImgUtils.isImg(filepath)) {
base64 = String.format("data:image/%s;base64,", FileUtil.extName(filepath).toLowerCase()) + base64;
}
return Result.success(base64);
}
}

102
src/main/java/com/biutag/supervision/controller/LoginController.java

@ -0,0 +1,102 @@
package com.biutag.supervision.controller;
import cn.com.jit.JitAuthClient;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.domain.AppUser;
import com.biutag.supervision.pojo.dto.AccountDto;
import com.biutag.supervision.pojo.entity.BaseAccount;
import com.biutag.supervision.pojo.entity.SupPolice;
import com.biutag.supervision.pojo.vo.TokenVo;
import com.biutag.supervision.service.BaseAccountService;
import com.biutag.supervision.service.SupPoliceService;
import com.biutag.supervision.service.UserLoginService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@Tag(name = "登录接口")
@Slf4j
@RequiredArgsConstructor
@RestController
public class LoginController {
private final BaseAccountService accountService;
private final UserLoginService userLoginService;
private final SupPoliceService policeService;
@Operation(summary = "登录")
@PostMapping("login")
public Result<TokenVo> login(@RequestBody AccountDto account) {
List<BaseAccount> baseAccounts = accountService.getByLogin(account.getAccount());
if (baseAccounts.isEmpty()) {
throw new RuntimeException("用户名或密码有误,请重新输入");
}
BaseAccount baseAccount = baseAccounts.get(0);
try {
if (!BCrypt.checkpw(account.getPassword(), baseAccount.getPassword())) {
throw new RuntimeException();
}
} catch (RuntimeException e) {
log.error(e.getMessage(), e);
throw new RuntimeException("用户名或密码有误,请重新输入");
}
String token = userLoginService.login(baseAccount.getAccount());
return Result.success(new TokenVo().setToken(token));
}
@PostMapping("logout")
public Result<Void> logout() {
userLoginService.logout();
return Result.success();
}
@Operation(summary ="生成数字证书随机数")
@GetMapping("jit/random")
public Result<String> random() {
String path = "/app/conf/jitMessage.properties";
JitAuthClient jitAuthClient = new JitAuthClient(path);
String random = jitAuthClient.random();
return Result.success(random);
}
@Operation(summary ="数字证书登录")
@PostMapping("jit/p7certAuth")
public Result<TokenVo> p7certAuth(@RequestBody JSONObject body) {
String path = "/app/conf/jitMessage.properties";
JitAuthClient jitAuthClient = new JitAuthClient(path);
Map responseMap = jitAuthClient.authenP7(body.getString("random"), body.getString("signed_data"), "");
String responseStr = JSON.toJSONString(responseMap);
log.info("返回的结果:{}", responseStr);
JSONObject response = JSON.parseObject(responseStr);
if (!response.getBoolean("isSuccess")) {
throw new RuntimeException(response.getString("errDesc"));
}
String cerSubject = response.getJSONObject("certAttributeNodeMap").getString("_saml_cert_subject");
log.info("_saml_cert_subject:{}", cerSubject);
String idCode = cerSubject.split(",")[0].split(" ")[1];
log.info("身份证:{}", idCode);
String token = userLoginService.login(idCode);
return Result.success(new TokenVo().setToken(token));
}
@Operation(summary = "App登录")
@PostMapping("app/login")
public Result<AppUser> appLogin(String empNo) {
SupPolice police = policeService.getByEmpNo(empNo);
return Result.success(userLoginService.loginByApp(police.getIdCode()));
}
}

54
src/main/java/com/biutag/supervision/controller/PoliceAvatarController.java

@ -0,0 +1,54 @@
package com.biutag.supervision.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.biutag.supervision.mapper.SupPoliceMapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.SupPolice;
import com.biutag.supervision.service.FileService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
/**
* @author wxc
* @date 2024/12/24
*/
@RequestMapping("policeUpdateAvatar")
@Slf4j
@RequiredArgsConstructor
@RestController
public class PoliceAvatarController {
private final FileService fileService;
private final SupPoliceMapper policeMapper;
@RequestMapping
public Result<String> update() throws FileNotFoundException {
List<File> files = FileUtil.loopFiles("/work/POLICE");
for (File file : files) {
try {
String img = file.getPath().replace("/work/POLICE", "");
log.info(img);
String idCode = policeMapper.getIdCodeByPoliceAvatar(img);
if (StrUtil.isBlank(idCode) || !policeMapper.exists(new LambdaUpdateWrapper<SupPolice>().eq(SupPolice::getIdCode, idCode))) {
continue;
}
String filePath = fileService.upload(new FileInputStream(file), FileUtil.size(file), FileUtil.extName(file.getName()));
policeMapper.update(new LambdaUpdateWrapper<SupPolice>().eq(SupPolice::getIdCode, idCode).set(SupPolice::getAvatarUrl, filePath));
log.info("{} 更新头像 {}", idCode, file.getName());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
return Result.success();
}
}

129
src/main/java/com/biutag/supervision/controller/invertRecord/invertRecordController.java

@ -0,0 +1,129 @@
package com.biutag.supervision.controller.invertRecord;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.constants.enums.RoleCodeEnum;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.InformMessage;
import com.biutag.supervision.pojo.entity.InvertRecord;
import com.biutag.supervision.pojo.entity.SupDepart;
import com.biutag.supervision.pojo.entity.report.ReportProject;
import com.biutag.supervision.pojo.entity.warning.WarningRecord;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.param.InvertRecord.InvertRecordQueryParam;
import com.biutag.supervision.pojo.param.entryWindow.EntryWindowQueryParam;
import com.biutag.supervision.pojo.vo.InvertRecord.InvertRecordVo;
import com.biutag.supervision.pojo.vo.entryWindow.EntryWindowVo;
import com.biutag.supervision.service.InformMessageService;
import com.biutag.supervision.service.InvertRecord.InvertRecordService;
import com.biutag.supervision.service.Report.ReportProjectService;
import com.biutag.supervision.service.SupDepartService;
import com.biutag.supervision.service.Warning.WarningRecordService;
import com.biutag.supervision.util.BigDecimalUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
//预警项目相关接口
@RequiredArgsConstructor
@RestController
@RequestMapping("/invertRecor")
public class invertRecordController {
private final InvertRecordService invertRecordService;
private final ReportProjectService projectService;
private final WarningRecordService recordService;
private final InformMessageService informMessageService;
private final SupDepartService departService;
@PostMapping("/page")
public Result<Page<InvertRecordVo>> page(@RequestBody InvertRecordQueryParam query){
UserAuth user = UserContextHolder.getCurrentUser();
QueryWrapper<InvertRecord> wrapper=new QueryWrapper<>();
// 权限
if (!AppConstants.USER_TYPE_SUPER.equals(user.getUserType()) && !user.getRoleCodes().contains(RoleCodeEnum.FIRST_ADMIN.getCode())) {
List<String> orgIds =new ArrayList<>();
// wrapper.in("r.applicant_id",user.getUserName());
if(!user.getAuthDepartIds().isEmpty()){
orgIds = departService.getAllNodeIds(user.getAuthDepartIds());
wrapper.in("r.project_unit_id", orgIds);
}else{
orgIds = departService.getAllNodeIds(user.getDepartId());
wrapper.in("r.project_unit_id", orgIds);
}
// wrapper.in("r.project_unit_id", orgIds);
}
if(StrUtil.isNotBlank(query.getName())){
wrapper.like(" r.report_name",query.getName());
}
if(StrUtil.isNotBlank(query.getWarningState())){
wrapper.eq("i.warning_state",query.getWarningState());
}
wrapper.orderByDesc("i.crt_time");
return Result.success(invertRecordService.queryPage(new Page<>(query.getCurrent(),query.getSize()),wrapper));
}
@GetMapping("/getDetail/{id}")
public Result<InvertRecord> getDetail(@PathVariable("id")String id){
InvertRecord record = invertRecordService.getById(id);
return Result.success(record);
}
@Transactional(rollbackFor = Exception.class)
@GetMapping("/upWarningStateById/{id}")
public Result upWarningStateById(@PathVariable("id")String id){
UserAuth user = UserContextHolder.getCurrentUser();
InvertRecord record = invertRecordService.getById(id);
LambdaUpdateWrapper<InvertRecord> updateWrapper=new LambdaUpdateWrapper<InvertRecord>();
updateWrapper.eq(InvertRecord::getId,id);
if(record.getWarningState().equals("0")){
updateWrapper.set(InvertRecord::getWarningState,"1");
//发送通知
InvertRecord invertRecord = invertRecordService.getById(id);
//获取项目信息
ReportProject project = projectService.getById(invertRecord.getReportId());
//获取预警监督人员
WarningRecord warningRecord = recordService.getById(invertRecord.getWarningId());
//格式化当前时间
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
//初始化发送信息
InformMessage informMessage =new InformMessage();
informMessage.setNode("审计预警项目反馈");
String message = String.format("%s 于 %s 提交项目 %s",user.getNickName(),formattedDateTime,project.getReportName());
informMessage.setMessage(message);
informMessage.setCrtUser(user.getNickName());
informMessage.setCrtUserId(user.getUserName());
informMessage.setCrtTime(LocalDateTime.now());
informMessage.setReportId(record.getReportId());
informMessage.setRecipient(warningRecord.getWarningSupervision());
informMessage.setRecipientId(warningRecord.getWarningSupervisionId());
informMessageService.save(informMessage);
}else{
updateWrapper.set(InvertRecord::getWarningState,"0");
}
invertRecordService.update(updateWrapper);
return Result.success();
}
}

137
src/main/java/com/biutag/supervision/controller/price/PriceInformationController.java

@ -0,0 +1,137 @@
package com.biutag.supervision.controller.price;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.constants.enums.RoleCodeEnum;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.price.PriceFile;
import com.biutag.supervision.pojo.entity.price.PriceInformation;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.param.Price.PriceInformationQueryParam;
import com.biutag.supervision.pojo.vo.excel.ExcelPriceInformation;
import com.biutag.supervision.pojo.vo.price.PriceInformationVo;
import com.biutag.supervision.service.FileService;
import com.biutag.supervision.service.Price.PriceFileService;
import com.biutag.supervision.service.Price.PriceInformationService;
import com.biutag.supervision.service.SupDepartService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* @author weipeng
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/price")
public class PriceInformationController {
private final PriceInformationService service;
private final FileService fileService;
private final PriceFileService priceFileService;
private final SupDepartService departService;
@GetMapping
public Result<Page<PriceInformationVo>> getPage(PriceInformationQueryParam queryParam){
UserAuth user = UserContextHolder.getCurrentUser();
QueryWrapper<PriceInformation> queryWrapper=new QueryWrapper<>();
if (!AppConstants.USER_TYPE_SUPER.equals(user.getUserType()) && !user.getRoleCodes().contains(RoleCodeEnum.FIRST_ADMIN.getCode())) {
// wrapper.in("r.applicant_id",user.getUserName());
List<String> orgIds = departService.getAllNodeIds(user.getAuthDepartIds());
queryWrapper.in("pi.create_depart", orgIds);
}
queryWrapper.like(StrUtil.isNotBlank(queryParam.getContent()),"pi.information",queryParam.getContent());
return Result.success(service.queryPage(new Page<>(queryParam.getCurrent(),queryParam.getSize()),queryWrapper));
}
@PostMapping("/upData")
public Result upData(@RequestBody PriceInformation information){
information.setInformationData();
if(service.updateById(information)){
return Result.success();
}else{
return Result.failed("操作失败");
}
}
@DeleteMapping("/{id}")
public Result delById(@PathVariable("id") String id){
if(service.removeById(id)){
return Result.success();
}else{
return Result.failed("删除失败");
}
}
@Transactional(rollbackFor = Exception.class)
@PostMapping("/import")
public Result<List<PriceInformation>> importExcel(@RequestPart("file") MultipartFile file) throws IOException {
log.info("文件导入中------------------------------");
UserAuth user = UserContextHolder.getCurrentUser();
String filePath = fileService.upload(file);
String fileNameType = FileUtil.extName(file.getOriginalFilename());
PriceFile priceFile =new PriceFile();
priceFile.setFilePath(filePath);
priceFile.setFileName(file.getOriginalFilename());
priceFile.setCreTime(LocalDateTime.now());
priceFile.setCreUser(user.getNickName());
priceFileService.save(priceFile);
if (!"xls".equals(fileNameType) && !"xlsx".equals(fileNameType)) {
throw new RuntimeException("仅支持 xls/xlsx 格式文件的导入");
}
List<PriceInformation> list = new ArrayList<>();
ExcelReader excelReader = EasyExcel.read(file.getInputStream(), PriceInformation.class, new ReadListener<PriceInformation>() {
@Override
public void invoke(PriceInformation data, AnalysisContext analysisContext) {
data.setFileId(priceFile.getId());
data.setCreateDepart(user.getDepartId());
data.setInformationData();
list.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}).build();
ReadSheet sheet = EasyExcel.readSheet(0).headRowNumber(2).build();
excelReader.read(sheet);
excelReader.close();
service.saveBatch(list);
return Result.success(list);
}
@GetMapping("/export")
public void export(PriceInformationQueryParam queryParam, HttpServletResponse response) throws IOException{
queryParam.setCurrent(1);
queryParam.setSize(100000);
QueryWrapper<PriceInformation> queryWrapper=new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(queryParam.getContent()),"pi.information",queryParam.getContent());
Page<PriceInformationVo> page = service.queryPage(new Page<>(queryParam.getCurrent(),queryParam.getSize()),queryWrapper);
List<PriceInformationVo> list = page.getRecords();
String headerValue = "attachment; filename=\"" + URLEncoder.encode("价格库信息.xlsx", "UTF-8") + "\"";
response.setHeader("Content-Disposition", headerValue);
response.setContentType("application/octet-stream");
EasyExcel.write(response.getOutputStream(), ExcelPriceInformation.class).inMemory(Boolean.TRUE).sheet("禁闭台帐").doWrite(list);
}
}

80
src/main/java/com/biutag/supervision/controller/report/ReportFlowController.java

@ -0,0 +1,80 @@
package com.biutag.supervision.controller.report;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.InformMessage;
import com.biutag.supervision.pojo.param.ApprovalFlowQueryParam;
import com.biutag.supervision.pojo.param.Report.FlowQueryParam;
import com.biutag.supervision.service.InformMessageService;
import com.biutag.supervision.service.Report.ReportFlowService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@RestController
@RequestMapping("/reportFlow")
public class ReportFlowController {
private final ReportFlowService flowService;
private final InformMessageService messageService;
/**
*审核
* */
@PostMapping("/audit")
public Result audit(@RequestBody FlowQueryParam queryParam){
if(flowService.upFlowState(queryParam)){
return Result.success();
}else {
return Result.failed("操作失败");
}
}
/**
* 审核预警
* */
@PostMapping("/auditWarning")
public Result auditWarning(@RequestBody FlowQueryParam queryParam){
if(flowService.upFlowWarning(queryParam)){
return Result.success();
}else{
return Result.failed("操作失败");
}
}
/**
* 审核通知单位
* */
@PostMapping("/auditWarningInform")
public Result auditWarningInform(@RequestBody FlowQueryParam queryParam){
if(flowService.upFlowWarningInform(queryParam)){
return Result.success();
}else{
return Result.failed("操作失败");
}
}
@PostMapping("/getApprovalFlow")
public Result getApprovalFlow(@RequestBody ApprovalFlowQueryParam param){
return Result.success(flowService.getFlowDta(param));
}
/**
* 获取进退窗记录
* */
@PostMapping("/getEntryWindowRecord")
public Result getEntryWindowRecord(@RequestBody ApprovalFlowQueryParam param){
List<String> nodes = new ArrayList<>();
nodes.add("进窗");
nodes.add("退窗");
LambdaQueryWrapper<InformMessage> messages = new LambdaQueryWrapper<InformMessage>();
messages.eq(InformMessage::getReportId,param.getId())
.in(InformMessage::getNode,nodes);
return Result.success(messageService.list(messages));
}
}

480
src/main/java/com/biutag/supervision/controller/report/ReportProjectController.java

@ -0,0 +1,480 @@
package com.biutag.supervision.controller.report;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.constants.enums.FlowNodeEnum;
import com.biutag.supervision.constants.enums.RoleCodeEnum;
import com.biutag.supervision.mapper.Recessed.RecessedLogMapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.InformMessage;
import com.biutag.supervision.pojo.entity.recessed.RecessedLog;
import com.biutag.supervision.pojo.entity.report.ReportFlow;
import com.biutag.supervision.pojo.entity.report.ReportProject;
import com.biutag.supervision.pojo.entity.report.ReportReview;
import com.biutag.supervision.pojo.enums.FlowEnum;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.param.Recessed.RecessedParam;
import com.biutag.supervision.pojo.param.Report.ReportProjectQueryParam;
import com.biutag.supervision.pojo.param.entryWindow.EntryWindowQueryParam;
import com.biutag.supervision.pojo.param.statement.StatementQueryParam;
import com.biutag.supervision.pojo.vo.entryWindow.EntryWindowVo;
import com.biutag.supervision.pojo.vo.excel.ExcelControlPriceVo;
import com.biutag.supervision.pojo.vo.report.ReportHomeVo;
import com.biutag.supervision.pojo.vo.report.ReportProjectVo;
import com.biutag.supervision.pojo.vo.statement.ConditionExcelVo;
import com.biutag.supervision.pojo.vo.statement.ConditionVo;
import com.biutag.supervision.service.InformMessageService;
import com.biutag.supervision.service.Report.ReportProjectService;
import com.biutag.supervision.service.Report.ReportReviewService;
import com.biutag.supervision.service.SupDepartService;
import com.biutag.supervision.util.BigDecimalUtils;
import com.biutag.supervision.util.CustomFontLoader;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* @author weipeng
*/
@RequiredArgsConstructor
@RestController
@Slf4j
@RequestMapping("reportProject")
public class ReportProjectController {
private final ReportProjectService reportProjectService;
private final SupDepartService departService;
private final RecessedLogMapper recessedLogMapper;
private final InformMessageService informMessageService;
@PostMapping("/page")
public Result<Page<EntryWindowVo>> page(@RequestBody EntryWindowQueryParam query){
QueryWrapper<ReportProject> wrapper=new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(query.getReportType()),"p.report_type",query.getReportType())
.like(StrUtil.isNotBlank(query.getReportName()),"p.report_name",query.getReportName())
.eq(StrUtil.isNotBlank(query.getProjectType()),"p.project_type",query.getProjectType())
.eq(StrUtil.isNotBlank(query.getAuditUnitId()),"p.audit_unit_id",query.getAuditUnitId())
.like(StrUtil.isNotBlank(query.getProjectPrincipal()),"p.project_principal",query.getProjectPrincipal())
.like(StrUtil.isNotBlank(query.getProjectPhone()),"p.project_phone",query.getProjectPhone())
.eq(StrUtil.isNotBlank(query.getPurchaseMethod()),"p.purchase_method",query.getPurchaseMethod())
.like(BigDecimalUtils.isNotZeroAndNull(query.getReportMoney()),"p.report_money",query.getReportMoney())
.like(BigDecimalUtils.isNotZeroAndNull(query.getProjectApprovalMoney()),"p.project_approval_money",query.getProjectApprovalMoney())
.eq(StrUtil.isNotBlank(query.getPurchaseType()),"p.purchase_type",query.getPurchaseType())
.like(BigDecimalUtils.isNotZeroAndNull(query.getContractMount()),"p.contract_mount",query.getContractMount())
.eq(StrUtil.isNotBlank(query.getServiceUnit()),"p.service_unit",query.getServiceUnit())
.eq(StrUtil.isNotBlank(query.getApplicantId()),"p.applicant_id",query.getApplicantId());
//报审日期
if(CollectionUtil.isNotEmpty(query.getApplicantTime())){
wrapper.between("p.applicant_time",query.getApplicantTime().get(0),query.getApplicantTime().get(1));
}
//立项日期
if(CollectionUtil.isNotEmpty(query.getProjectApprovalTime())){
wrapper.between("p.project_approval_time",query.getProjectApprovalTime().get(0),query.getProjectApprovalTime().get(1));
}
//申报政府采购日期
if(CollectionUtil.isNotEmpty(query.getApplyGovernmentTime())){
wrapper.between("p.apply_government_time",query.getApplyGovernmentTime().get(0),query.getApplyGovernmentTime().get(1));
}
//采购日期
if(CollectionUtil.isNotEmpty(query.getPurchaseTime())){
wrapper.between("p.purchase_time",query.getPurchaseTime().get(0),query.getPurchaseTime().get(1));
}
//合同签订日期
if(CollectionUtil.isNotEmpty(query.getContractTime())){
wrapper.between("p.contract_time",query.getContractTime().get(0),query.getContractTime().get(1));
}
//服务日期
if(query.getServiceStartTime()!= null & query.getServiceEndTime()!= null){
wrapper.ge("p.service_start_time",query.getServiceStartTime());
wrapper.le("p.service_end_time",query.getServiceEndTime());
}
// wrapper.eq("f.approver_state","start" );
//是否退窗
if(StrUtil.isNotBlank(query.getCode()) &&!"all".equals(query.getCode()) ){
wrapper.eq("p.is_recessed",Integer.parseInt(query.getCode()));
}
//获取登陆人信息
UserAuth user = UserContextHolder.getCurrentUser();
log.info("user",user);
boolean firstAuth = AppConstants.USER_TYPE_SUPER.equals(user.getUserType()) || user.getRoleCodes().contains(RoleCodeEnum.FIRST_ADMIN.getCode());
//非超级管理员 && 非市级管理员
if( !firstAuth ){
List<String> orgIds = new ArrayList<>();
if(!user.getAuthDepartIds().isEmpty()){
orgIds = departService.getAllNodeIds(user.getAuthDepartIds());
wrapper.in("p.project_unit_id", orgIds);
}else{
orgIds = departService.getAllNodeIds(user.getDepartId());
wrapper.in("p.project_unit_id", orgIds);
}
}
wrapper.orderByDesc("p.crt_time");
wrapper.groupBy("p.id");
return Result.success(reportProjectService.getPage(new Page<>(query.getCurrent(),query.getSize()),wrapper));
}
//审计情况表报表
@PostMapping("/pageConditionVo")
public Result<Page<ConditionVo>> pageConditionVo(@RequestBody StatementQueryParam queryParam){
QueryWrapper<ReportProject> wrapper=new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(queryParam.getNode()),"p.node",queryParam.getNode())
.like(StrUtil.isNotBlank(queryParam.getReportName()),"p.report_name",queryParam.getReportName())
.like(StrUtil.isNotBlank(queryParam.getProjectType()),"p.project_type",queryParam.getProjectType())
.eq(StrUtil.isNotBlank(queryParam.getAuditUnitId()),"p.audit_unit_id",queryParam.getAuditUnitId())
.eq(StrUtil.isNotBlank(queryParam.getProjectUnitId()),"p.project_unit_id",queryParam.getProjectUnitId())
.eq(StrUtil.isNotBlank(queryParam.getPurchaseMethod()),"p.purchase_method",queryParam.getPurchaseMethod())
.like(StrUtil.isNotBlank(queryParam.getReferenceNumber()),"p.reference_number",queryParam.getReferenceNumber());
if(StrUtil.isNotBlank(queryParam.getReportType()) && !"all".equals(queryParam.getReportType())) {
wrapper.eq("p.report_type",queryParam.getReportType());
}
if(CollectionUtil.isNotEmpty(queryParam.getArchivingTime())){
wrapper.between("p.archiving",queryParam.getArchivingTime().get(0),queryParam.getArchivingTime().get(1));
}
if(CollectionUtil.isNotEmpty(queryParam.getPublicationTime())){
wrapper.between("p.publication_date",queryParam.getPublicationTime().get(0),queryParam.getPublicationTime().get(1));
}
if(CollectionUtil.isNotEmpty(queryParam.getApplicantDateTime())){
wrapper.between("p.applicant_time",queryParam.getApplicantDateTime().get(0),queryParam.getApplicantDateTime().get(1));
}
if(StrUtil.isNotBlank(queryParam.getCode())){
if(queryParam.getCode().equals("city")){
wrapper.le("p.report_money",new BigDecimal(200000));
}else{
wrapper.ge("p.report_money",new BigDecimal(200000));
}
}
wrapper.groupBy("p.id");
return Result.success(reportProjectService.getConditionPage(new Page<>(queryParam.getCurrent(),queryParam.getSize()),wrapper));
}
//审计情况表导出
@GetMapping("/excelConditionVo")
public void excelConditionVo(StatementQueryParam queryParam, HttpServletResponse response) throws Exception {
ClassPathResource couponOrderTemplateResource = new ClassPathResource("/excelTemplate/政府投资项目审计情况备案表.xlsx");
InputStream inputStream =couponOrderTemplateResource.getInputStream();
ServletOutputStream outputStream = null;
try{
queryParam.setCurrent(1);
queryParam.setSize(10000);
Result<Page<ConditionVo>> result = pageConditionVo(queryParam);
if(result.getCode() != 200){
throw new RuntimeException("数据查询失败");
}
List<ConditionVo> list = result.getData().getRecords();
List<ConditionExcelVo> dataList = BeanUtil.copyToList(list,ConditionExcelVo.class);
dataList.stream().forEach(s->{
s.setReductionRate(s.getReductionRate().setScale(2,RoundingMode.HALF_UP));
s.setNode(FlowEnum.contains(s.getNode()));
});
//报审金额(元)
BigDecimal reportMoneySum = dataList.stream().map(ConditionExcelVo::getReportMoney).filter(Objects::nonNull)
.reduce(BigDecimal.ZERO,BigDecimal::add);
//审定金额(元)
BigDecimal archivingMoneySum = dataList.stream().map(ConditionExcelVo::getArchivingMoney).filter(Objects::nonNull)
.reduce(BigDecimal.ZERO,BigDecimal::add);
//审减金额(元)
BigDecimal archivingReduceMoneySum=dataList.stream().map(ConditionExcelVo::getArchivingReduceMoney).filter(Objects::nonNull)
.reduce(BigDecimal.ZERO,BigDecimal::add);
//审减率
BigDecimal bigDecimal =new BigDecimal("100");
BigDecimal reductionRateSum = (reportMoneySum.compareTo(BigDecimal.ZERO) != 0 ?
archivingReduceMoneySum.divide(reportMoneySum, 4,RoundingMode.HALF_UP):
BigDecimal.ZERO).multiply(bigDecimal).setScale(2, RoundingMode.HALF_UP) ;
//
ConditionExcelVo vo=new ConditionExcelVo();
vo.setProjectUnit("合计");
vo.setReportMoney(reportMoneySum);
vo.setArchivingMoney(archivingMoneySum);
vo.setArchivingReduceMoney(archivingReduceMoneySum);
vo.setReductionRate(reductionRateSum);
dataList.add(vo);
String headerValue = "attachment; filename=\"" + URLEncoder.encode("政府投资项目审计情况备案表.xlsx", "UTF-8") + "\"";
response.setHeader("Content-Disposition", headerValue);
response.setContentType("application/octet-stream");
EasyExcel.write(response.getOutputStream(), ConditionExcelVo.class).inMemory(Boolean.TRUE).sheet("问题台账").doWrite(dataList);
}catch (Exception e){
log.info("e",e.getMessage());
throw new RuntimeException(e.getMessage());
}finally {
IOUtils.closeQuietly(outputStream);
IOUtils.closeQuietly(inputStream);
}
// EasyExcel.write(response.getOutputStream(), ConditionVo.class).inMemory(Boolean.TRUE).sheet("政府投资项目审计情况备案表").doWrite(dataList);
}
//进窗退窗
@Transactional(rollbackFor = Exception.class)
@PostMapping("RecessedData")
public Result RecessedData(@RequestBody RecessedParam param){
UserAuth user = UserContextHolder.getCurrentUser();
ReportProject project = reportProjectService.getById(param.getId());
LambdaUpdateWrapper<ReportProject> updateWrapper =new LambdaUpdateWrapper<ReportProject>()
.set(ReportProject::getIsRecessed,(project.getIsRecessed()==0? 1:0)).eq(ReportProject::getId,param.getId());
//当前时间
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
//进窗退窗日志
RecessedLog recessedLog =new RecessedLog();
recessedLog.setReportId(param.getId());
recessedLog.setRecessedTime(LocalDateTime.now());
recessedLog.setCreateUser(user.getNickName());
recessedLog.setCreateId(user.getUserName());
recessedLog.setMessage(project.getIsRecessed()==0?(user.getNickName()+"于"+formattedDateTime+"退窗"+project.getReportName()):(user.getNickName()+"于"+formattedDateTime+"重新进窗"+project.getReportName()));
recessedLogMapper.insert(recessedLog);
//进窗退窗信息
InformMessage message=new InformMessage();
message.setReportId(param.getId());
message.setMessage((project.getIsRecessed()==0?param.getMessage():(project.getReportName()+"执行进窗操作")));
message.setCrtTime(LocalDateTime.now());
message.setCrtUser(user.getNickName());
//接收人
if(project.getIsRecessed()==0){
message.setNode("退窗");
message.setRecipientId(project.getApplicantId());
message.setRecipient(project.getApplicant());
}else{
RecessedLog logData = recessedLogMapper.selectOne(
new LambdaQueryWrapper<RecessedLog>().eq(RecessedLog::getReportId,param.getId())
.like(RecessedLog::getMessage,"退窗")
.orderByDesc(RecessedLog::getRecessedTime)
.last("limit 1")
);
//退窗
message.setNode("重新进窗");
message.setRecipientId(logData.getCreateId());
message.setRecipient(logData.getCreateUser());
}
informMessageService.save(message);
return Result.success(reportProjectService.update(updateWrapper));
}
/**
* 查看详情
* */
@GetMapping
public Result<ReportProjectVo> getDetail(ReportProjectQueryParam queryParam){
return Result.success(reportProjectService.getDetail(queryParam.getId()));
}
/**
* 获取首页数据
* */
@GetMapping("/getHomeVo/{id}")
public Result<ReportHomeVo> getHomeVo(@PathVariable("id") String id){
return Result.success(reportProjectService.getReportHomeVo(id));
}
@DeleteMapping("/{id}")
public Result delDetail(@PathVariable("id")String id){
reportProjectService.removeById(id);
return Result.success();
}
@GetMapping("/getListByName")
public Result<List<ReportProject>> getList(ReportProjectQueryParam queryParam){
return Result.success(reportProjectService.getProjectList(queryParam));
}
/**
* 新增或者修改
* @param queryParam
* */
@PostMapping
public Result save(@RequestBody ReportProjectQueryParam queryParam){
return Result.success(reportProjectService.addOrUpdate(queryParam));
}
@DeleteMapping
public Result remove(@RequestBody ReportProjectQueryParam queryParam){
reportProjectService.delData(queryParam);
return Result.success();
}
public Result getDataByPage(@RequestBody EntryWindowQueryParam query){
QueryWrapper<ReportProject> wrapper=new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(query.getReportType()),"p.report_type",query.getReportType())
.like(StrUtil.isNotBlank(query.getReportName()),"p.report_name",query.getReportName())
.eq(StrUtil.isNotBlank(query.getProjectType()),"p.project_type",query.getProjectType())
.eq(StrUtil.isNotBlank(query.getAuditUnitId()),"p.audit_unit_id",query.getAuditUnitId())
.like(StrUtil.isNotBlank(query.getProjectPrincipal()),"p.project_principal",query.getProjectPrincipal())
.like(StrUtil.isNotBlank(query.getProjectPhone()),"p.project_phone",query.getProjectPhone())
.eq(StrUtil.isNotBlank(query.getPurchaseMethod()),"p.purchase_method",query.getPurchaseMethod())
.like(BigDecimalUtils.isNotZeroAndNull(query.getReportMoney()),"p.report_money",query.getReportMoney())
.like(BigDecimalUtils.isNotZeroAndNull(query.getProjectApprovalMoney()),"p.project_approval_money",query.getProjectApprovalMoney())
.eq(StrUtil.isNotBlank(query.getPurchaseType()),"p.purchase_type",query.getPurchaseType())
.like(BigDecimalUtils.isNotZeroAndNull(query.getContractMount()),"p.contract_mount",query.getContractMount())
.eq(StrUtil.isNotBlank(query.getServiceUnit()),"p.service_unit",query.getServiceUnit())
.eq(StrUtil.isNotBlank(query.getApplicantId()),"p.applicant_id",query.getApplicantId());
//报审日期
if(CollectionUtil.isNotEmpty(query.getApplicantTime())){
wrapper.between("p.applicant_time",query.getApplicantTime().get(0),query.getApplicantTime().get(1));
}
//立项日期
if(CollectionUtil.isNotEmpty(query.getProjectApprovalTime())){
wrapper.between("p.project_approval_time",query.getProjectApprovalTime().get(0),query.getProjectApprovalTime().get(1));
}
//申报政府采购日期
if(CollectionUtil.isNotEmpty(query.getApplyGovernmentTime())){
wrapper.between("p.apply_government_time",query.getApplyGovernmentTime().get(0),query.getApplyGovernmentTime().get(1));
}
//采购日期
if(CollectionUtil.isNotEmpty(query.getPurchaseTime())){
wrapper.between("p.purchase_time",query.getPurchaseTime().get(0),query.getPurchaseTime().get(1));
}
//合同签订日期
if(CollectionUtil.isNotEmpty(query.getContractTime())){
wrapper.between("p.contract_time",query.getContractTime().get(0),query.getContractTime().get(1));
}
//服务日期
if(query.getServiceStartTime()!= null & query.getServiceEndTime()!= null){
wrapper.ge("p.service_start_time",query.getServiceStartTime());
wrapper.le("p.service_end_time",query.getServiceEndTime());
}
// wrapper.eq("f.approver_state","start" );
//是否退窗
if(StrUtil.isNotBlank(query.getCode()) &&!"all".equals(query.getCode()) ){
wrapper.eq("p.is_recessed",Integer.parseInt(query.getCode()));
}
return Result.success();
}
//上传定案表
@PostMapping("/upFinalizationPath")
public Result upFinalizationPath(@RequestBody ReportProjectQueryParam queryParam){
if(reportProjectService.upFinalizationPath(queryParam)){
return Result.success();
}else{
return Result.failed("上传失败");
}
}
@PostMapping("/getExcelContrilPrice")
public void getExcelContrilPriceFun(@RequestBody ReportProjectQueryParam queryParam, HttpServletResponse response) throws UnsupportedEncodingException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
ExcelControlPriceVo priceVo = new ExcelControlPriceVo();
ReportProjectVo vo = reportProjectService.getDetail(queryParam.getId());
//非空
if(ObjectUtil.isNotEmpty(vo)){
ReportProject project = vo.getProject();
BeanUtil.copyProperties(project,priceVo);
priceVo.setFirstAuditor(vo.getReview().getFirstAuditor());
priceVo.setSecondAuditor(vo.getReview().getSecondAuditor());
priceVo.setThirdlyAuditor(vo.getReview().getThirdlyAuditor());
}
String filePathName ="控制价定案表";
if ("结算项目".equals(vo.getProject().getProjectType())){
filePathName = "结算定案表";
}else{
filePathName = "控制价定案表";
}
String excelFileName =StrUtil.isNotEmpty(filePathName)? URLEncoder.encode(filePathName, "UTF-8"):URLEncoder.encode("定案表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + excelFileName + ".xls");
ClassPathResource couponOrderTemplateResource = new ClassPathResource("/excelTemplate/"+filePathName+".xls");
if(! couponOrderTemplateResource.exists()){
throw new RuntimeException("模板不存在");
}
InputStream templateInputStream = null;
ServletOutputStream outputStream = null;
ExcelWriter excelWriter = null;
try{
outputStream = response.getOutputStream();
templateInputStream = couponOrderTemplateResource.getInputStream();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter = EasyExcel.write(outputStream).withTemplate(templateInputStream)
.inMemory(true)
.excelType(ExcelTypeEnum.XLS).build();
WriteSheet writeSheet = EasyExcel.writerSheet("汇总表").build();
excelWriter.fill(priceVo, fillConfig, writeSheet);
//触发计算公式
Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
excelWriter.finish();
}catch (Exception e){
log.info("e",e.getMessage());
throw new RuntimeException(e.getMessage());
}finally {
IOUtils.closeQuietly(outputStream);
IOUtils.closeQuietly(templateInputStream);
}
}
}

83
src/main/java/com/biutag/supervision/controller/serviceUnit/ServiceUnitController.java

@ -0,0 +1,83 @@
package com.biutag.supervision.controller.serviceUnit;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.price.PriceInformation;
import com.biutag.supervision.pojo.entity.serviceUnit.ServiceUnit;
import com.biutag.supervision.pojo.param.Price.PriceInformationQueryParam;
import com.biutag.supervision.pojo.param.ServiceUnit.ServiceUnitQueryParam;
import com.biutag.supervision.pojo.vo.ServiceUnit.ServiceUnitVo;
import com.biutag.supervision.pojo.vo.excel.ExcelPriceInformation;
import com.biutag.supervision.pojo.vo.excel.ExcelServiceUnit;
import com.biutag.supervision.pojo.vo.price.PriceInformationVo;
import com.biutag.supervision.service.ServiceUnit.ServiceUnitService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("serviceUnit")
public class ServiceUnitController {
private final ServiceUnitService service;
@GetMapping
public Result<Page<ServiceUnitVo>> getPage(ServiceUnitQueryParam queryParam){
return Result.success(service.pageList(queryParam));
}
@PostMapping("/insertOrUpdate")
public Result insertOrUpdate(@RequestBody ServiceUnit serviceUnit){
if(service.addOrUpData(serviceUnit)){
return Result.success();
}else{
return Result.failed("操作失败");
}
}
@PostMapping("/delData")
public Result delData(@PathVariable("id")String id){
if(service.delServiceUnit(id)){
return Result.success();
}else {
return Result.failed("操作失败");
}
}
@GetMapping("/export")
public void export(ServiceUnitQueryParam queryParam, HttpServletResponse response) throws IOException {
queryParam.setCurrent(1);
queryParam.setSize(100000);
Page<ServiceUnitVo> page = service.pageListData(queryParam);
List<ServiceUnitVo> list = page.getRecords();
log.info("服务单位信息库数据量:"+list.size());
List<ExcelServiceUnit> excelServiceUnitList = new ArrayList<>();
if(CollectionUtil.isNotEmpty(list)){
list.forEach((s)->{
ExcelServiceUnit unit=new ExcelServiceUnit();
BeanUtils.copyProperties( s,unit);
excelServiceUnitList.add(unit);
});
}
String headerValue = "attachment; filename=\"" + URLEncoder.encode("服务单位信息库.xlsx", "UTF-8") + "\"";
response.setHeader("Content-Disposition", headerValue);
response.setContentType("application/octet-stream");
EasyExcel.write(response.getOutputStream(), ExcelServiceUnit.class).inMemory(Boolean.TRUE).sheet("服务单位信息库").doWrite(excelServiceUnitList);
}
}

141
src/main/java/com/biutag/supervision/controller/system/DepartController.java

@ -0,0 +1,141 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.constants.enums.DepartGroupIdEnum;
import com.biutag.supervision.constants.enums.DepartLevelEnum;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.SupDepart;
import com.biutag.supervision.pojo.param.DepartQueryParam;
import com.biutag.supervision.pojo.param.DepartTreeListParam;
import com.biutag.supervision.pojo.vo.DepartTree;
import com.biutag.supervision.service.SupDepartService;
import com.biutag.supervision.service.SupPoliceService;
import jakarta.validation.ValidationException;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
@RequestMapping("depart")
@RequiredArgsConstructor
@RestController
public class DepartController {
private final SupDepartService departService;
public final SupPoliceService policeService;
@GetMapping
public Result<List<DepartTree>> treeList(DepartTreeListParam departTreeListParam) {
return Result.success(departService.buildTreeByParam(departTreeListParam));
}
@GetMapping("list")
public Result<Page<SupDepart>> list(DepartQueryParam departQueryParam) {
return Result.success(departService.page(departQueryParam));
}
@GetMapping("getDepartByIds")
public Result<List<SupDepart>> getDepartByIds(DepartQueryParam departQueryParam){
return Result.success(departService.list(new LambdaQueryWrapper<SupDepart>().in(SupDepart::getId,departQueryParam.getIds())));
}
@PostMapping
public Result<Boolean> add(@RequestBody SupDepart supDepart) {
if (departService.existsByName(supDepart.getName())) {
throw new ValidationException("单位全称已存在");
}
if (departService.existsByCode(supDepart.getCode())) {
throw new ValidationException("单位编码已存在");
}
SupDepart parent = departService.getById(supDepart.getPid());
supDepart.setId(String.valueOf(NumberUtil.nullToZero(departService.getMaxId()) + 1));
supDepart.setLevel(parent.getLevel() + 1);
supDepart.setUpdatedAt(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
departService.save(supDepart);
String pathTrace = departService.getPathTrace(supDepart);
departService.update(new LambdaUpdateWrapper<SupDepart>().eq(SupDepart::getId, supDepart.getId()).set(SupDepart::getPathTrace, pathTrace));
return Result.success();
}
@PutMapping
public Result<Boolean> update(@RequestBody SupDepart supDepart) {
if (departService.exists(new LambdaQueryWrapper<SupDepart>().eq(SupDepart::getName, supDepart.getName()).ne(SupDepart::getId, supDepart.getId()))) {
throw new ValidationException("单位全称已存在");
}
if (departService.exists(new LambdaQueryWrapper<SupDepart>().eq(SupDepart::getCode, supDepart.getCode()).ne(SupDepart::getId, supDepart.getId()))) {
throw new ValidationException("单位编码已存在");
}
SupDepart parent = departService.getById(supDepart.getPid());
supDepart.setLevel(parent.getLevel() + 1);
supDepart.setUpdatedAt(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
String pathTrace = departService.getPathTrace(supDepart);
supDepart.setPathTrace(pathTrace);
return Result.success(departService.updateById(supDepart));
}
@DeleteMapping("{id}")
public Result<Boolean> del(@PathVariable String id) {
if (policeService.exists(id)) {
throw new RuntimeException("该单位下还有警务人员,请移除后再删除");
}
List<String> orgIds = departService.getAllNodeIds(id);
return Result.success(departService.removeBatchByIds(orgIds));
}
@GetMapping("tree")
public Result<List<DepartTree>> tree() {
return Result.success(departService.buildTreeByAuth());
}
@GetMapping("treeAll")
public Result<List<DepartTree>> treeAll() {
return Result.success(departService.buildTreeAll());
}
@GetMapping("second")
public Result<List<DepartTree>> seconds() {
List<SupDepart> supDeparts = departService.listByLevel(List.of(DepartLevelEnum.SECOND_CATEGORY.getValue(), DepartLevelEnum.SECOND.getValue()));
return Result.success(departService.buildTreeBySecond(supDeparts));
}
@GetMapping("firstHost")
public Result<List<DepartTree>> firstHost() {
return Result.success(departService.buildTreeByFirstHost());
}
@GetMapping("{departId}/children")
public Result<List<SupDepart>> children(@PathVariable String departId) {
return Result.success(departService.list(new LambdaQueryWrapper<SupDepart>().eq(SupDepart::getPid, departId).orderByAsc(SupDepart::getOrderNo)));
}
/**
* 获取分县市局
* @return
*/
@GetMapping("tree/countyAndCityBureaus")
public Result<List<DepartTree>> countyAndCityBureaus() {
List<DepartTree> children = departService.list(new LambdaQueryWrapper<SupDepart>().eq(SupDepart::getStatisticsGroupId, DepartGroupIdEnum.COUNTY_AND_CITY_BUREAUS.getValue())
.orderByAsc(SupDepart::getOrderNo))
.stream().map(item -> {
DepartTree departTree = new DepartTree();
BeanUtils.copyProperties(item, departTree);
return departTree;
}).toList();
DepartTree root = new DepartTree();
root.setShortName(AppConstants.ROOT_DEPART_NAME);
root.setId(AppConstants.ROOT_DEPART_ID);
root.setChildren(children);
return Result.success(List.of(root));
}
}

85
src/main/java/com/biutag/supervision/controller/system/DepartMapingController.java

@ -0,0 +1,85 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.SupDepart;
import com.biutag.supervision.pojo.entity.SupExternalDepart;
import com.biutag.supervision.pojo.param.DepartMapingQueryParam;
import com.biutag.supervision.service.SupDepartService;
import com.biutag.supervision.service.SupExternalDepartService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
/**
* @author wxc
* @date 2024/12/30
*/
@RequiredArgsConstructor
@RequestMapping("depart/maping")
@RestController
public class DepartMapingController {
private final SupExternalDepartService externalDepartService;
private final SupDepartService departService;
@GetMapping("{source}")
public Result<Page<SupExternalDepart>> list(@PathVariable String source, DepartMapingQueryParam queryParam) {
LambdaQueryWrapper<SupExternalDepart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.eq(SupExternalDepart::getSource, source)
.like(StrUtil.isNotBlank(queryParam.getExternalId()), SupExternalDepart::getExternalId, queryParam.getExternalId())
.like(StrUtil.isNotBlank(queryParam.getExternalName()), SupExternalDepart::getExternalName, queryParam.getExternalName())
.eq(StrUtil.isNotBlank(queryParam.getInternalId()), SupExternalDepart::getInternalId, queryParam.getInternalId())
.isNull("noMaping".equals(queryParam.getActiveMaping()), SupExternalDepart::getInternalId);
Page<SupExternalDepart> page = externalDepartService.page(Page.of(queryParam.getCurrent(), queryParam.getSize()), queryWrapper);
return Result.success(page);
}
@PostMapping
public Result<Void> add(@RequestBody SupExternalDepart data) {
if (externalDepartService.exists(new LambdaQueryWrapper<SupExternalDepart>()
.eq(SupExternalDepart::getSource, data.getSource()).eq(SupExternalDepart::getExternalId, data.getExternalId()))) {
throw new RuntimeException(String.format("%s 单位编码【%s】已存在", data.getSource(), data.getExternalId()));
}
data.setUpdateTime(LocalDateTime.now());
data.setCreateTime(LocalDateTime.now());
SupDepart depart = departService.getById(data.getInternalId());
data.setInternalName(depart.getName());
data.setInternalShortName(depart.getShortName());
data.setPid(depart.getPid());
data.setLevel(depart.getLevel());
externalDepartService.save(data);
return Result.success();
}
@PutMapping
public Result<Void> update(@RequestBody SupExternalDepart data) {
if (externalDepartService.exists(new LambdaQueryWrapper<SupExternalDepart>()
.eq(SupExternalDepart::getSource, data.getSource()).eq(SupExternalDepart::getExternalId, data.getExternalId())
.ne(SupExternalDepart::getId, data.getId()))) {
throw new RuntimeException(String.format("%s 单位编码【%s】已存在", data.getSource(), data.getExternalId()));
}
data.setUpdateTime(LocalDateTime.now());
SupDepart depart = departService.getById(data.getInternalId());
data.setInternalName(depart.getName());
data.setInternalShortName(depart.getShortName());
data.setPid(depart.getPid());
data.setLevel(depart.getLevel());
externalDepartService.updateById(data);
return Result.success();
}
@DeleteMapping("{id}")
public Result<Void> del(@PathVariable Integer id) {
externalDepartService.removeById(id);
return Result.success();
}
}

52
src/main/java/com/biutag/supervision/controller/system/DictContentController.java

@ -0,0 +1,52 @@
package com.biutag.supervision.controller.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.SupDictProblemType;
import com.biutag.supervision.pojo.vo.DictContentTree;
import com.biutag.supervision.service.SupDictProblemTypeService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RequiredArgsConstructor
@RequestMapping("dict/content")
@RestController
public class DictContentController {
private final SupDictProblemTypeService dictContentService;
@GetMapping("tree")
public Result<List<DictContentTree>> list() {
return Result.success(dictContentService.buildTree());
}
@PostMapping
public Result<Void> add(@RequestBody SupDictProblemType dictContent) {
dictContent.setUpdTime(LocalDateTime.now());
dictContent.setCrtTime(LocalDateTime.now());
dictContent.setStatus("0");
dictContentService.save(dictContent);
dictContentService.update(new LambdaUpdateWrapper<SupDictProblemType>().eq(SupDictProblemType::getId, dictContent.getId()).set(SupDictProblemType::getCode, dictContent.getId()));
return Result.success();
}
@PutMapping
public Result<Void> update(@RequestBody SupDictProblemType dictContent) {
dictContent.setUpdTime(LocalDateTime.now());
dictContentService.updateById(dictContent);
return Result.success();
}
@DeleteMapping("{id}")
public Result<Void> update(@PathVariable Integer id) {
if (dictContentService.exists(new LambdaQueryWrapper<SupDictProblemType>().eq(SupDictProblemType::getParentCode, id))) {
throw new RuntimeException("该节点下还存在子节点,无法删除");
}
dictContentService.removeById(id);
return Result.success();
}
}

137
src/main/java/com/biutag/supervision/controller/system/DictController.java

@ -0,0 +1,137 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.dto.DictDataDto;
import com.biutag.supervision.pojo.dto.DictTypeDto;
import com.biutag.supervision.pojo.entity.SupDict12337HandleResult;
import com.biutag.supervision.pojo.entity.SupDictData;
import com.biutag.supervision.pojo.entity.SupDictType;
import com.biutag.supervision.pojo.vo.DictProblemSourceTree;
import com.biutag.supervision.pojo.vo.SelectOption;
import com.biutag.supervision.pojo.vo.SelectOptionGroup;
import com.biutag.supervision.service.SupDict12337HandleResultService;
import com.biutag.supervision.service.SupDictDataService;
import com.biutag.supervision.service.SupDictProblemSourceService;
import com.biutag.supervision.service.SupDictTypeService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RequiredArgsConstructor
@RequestMapping("dict")
@RestController
public class DictController {
private final SupDictTypeService dictTypeService;
private final SupDictDataService dictDataService;
private final SupDictProblemSourceService dictProblemSourceService;
private final SupDict12337HandleResultService dict12337HandleResultService;
@GetMapping
public Result<Page<SupDictType>> page(Page<SupDictType> page, String dictName, String dictType) {
LambdaQueryWrapper<SupDictType> queryWrapper = new LambdaQueryWrapper<SupDictType>()
.like(StrUtil.isNotBlank(dictName), SupDictType::getDictName, dictName)
.like(StrUtil.isNotBlank(dictType), SupDictType::getDictType, dictType)
.orderByDesc(SupDictType::getUpdateTime);
return Result.success(dictTypeService.page(page, queryWrapper));
}
@PostMapping
public Result<Boolean> add(@RequestBody DictTypeDto dictType) {
return Result.success(dictTypeService.save(dictType));
}
@PutMapping
public Result<Boolean> update(@RequestBody DictTypeDto dictType) {
SupDictType supDictType = new SupDictType();
BeanUtil.copyProperties(dictType, supDictType);
supDictType.setUpdateTime(LocalDateTime.now());
LambdaQueryWrapper<SupDictType> queryWrapper = new LambdaQueryWrapper<SupDictType>().ne(SupDictType::getDictId, dictType.getDictId()).eq(SupDictType::getDictType, dictType.getDictType());
if (dictTypeService.exists(queryWrapper)) {
throw new RuntimeException("字典类型已存在");
}
SupDictType oldSupDictType = dictTypeService.getById(dictType.getDictId());
if (!oldSupDictType.getDictType().equals(supDictType.getDictType())) {
// 更新
dictDataService.update(new LambdaUpdateWrapper<SupDictData>().eq(SupDictData::getDictType, oldSupDictType.getDictType()).set(SupDictData::getDictType, dictType.getDictType()));
}
return Result.success(dictTypeService.updateById(supDictType));
}
@DeleteMapping("{dictId}")
public Result<Boolean> update(@PathVariable Integer dictId) {
return Result.success(dictTypeService.removeById(dictId));
}
@GetMapping("{dictType}/dictData")
public Result<Page<SupDictData>> list(Page<SupDictData> page, @PathVariable String dictType) {
return Result.success(dictDataService.page(page, new LambdaQueryWrapper<SupDictData>()
.eq(SupDictData::getDictType, dictType)
.orderByAsc(SupDictData::getDictSort)));
}
@PostMapping("{dictType}/dictData")
public Result<Boolean> add(@RequestBody DictDataDto dictData) {
return Result.success(dictDataService.save(dictData));
}
@PutMapping("{dictType}/dictData")
public Result<Boolean> update(@RequestBody DictDataDto dictData) {
SupDictData supDictData = new SupDictData();
BeanUtil.copyProperties(dictData, supDictData);
return Result.success(dictDataService.updateById(supDictData));
}
@DeleteMapping("{dictType}/dictData/{dictCode}")
public Result<Boolean> del(@PathVariable Integer dictCode) {
return Result.success(dictDataService.removeById(dictCode));
}
@GetMapping("data/{dictType}")
public Result<List<SupDictData>> list(@PathVariable String dictType) {
return Result.success(dictDataService.list(new LambdaQueryWrapper<SupDictData>()
.eq(SupDictData::getDictType, dictType)
.orderByAsc(SupDictData::getDictSort)));
}
@GetMapping("problemSource")
public Result<List<DictProblemSourceTree>> listProblemSource() {
return Result.success(dictProblemSourceService.buildTree());
}
@GetMapping("12337HandleResult")
public Result<List<SelectOptionGroup>> handleResult() {
List<SupDict12337HandleResult> list = dict12337HandleResultService.list();
Map<String, List<SupDict12337HandleResult>> collect = list.stream().collect(Collectors.groupingBy(SupDict12337HandleResult::getGroupName));
List<String> groups = List.of("第一种形态", "第二种形态","第三种形态","第四种形态");
List<SelectOptionGroup> result = collect.keySet().stream()
// 排序
.sorted(Comparator.comparingInt(groups::indexOf))
.map(label -> {
SelectOptionGroup group = new SelectOptionGroup();
group.setLabel(label);
group.setOptions(collect.get(label).stream().map(o -> {
SelectOption option = new SelectOption();
option.setText(o.getName());
option.setValue(o.getName());
return option;
}).toList());
return group;
}).toList();
return Result.success(result);
}
}

69
src/main/java/com/biutag/supervision/controller/system/HandleResultMapingController.java

@ -0,0 +1,69 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.SupDictHandleResultMaping;
import com.biutag.supervision.pojo.param.DepartMapingQueryParam;
import com.biutag.supervision.service.SupDictHandleResultMapingService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
/**
* @author wxc
* @date 2024/12/31
*/
@RequestMapping("handleResultMaping")
@RequiredArgsConstructor
@RestController
public class HandleResultMapingController {
private final SupDictHandleResultMapingService handleResultMapingService;
@GetMapping
public Result<Page<SupDictHandleResultMaping>> list(DepartMapingQueryParam param) {
LambdaQueryWrapper<SupDictHandleResultMaping> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.eq(SupDictHandleResultMaping::getSource, param.getSource())
.like(StrUtil.isNotBlank(param.getExternalName()), SupDictHandleResultMaping::getExternalName, param.getExternalName())
.eq(StrUtil.isNotBlank(param.getInternalId()), SupDictHandleResultMaping::getInternalId, param.getInternalId())
.orderByDesc(SupDictHandleResultMaping::getCreateTime);
return Result.success(handleResultMapingService.page(Page.of(param.getCurrent(), param.getSize()), queryWrapper));
}
@PostMapping
public Result<Void> add(@RequestBody SupDictHandleResultMaping data) {
if (handleResultMapingService.exists(new LambdaQueryWrapper<SupDictHandleResultMaping>()
.eq(SupDictHandleResultMaping::getExternalName, data.getExternalName()))) {
throw new RuntimeException(String.format("处理结果【%s】已存在", StrUtil.trim(data.getExternalName())));
}
data.setExternalName(StrUtil.trim(data.getExternalName()));
data.setUpdateTime(LocalDateTime.now());
data.setCreateTime(LocalDateTime.now());
handleResultMapingService.save(data);
return Result.success();
}
@PutMapping
public Result<Void> update(@RequestBody SupDictHandleResultMaping data) {
if (handleResultMapingService.exists(new LambdaQueryWrapper<SupDictHandleResultMaping>()
.eq(SupDictHandleResultMaping::getExternalName, data.getExternalName())
.eq(SupDictHandleResultMaping::getSource, data.getSource())
.ne(SupDictHandleResultMaping::getId, data.getId()))) {
throw new RuntimeException(String.format("处理结果【%s】已存在", data.getExternalName()));
}
data.setUpdateTime(LocalDateTime.now());
handleResultMapingService.updateById(data);
return Result.success();
}
@DeleteMapping("{id}")
public Result<Void> del(@PathVariable String id) {
handleResultMapingService.removeById(id);
return Result.success();
}
}

71
src/main/java/com/biutag/supervision/controller/system/HolidayController.java

@ -0,0 +1,71 @@
package com.biutag.supervision.controller.system;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.Holiday;
import com.biutag.supervision.service.HolidayService;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@RequestMapping("holiday")
@RestController
public class HolidayController {
private final HolidayService holidayService;
public static final List<Integer> months = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
@GetMapping("{year}")
public Result<List<HolidayVo>> list(@PathVariable Integer year) {
List<Holiday> holidays = holidayService.list(year);
List<HolidayVo> list = months.stream().map(month -> {
HolidayVo holidayVo = new HolidayVo();
holidayVo.setMonth(month);
LocalDate beginDay = LocalDate.of(year, month, 1);
int beginDayOfWeek = beginDay.getDayOfWeek().getValue();
for (int i = 0; i < (beginDayOfWeek != 0 ? beginDayOfWeek - 1 : 6); i++) {
holidayVo.getDays().add(new Day());
}
LocalDate.of(year, month, 1);
for (int i = 1; i <= beginDay.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth(); i++) {
String date = LocalDate.of(year, month, i).toString();
Boolean flag = holidays.stream().filter(item -> item.getDate().equals(date)).findFirst().map(Holiday::getFlag).orElse(false);
holidayVo.getDays().add(Day.of(i, flag));
}
return holidayVo;
}).toList();
return Result.success(list);
}
@Setter
@Getter
public static class HolidayVo {
private Integer month;
private List<Day> days = new ArrayList<>();
}
@Setter
@Getter
public static class Day {
private Integer day;
private Boolean flag = false;
public static Day of(Integer day, Boolean flag) {
Day obj = new Day();
obj.setDay(day);
obj.setFlag(flag);
return obj;
}
}
}

51
src/main/java/com/biutag/supervision/controller/system/MenuController.java

@ -0,0 +1,51 @@
package com.biutag.supervision.controller.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.dto.MenuDto;
import com.biutag.supervision.pojo.entity.Menu;
import com.biutag.supervision.pojo.vo.MenuTree;
import com.biutag.supervision.service.MenuService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RequiredArgsConstructor
@RequestMapping("menu")
@RestController
public class MenuController {
private final MenuService menuService;
@GetMapping
public Result<List<MenuTree>> list() {
List<Menu> menus = menuService.list(new LambdaQueryWrapper<Menu>().orderByAsc(Menu::getMenuSort));
return Result.success(MenuTree.buildTree(menus));
}
@PostMapping
public Result<Void> add(@RequestBody MenuDto menuDto) {
Menu menu = new Menu();
BeanUtils.copyProperties(menuDto, menu);
menuService.save(menu);
return Result.success();
}
@PutMapping
public Result<List<MenuTree>> update(@RequestBody MenuDto menuDto) {
Menu menu = new Menu();
BeanUtils.copyProperties(menuDto, menu);
menu.setUpdateTime(LocalDateTime.now());
menuService.updateById(menu);
return Result.success();
}
@DeleteMapping("{id}")
public Result<Boolean> del(@PathVariable Integer id) {
return Result.success(menuService.removeById(id));
}
}

291
src/main/java/com/biutag/supervision/controller/system/PoliceController.java

@ -0,0 +1,291 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.domain.PoliceAuth;
import com.biutag.supervision.pojo.dto.PoliceDto;
import com.biutag.supervision.pojo.dto.PoliceImport;
import com.biutag.supervision.pojo.dto.UserDto;
import com.biutag.supervision.pojo.entity.*;
import com.biutag.supervision.pojo.model.PoliceModel;
import com.biutag.supervision.pojo.param.PoliceQueryParam;
import com.biutag.supervision.pojo.vo.DepartTree;
import com.biutag.supervision.service.*;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Valid;
import jakarta.validation.Validator;
import lombok.RequiredArgsConstructor;
import org.apache.xmlbeans.UserType;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@RequestMapping("police")
@RequiredArgsConstructor
@RestController
public class PoliceController {
private final SupPoliceService policeService;
private final SupDepartService departService;
private final NegDepartAuthorityService negDepartAuthorityService;
private final NegSourceAuthorityService negSourceAuthorityService;
private final BaseUserService baseUserService;
private final Validator validator;
@GetMapping
public Result<Page<PoliceModel>> list(PoliceQueryParam param) {
return Result.success(policeService.page(param));
}
@GetMapping("/getAllDepartNode")
public Result<List<SupDepart>> getAllDepartNode(){
return Result.success(policeService.getALlDepartNode());
}
// 异常人员
@GetMapping("abnormal")
public Result<Page<PoliceModel>> abnormalList(PoliceQueryParam param) {
return Result.success(policeService.pageByAbnormal(param));
}
@PostMapping
public Result<Boolean> add(@Valid @RequestBody PoliceDto policeDto) {
SupPolice policeByEmpNo = policeService.getOne(new LambdaQueryWrapper<SupPolice>().eq(SupPolice::getEmpNo, policeDto.getEmpNo()));
if (Objects.nonNull(policeByEmpNo)) {
SupDepart depart = departService.getById(policeByEmpNo.getOrgId());
throw new RuntimeException(String.format("该人员[%s]已存在于“%s”单位中,请联系二级机构或市局管理员以进行人员调整。", policeDto.getEmpNo(), depart.getName()));
}
SupPolice one = policeService.getOne(new LambdaQueryWrapper<SupPolice>().eq(SupPolice::getIdCode, policeDto.getIdCode()));
if (Objects.nonNull(one)) {
SupDepart depart = departService.getById(one.getOrgId());
throw new RuntimeException(String.format("该人员[%s]已存在于“%s”单位中,请联系二级机构或市局管理员以进行人员调整。", policeDto.getIdCode(), depart.getName()));
}
SupPolice police = new SupPolice();
BeanUtils.copyProperties(policeDto, police);
police.setId(IdUtil.getSnowflakeNextIdStr());
police.setUpdatedAt(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
police.setCreatedAt(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
policeService.save(police);
if (policeDto.getCreateUserFlag() && !userService.exists(new LambdaQueryWrapper<BaseUser>().eq(BaseUser::getUserName, police.getIdCode()))) {
UserDto userDto = new UserDto();
userDto.setUserName(police.getIdCode());
userDto.setNickName(police.getName());
userDto.setPassword(policeDto.getPassword());
userDto.setUserType("normal");
userDto.setRoleIds(new ArrayList<>());
baseUserService.save(userDto);
}
return Result.success();
}
@PutMapping
public Result<Boolean> update(@RequestBody SupPolice police) {
SupPolice policeByEmpNo = policeService.getOne(new LambdaQueryWrapper<SupPolice>().eq(SupPolice::getEmpNo, police.getEmpNo()).ne(SupPolice::getId, police.getId()));
if (Objects.nonNull(policeByEmpNo)) {
SupDepart depart = departService.getById(policeByEmpNo.getOrgId());
throw new RuntimeException(String.format("该人员[%s]已存在于“%s”单位中,请联系二级机构或市局管理员以进行人员调整。", police.getEmpNo(), depart.getName()));
}
SupPolice one = policeService.getOne(new LambdaQueryWrapper<SupPolice>().eq(SupPolice::getIdCode, police.getIdCode()).ne(SupPolice::getId, police.getId()));
if (Objects.nonNull(one)) {
SupDepart depart = departService.getById(one.getOrgId());
throw new RuntimeException(String.format("该人员[%s]已存在于“%s”单位中,请联系二级机构或市局管理员以进行人员调整。", police.getIdCode(), depart.getName()));
}
LambdaUpdateWrapper<SupPolice> updateWrapper = new LambdaUpdateWrapper<SupPolice>()
.eq(SupPolice::getId, police.getId())
.set(SupPolice::getName, police.getName())
.set(SupPolice::getEmpNo, police.getEmpNo())
.set(SupPolice::getIdCode, police.getIdCode())
.set(SupPolice::getOrgId, police.getOrgId())
.set(SupPolice::getPersonType, police.getPersonType())
.set(SupPolice::getPosition, police.getPosition())
.set(SupPolice::getPoliceRole, police.getPoliceRole())
.set(SupPolice::getMobile, police.getMobile())
.set(SupPolice::getEmploymentDate, police.getEmploymentDate())
.set(SupPolice::getAvatarUrl, police.getAvatarUrl())
.set(SupPolice::getUpdatedAt, DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
return Result.success(policeService.update(updateWrapper));
}
@DeleteMapping("{id}")
public Result<Void> del(@PathVariable String id, @RequestBody JSONObject body) {
policeService.update(new LambdaUpdateWrapper<SupPolice>().eq(SupPolice::getId, id).set(SupPolice::getDel, AppConstants.DEL)
.set(SupPolice::getDelReason, body.getString("reason")));
return Result.success();
}
@GetMapping("{departId}/all")
public Result<List<SupPolice>> all(@PathVariable String departId) {
return Result.success(policeService.listAllByDepartId(departId));
}
@GetMapping("{departId}/leader")
public Result<List<SupPolice>> leader(@PathVariable String departId) {
return Result.success(policeService.listLeaderByDepartId(departId));
}
@GetMapping("auth/{idCode}")
public Result<PoliceAuth> auth(@PathVariable String idCode) {
PoliceAuth policeAuth = new PoliceAuth().setDeparts(negDepartAuthorityService.list(idCode).stream().map(NegDepartAuthority::getDepartId).toList())
.setSources(negSourceAuthorityService.list(idCode).stream().map(NegSourceAuthority::getSource).toList())
.setRoleIds(userService.getRoleIds(idCode));
return Result.success(policeAuth);
}
@PostMapping("auth/{idCode}")
public Result<Void> auth(@PathVariable String idCode, @RequestBody PoliceAuth policeAuth) {
negDepartAuthorityService.save(idCode, policeAuth.getDeparts());
negSourceAuthorityService.save(idCode, policeAuth.getSources());
userService.updateRoleCodeByUserName(idCode, policeAuth.getRoleIds());
return Result.success();
}
private final BaseUserService userService;
private final BaseAccountService accountService;
private final SupDictProblemSourceService dictProblemSourceService;
@PostMapping("import")
public Result<List<PoliceImport>> importExcel(@RequestPart("file") MultipartFile file) throws IOException {
String fileNameType = FileUtil.extName(file.getOriginalFilename());
if (!"xls".equals(fileNameType) && !"xlsx".equals(fileNameType)) {
throw new RuntimeException("仅支持 xls/xlsx 格式文件的导入");
}
List<PoliceImport> list = new ArrayList<>();
List<SupDictProblemSource> problemSources = dictProblemSourceService.list();
ExcelReader excelReader = EasyExcel.read(file.getInputStream(), PoliceImport.class, new ReadListener<PoliceImport>() {
@Override
public void invoke(PoliceImport data, AnalysisContext analysisContext) {
Set<ConstraintViolation<PoliceImport>> validate = validator.validate(data);
if (!validate.isEmpty()) {
String message = validate.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining("\n"));
throw new RuntimeException(String.format("第%s条数据的异常:%s", list.size() + 1, message));
}
list.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}).build();
ReadSheet sheet = EasyExcel.readSheet(0).build();
excelReader.read(sheet);
excelReader.close();
for (int i = 0; i < list.size(); i++) {
PoliceImport police = list.get(i);
SupDepart depart = departService.getOne(new LambdaQueryWrapper<SupDepart>().eq(SupDepart::getShortName, police.getSecondDepartName()).eq(SupDepart::getLevel, 2));
if (Objects.isNull(depart)) {
throw new RuntimeException(String.format("%s 该单位在系统中未找到,请核实", police.getSecondDepartName()));
}
if (StrUtil.isNotBlank(police.getThirdDepartName())) {
depart = departService.getOne(new LambdaQueryWrapper<SupDepart>().eq(SupDepart::getPid, depart.getId())
.eq(SupDepart::getShortName, police.getThirdDepartName()).eq(SupDepart::getLevel, 3));
if (Objects.isNull(depart)) {
throw new RuntimeException(String.format("%s/%s 该单位在系统中未找到,请核实", police.getSecondDepartName(), police.getThirdDepartName()));
}
}
SupPolice supPolice = policeService.getByIdCode(list.get(i).getIdCode());
if (supPolice == null) {
supPolice = new SupPolice();
}
supPolice.setName(police.getName());
supPolice.setIdCode(police.getIdCode());
supPolice.setEmpNo(police.getEmpNo());
supPolice.setOrgId(depart.getId());
if (police.getEmpNo().contains("A")) {
supPolice.setPersonType("3");
} else {
supPolice.setPersonType("1");
}
policeService.saveOrUpdate(supPolice);
if ("三级机构专班".equals(police.getRole()) || "二级机构专班".equals(police.getRole())) {
String userId = saveOrUpdateUser(police);
// 角色
addRoleUser(userId, police.getRole());
// 权限
addAuth(police.getIdCode(), supPolice.getOrgId(), problemSources);
}
}
return Result.success(list);
}
public String saveOrUpdateUser(PoliceImport police) {
BaseUser user = userService.getByUserName(police.getIdCode());
if (user != null) {
return user.getUserId();
}
BaseUser baseUser = new BaseUser();
baseUser.setUserName(police.getIdCode());
baseUser.setNickName(police.getName());
baseUser.setUserType("admin");
baseUser.setCreateTime(LocalDateTime.now());
baseUser.setUpdateTime(LocalDateTime.now());
userService.save(baseUser);
BaseAccount account = new BaseAccount();
account.setAccount(police.getIdCode());
account.setUserId(baseUser.getUserId());
account.setAccountType("username");
account.setDomain("@admin.com");
account.setPassword("$2a$10$q0NbHH1fbkDotxJ1dT7PbOcV4G47R8n15uVxz2.imTiDqdCwAJYBC");
account.setDomain("@admin.com");
account.setCreateTime(LocalDateTime.now());
account.setUpdateTime(LocalDateTime.now());
accountService.save(account);
return baseUser.getUserId();
}
private final BaseRoleUserService roleUserService;
public void addRoleUser(String userId, String role) {
roleUserService.remove(new LambdaQueryWrapper<BaseRoleUser>().eq(BaseRoleUser::getUserId, userId));
BaseRoleUser baseRoleUser = new BaseRoleUser();
baseRoleUser.setUserId(userId);
if ("三级机构专班".equals(role)) {
baseRoleUser.setRoleId("5");
}
if ("二级机构专班".equals(role)) {
baseRoleUser.setRoleId("4");
}
baseRoleUser.setCreateTime(LocalDateTime.now());
baseRoleUser.setUpdateTime(LocalDateTime.now());
roleUserService.save(baseRoleUser);
}
public void addAuth(String idCode, String orgId, List<SupDictProblemSource> problemSources) {
negDepartAuthorityService.remove(new LambdaQueryWrapper<NegDepartAuthority>().eq(NegDepartAuthority::getIdCode, idCode));
NegDepartAuthority authority = new NegDepartAuthority();
authority.setDepartId(orgId);
authority.setIdCode(idCode);
negDepartAuthorityService.save(authority);
negSourceAuthorityService.remove(new LambdaQueryWrapper<NegSourceAuthority>().eq(NegSourceAuthority::getIdCode, idCode));
List<NegSourceAuthority> list = problemSources.stream().map(item -> {
NegSourceAuthority sourceAuthority = new NegSourceAuthority();
sourceAuthority.setIdCode(idCode);
sourceAuthority.setSource(item.getId());
return sourceAuthority;
}).toList();
negSourceAuthorityService.saveBatch(list);
}
}

66
src/main/java/com/biutag/supervision/controller/system/ProblemTypeMapingController.java

@ -0,0 +1,66 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.mapper.SupDictProblemTypeMapingMapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.SupDictProblemTypeMaping;
import com.biutag.supervision.pojo.param.DepartMapingQueryParam;
import com.biutag.supervision.pojo.param.PoliceQueryParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
/**
* @author wxc
* @date 2024/12/31
*/
@RequestMapping("problemTypeMaping")
@RequiredArgsConstructor
@RestController
public class ProblemTypeMapingController {
private final SupDictProblemTypeMapingMapper problemTypeMapingMapper;
@GetMapping
public Result<Page<SupDictProblemTypeMaping>> list(DepartMapingQueryParam param) {
LambdaQueryWrapper<SupDictProblemTypeMaping> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(param.getExternalName()), SupDictProblemTypeMaping::getExternalName, param.getExternalName())
.eq(StrUtil.isNotBlank(param.getInternalId()), SupDictProblemTypeMaping::getInternalId, param.getInternalId())
.orderByDesc(SupDictProblemTypeMaping::getCreateTime);
return Result.success(problemTypeMapingMapper.selectPage(Page.of(param.getCurrent(), param.getSize()), queryWrapper));
}
@PostMapping
public Result<Void> add(@RequestBody SupDictProblemTypeMaping data) {
if (problemTypeMapingMapper.exists(new LambdaQueryWrapper<SupDictProblemTypeMaping>()
.eq(SupDictProblemTypeMaping::getExternalName, data.getExternalName()))) {
throw new RuntimeException(String.format("问题类型【%s】已存在", StrUtil.trim(data.getExternalName())));
}
data.setExternalName(StrUtil.trim(data.getExternalName()));
data.setUpdateTime(LocalDateTime.now());
data.setCreateTime(LocalDateTime.now());
problemTypeMapingMapper.insert(data);
return Result.success();
}
@PutMapping
public Result<Void> update(@RequestBody SupDictProblemTypeMaping data) {
if (problemTypeMapingMapper.exists(new LambdaQueryWrapper<SupDictProblemTypeMaping>()
.eq(SupDictProblemTypeMaping::getExternalName, data.getExternalName())
.ne(SupDictProblemTypeMaping::getId, data.getId()))) {
throw new RuntimeException(String.format("单位编码【%s】已存在", data.getExternalName()));
}
data.setUpdateTime(LocalDateTime.now());
problemTypeMapingMapper.updateById(data);
return Result.success();
}
@DeleteMapping("{id}")
public Result<Void> del(@PathVariable String id) {
problemTypeMapingMapper.deleteById(id);
return Result.success();
}
}

62
src/main/java/com/biutag/supervision/controller/system/RoleController.java

@ -0,0 +1,62 @@
package com.biutag.supervision.controller.system;
import cn.hutool.core.util.IdUtil;
import com.biutag.supervision.constants.enums.StatusEnum;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.BaseRole;
import com.biutag.supervision.pojo.entity.RoleMenu;
import com.biutag.supervision.pojo.param.RoleQueryParam;
import com.biutag.supervision.service.BaseRoleService;
import com.biutag.supervision.service.RoleMenuService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RequiredArgsConstructor
@RequestMapping("role")
@RestController
public class RoleController {
private final BaseRoleService baseRoleService;
private final RoleMenuService roleMenuService;
@GetMapping
public Result<List<BaseRole>> list(RoleQueryParam roleQueryParam) {
List<BaseRole> roles = baseRoleService.list(roleQueryParam);
return Result.success(roles);
}
@PostMapping
public Result<Boolean> add(@RequestBody BaseRole role) {
role.setRoleId(String.valueOf(IdUtil.getSnowflakeNextId()));
role.setCreateTime(LocalDateTime.now());
role.setUpdateTime(LocalDateTime.now());
role.setStatus(StatusEnum.ENABLE.getValue());
return Result.success(baseRoleService.save(role));
}
@PutMapping
public Result<Boolean> update(@RequestBody BaseRole role) {
role.setUpdateTime(LocalDateTime.now());
return Result.success(baseRoleService.updateById(role));
}
@DeleteMapping("{id}")
public Result<Boolean> del(@PathVariable String id) {
return Result.success(baseRoleService.removeById(id));
}
@GetMapping("{roleCode}/menu")
public Result<List<Integer>> add(@PathVariable String roleCode) {
return Result.success(roleMenuService.list(roleCode).stream().map(RoleMenu::getMenuId).toList());
}
@PostMapping("{roleCode}/menu")
public Result<Boolean> add(@PathVariable String roleCode, @RequestBody List<Integer> menuIds) {
return Result.success(roleMenuService.update(roleCode, menuIds));
}
}

56
src/main/java/com/biutag/supervision/controller/system/UserController.java

@ -0,0 +1,56 @@
package com.biutag.supervision.controller.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.dto.UserDto;
import com.biutag.supervision.pojo.dto.UserPasswordDto;
import com.biutag.supervision.pojo.entity.BaseAccount;
import com.biutag.supervision.pojo.model.UserModel;
import com.biutag.supervision.pojo.param.UserQueryParam;
import com.biutag.supervision.service.BaseAccountService;
import com.biutag.supervision.service.BaseUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
@RequestMapping("user")
@RestController
public class UserController {
private final BaseUserService baseUserService;
private final BaseAccountService accountService;
@GetMapping
public Result<Page<UserModel>> list(UserQueryParam queryParam) {
Page<UserModel> baseUserPage = baseUserService.page(queryParam);
return Result.success(baseUserPage);
}
@PostMapping
public Result<Boolean> add(@RequestBody UserDto userDto) {
return Result.success(baseUserService.save(userDto));
}
@PutMapping
public Result<Boolean> update(@RequestBody UserDto userDto) {
return Result.success(baseUserService.update(userDto));
}
@PutMapping("password")
public Result<Boolean> updatePsd(@RequestBody UserPasswordDto userPasswordDto) {
BaseAccount baseAccount = accountService.getByAccount(userPasswordDto.getAccount());
if (!BCrypt.checkpw(userPasswordDto.getPassword(), baseAccount.getPassword())) {
throw new RuntimeException("密码错误!");
}
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String passwordEncoder = encoder.encode(userPasswordDto.getNewPassword());
accountService.update(new LambdaUpdateWrapper<BaseAccount>().eq(BaseAccount::getAccount, userPasswordDto.getAccount()).set(BaseAccount::getPassword, passwordEncoder));
return Result.success();
}
}

229
src/main/java/com/biutag/supervision/controller/warning/WarningController.java

@ -0,0 +1,229 @@
package com.biutag.supervision.controller.warning;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.constants.enums.RoleCodeEnum;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.InvertRecord;
import com.biutag.supervision.pojo.entity.report.ReportFlow;
import com.biutag.supervision.pojo.entity.report.ReportProject;
import com.biutag.supervision.pojo.entity.report.ReportReview;
import com.biutag.supervision.pojo.entity.warning.WarningContent;
import com.biutag.supervision.pojo.entity.warning.WarningRecord;
import com.biutag.supervision.pojo.enums.FlowEnum;
import com.biutag.supervision.pojo.enums.FlowStateEnum;
import com.biutag.supervision.pojo.enums.FlowWarningEnum;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.param.Warning.WarningQueryParam;
import com.biutag.supervision.pojo.vo.entryWindow.EntryWindowVo;
import com.biutag.supervision.pojo.vo.warning.WaringVo;
import com.biutag.supervision.pojo.vo.warning.WarningInformData;
import com.biutag.supervision.service.InvertRecord.InvertRecordService;
import com.biutag.supervision.service.Report.ReportFlowService;
import com.biutag.supervision.service.Report.ReportProjectService;
import com.biutag.supervision.service.SupDepartService;
import com.biutag.supervision.service.Warning.WarningContentService;
import com.biutag.supervision.service.Warning.WarningRecordService;
import io.lettuce.core.dynamic.annotation.Param;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
@RequestMapping("/warning")
public class WarningController {
private final ReportProjectService reportProjectService;
private final WarningContentService contentService;
private final WarningRecordService recordService;
private final ReportFlowService reportFlowService;
private final InvertRecordService invertRecordService;
private final SupDepartService departService;
//预警督察列表
@PostMapping("/getPage")
public Result<Page<EntryWindowVo>> getPage(@RequestBody WarningQueryParam queryParam){
UserAuth user = UserContextHolder.getCurrentUser();
QueryWrapper<ReportProject> wrapper= new QueryWrapper<ReportProject>()
.eq(StrUtil.isNotBlank(queryParam.getProjectUnitId()),"p.project_unit_id",queryParam.getProjectUnitId())
.eq(StrUtil.isNotBlank(queryParam.getAuditUnitId()),"p.audit_unit_id",queryParam.getAuditUnitId())
.eq(StrUtil.isNotBlank(queryParam.getReportName()),"p.report_name",queryParam.getReportName())
.eq("f.report_link","end")
.eq("f.approver_state","end")
.eq(StrUtil.isNotBlank(queryParam.getWarningState()),"p.warning_state",queryParam.getWarningState())
.eq("p.node",FlowStateEnum.End.getLabel());
if (!AppConstants.USER_TYPE_SUPER.equals(user.getUserType()) && !user.getRoleCodes().contains(RoleCodeEnum.FIRST_ADMIN.getCode())) {
List<String> orgIds =new ArrayList<>();
if(!user.getAuthDepartIds().isEmpty()){
orgIds = departService.getAllNodeIds(user.getAuthDepartIds());
wrapper.in("p.project_unit_id", orgIds);
}else{
orgIds = departService.getAllNodeIds(user.getDepartId());
wrapper.in("p.project_unit_id", orgIds);
}
// List<String> orgIds = departService.getAllNodeIds(user.getAuthDepartIds());
// wrapper.in("p.project_unit_id", orgIds);
}
if(CollectionUtil.isNotEmpty(queryParam.getPublicationDate())){
wrapper.between(CollectionUtil.isNotEmpty(queryParam.getPublicationDate()),"p.publication_date",queryParam.getPublicationDate().get(0),queryParam.getPublicationDate().get(1));
}
if(CollectionUtil.isNotEmpty(queryParam.getEndDate())){
wrapper.between(CollectionUtil.isNotEmpty(queryParam.getEndDate()),"p.archiving",queryParam.getEndDate().get(0),queryParam.getEndDate().get(1));
}
wrapper.groupBy("p.id");
Page<EntryWindowVo> page= reportProjectService.getPageWarning(new Page<>(queryParam.getCurrent(),queryParam.getSize()),wrapper,queryParam.getWarningState());
List<EntryWindowVo> entryWindowVos = page.getRecords();
entryWindowVos.forEach(s->{
List<WarningRecord> list = recordService.list(new LambdaQueryWrapper<WarningRecord>().eq(WarningRecord::getReportId,s.getId()));
if(CollectionUtil.isNotEmpty(list)) {
//0的代表已下发问题
List<WarningRecord> records= list.stream().filter(x-> "0".equals(x.getFlowState())).toList();
//为空表示已提交审核
List<WarningRecord> auditNumber= list.stream().filter(x-> StrUtil.isEmpty(x.getFlowState())).toList();
//1 为 已下发问题 ,2 为已提交审核,0为常规
String stateData = CollectionUtil.isNotEmpty(records)?"1":(CollectionUtil.isNotEmpty(auditNumber)?"2":"0");
s.setStateData(stateData);
List<String> ids = list.stream().map(x -> x.getId()).toList();
long counts = contentService.count(new LambdaQueryWrapper<WarningContent>().in(WarningContent::getWarningId, ids)
.isNotNull(WarningContent::getRemark));
s.setWarningContent(counts);
}
});
page.setRecords(entryWindowVos);
return Result.success(page);
}
/**
* 获取最新的预警记录
* @param id 项目id
* */
@GetMapping("/getWarningRecord/{id}")
public Result<WarningRecord> getWarningRecord(@PathVariable("id")String id){
WarningRecord record =recordService.selectDataByDistinct(id);
if(ObjectUtil.isNotEmpty(record)){
return Result.success(record);
}else {
return Result.success();
}
}
@GetMapping("getWarningAudit/{id}")
public Result< List<WarningRecord>> getWarningAudit(@PathVariable("id")String id){
//获取已下发的预警记录
List<WarningRecord> record = recordService.selectDataByAudit(id);
return Result.success(record);
}
@GetMapping("/getRejectNode/{id}")
public Result<List<ReportFlow>> getRejectNode(@PathVariable("id") String id){
WarningRecord record = recordService.getById(id);
List<ReportFlow> flows =reportFlowService.list(new LambdaQueryWrapper<ReportFlow>().eq(ReportFlow::getReportId,id).eq(ReportFlow::getType,"warning"));
flows=flows.stream().filter(s->!s.getApproverState().equals(FlowStateEnum.Reject.getLabel()) && isRejectNodeFlow(record.getNode()).contains(s.getReportLink()))
.collect(Collectors.toMap(
ReportFlow::getReportCode,
Function.identity(),
(existing, replacement) -> existing
)).values().stream().toList();
return Result.success(flows);
}
//预警督察详情
@GetMapping("/{id}")
public Result<WaringVo> getDetail(@PathVariable("id") String id){
WaringVo vo= recordService.getWarningVoFun(id);
return Result.success(vo);
}
//保存或者修改 预警督察详情
@PostMapping("/addOrUpData")
public Result addOrUpData(@RequestBody WaringVo vo){
vo.getRecord().setReportId(vo.getReportProject().getId());
UserAuth user = UserContextHolder.getCurrentUser();
String type="warning";
vo.getRecord().setCreateTime(LocalDateTime.now());
if("inform".equals(vo.getCode())){
type= "inform";
}
if(StrUtil.isNotBlank(vo.getIsSubmit())){
if("inform".equals(vo.getCode())){
vo.getRecord().setInformNode(FlowWarningEnum.state.getLabel());
}else{
vo.getRecord().setNode(FlowWarningEnum.state.getLabel());
}
recordService.saveOrUpdate(vo.getRecord());
List<ReportFlow> reportFlows = reportFlowService.list(
new LambdaQueryWrapper<ReportFlow>().eq(ReportFlow::getReportId,vo.getRecord().getId())
.eq(ReportFlow::getReportLink,FlowWarningEnum.state.getLabel())
.eq(ReportFlow::getReportCode,FlowWarningEnum.state.getValue())
.eq(ReportFlow::getApproverState,FlowStateEnum.Start.getLabel())
.eq(ReportFlow::getType,type)
);
if(CollectionUtil.isEmpty(reportFlows)){
ReportFlow flow = new ReportFlow();
flow.setReportId(vo.getRecord().getId());
flow.setReportLink(FlowWarningEnum.state.getLabel());
flow.setReportCode(FlowWarningEnum.state.getValue());
flow.setAreportTime(LocalDateTime.now());
flow.setApproverState(FlowStateEnum.Start.getLabel());
flow.setApprover(user.getNickName());
flow.setApproverId(user.getUserName());
flow.setIsInit("1");
flow.setType(type);
reportFlowService.save(flow);
}
}else{
recordService.saveOrUpdate(vo.getRecord());
}
if(CollectionUtil.isNotEmpty(vo.getContents())){
vo.getContents().forEach(s->{
s.setWarningId(vo.getRecord().getId());
});
contentService.saveOrUpdateBatch(vo.getContents());
}
return this.getDetail(vo.getRecord().getId());
}
@GetMapping("/getWarningInformList/{id}")
public Result<List<WarningInformData>> getWarningInformList(@PathVariable("id")String id){
List<WarningInformData> list =recordService.getWarningInformData(id);
return Result.success(list);
}
public List<String> isRejectNodeFlow(String node){
return switch (node) {
case "leader" -> List.of( "state");
case "end" -> List.of("state", "leader");
default -> new ArrayList<>();
};
}
}

97
src/main/java/com/biutag/supervision/controller/work/workController.java

@ -0,0 +1,97 @@
package com.biutag.supervision.controller.work;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.biutag.supervision.common.UserContextHolder;
import com.biutag.supervision.constants.AppConstants;
import com.biutag.supervision.constants.enums.RoleCodeEnum;
import com.biutag.supervision.mapper.InformMessageMapper;
import com.biutag.supervision.mapper.Report.ReportProjectMapper;
import com.biutag.supervision.pojo.Result;
import com.biutag.supervision.pojo.entity.InformMessage;
import com.biutag.supervision.pojo.entity.SupPolice;
import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.param.Work.ProjectWorkQueryParam;
import com.biutag.supervision.pojo.vo.work.MessageWorkVo;
import com.biutag.supervision.pojo.vo.work.ProjectTabWorkVo;
import com.biutag.supervision.pojo.vo.work.ProjectWorkVo;
import com.biutag.supervision.service.InformMessageService;
import com.biutag.supervision.service.Report.ReportProjectService;
import com.biutag.supervision.service.SupPoliceService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RequiredArgsConstructor
@RestController
@RequestMapping("/work")
public class workController {
private final SupPoliceService policeService;
private final ReportProjectService projectService;
private final InformMessageMapper informMessageMapper;
//待办事项
@GetMapping("/{code}")
public Result<List<ProjectWorkVo>> getWorkVoList(@PathVariable("code")String code){
ProjectWorkQueryParam queryParam =new ProjectWorkQueryParam();
queryParam.setCode(code);
UserAuth user = UserContextHolder.getCurrentUser();
if(ObjectUtil.isNotEmpty(user)){
if(!AppConstants.USER_TYPE_SUPER.equals(user.getUserType())){
queryParam.setUserId(user.getUserName());
}
}
return Result.success(projectService.getProjectWork(queryParam));
}
//tab数字
@GetMapping("/getWorkTab")
public Result<ProjectTabWorkVo> getWorkTab(){
ProjectWorkQueryParam queryParam =new ProjectWorkQueryParam();
UserAuth user = UserContextHolder.getCurrentUser();
if(ObjectUtil.isNotEmpty(user)){
if(!AppConstants.USER_TYPE_SUPER.equals(user.getUserType())){
queryParam.setUserId(user.getUserName());
}
}
ProjectTabWorkVo workVo = projectService.getProjectTabWorkVo(queryParam);
if(ObjectUtil.isEmpty(workVo)){
workVo=new ProjectTabWorkVo();
}
workVo.setUnread(informMessageMapper.selectCount(
new LambdaUpdateWrapper<InformMessage>().eq(InformMessage::getIsRead,"0")
.eq(StrUtil.isNotBlank(queryParam.getUserId()),InformMessage::getRecipientId,queryParam.getUserId())
));
workVo.setRead(informMessageMapper.selectCount(
new LambdaUpdateWrapper<InformMessage>().eq(InformMessage::getIsRead,"1")
.eq(StrUtil.isNotBlank(queryParam.getUserId()),InformMessage::getRecipientId,queryParam.getUserId())
));
return Result.success(workVo);
}
@GetMapping("/getMessageWorkList/{code}")
public Result<List<MessageWorkVo>> getMessageWorkList(@PathVariable("code") String code){
UserAuth user = UserContextHolder.getCurrentUser();
ProjectWorkQueryParam queryParam=new ProjectWorkQueryParam();
if(ObjectUtil.isNotEmpty(user)){
if(!AppConstants.USER_TYPE_SUPER.equals(user.getUserType()) ){
queryParam.setUserId(user.getUserName());
}
}
queryParam.setCode(code);
return Result.success(informMessageMapper.getMessageWorkReportList(queryParam));
}
@GetMapping("/upMessageWork/{id}")
public Result upMessageWork(@PathVariable("id") String id){
informMessageMapper.update(new LambdaUpdateWrapper<InformMessage>().set(InformMessage::getIsRead,"1").eq(InformMessage::getId,id));
return Result.success();
}
}

11
src/main/java/com/biutag/supervision/exception/AuthException.java

@ -0,0 +1,11 @@
package com.biutag.supervision.exception;
public class AuthException extends RuntimeException {
public AuthException() {
}
public AuthException(String message) {
super(message);
}
}

9
src/main/java/com/biutag/supervision/flow/action/Action.java

@ -0,0 +1,9 @@
package com.biutag.supervision.flow.action;
import com.biutag.supervision.pojo.dto.ActionDto;
public interface Action {
void next(ActionDto actionDto);
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save