Browse Source

林场项目任务管理代码提交

tags/v1.1.0
qiujinyang 2 years ago
commit
60fa2e4197
100 changed files with 7230 additions and 0 deletions
  1. +40
    -0
      .gitignore
  2. +3
    -0
      README.md
  3. +52
    -0
      doc/林场项目整体流程.puml
  4. +84
    -0
      pom.xml
  5. +294
    -0
      tuoheng-admin/pom.xml
  6. +23
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/AdminApplication.java
  7. +100
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/advice/CustomExceptionHandler.java
  8. +54
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/advice/CustomWrapHandler.java
  9. +29
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/common/ServiceConstant.java
  10. +96
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/common/ServiceExceptionEnum.java
  11. +80
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/AliyuncsVodConfig.java
  12. +21
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/EmbeddedServletContainerConfig.java
  13. +36
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/ExecutorConfig.java
  14. +72
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/MQConfig.java
  15. +86
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/Swagger3Config.java
  16. +22
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/UploadConfig.java
  17. +14
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/config/WebSocketConfig.java
  18. +96
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/controller/InspectionController.java
  19. +56
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/controller/InspectionFileController.java
  20. +127
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/controller/MissionController.java
  21. +74
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/controller/QuestionController.java
  22. +75
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/controller/TenantController.java
  23. +127
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/controller/ThInspectionQuestionController.java
  24. +125
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/InspectionFile.java
  25. +73
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/InspectionQuestionItem.java
  26. +52
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/Question.java
  27. +103
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/Tenant.java
  28. +81
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspection.java
  29. +88
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionCheck.java
  30. +23
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionDetail.java
  31. +163
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionFile.java
  32. +90
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionQuestion.java
  33. +154
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThMission.java
  34. +46
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/AiAnalysisResult.java
  35. +41
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/AiOfflineTask.java
  36. +60
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/AiTaskResult.java
  37. +101
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/TenantDto.java
  38. +42
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/InspectionRequest.java
  39. +45
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/MissionQuery.java
  40. +109
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/MissionRequest.java
  41. +34
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/MissionStatusRequest.java
  42. +42
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QueryQuestionPictureRequest.java
  43. +44
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QueryQuestionRequest.java
  44. +34
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QuestionFileRequest.java
  45. +45
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QuestionInventoryRequest.java
  46. +28
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QuestionQuery.java
  47. +53
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/ReportRequest.java
  48. +17
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/TenantQuery.java
  49. +71
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/UAVKHQuestionRequest.java
  50. +15
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/UpdateLiveChannel.java
  51. +28
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/UploadVideoUrlRequest.java
  52. +21
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AIInspectionVo.java
  53. +28
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirExecuteTaskVO.java
  54. +75
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirLineVO.java
  55. +72
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirPortVO.java
  56. +114
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirWeatherVO.java
  57. +40
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/InspectionFileInfoVo.java
  58. +37
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/InspectionVO.java
  59. +77
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/MissionVO.java
  60. +29
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionCountVo.java
  61. +69
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionDetailVo.java
  62. +53
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionFileVo.java
  63. +65
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionInventoryVo.java
  64. +17
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionTypeCountVo.java
  65. +63
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/ThInspectionFileVo.java
  66. +121
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/ThInspectionQuestionPictureVo.java
  67. +76
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/ThInspectionQuestionVo.java
  68. +23
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/enums/AirPortTaskStatusEnum.java
  69. +24
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/enums/MarkTypeEnum.java
  70. +24
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/enums/QuestionEnum.java
  71. +25
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/enums/TaskStatusEnum.java
  72. +24
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/QuestionMapper.java
  73. +16
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/TenantMapper.java
  74. +130
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionFileMapper.java
  75. +9
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionMapper.java
  76. +14
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionQuestionItemMapper.java
  77. +26
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionQuestionMapper.java
  78. +18
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThMissionMapper.java
  79. +121
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/oss/PutObjectProgressListener.java
  80. +21
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/oss/RefreshSTSTokenImpl.java
  81. +13
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/IInspectionQuestionItemService.java
  82. +55
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/IMissionService.java
  83. +23
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/IQuestionService.java
  84. +45
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/ITenantService.java
  85. +31
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/IThInspectionService.java
  86. +19
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/InspectionQuestionItemServiceImpl.java
  87. +189
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/MissionServiceImpl.java
  88. +45
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/QuestionServiceImpl.java
  89. +167
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/TenantServiceImpl.java
  90. +152
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/ThInspectionServiceImpl.java
  91. +33
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/task/ExecuteTaskTask.java
  92. +25
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/utils/CodeUtil.java
  93. +159
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/utils/GaodeUtil.java
  94. +362
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/utils/WordUtilsOld.java
  95. +150
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/utils/XwpfTUtil.java
  96. +220
    -0
      tuoheng-admin/src/main/resources/application-dev.yml
  97. +214
    -0
      tuoheng-admin/src/main/resources/application-local.yml
  98. +214
    -0
      tuoheng-admin/src/main/resources/application-prod.yml
  99. +214
    -0
      tuoheng-admin/src/main/resources/application-test.yml
  100. +0
    -0
      tuoheng-admin/src/main/resources/application.yml

+ 40
- 0
.gitignore View File

@@ -0,0 +1,40 @@
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/

/.idea
/.vscode
/.svn
tuoheng-ui
target/
HELP.md

+ 3
- 0
README.md View File

@@ -0,0 +1,3 @@
# tuoheng_lc

拓恒林场SaaS平台后端JAVA服务

+ 52
- 0
doc/林场项目整体流程.puml View File

@@ -0,0 +1,52 @@
@startuml
autoactivate on
title 林场项目

skinparam responseMessageBelowArrow true
机场 -> 机场 : 预置飞行航线、预置无人机等操作
林场项目-> 林场项目: 登录

林场项目 -> 机场 : 机场列表
机场 --> 林场项目 :机场列表(1、每个机场里面有一个无人机,2、每个机场有一个机场内视频和机场位置,3、机场的天气信息)

林场项目 -> 机场 : 任务列表
机场 --> 林场项目 : 任务列表(1、飞行里程,2、航线,3、无人机直播流地址(需要在后面获取),4、无人机执行时间)

DSP -> 林场项目: 调用林场回调地址
林场项目 --> DSP: 1、视频分析结束\n2、分析已经关闭

林场项目-> 机场 : 发送飞行命令

机场-> 通道服务 : 请求获取空闲通道
通道服务 --> 机场 : 返回空闲的通道

机场 --> 林场项目 : 返回推流的地址
机场 -> 机场 : 执行飞行任务,机场给刚才申请的通道推流


林场项目-> DSP: 携带通道给DSP,需要DSP基于已携带的通道进行拉流操作
DSP --> 林场项目: 返回分析后的AI推流地址,并返回任务状态以及问题图片


机场 -> 林场项目 : 更新任务状态(任务状态更新为:任务飞行中)
林场项目 --> 机场 : 任务状态更新成功\n1、判断当前状态是否出错\n2、判断任务是否已经完成

机场-> 林场项目 : 坐标信息实时发送
林场项目 -> 机场 : 接受坐标信息并存库

林场项目 -> 林场项目 : 点击查看直播页面,返回当前任务的拉流地址以及AI分析后的视频地址
林场项目 -> 林场项目 : 点击查看轨迹功能,查询当前无人的轨迹页面(可以做成定时的请求,比如一秒一次)

机场-> 林场项目 : 飞行任务已经完成飞机已经回仓(机场发送任务状态给林场系统:飞行任务完成)
林场项目 -> 林场项目 : 场景1:实时版本直接发送请求到DSP \n场景2:离线版本先判断AI分析视屏的状态是否已经结束\n(任务状态更新为:任务已结束)
林场项目 -> 林场项目 : 生成报告接口可点击
林场项目 -> DSP : 关闭AI分析视频,确定任务已经结束
DSP-> 通道服务: 给AI发送消息,提醒需要关闭分析

AI --> DSP : 分析已经关闭

DSP -> 通道服务 : 关闭AI分析的通道服务,状态重置为已释放
通道服务 --> DSP : 状态释放成功

DSP--> 通道服务 : 分析已经关闭
@enduml

+ 84
- 0
pom.xml View File

@@ -0,0 +1,84 @@
<?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>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.tuoheng</groupId>
<artifactId>tuoheng</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--父模块打包类型必须为pom-->
<packaging>pom</packaging>
<name>tuoheng</name>
<description>Demo project for Spring Boot</description>

<!-- 子模块依赖 -->
<modules>
<module>tuoheng-common</module>
<module>tuoheng-generator</module>
<module>tuoheng-system</module>
<module>tuoheng-admin</module>
<!-- <module>tuoheng-generator</module>-->
</modules>

<properties>
<java.version>1.8</java.version>
<!-- 表示打包时跳过mvn test -->
<maven.test.skip>true</maven.test.skip>
<!--全局配置项目版本号-->
<version>0.0.1-SNAPSHOT</version>
<spring-kafka.version>2.8.3</spring-kafka.version>
</properties>

<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- 子模块依赖 -->
<dependency>
<groupId>com.tuoheng</groupId>
<artifactId>tuoheng-common</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>com.tuoheng</groupId>
<artifactId>tuoheng-generator</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>com.tuoheng</groupId>
<artifactId>tuoheng-system</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>com.tuoheng</groupId>
<artifactId>tuoheng-admin</artifactId>
<version>${version}</version>
</dependency>
<!-- swagger依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>

<!-- 第三方依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
</dependencyManagement>

</project>

+ 294
- 0
tuoheng-admin/pom.xml View File

@@ -0,0 +1,294 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 子模块的parent要使用顶层的父模块-->
<parent>
<artifactId>tuoheng</artifactId>
<groupId>com.tuoheng</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>tuoheng-admin</artifactId>
<packaging>jar</packaging>
<name>tuoheng-admin</name>
<description>Demo project for Spring Boot</description>



<!-- 依赖声明 -->
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>2.16.8</version>
</dependency>
<!-- 核心模块 -->
<dependency>
<groupId>com.tuoheng</groupId>
<artifactId>tuoheng-system</artifactId>
</dependency>
<!-- 代码生成 -->
<dependency>
<groupId>com.tuoheng</groupId>
<artifactId>tuoheng-generator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.15.Final</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>[0.4, 0.5)</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext-rtf</artifactId>
<version>2.1.7</version>
</dependency>

<!--阿里云视频点播-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-kms</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.vod</groupId>
<artifactId>upload</artifactId>
<version>1.4.14</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-vod-upload-1.4.14.jar</systemPath>
</dependency>


</dependencies>

<profiles>
<!-- 本地开发环境 -->
<profile>
<id>local</id>
<properties>
<package.environment>local</package.environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<package.environment>dev</package.environment>
</properties>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<package.environment>test</package.environment>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<package.environment>prod</package.environment>
</properties>
</profile>
</profiles>

<build>
<finalName>tuoheng_lc_admin</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.yml</include>
</includes>
</resource>

<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.docx</include>
</includes>
</resource>

<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>

<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<targetPath>WEB-INF/classes</targetPath>
<includes>
<include>application-${package.environment}.yml</include>
</includes>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.11.RELEASE</version>
<configuration>
<finalName>${project.build.finalName}</finalName>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>

</project>

+ 23
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/AdminApplication.java View File

@@ -0,0 +1,23 @@
package com.tuoheng.admin;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import springfox.documentation.oas.annotations.EnableOpenApi;

@EnableAsync
//排除原有的Multipart配置
@SpringBootApplication(scanBasePackages = {"com.tuoheng.*"}, exclude = {MultipartAutoConfiguration.class})
@MapperScan("com.tuoheng.**.mapper")
@EnableTransactionManagement
@EnableOpenApi
public class AdminApplication {

public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}

}

+ 100
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/advice/CustomExceptionHandler.java View File

@@ -0,0 +1,100 @@
package com.tuoheng.admin.advice;

import com.tuoheng.common.common.SysExceptionEnum;
import com.tuoheng.common.exception.ServiceException;
import com.tuoheng.common.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.shiro.dao.DataAccessException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;
import java.util.stream.Collectors;

/**
* 自定义异常处理器
*
* @author zhu_zishuang
* @date 2021-03-12
*/
@Slf4j
@RestControllerAdvice
public class CustomExceptionHandler {
/**
* 密码校验异常
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public JsonResult<Object> handleAuthenticationException(BindException e) {
BindingResult bindingResult = e.getBindingResult();
String errorMessage = "";
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errorMessage += fieldError.getDefaultMessage() + "!";
}
return JsonResult.error(SysExceptionEnum.PARAMETER_EMPTY_EXCEPTION.getCode(), errorMessage);
}

/**
* 校验异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JsonResult<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.warn("系统参数校验异常,异常信息:{}", e.getMessage());

JsonResult<Object> error = JsonResult.error(SysExceptionEnum.PARAMETER_EMPTY_EXCEPTION.getCode(),
SysExceptionEnum.PARAMETER_EMPTY_EXCEPTION.getMessage());

BindingResult result = e.getBindingResult();
List<FieldError> fieldErrors = result.getFieldErrors();
if (!CollectionUtils.isEmpty(fieldErrors)) {
error.setMsg(fieldErrors.stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(",")));
} else {
if (!CollectionUtils.isEmpty(result.getAllErrors())) {
ObjectError currError = result.getAllErrors().get(0);
error.setMsg(currError.getObjectName() + currError.getDefaultMessage());
}
}

return error;
}

/**
* 系统业务异常处理
*/
@ExceptionHandler(ServiceException.class)
@ResponseBody
public JsonResult<Object> handleServiceException(ServiceException e) {
// 打印业务异常日志
log.warn("系统业务逻辑异常,异常状态码 {},异常信息:{}", e.code, e.getMessage());
return JsonResult.error(e.code, e.getMessage());
}

/**
* 系统数据访问异常处理
*/
@ExceptionHandler(DataAccessException.class)
@ResponseBody
public JsonResult<Object> handleDataAccessException(DataAccessException e) {
log.error("系统数据访问异常,异常信息:{}", e.getMessage());
return JsonResult.error(SysExceptionEnum.DATAACCESS_EXCEPTION.getCode(), SysExceptionEnum.DATAACCESS_EXCEPTION.getMessage());
}

/**
* 系统异常处理
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public JsonResult<Object> handleException(Exception e) {
e.printStackTrace();
log.error("系统异常,异常信息:{}", e.getMessage());
return JsonResult.error(SysExceptionEnum.SYS_EXCEPTION.getCode(), SysExceptionEnum.SYS_EXCEPTION.getMessage());
}
}

+ 54
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/advice/CustomWrapHandler.java View File

@@ -0,0 +1,54 @@
/*
package com.tuoheng.admin.advice;

import com.tuoheng.common.common.OperationEnum;
import com.tuoheng.common.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

*/
/**
* 自定义包装处理类
*
* @author zhu_zishuang
* @date 2021-03-12
*//*

@Slf4j
@ControllerAdvice(basePackages = "com.tuoheng.admin.controller")
public class CustomWrapHandler<T> implements ResponseBodyAdvice<T> {

@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {
return MappingJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
}

@Override
public T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
*/
/**
* 增、删、改操作返回的状态
*//*

if (body.getClass().equals(OperationEnum.class)) {
log.info("接口: {} , 增删改方法!" + request.getURI());
return (T) JsonResult.success();
}

*/
/**
* 读操作
*//*

return body;
//return (T) JsonResult.success(body);
}
}
*/

+ 29
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/common/ServiceConstant.java View File

@@ -0,0 +1,29 @@
package com.tuoheng.admin.common;

/**
* 常量类
*
* @author: zhu_zishuang
* @date: 2020-04-22 14:22
*/
public final class ServiceConstant {
/**
* 构造器私有化
*/
private ServiceConstant() {
// 可抛出异常,防止通过反射实例化对象
}

/**
* 常用数值
*/
public static final Integer ZERO = 0;
public static final Integer ONE = 1;
public static final Integer TWO = 2;
public static final Integer DELETE = 0;
public static final Integer NOT_DELETE = 1;
public static final Integer STATUS_25 = 25;
public static final Integer STATUS_15 = 15;


}

+ 96
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/common/ServiceExceptionEnum.java View File

@@ -0,0 +1,96 @@
package com.tuoheng.admin.common;

import com.tuoheng.common.common.ExceptionInterface;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* 业务异常 枚举
*
* @author zhu_zishuang
* @date 2021-03-12
*/
@AllArgsConstructor
public enum ServiceExceptionEnum implements ExceptionInterface {

/**
* 未查询到数据
*/
GET_NO_DATA(10001, "未查到该记录!"),
/**
* 参数为空
*/
PARAMETER_IS_NULL(10002, "参数为空!"),

/**
* 获取用户ID失败
*/
GET_NO_USER_ID(10003, "获取用户ID失败!"),

/**
* websocket连接异常!
*/
WEB_SOCKET_CONNECTION_ERROR(10004, "websocket连接异常!"),

/**
* 文件不能为空!
*/
FILE_IS_EMPTY(10005, "上传文件不能为空!"),

/**
* 上传文件格式错误!
*/
FILE_FORMAT_IS_ERROR(10006, "上传文件格式错误!"),

/**
* 上传文件数据错误,请检查文件!
*/
FILE_DATA_IS_ERROR(10101, "上传文件数据错误,请检查文件!"),

/**
* 上传文件数据错误,请检查文件!
*/
FILE_DATA_TIME_IS_ERROR(10102, "上传文件数据错误,请检查文件!"),

/**
* 上传文件数据错误,请检查文件!
*/
FILE_DATA_LNG_IS_ERROR(10103, "上传文件数据错误,请检查文件!"),

/**
* 上传文件数据错误,请检查文件!
*/
FILE_DATA_LAT_IS_ERROR(10104, "上传文件数据错误,请检查文件!"),

/**
* 读取图片经纬度失败,请手动填写!
*/
IMAGE_LOCATION_IS_ERROR(11001, "读取图片经纬度失败,请手动填写!"),

/**
* 任务不存在!
*/
TASK_DOES_NOT_EXIST(11111, "巡检任务不存在,请先创建巡检任务!"),

/**
* 视频分析中,请稍后再试
*/
VIDEO_ANALYSIS_IN_PROGRESS(11112, "视频分析中,请稍后再试!"),

/**
* 只有飞行完成状态可以操作
*/
TASK_NOT_OPERATION(11113, "只有飞行完成状态可以操作!"),

/**
* 没有这个飞行状态
*/
TASK_NOT_STATUS(11113, "飞行状态出错!"),
;

@Getter
private final int code;

@Getter
private final String message;
}

+ 80
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/AliyuncsVodConfig.java View File

@@ -0,0 +1,80 @@
package com.tuoheng.admin.config;

import com.aliyun.teaopenapi.models.Config;
import com.aliyun.vod20170321.Client;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

/**
* 阿里云点播服务配置类
*
* @author WangHaoran
* @since 2022-03-11
*/
@Configuration
@Slf4j
public class AliyuncsVodConfig {

/**
* 阿里云endpoint
*/
public final static String ENDPOINT = "vod.cn-shanghai.aliyuncs.com";

/**
* 账号
*/
public static String accessKeyId;

/**
* 密码
*/
public static String accessKeySecret;

/**
* 角色ARN
*/
public static String roleArn;

/**
* Bucket名称
*/
public static String bucketName;

@Value("${aliyuncsVod.accessKeyId}")
public void setAccessKeyId(String accessKeyId) {
AliyuncsVodConfig.accessKeyId = accessKeyId;
}

@Value("${aliyuncsVod.accessKeySecret}")
public void setAccessKeySecret(String accessKeySecret) {
AliyuncsVodConfig.accessKeySecret = accessKeySecret;
}

@Value("${aliyuncsVod.roleArn}")
public void setRoleArn(String roleArn) {
AliyuncsVodConfig.roleArn = roleArn;
}

@Value("${aliyuncsVod.bucketName}")
public void setBucketName(String bucketName) {
AliyuncsVodConfig.bucketName = bucketName;
}

@Bean
@Lazy
public Client vodClient() {
try {
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret)
.setEndpoint(ENDPOINT);
return new Client(config);
} catch (Exception e) {
log.error("获取vodClient客户端失败", e);
}
return null;
}
}

+ 21
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/EmbeddedServletContainerConfig.java View File

@@ -0,0 +1,21 @@
package com.tuoheng.admin.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

import java.io.File;

@Component
public class EmbeddedServletContainerConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

@Value("${server.tomcat.basedir}")
private String basedir;

@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.setDocumentRoot(new File(basedir));
}

}

+ 36
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/ExecutorConfig.java View File

@@ -0,0 +1,36 @@
package com.tuoheng.admin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
* 线程池配置
*/
@Configuration
@EnableAsync
public class ExecutorConfig {

@Bean
public Executor asyncServiceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(10);
//配置队列大小
executor.setQueueCapacity(400);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("thread-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}

+ 72
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/MQConfig.java View File

@@ -0,0 +1,72 @@
package com.tuoheng.admin.config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MQConfig {
@Bean(name = "getQueue")
public Queue getQueue() {
/**
* name: 队列名称
* durable:是否持久化
*/
return new Queue("5gaiDirectQueue", true, false, false);
}

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory factory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(factory);
//解决: Caused by: org.springframework.amqp.AmqpException: No method found for class [B 异常
//消息转换器,消息转化为json, setMessageConverter(MessageConverter ),这个方法就是这次异常的解决方案,创建一个Jackson2JsonMessageConverter对象放进去
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}

@Bean
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory factory){
SimpleRabbitListenerContainerFactory srlcf = new SimpleRabbitListenerContainerFactory();
srlcf.setConnectionFactory(factory);
//当消息有异常内容时(例如类型不匹配),将不再重新放入队列,直接丢弃
srlcf.setDefaultRequeueRejected(false);

//设置消息转为json
Jackson2JsonMessageConverter j2jmc = new Jackson2JsonMessageConverter();
srlcf.setMessageConverter(j2jmc);
return srlcf;
}

//发送消息时如不配置序列化方法则按照java默认序列化机制,则会造成发送编码不符合
@Bean
public MessageConverter messageConverter(){
Jackson2JsonMessageConverter j2jmc = new Jackson2JsonMessageConverter();
return j2jmc;
}


// @Bean(name = "getDirectExchange")
// public DirectExchange getDirectExchange() {
// return new DirectExchange("shuiwuDirectExchange", true, false);
// }
//
// @Bean(name = "getQueue")
// public Queue getQueue() {
// return new Queue("5gaiDirectQueue", true, false, false);
// }

// @Bean
// public Binding getDirectExchangeQueueTx(
// @Qualifier(value = "getDirectExchange") DirectExchange getDirectExchangeTx,
// @Qualifier(value = "getQueue") Queue getQueueTx) {
// return BindingBuilder.bind(getQueueTx).to(getDirectExchangeTx).with("shuiwu");
// }

}

+ 86
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/Swagger3Config.java View File

@@ -0,0 +1,86 @@
package com.tuoheng.admin.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

/**
* @author qiujinyang
* @company 拓恒技术
* @create 2022-07-19 21:00
*/
@Configuration
public class Swagger3Config {

/**
* 配置swagger的Docket bean
* @return
*/
@Bean
public Docket createRestApiSystem() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.groupName("system")
.select()
.apis(RequestHandlerSelectors.basePackage("com.tuoheng.system.controller")) // 指定扫描的包 常用方式
.build()
.apiInfo(createApiInfoSystem());
}

/**
* 配置swagger的ApiInfo bean
* @return
*/
@Bean
public ApiInfo createApiInfoSystem(){
return new ApiInfo("system Swagger"
,"system Api Documentation"
,"3.0"
,""
,new Contact("拓恒", "", "")
,"Apache 2.0"
,"http://www.apache.org/licenses/LICENSE-2.0"
,new ArrayList());
}


/**
* 配置swagger的Docket bean
* @return
*/
@Bean
public Docket createRestApiLc() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.groupName("lc")
.select()
.apis(RequestHandlerSelectors.basePackage("com.tuoheng.admin.controller"))
.build()
.apiInfo(createApiInfoLc());
}

/**
* 配置swagger的ApiInfo bean
* @return
*/
@Bean
public ApiInfo createApiInfoLc(){
return new ApiInfo("lc Swagger"
,"lc Api Documentation"
,"3.0"
,""
,new Contact("拓恒", "", "")
,"Apache 2.0"
,"http://www.apache.org/licenses/LICENSE-2.0"
,new ArrayList());
}




}

+ 22
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/UploadConfig.java View File

@@ -0,0 +1,22 @@
package com.tuoheng.admin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

@Configuration
public class UploadConfig {
//显示声明CommonsMultipartResolver为mutipartResolver
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
resolver.setResolveLazily(true);
resolver.setMaxInMemorySize(40960);
//上传文件大小 30M 30*1024*1024
resolver.setMaxUploadSize(30 * 1024 * 1024);
return resolver;
}
}

+ 14
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/config/WebSocketConfig.java View File

@@ -0,0 +1,14 @@
package com.tuoheng.admin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}

}

+ 96
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/controller/InspectionController.java View File

@@ -0,0 +1,96 @@
package com.tuoheng.admin.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.entity.domain.ThInspection;
import com.tuoheng.admin.entity.domain.ThMission;
import com.tuoheng.admin.entity.request.InspectionRequest;
import com.tuoheng.admin.entity.request.MissionStatusRequest;
import com.tuoheng.admin.service.IMissionService;
import com.tuoheng.admin.service.IThInspectionService;
import com.tuoheng.common.utils.JsonResult;
import com.tuoheng.system.utils.ShiroUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 9:28
*/
@RestController
@RequestMapping("/inspection")
@ApiOperation(value = "巡检坐标")
public class InspectionController {


@Autowired
private IThInspectionService inspectionService;

@Autowired
private IMissionService missionService;

/**
* 获取巡检机场
*/
@GetMapping("/airport")
public JsonResult airport() {
return JsonResult.success(inspectionService.airport());
}


/**
* 获取巡检线路
*/
@GetMapping("/airport/line/{droneId}")
public JsonResult airLine(@PathVariable("droneId") Integer droneId) {
return JsonResult.success(inspectionService.airLine(droneId));
}

/**
* 获取飞行轨迹
*/
@GetMapping("/track/{id}")
public JsonResult track(@PathVariable("id") Integer id) {
return JsonResult.success(inspectionService.track(id));
}


/**
* 立即执行
*/
@PutMapping("/mission/{id}")
public JsonResult executeTask(@PathVariable("id") Integer id) {
return inspectionService.executeTask(id);
}

/**
* 获取天气信息
*/
@GetMapping("/airport/weather/{airportId}")
public JsonResult getWeather(@PathVariable("airportId")Integer airportId) {
return JsonResult.success(inspectionService.getWeather(airportId));
}


/**
* 被硬件调用,存任务状态
*/
@PutMapping("/status")
public JsonResult track(@RequestBody @Valid MissionStatusRequest missionStatusRequest) {
return JsonResult.success(missionService.updateStatus(missionStatusRequest));
}


/**
* 被硬件调用,存飞行轨迹
*/
@PostMapping("/track")
public JsonResult track(@RequestBody @Valid InspectionRequest inspectionRequest) {
return JsonResult.success(inspectionService.track(inspectionRequest));
}


}

+ 56
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/controller/InspectionFileController.java View File

@@ -0,0 +1,56 @@
package com.tuoheng.admin.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.request.QuestionFileRequest;
import com.tuoheng.admin.entity.vo.QuestionDetailVo;
import com.tuoheng.admin.entity.vo.QuestionFileVo;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
* 巡检附件 前端控制器
*
* @author: WangHaoran
* @date: 2021/9/28
*/
@RestController
@RequestMapping("/inspectionFile")
public class InspectionFileController {

// @Autowired
// private IThInspectionFileService thInspectionFileService;

/**
* 查询问题清单列表
*
* @author: WangHaoran
* @date: 2021/9/28
*/
@GetMapping("/queryQuestionFileList")
public IPage<QuestionFileVo> queryQuestionFileList(QuestionFileRequest request) {
return null;//thInspectionFileService.queryQuestionFileList(request);
}

/**
* 查询问题清单 详情
*
* @author: WangHaoran
* @date: 2021/9/28
*/
@GetMapping("/queryQuestionDetail")
public QuestionDetailVo queryQuestionDetail(Integer fileId) {
return null;//thInspectionFileService.queryQuestionDetail(fileId);
}

/**
* 查询问题清单 GIS展示
*
* @author: WangHaoran
* @date: 2021/9/28
*/
@GetMapping("/queryQuestionLocationList")
public List<QuestionDetailVo> queryQuestionLocationList(Integer inspectionId) {
return null;//thInspectionFileService.queryQuestionLocationList(inspectionId);
}
}

+ 127
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/controller/MissionController.java View File

@@ -0,0 +1,127 @@
package com.tuoheng.admin.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.domain.ThMission;
import com.tuoheng.admin.entity.request.MissionQuery;
import com.tuoheng.admin.entity.request.MissionRequest;
import com.tuoheng.admin.entity.vo.MissionVO;
import com.tuoheng.admin.service.IMissionService;
import com.tuoheng.common.utils.JsonResult;
import com.tuoheng.system.utils.ShiroUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
* 林场巡检任务
*
* @author: qiujinyang
* @date: 2021/9/1
*/
@RestController
@RequestMapping("/mission")
@ApiOperation(value = "任务管理")
public class MissionController {
@Autowired
private IMissionService missionService;

/**
* 新建巡检任务
* @param addThMissionRequest
* @return
*/
@PostMapping("")
@ApiOperation(value = "新增任务", notes = "传入巡检任务对象")
public JsonResult addThInspection(@RequestBody @Valid MissionRequest addThMissionRequest) {
//新增巡检任务校验
checkAddInfo(addThMissionRequest);
return JsonResult.success(missionService.addMission(addThMissionRequest));
}

private void checkAddInfo(MissionRequest request) {
//判断任务名称不能重复
LambdaQueryWrapper<ThMission> lambdaQueryWrapper= new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ThMission::getName, request.getName());
//lambdaQueryWrapper.eq(ThMission::getTenantId, ShiroUtils.getTenantId());
ThMission one = missionService.getOne(lambdaQueryWrapper);
if(!ObjectUtils.isEmpty(one)){
JsonResult.error("任务名称不能重复");
}

if(request.getName().length()>100){
JsonResult.error("任务名称长度不能超过100");
}
}

/**
* 删除巡检任务
*/
@DeleteMapping("")
@ApiOperation(value = "删除巡检任务", notes = "传入巡检任务id")
public JsonResult deleteBatch(@RequestParam("idList") List<Integer> idList) {
return JsonResult.success(missionService.deleteBatch(idList));
}


/**
* 查询巡检任务列表
*
*/
@GetMapping("/page")
@ApiOperation(value = "查询巡检任务列表", notes = "查询巡检任务分页")
public JsonResult findList(MissionQuery queryMissionRequest) {
return JsonResult.success(missionService.findList(queryMissionRequest));
}


/**
* 获取巡检任务详情
*/
@GetMapping("/{id}")
public JsonResult findById(@PathVariable("id")Integer id) {
return JsonResult.success(missionService.findById(id));
}



/**
* 查询问题以及问题类型列表
*/


/**
* 修改问题
*/

/**
* 查询问题详情
*/


/**
* 问题确认(支持批量)
*/

/**
* 问题忽略(支持批量)
*/

/**
* 提交并生成报告
*/










}

+ 74
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/controller/QuestionController.java View File

@@ -0,0 +1,74 @@
package com.tuoheng.admin.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.domain.Question;
import com.tuoheng.admin.entity.request.QuestionQuery;
import com.tuoheng.admin.service.IQuestionService;
import com.tuoheng.common.common.OperationEnum;
import com.tuoheng.system.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
* 巡检问题表 前端控制器
*
* @author WangHaoran
* @since 2021-09-02
*/
@RestController
@RequestMapping("/question")
public class QuestionController {

@Autowired
IQuestionService questionService;

/**
* 获取巡检问题列表(分页)
*
* @param questionQuery 查询条件
* @return
*/
@GetMapping("/index")
public IPage<Question> index(QuestionQuery questionQuery) {
return questionService.queryPage(questionQuery);
}

/**
* 添加巡检问题
*
* @param entity 实体对象
* @return
*/
@PostMapping("/add")
public OperationEnum add(@RequestBody Question entity) {
entity.setCreateUserName(ShiroUtils.getUserInfo().getUsername());
questionService.edit(entity);
return OperationEnum.OPERATION_SUCCESS;
}

/**
* 编辑巡检问题
*
* @param entity 实体对象
* @return
*/
@PutMapping("/edit")
public OperationEnum edit(@RequestBody Question entity) {
entity.setUpdateUserName(ShiroUtils.getUserInfo().getUsername());
questionService.edit(entity);
return OperationEnum.OPERATION_SUCCESS;
}

/**
* 删除巡检问题
*
* @param ids 巡检问题ID
* @return
*/
@DeleteMapping("/{ids}")
public OperationEnum delete(@PathVariable("ids") Integer[] ids) {
questionService.deleteByIds(ids);
return OperationEnum.OPERATION_SUCCESS;
}

}

+ 75
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/controller/TenantController.java View File

@@ -0,0 +1,75 @@
package com.tuoheng.admin.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.domain.Tenant;
import com.tuoheng.admin.entity.dto.TenantDto;
import com.tuoheng.admin.entity.request.TenantQuery;
import com.tuoheng.admin.service.ITenantService;
import com.tuoheng.common.common.OperationEnum;
import com.tuoheng.common.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import com.tuoheng.common.common.BaseController;

/**
* <p>
* 企业管理表 前端控制器
* </p>
*
* @author 拓恒
* @since 2022-07-15
*/
@RestController
@RequestMapping("/tenant")
public class TenantController extends BaseController {
@Autowired
private ITenantService tenantService;

/**
* 获取职级列表
*
* @param levelQuery 查询条件
* @return
*/
@GetMapping("/index")
public IPage<Tenant> index(TenantQuery levelQuery) {
return tenantService.getTenantList(levelQuery);
}

/**
* 添加职级
*
* @param tenantDto 实体对象
* @return
*/
@PostMapping("/add")
public OperationEnum add(@RequestBody TenantDto tenantDto) {
tenantService.addTenant(tenantDto);
return OperationEnum.OPERATION_SUCCESS;
}

/**
* 编辑职级
*
* @param tenantDto 实体对象
* @return
*/
@PutMapping("/edit")
public OperationEnum edit(@RequestBody TenantDto tenantDto) {
tenantService.editTenant(tenantDto);
return OperationEnum.OPERATION_SUCCESS;
}

/**
* 删除职级
*
* @param tenantIds 职级ID
* @return
*/
@DeleteMapping("/delete/{tenantIds}")
public JsonResult delete(@PathVariable("tenantIds") Integer[] tenantIds) {
return tenantService.deleteByIds(tenantIds);
}
}

+ 127
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/controller/ThInspectionQuestionController.java View File

@@ -0,0 +1,127 @@
package com.tuoheng.admin.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.entity.domain.ThInspectionFile;
import com.tuoheng.admin.entity.request.QueryQuestionPictureRequest;
import com.tuoheng.admin.entity.request.QueryQuestionRequest;
import com.tuoheng.admin.entity.request.QuestionInventoryRequest;
import com.tuoheng.admin.entity.vo.QuestionInventoryVo;
import com.tuoheng.admin.entity.vo.ThInspectionQuestionPictureVo;
import com.tuoheng.admin.entity.vo.ThInspectionQuestionVo;
import com.tuoheng.common.common.OperationEnum;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
* 巡检问题 前端控制器
*
* @author zhu_zishuang
* @date 2021/9/26
*/
@RestController
@RequestMapping("/inspection/question")
public class ThInspectionQuestionController {
/**
* 巡检问题接口
*/
// @Autowired
// private IThInspectionFileService iThInspectionFileService;

/**
* 查询 巡检任务问题 列表
*
* @author zhu_zishuang
* @date 2021/9/1
*/
@GetMapping("/findList")
public IPage<ThInspectionQuestionVo> findList(QueryQuestionRequest request) {
return null;//iThInspectionFileService.findList(request);
}

/**
* 查询 巡检任务问题图片 列表
*
* @author zhu_zishuang
* @date 2021/9/28
*/
@GetMapping("/findPictureList")
public Page<ThInspectionQuestionPictureVo> findPictureList(@Validated QueryQuestionPictureRequest request) {
return null;//iThInspectionFileService.findPictureList(request);
}

/**
* 查询 巡检任务问题图片 详情
*
* @author zhu_zishuang
* @date 2021/9/28
*/
@GetMapping("/findPicture")
public ThInspectionQuestionPictureVo findPicture(Integer id) {
return null;//iThInspectionFileService.findPicture(id);
}

/**
* 删除 巡检任务问题图片
*
* @author zhu_zishuang
* @date 2021/9/28
*/
@GetMapping("/delete")
public OperationEnum delete(Integer id) {
return null;//iThInspectionFileService.deleteById(id);
}

/**
* 审核/修改 巡检任务问题图片
*
* @author zhu_zishuang
* @date 2021/9/28
*/
@PutMapping("/updateById")
public OperationEnum updateById(@RequestBody ThInspectionFile thInspectionFile) {
return null;//iThInspectionFileService.updateById(thInspectionFile);
}

/**
* 生成工单
*
* @author WangHaoran
* @date 2021/11/23
*/
@GetMapping("/generateWorkOrder")
public OperationEnum generateWorkOrder(Integer inspectionId) {
return null;//iThInspectionFileService.generateWorkOrder(inspectionId);
}

/**
* 新增 巡检任务问题图片
*
* @author zhu_zishuang
* @date 2021/9/28
*/
@PostMapping("/addInspectionFile")
public OperationEnum addInspectionFile(@RequestParam("originalImage") String originalImage,
@RequestParam("aiImage") String aiImage,
@RequestParam("questionId") Integer questionId,
@RequestParam("inspectionId") Integer inspectionId,
@RequestParam("location") String location,
@RequestParam("questionDesc") String questionDesc,
@RequestParam("status") Integer status,
@RequestParam("sourceFileId") Integer sourceFileId,
@RequestParam(value = "longitude",required = false) String longitude,
@RequestParam(value = "latitude",required = false) String latitude) {
return null;//iThInspectionFileService.addInspectionFile(originalImage, aiImage, questionId, inspectionId, location, questionDesc, status, sourceFileId, longitude, latitude);
}

/**
* 查询问题清单
*
* @author: WangHaoran
* @date: 2021/9/28
*/
@GetMapping("/queryQuestionInventory")
public IPage<QuestionInventoryVo> queryQuestionInventory(QuestionInventoryRequest request) {
return null;//iThInspectionFileService.queryQuestionInventory(request);
}
}

+ 125
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/InspectionFile.java View File

@@ -0,0 +1,125 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.tuoheng.common.common.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
* 巡检附件表
*
* @author WangHaoran
* @since 2021-06-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_inspection_file")
public class InspectionFile extends BaseEntity {

/**
* 图片编码
*/
private String fileCode;

/**
* 巡检任务ID
*/
private Integer inspectionId;

/**
* 附件类型:1图片 2视频
*/
private Integer fileType;

/**
* 文件名称
*/
private String fileName;

/**
* 缩略图
*/
private String fileThumbnail;

/**
* 原图
*/
private String fileOriginal;

/**
* 标记图
*/
private String fileImage;

/**
* 文件大小
*/
private Double fileSize;

/**
* 纬度(原始图片纬度)
*/
private String latitude;

/**
* 经度(原始图片经度)
*/
private String longitude;

/**
* 位置信息
*/
private String location;

/**
* 高德地图经度
*/
private String gaodeLongitude;

/**
* 高德地图纬度
*/
private String gaodeLatitude;

/**
* 高德地图地址
*/
private String gaodeAddress;

/**
* 问题类型ID
*/
private Integer questionId;

/**
* 图片来源:1AI 2后台 3视频
*/
private Integer source;

/**
* 详细描述
*/
private String questionDesc;

/**
* 审核状态:0待审核 1已审核
*/
private Integer status;

/**
* 审核人
*/
private String checkUser;

/**
* 审核时间
*/
private String checkTime;

/**
* 租户id
*/
private Integer tenantId;
}

+ 73
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/InspectionQuestionItem.java View File

@@ -0,0 +1,73 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.common.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* 巡检问题工单子表
*
* @author WangHaoran
* @since 2021-09-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_inspection_question_item")
public class InspectionQuestionItem extends BaseEntity implements Serializable {

private static final long serialVersionUID = 1L;
/**
* 巡检任务ID
*/
private Integer inspectionId;

/**
* 巡检问题工单ID
*/
private Integer inspectionQuestionId;

/**
* 巡检问题文件ID
*/
private Integer inspectionFileId;

/**
* 处理状态:0待处理 1已处理
*/
private Integer status;

/**
* 巡检问题文件ID
*/
private Integer handlerUser;

/**
* 处理后图片(多个图片逗号“,”分隔)
*/
private String handlerImage;

/**
* 处理结果
*/
private String handlerResult;

/**
* 处理完成时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date handlerTime;

/**
* 租户id
*/
private Integer tenantId;
}

+ 52
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/Question.java View File

@@ -0,0 +1,52 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.tuoheng.common.common.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
* 巡检问题表
*
* @author WangHaoran
* @since 2021-09-02
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_question")
public class Question extends BaseEntity {

/**
* 项目名称:1水面 2岸线 3水质 4排口
*/
private Integer name;

/**
* 项目类型:1日常监测 2重点核查
*/
private Integer type;

/**
* 巡检内容
*/
private String content;

/**
* 排序
*/
private Integer sort;


/**
* 添加人名称
*/
private String createUserName;

/**
* 更新人名称
*/
private String updateUserName;

}

+ 103
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/Tenant.java View File

@@ -0,0 +1,103 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;

import java.time.LocalDateTime;

import com.tuoheng.common.common.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
* <p>
* 企业管理表
* </p>
*
* @author 拓恒
* @since 2022-07-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_tenant")
public class Tenant extends BaseEntity {

private static final long serialVersionUID = 1L;

/**
* 租户名称
*/
private String name;

/**
* 租户编号
*/
private String code;

/**
* 租户LOGO
*/
private String logo;

/**
* 上级ID
*/
private Integer pid;

/**
* 租户类型:1政府 2企业 3组织
*/
private Integer type;

/**
* 租户电话
*/
private String phone;

/**
* 租户邮箱
*/
private String email;

/**
* 省份编号
*/
private String provinceCode;

/**
* 市区编号
*/
private String cityCode;

/**
* 区县编号
*/
private String districtCode;

/**
* 详细地址
*/
private String address;

/**
* 租户简介
*/
private String intro;

/**
* 状态:1正常 2禁用
*/
private Integer status;

/**
* 备注
*/
private String note;

/**
* 排序号
*/
private Integer sort;

}

+ 81
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspection.java View File

@@ -0,0 +1,81 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.admin.enums.MarkTypeEnum;
import com.tuoheng.common.common.BaseEntity;
import com.tuoheng.system.utils.ShiroUtils;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* th_flight_data
* @author qiujinyang
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_inspection")
public class ThInspection extends BaseEntity implements Serializable {

private static final long serialVersionUID = 1L;

public ThInspection(){
// setCreateUser(ShiroUtils.getUserId());
// setUpdateUser(ShiroUtils.getUserId());
setCreateTime(new Date());
setUpdateTime(new Date());
setMark(MarkTypeEnum.VALID.getCode());
}

/**
* 租户id
*/
private Integer tenantId;

/**
* 任务ID
*/
private Integer missionId;

/**
* 巡检的ID,跟硬件对接的时候,硬件的巡检ID
*/
private Integer inspectionId;


/**
* 地面站标识
*/
private Integer hostIp;


/**
* 飞行高度
*/
private String altitude;

/**
* 经度
*/
private String lng;

/**
* 纬度
*/
private String lat;


/**
* 飞行时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private String timestamp;

}

+ 88
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionCheck.java View File

@@ -0,0 +1,88 @@
package com.tuoheng.admin.entity.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* th_inspection_check
* @author
*/
@Data
public class ThInspectionCheck implements Serializable {
/**
* ID
*/
private Integer id;

/**
* 巡检任务ID
*/
private Integer inspectionId;

/**
* 审核人
*/
private Integer checkUser;

/**
* 审核人姓名
*/
private String checkUserName;

/**
* 审核时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date checkTime;

/**
* 审核状态:1审核通过 2审核未通过
*/
private Integer status;

/**
* 审核备注
*/
private String note;

/**
* 创建人
*/
private Integer createUser;

/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

/**
* 更新人
*/
private Integer updateUser;

/**
* 更新时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;

/**
* 有效标记
*/
private Integer mark;

private static final long serialVersionUID = 1L;

/**
* 租户id
*/
private Integer tenantId;
}

+ 23
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionDetail.java View File

@@ -0,0 +1,23 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.tuoheng.common.common.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/27 11:31
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_inspection_detail")
public class ThInspectionDetail extends BaseEntity implements Serializable {

private static final long serialVersionUID = 1L;
}

+ 163
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionFile.java View File

@@ -0,0 +1,163 @@
package com.tuoheng.admin.entity.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* th_inspection_file
* @author
*/
@Data
public class ThInspectionFile implements Serializable {
/**
* ID
*/
private Integer id;

/**
* 图片编码
*/
private String fileCode;

/**
* 巡检任务ID
*/
private Integer inspectionId;

/**
* 附件类型:1图片 2视频
*/
private Integer fileType;

/**
* 文件名称
*/
private String fileName;

/**
* 缩略图
*/
private String fileThumbnail;

/**
* 原图
*/
private String fileOriginal;

/**
* 标记图
*/
private String fileImage;

/**
* 文件大小
*/
private Double fileSize;

/**
* 纬度(原始图片纬度)
*/
private String latitude;

/**
* 经度(原始图片经度)
*/
private String longitude;

/**
* 后台上传图片的拍摄时间
*/
private Long shootTime;

/**
* 位置信息
*/
private String location;

/**
* 高德地图经度
*/
private String gaodeLongitude;

/**
* 高德地图纬度
*/
private String gaodeLatitude;

/**
* 高德地图地址
*/
private String gaodeAddress;

/**
* 问题类型ID
*/
private Integer questionId;

/**
* 图片来源:1AI 2后台 3视频
*/
private Integer source;

/**
* 详细描述
*/
private String questionDesc;

/**
* 审核状态:0待审核 1已审核
*/
private Integer status;

/**
* 审核人
*/
private Integer checkUser;

/**
* 审核时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date checkTime;

/**
* 创建人
*/
private Integer createUser;

/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

/**
* 更新人
*/
private Integer updateUser;

/**
* 更新时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;

/**
* 有效标记
*/
private Integer mark;

private static final long serialVersionUID = 1L;

/**
* 租户id
*/
private Integer tenantId;
}

+ 90
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThInspectionQuestion.java View File

@@ -0,0 +1,90 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
* 问题工单映射实体
*
* @author zhuzishuang
* @date 2021/10/8
*/
@Data
public class ThInspectionQuestion implements Serializable {
/**
* ID
*/
@TableId(type = IdType.AUTO)
private Integer id;

/**
* 问题工单号
*/
private String code;

/**
* 巡检ID
*/
private Integer inspectionId;

/**
* 处理状态:1问题待指派 2问题待处理 3问题处理中 4问题已处理
*/
private Boolean status;

/**
* 指派负责人
*/
private Integer assignUser;

/**
* 指派负责人联系方式
*/
private String assignContact;

/**
* 指派备注
*/
private String assignNote;

/**
* 指派时间
*/
private Date assignTime;

/**
* 创建人
*/
private Integer createUser;

/**
* 创建时间
*/
private Date createTime;

/**
* 更新人
*/
private Integer updateUser;

/**
* 更新时间
*/
private Date updateTime;

/**
* 有效标记
*/
private Boolean mark;

private static final long serialVersionUID = 1L;

/**
* 租户id
*/
private Integer tenantId;
}

+ 154
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/domain/ThMission.java View File

@@ -0,0 +1,154 @@
package com.tuoheng.admin.entity.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.admin.enums.MarkTypeEnum;
import com.tuoheng.common.common.BaseEntity;
import com.tuoheng.system.utils.ShiroUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
* ThMission
*
* @author qiujinyang
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_mission")
public class ThMission extends BaseEntity implements Serializable {

private static final long serialVersionUID = 1L;

public ThMission(){
// setCreateUser(ShiroUtils.getUserId());
// setUpdateUser(ShiroUtils.getUserId());
setCreateTime(new Date());
setUpdateTime(new Date());
setMark(MarkTypeEnum.VALID.getCode());
}

/**
* 巡检任务编号
*/
private String code;

/**
* 巡检任务名称
*/
private String name;

/**
* 巡检任务类型 1 常规;2 日常
*/
private Integer type;

/**
* 巡检方式 1 机场服务,2 人工巡检
*/
private Integer inspectionType;

/**
* 巡检机场
*/
private String airportId;

/**
* 巡检线路
*/
private String inspectionLine;

/**
* 巡检机场名称
*/
private String airportName;

/**
* 巡检线路名称
*/
private String inspectionLineName;

/**
* 任务状态:1任务待飞行 2任务飞行中 3任务执行失败 4任务飞行完成
*/
private Integer status;

/**
* 视频推流地址
*/
private String pushUrl;

/**
* 视频拉流地址
*/
private String pullUrl;

/**
* AI拉流地址
*/
private String aipullUrl;

/**
* AI推流地址
*/
private String aipushUrl;

/**
* 执行开始时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date executionStartTime;

/**
* 执行结束时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date executionEndTime;


/**
* 原视频地址
*/
private String videoUrl;

/**
* AI识别后视频地址
*/
private String aiVideoUrl;

/**
* AI处理状态
*/
private Integer analyseStatus;

/**
* 算法分析进度
*/
private Double progressbar;

/**
* 备注
*/
private String note;

/**
* 巡检报告是否生成 是否生成 0 未生成 1 已生成
*/
private Integer reportStatus;

/**
* 租户id
*/
private Integer tenantId;
}

+ 46
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/AiAnalysisResult.java View File

@@ -0,0 +1,46 @@
package com.tuoheng.admin.entity.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
* Ai分析结果
* @author chenyukun
*/
@Getter
@Setter
@Accessors(chain = true)
public class AiAnalysisResult implements Serializable {

/**
* 原图地址或原视频地址
*/
@JsonProperty("original_url")
private String originalUrl;

/**
* Ai分析图片地址或视频地址
*/
@JsonProperty("sign_url")
private String signUrl;

/**
* 分类标识
*/
@JsonProperty("category_id")
private String categoryId;

/**
* 问题描述
*/
private String description;

/**
* 时间戳
*/
private String time;
}

+ 41
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/AiOfflineTask.java View File

@@ -0,0 +1,41 @@
package com.tuoheng.admin.entity.dto;


import lombok.Data;

/**
* 离线分析任务下发
*/
@Data
public class AiOfflineTask {

/**
* 唯一性标识
*/
private String msg_id;

/**
* 业务标识
*/
private String biz_id;

/**
* 模型标识
*/
private String mod_id;

/**
* 素材标识
*/
private String offering_id;

/**
* 素材类型
*/
private String offering_type;

/**
* 图片存储地址
*/
private String results_base_dir;
}

+ 60
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/AiTaskResult.java View File

@@ -0,0 +1,60 @@
package com.tuoheng.admin.entity.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;

/**
* @author chenyukun
*/
@Setter
@Getter
@Accessors(chain = true)
public class AiTaskResult implements Serializable {
/**
* 唯一性标识
*/
@JsonProperty("msg_id")
private String msgId;

/**
* 业务标识
*/
@JsonProperty("biz_id")
private String bizId;

/**
* 模型标识
*/
@JsonProperty("mod_id")
private String modId;

/**
* AI任务分析状态
*/
private String status;

/**
* 数据类型
*/
private String type;

/**
* AI任务错误信息
*/
private String error;

/**
* AI任务分析进度
*/
private String progressbar;

/**
* 结果
*/
private List<AiAnalysisResult> results;
}

+ 101
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/dto/TenantDto.java View File

@@ -0,0 +1,101 @@
package com.tuoheng.admin.entity.dto;

import lombok.Data;

/**
* 租户Dto
*/
@Data
public class TenantDto {

/**
* 租户ID
*/
private Integer id;

/**
* 租户名称
*/
private String name;

/**
* 租户编号
*/
private String code;

/**
* 租户LOGO
*/
private String logo;

/**
* 上级ID
*/
private Integer pid;

/**
* 租户类型:1政府 2企业 3组织
*/
private Integer type;

/**
* 租户电话
*/
private String phone;

/**
* 租户邮箱
*/
private String email;

/**
* 省份编号
*/
private String provinceCode;

/**
* 市区编号
*/
private String cityCode;

/**
* 区县编号
*/
private String districtCode;

/**
* 详细地址
*/
private String address;

/**
* 租户简介
*/
private String intro;

/**
* 状态:1正常 2禁用
*/
private Integer status;

/**
* 备注
*/
private String note;

/**
* 排序号
*/
private Integer sort;

/**
* 登录账号
*/
private String username;

/**
* 登录密码
*/
private String password;

}

+ 42
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/InspectionRequest.java View File

@@ -0,0 +1,42 @@
package com.tuoheng.admin.entity.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import javax.validation.constraints.NotNull;
/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 9:51
*/
@Data
public class InspectionRequest implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "巡检的ID,跟硬件对接的时候,硬件的巡检ID")
@NotNull(message = "巡检的ID不能为空!")
private Integer inspectionId;

@ApiModelProperty(value = "飞行高度")
@NotNull(message = "飞行高度不能为空!")
private String altitude;

@ApiModelProperty(value = "经度")
@NotNull(message = "经度不能为空!")
private String lng;

@ApiModelProperty(value = "纬度")
@NotNull(message = "纬度不能为空!")
private String lat;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "飞行时间")
@NotNull(message = "飞行时间不能为空!")
private String timestamp;

}

+ 45
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/MissionQuery.java View File

@@ -0,0 +1,45 @@
package com.tuoheng.admin.entity.request;

import com.tuoheng.common.common.BaseQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Value;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
* 查询巡检任务请求实体
* @author: qiujinyang
*/
@Data
public class MissionQuery extends BaseQuery {

private Integer id;

@ApiModelProperty(value = "任务名称")
private String name;

@ApiModelProperty(value = "任务编号")
private String code;

@ApiModelProperty(value = "巡检方式 1 机场服务,2 人工巡检")
private Integer inspectionType;

@ApiModelProperty(value = "任务飞行状态:1任务待飞行 2任务飞行中 3任务执行失败 4任务飞行完成")
private Integer status;

@ApiModelProperty(value = "巡检机场")
private String airportId;

@ApiModelProperty(value = "巡检线路")
private String inspectionLine;

@ApiModelProperty(value = "任务类型")
private Integer type;

@ApiModelProperty(value = "租户Id",hidden = true)
private Integer tenantId;
}

+ 109
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/MissionRequest.java View File

@@ -0,0 +1,109 @@
package com.tuoheng.admin.entity.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.common.BaseQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
* 巡检任务 新增或修改请求参数
* @author: qiujinyang
* @date: 2021/9/7
*/
@Data
public class MissionRequest {
private static final long serialVersionUID = 1L;

private Integer id;

/**
* 巡检任务名称
*/
@NotNull(message = "任务名称不能为空!")
@ApiModelProperty(value = "任务名称")
private String name;


/**
* 巡检方式 1 机场服务,2 人工巡检
*/
@NotNull(message = "巡检方式不能为空!")
@ApiModelProperty(value = "巡检方式 1 机场服务,2 人工巡检")
private Integer inspectionType;

/**
* 巡检机场
*/
@NotNull(message = "巡检机场不能为空!")
@ApiModelProperty(value = "巡检机场")
private String airportId;

/**
* 巡检机场名称
*/
@NotNull(message = "巡检机场名称不能为空!")
@ApiModelProperty(value = "巡检机场名称")
private String airportName;

/**
* 巡检线路
*/
@NotNull(message = "巡检线路不能为空!")
@ApiModelProperty(value = "巡检线路")
private String inspectionLine;

/**
* 巡检线路名称
*/
@NotNull(message = "巡检线路名称不能为空!")
@ApiModelProperty(value = "巡检线路名称")
private String inspectionLineName;

/**
* 巡检任务类型 1 日常,2 应急巡检
*/
@NotNull(message = "任务类型不能为空!")
@ApiModelProperty(value = "任务类型,1 日常,2 应急巡检")
private Integer type;

/**
* 执行开始时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "巡检时间")
@NotNull(message = "巡检时间不能为空!")
private Date executionStartTime;

/**
* 执行结束时间,飞行结束的时候才会填充的时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "巡检结束时间")
private Date executionEndTime;

/**
* 视频地址
*/
@ApiModelProperty(value = "视频地址")
private String videoUrl;


@ApiModelProperty(value = "任务飞行状态:1任务待飞行 2任务飞行中 3任务执行失败 4任务飞行完成")
private Integer status;


@ApiModelProperty(value = "备注")
private String note;


@ApiModelProperty(value = "租户id",hidden = true)
private Integer tenantId;

}

+ 34
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/MissionStatusRequest.java View File

@@ -0,0 +1,34 @@
package com.tuoheng.admin.entity.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import java.util.Date;

/**
* 巡检任务 新增或修改请求参数
* @author: qiujinyang
* @date: 2021/9/7
*/
@Data
public class MissionStatusRequest {
private static final long serialVersionUID = 1L;

@NotNull(message = "任务名称不能为空!")
@ApiModelProperty(value = "任务ID不能为空")
private Integer id;

@NotNull(message = "视频推流地址不能为空!")
@ApiModelProperty(value = "视频推流地址不能为空")
private String pushUrl;

@NotNull(message = "视频拉流地址不能为空!")
@ApiModelProperty(value = "视频拉流地址不能为空")
private String pullUrl;

@ApiModelProperty(value = "任务飞行状态:1任务待飞行 2任务飞行中 3任务执行失败 4任务飞行完成")
private Integer status;
}

+ 42
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QueryQuestionPictureRequest.java View File

@@ -0,0 +1,42 @@
package com.tuoheng.admin.entity.request;

import com.tuoheng.common.common.BaseQuery;
import lombok.Data;

import javax.validation.constraints.NotNull;


/**
* 查询巡检问题图片请求参数
*
* @author: zhu_zishuang
* @date: 2021/9/26
*/
@Data
public class QueryQuestionPictureRequest extends BaseQuery {
/**
* 巡检ID
*/
@NotNull(message = "巡检ID不能为空!")
private Integer inspectionId;

/**
* 问题类型一级分类ID
*/
private Integer questionName;

/**
* 图片来源:1AI 2后台 3视频
*/
private Integer source;

/**
* 图片审核状态:0待审核 1已审核
*/
private Integer status;

/**
* 巡检内容
*/
private String content;
}

+ 44
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QueryQuestionRequest.java View File

@@ -0,0 +1,44 @@
package com.tuoheng.admin.entity.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.common.BaseQuery;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
* 查询巡检问题请求参数
*
* @author: zhu_zishuang
* @date: 2021/9/26
*/
@Data
public class QueryQuestionRequest extends BaseQuery {
/**
* 河道名称
*/
private String streamName;

/**
* 巡检任务编号
*/
private String inspectionCode;

/**
* 巡检时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inspectionTime;

/**
* 任务名称
*/
private String inspectionName;

/**
* 任务状态
*/
private Integer status;
}

+ 34
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QuestionFileRequest.java View File

@@ -0,0 +1,34 @@
package com.tuoheng.admin.entity.request;

import com.tuoheng.common.common.BaseQuery;
import lombok.Data;

/**
* 查询问题清单列表 请求参数
*
* @author: WangHaoran
* @date: 2021/9/26
*/
@Data
public class QuestionFileRequest extends BaseQuery {

/**
* 项目名称:1河湖水面 2河湖岸线 3河湖感观水质4入河、湖异常排口
*/
private Integer name;

/**
* 巡检ID
*/
private Integer inspectionId;

/**
* 图片ID
*/
private Integer fileId;

/**
* 图片图片
*/
private String fileCode;
}

+ 45
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QuestionInventoryRequest.java View File

@@ -0,0 +1,45 @@
package com.tuoheng.admin.entity.request;

import com.tuoheng.common.common.BaseQuery;
import lombok.Data;

/**
* 查询问题清单 请求参数
*
* @author: WangHaoran
* @date: 2021/9/26
*/
@Data
public class QuestionInventoryRequest extends BaseQuery {

/**
* 河流名称
*/
private String streamName;

/**
* 巡检时间
*/
private String inspectionTime;

/**
* 工单编码
*/
private String code;

/**
* 巡检编码
*/
private String inspectionCode;

/**
* 处理状态:1问题待指派 2问题待处理 3问题处理中 4问题已处理
*/
private String status;

/**
* 巡检名称
*/
private String inspectionName;

}

+ 28
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/QuestionQuery.java View File

@@ -0,0 +1,28 @@
package com.tuoheng.admin.entity.request;

import com.tuoheng.common.common.BaseQuery;
import lombok.Data;

/**
* 巡检问题查询
*
* @author WangHaoran
* @since 2021-09-02
*/
@Data
public class QuestionQuery extends BaseQuery {
/**
* 项目名称:1水面 2岸线 3水质 4排口
*/
private Integer name;

/**
* 项目类型:1日常监测 2重点核查
*/
private Integer type;

/**
* 巡检内容
*/
private String content;
}

+ 53
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/ReportRequest.java View File

@@ -0,0 +1,53 @@
package com.tuoheng.admin.entity.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.common.BaseQuery;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

/**
* 报告查询
*
* @author WangHaoran
* @since 2021-10-8
*/
@Data
public class ReportRequest extends BaseQuery {

/**
* 河流名称
*/
private String streamName;

/**
* 巡检时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private String inspectionTime;

/**
* 报告编号
*/
private String reportNo;

/**
* 报告ID
*/
private Integer reportId;

/**
* 巡检ID
*/
private Integer inspectionId;

/**
* 巡检编码
*/
private String inspectionCode;

/**
* 巡检名称
*/
private String inspectionName;
}

+ 17
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/TenantQuery.java View File

@@ -0,0 +1,17 @@
package com.tuoheng.admin.entity.request;

import com.tuoheng.common.common.BaseQuery;
import lombok.Data;

/**
* 租户查询条件
*/
@Data
public class TenantQuery extends BaseQuery {

/**
* 租户名称
*/
private String name;

}

+ 71
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/UAVKHQuestionRequest.java View File

@@ -0,0 +1,71 @@
package com.tuoheng.admin.entity.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* 常规巡河问题
*
* @author WangHaoran
* @since 2021-07-16
*/
@Data
public class UAVKHQuestionRequest implements Serializable {
private static final long serialVersionUID = 1L;

/**
* 帧号
*/
private String fid;
/**
* 问题类型
*/
private String type;

/**
* 问题类型ID
*/
private Integer typeId;

/**
* 图片Base64
*/
private String imgData;

/**
* 图片名称,包含.jpg后缀
*/
private String imgName;

/**
* 原始图片Base64
*/
private String imgDataOriginal;

/**
* 原始图片名称,包含.jpg后缀
*/
private String imgNameOriginal;

/**
* 巡检编码
*/
private String code;

/**
* 备注
*/
private String note;

/**
* 时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date time;
}

+ 15
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/UpdateLiveChannel.java View File

@@ -0,0 +1,15 @@
package com.tuoheng.admin.entity.request;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter
@Setter
@Accessors(chain = true)
public class UpdateLiveChannel {

private Integer id;

private Integer status;
}

+ 28
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/request/UploadVideoUrlRequest.java View File

@@ -0,0 +1,28 @@
package com.tuoheng.admin.entity.request;

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

@Data
public class UploadVideoUrlRequest {

/**
* 巡检ID
*/
@NotNull
private Integer inspectionId;

/**
* 视频地址
*/
@NotBlank
private String videoUrl;

/**
* 备注
*/
private String note;
}

+ 21
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AIInspectionVo.java View File

@@ -0,0 +1,21 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

/**
* AI分析返回视图Vo
*/
@Data
public class AIInspectionVo {

/**
* 巡检任务编号
*/
private String code;

/**
* 视频URL
*/
private String videoUrl;

}

+ 28
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirExecuteTaskVO.java View File

@@ -0,0 +1,28 @@
package com.tuoheng.admin.entity.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 13:31
*/
@NoArgsConstructor
@Data
public class AirExecuteTaskVO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "校验是否通过")
private Boolean result;

@ApiModelProperty(value = "错误信息")
private String check;

@ApiModelProperty(value = "建议值")
private String value;
}

+ 75
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirLineVO.java View File

@@ -0,0 +1,75 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 13:31
*/
@NoArgsConstructor
@Data
public class AirLineVO implements Serializable {

private static final long serialVersionUID = 1L;


@ApiModelProperty(value = "任务id")
private Integer id;

@ApiModelProperty(value = "任务编号")
private String code;

@ApiModelProperty(value = "任务名称")
private String name;

@ApiModelProperty(value = "无人机id")
private Integer droneId;

@ApiModelProperty(value = "无人机名称")
private String droneName;

@ApiModelProperty(value = "无人机直播播流地址")
private String liveUrl;

@ApiModelProperty(value = "航线id")
private Integer airlineFileId;

@ApiModelProperty(value = "航线名称")
private String airlineFileName;

@ApiModelProperty(value = "航线文件地址路径")
private String airlineFileUrl;

@ApiModelProperty(value = "执行类型,1单次2每天")
private Integer type;

@ApiModelProperty(value = "单次执行时间")
private String singleTime;

@ApiModelProperty(value = "每天执行时间")
private Object everydayTime;

@ApiModelProperty(value = "任务备注")
private Object note;

@ApiModelProperty(value = "任务状态1待执行 2执行中")
private Integer status;

@ApiModelProperty(value = "创建人",hidden = true)
private Integer createUser;

@ApiModelProperty(value = "创建时间",hidden = true)
private String createTime;

@ApiModelProperty(value = "修改用户",hidden = true)
private Integer updateUser;

@ApiModelProperty(value = "修改时间",hidden = true)
private String updateTime;
}

+ 72
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirPortVO.java View File

@@ -0,0 +1,72 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 13:31
*/
@NoArgsConstructor
@Data
public class AirPortVO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "机场id")
private Integer id;

@ApiModelProperty(value = "机场代码")
private String code;

@ApiModelProperty(value = "机场名称")
private String name;

@ApiModelProperty(value = "机场图片")
private String image;

@ApiModelProperty(value = "机场外部监控地址")
private String externalMonitorUrl;

@ApiModelProperty(value = "机场内部监控地址")
private String internalMonitorUrl;

@ApiModelProperty(value = "覆盖范围(km)")
private String coverage;

@ApiModelProperty(value = "排序")
private Integer sort;

@ApiModelProperty(value = "经度")
private String longitude;

@ApiModelProperty(value = "纬度")
private String latitude;

@ApiModelProperty(value = "无人机id")
private Integer droneId;

@ApiModelProperty(value = "无人机名称")
private String droneName;

@ApiModelProperty(value = "设备id")
private String edgeId;

@ApiModelProperty(value = "创建人",hidden = true)
private Integer createUser;

@ApiModelProperty(value = "创建时间",hidden = true)
private String createTime;

@ApiModelProperty(value = "修改人",hidden = true)
private Integer updateUser;

@ApiModelProperty(value = "修改时间",hidden = true)
private String updateTime;

}

+ 114
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/AirWeatherVO.java View File

@@ -0,0 +1,114 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 13:31
*/
@NoArgsConstructor
@Data
public class AirWeatherVO implements Serializable {

private static final long serialVersionUID = 1L;


@ApiModelProperty(value = "ACD")
private ACDDTO acd;
@ApiModelProperty(value = "WTH")
private WTHDTO wth;
@ApiModelProperty(value = "TAH")
private TAHDTO tah;

@NoArgsConstructor
@Data
public static class ACDDTO {
@ApiModelProperty(value = "parm")
private ParmDTO parm;
@ApiModelProperty(value = "mid")
private Integer mid;
@ApiModelProperty(value = "deviceid")
private String deviceid;
@ApiModelProperty(value = "timestamp")
private Integer timestamp;

@NoArgsConstructor
@Data
public static class ParmDTO {
@ApiModelProperty(value = "Tmp")
private Integer tmp;
}
}

@NoArgsConstructor
@Data
public static class WTHDTO {
@ApiModelProperty(value = "parm")
private ParmDTO parm;
@ApiModelProperty(value = "mid")
private Integer mid;
@ApiModelProperty(value = "deviceid")
private String deviceid;
@ApiModelProperty(value = "timestamp")
private Integer timestamp;

@NoArgsConstructor
@Data
public static class ParmDTO {
@ApiModelProperty(value = "Hum")
private Integer hum;
@ApiModelProperty(value = "Rainfull")
private Integer rainfull;
@ApiModelProperty(value = "Noise")
private Integer noise;
@ApiModelProperty(value = "co2")
private Integer co2;
@ApiModelProperty(value = "Lux")
private Integer lux;
@ApiModelProperty(value = "RainType")
private Integer rainType;
@ApiModelProperty(value = "Tmp")
private Integer tmp;
@ApiModelProperty(value = "PM2.5")
private Integer _$Pm25111;// FIXME check this code
@ApiModelProperty(value = "Dew")
private Integer dew;
@ApiModelProperty(value = "Hpa")
private Integer hpa;
@ApiModelProperty(value = "WSPD")
private Integer wspd;
@ApiModelProperty(value = "PM10")
private Integer pm10;
@ApiModelProperty(value = "WDIR")
private Integer wdir;
}
}

@NoArgsConstructor
@Data
public static class TAHDTO {
@ApiModelProperty(value = "parm")
private ParmDTO parm;
@ApiModelProperty(value = "mid")
private Integer mid;
@ApiModelProperty(value = "deviceid")
private String deviceid;
@ApiModelProperty(value = "timestamp")
private Integer timestamp;

@NoArgsConstructor
@Data
public static class ParmDTO {
@ApiModelProperty(value = "湿度")
private Integer hum;
@ApiModelProperty(value = "温度")
private Integer tmp;
}
}
}

+ 40
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/InspectionFileInfoVo.java View File

@@ -0,0 +1,40 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

@Data
public class InspectionFileInfoVo {

/**
* 主键
*/
private Integer id;

/**
* 标记图地址
*/
private String fileImage;

/**
* 纬度
*/
private String latitude;

/**
* 经度
*/
private String longitude;

/**
* 详细描述
*/
private String content;

private String handerName;

private String handTime;

private String handContent;

private String handImg;
}

+ 37
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/InspectionVO.java View File

@@ -0,0 +1,37 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.common.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 9:51
*/
@Data
public class InspectionVO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "任务id")
private Integer missionId;

@ApiModelProperty(value = "飞行高度")
private String altitude;

@ApiModelProperty(value = "经度")
private String lng;

@ApiModelProperty(value = "纬度")
private String lat;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "飞行时间")
private String timestamp;
}

+ 77
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/MissionVO.java View File

@@ -0,0 +1,77 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.common.BaseQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
* 巡检任务 新增或修改请求参数 2022/7/27
* @author : qiujinyang
*/
@Data
public class MissionVO {
private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "任务id")
private Integer id;

@ApiModelProperty(value = "任务名称")
private String name;

@ApiModelProperty(value = "巡检方式 1 机场服务,2 人工巡检")
private Integer inspectionType;

@ApiModelProperty(value = "巡检机场")
private String airportId;

@ApiModelProperty(value = "巡检机场名称")
private String airportName;

@ApiModelProperty(value = "巡检线路")
private String inspectionLine;

@ApiModelProperty(value = "巡检线路名称")
private String inspectionLineName;

@ApiModelProperty(value = "任务类型 1 日常,2 应急巡检")
private Integer type;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "巡检时间")
private Date executionStartTime;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "巡检结束时间")
private Date executionEndTime;

//直播的两个通道
@ApiModelProperty(value = "视频拉流地址")
private String pullUrl;
@ApiModelProperty(value = "AI拉流地址")
private String aipullUrl;


//回放的两个通道
@ApiModelProperty(value = "视频地址")
private String videoUrl;
@ApiModelProperty(value = "AI识别后视频地址")
private String aiVideoUrl;

@ApiModelProperty(value = "任务飞行状态:1任务待飞行 2任务飞行中 3任务执行失败 4任务飞行完成")
private Integer status;

@ApiModelProperty(value = "备注")
private String note;

@ApiModelProperty(value = "租户id",hidden = true)
private Integer tenantId;

}

+ 29
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionCountVo.java View File

@@ -0,0 +1,29 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

@Data
public class QuestionCountVo {

private Integer id;

/**
* 项目名称:1水面 2岸线 3水质 4排口
*/
private Integer name;

/**
* 项目类型:1日常监测 2重点核查
*/
private Integer type;

/**
* 巡检内容
*/
private String content;

/**
* 数量
*/
private Integer totalCount;
}

+ 69
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionDetailVo.java View File

@@ -0,0 +1,69 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

@Data
public class QuestionDetailVo {


/**
* 经度
*/
private String longitude;

/**
* 纬度
*/
private String latitude;

/**
* 位置信息
*/
private String location;

/**
* 标记图
*/
private String fileImage;

/**
* 项目名称:1水面 2岸线 3水质 4排口
*/
private Integer name;

/**
* 项目类型:1日常监测 2重点核查
*/
private Integer type;

/**
* 巡检内容
*/
private String content;

/**
* 处理后图片(多个图片逗号“,”分隔)
*/
private String handlerImage;

/**
* 处理结果
*/
private String handlerResult;

/**
* 处理完成时间
*/
private String handlerTime;

/**
* 处理人名称
*/
private String userName;

/**
* 处理状态:0待处理 1已处理
*/
private Integer status;

}

+ 53
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionFileVo.java View File

@@ -0,0 +1,53 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

@Data
public class QuestionFileVo {

/**
* th_inspection_file表ID
*/
private Integer id;

/**
* 图片编码
*/
private String fileCode;

/**
* 标记图地址
*/
private String fileImage;

/**
* 缩略图地址
*/
private String fileThumbnail;

/**
* 纬度
*/
private String latitude;

/**
* 经度
*/
private String longitude;

/**
* 项目名称:1水面 2岸线 3水质 4排口
*/
private Integer name;

/**
* 问题描述
*/
private String content;

/**
* 处理状态:0待处理 1已处理
*/
private Integer status;

}

+ 65
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionInventoryVo.java View File

@@ -0,0 +1,65 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

import java.util.List;

@Data
public class QuestionInventoryVo {

/**
* th_inspection_question表ID
*/
private Integer id;

/**
* 巡检ID
*/
private Integer inspectionId;

/**
* 清单编码(工单编码)
*/
private String code;

/**
* 巡检河道
*/
private String streamName;

/**
* 任务名称
*/
private String inspectionName;

/**
* 巡检编码
*/
private String inspectionCode;

/**
* 巡检时间
*/
private String inspectionTime;

/**
* 发现问题数量
*/
private Integer totalCount;

/**
* 未处理问题数量
*/
private Integer todoCount;

/**
* 处理状态:1问题待指派 2问题待处理 3问题处理中 4问题已处理
*/
private Integer status;

/**
* 问题类型统计
*/
private List<QuestionTypeCountVo> typeCount;

}

+ 17
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/QuestionTypeCountVo.java View File

@@ -0,0 +1,17 @@
package com.tuoheng.admin.entity.vo;

import lombok.Data;

@Data
public class QuestionTypeCountVo {

/**
* 项目名称:1水面 2岸线 3水质 4排口
*/
private Integer name;

/**
* 数量
*/
private Integer totalCount;
}

+ 63
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/ThInspectionFileVo.java View File

@@ -0,0 +1,63 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* 巡检问题工单 映射实体
*
* @author zhuzishuang
* @date 2021/9/27
*/
@Data
public class ThInspectionFileVo implements Serializable {
private static final long serialVersionUID = 1L;

/**
* 巡检ID
*/
private Integer inspectionId;

/**
* 巡检编码
*/
private String inspectionCode;

/**
* 巡检名称
*/
private String inspectionName;

/**
* 河流名称
*/
private String streamName;

/**
* 计划巡检日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inspectionTime;

/**
* 执行开始时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date executionStartTime;

/**
* 图片数量
*/
private Integer number;

/**
* 任务状态: 15 任务飞行完成(图片待审核);25 图片已审核(问题待分派)
*/
private Integer status;
}

+ 121
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/ThInspectionQuestionPictureVo.java View File

@@ -0,0 +1,121 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* 巡检问题图片 响应实体
*
* @author zhuzishuang
* @date 2021/9/27
*/
@Data
public class ThInspectionQuestionPictureVo implements Serializable {
private static final long serialVersionUID = 1L;

/**
* 问题ID
*/
private Integer id;

/**
* 图片编码
*/
private String fileCode;

/**
* 巡检任务ID
*/
private Integer inspectionId;

/**
* 问题 二级分类ID
*/
private Integer questionId;

/**
* 问题类型:1水面 2岸线 3水质 4排口
*/
private Integer questionName;

/**
* 巡检内容(问题二级分类名称)
*/
private String content;

/**
* 图片缩略图
*/
private String fileThumbnail;

/**
* 原图
*/
private String fileOriginal;

/**
* 标记图
*/
private String fileImage;

/**
* 位置信息
*/
private String location;

/**
* 纬度(原始图片纬度)
*/
private String latitude;

/**
* 纬度(原始图片纬度)
*/
private String longitude;

/**
* 高德地图经度
*/
private String gaodeLongitude;

/**
* 高德地图纬度
*/
private String gaodeLatitude;

/**
* 图片来源:1AI 2后台 3视频
*/
private Integer source;

/**
* 图片审核状态:0待审核 1已审核
*/
private Integer status;

/**
* 审核人ID
*/
private Integer checkUser;

/**
* 审核人
*/
private String checkUserName;

/**
* 详细描述
*/
private String questionDesc;

/**
* 审核时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date checkTime;
}

+ 76
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/entity/vo/ThInspectionQuestionVo.java View File

@@ -0,0 +1,76 @@
package com.tuoheng.admin.entity.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
* 巡检问题工单 映射实体
* 巡检问题 响应实体
*
* @author zhuzishuang
* @date 2021/9/27
*/
@Data
@EqualsAndHashCode
public class ThInspectionQuestionVo implements Serializable {
private static final long serialVersionUID = 1L;

/**
* 巡检ID
*/
private Integer inspectionId;

/**
* 巡检编码
*/
private String inspectionCode;

/**
* 巡检名称
*/
private String inspectionName;

/**
* 河流名称
*/
private String streamName;

/**
* 计划巡检日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inspectionTime;

/**
* 执行开始时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date executionStartTime;

/**
* 已审核图片数量
*/
private Integer reviewedPictureNum;

/**
* 未审核图片数量
*/
private Integer unreviewedPictureNum;

/**
* 图片总数量
*/
private Integer totalPictureNum;

/**
* 任务状态: 15 任务飞行完成(图片待审核);25 图片已审核(问题待分派)
*/
private Integer status;
}

+ 23
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/enums/AirPortTaskStatusEnum.java View File

@@ -0,0 +1,23 @@
package com.tuoheng.admin.enums;

import lombok.Getter;

/**
* 任务状态枚举
*/
public enum AirPortTaskStatusEnum {
//任务状态1待执行 2执行中
WAIT(1,"待执行"),
FLIGHT(2,"执行中");

AirPortTaskStatusEnum(int code, String description){
this.code = code;
this.description = description;
}

@Getter
private int code;

@Getter
private String description;
}

+ 24
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/enums/MarkTypeEnum.java View File

@@ -0,0 +1,24 @@
package com.tuoheng.admin.enums;

import lombok.Getter;

/**
* 逻辑删除标记类型
* @author chenyukun
*/
public enum MarkTypeEnum {
VALID(1,"有效"),

NOTVALID(0,"失效");

MarkTypeEnum(int code, String description){
this.code = code;
this.description = description;
}

@Getter
private int code;

@Getter
private String description;
}

+ 24
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/enums/QuestionEnum.java View File

@@ -0,0 +1,24 @@
package com.tuoheng.admin.enums;

import lombok.Getter;

/**
* 问题处理状态
*/
public enum QuestionEnum {

REVIEWED(1,"已审核"),

NOTREVIEWED(0,"待审核");

QuestionEnum(int code, String description){
this.code = code;
this.description = description;
}

@Getter
private int code;

@Getter
private String description;
}

+ 25
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/enums/TaskStatusEnum.java View File

@@ -0,0 +1,25 @@
package com.tuoheng.admin.enums;

import lombok.Getter;

/**
* 任务状态枚举
*/
public enum TaskStatusEnum {
//1任务待飞行 2任务飞行中 3任务执行失败 4任务飞行完成
WAIT(1,"任务待飞行"),
FLIGHT(2,"任务飞行中"),
FAIL(3,"任务执行失败"),
COMPLETE(4,"任务飞行完成");

TaskStatusEnum(int code, String description){
this.code = code;
this.description = description;
}

@Getter
private int code;

@Getter
private String description;
}

+ 24
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/QuestionMapper.java View File

@@ -0,0 +1,24 @@
package com.tuoheng.admin.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tuoheng.admin.entity.domain.Question;
import com.tuoheng.admin.entity.vo.QuestionCountVo;

import java.util.List;

/**
* 巡检问题表 Mapper 接口
*
* @author WangHaoran
* @since 2021-09-02
*/
public interface QuestionMapper extends BaseMapper<Question> {

/**
* 查询巡检结果
* @param inspectionId 巡检ID
* @param tenantId 租户id
* @return
*/
List<QuestionCountVo> queryCountByInspectionId(Integer inspectionId, Integer tenantId);
}

+ 16
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/TenantMapper.java View File

@@ -0,0 +1,16 @@
package com.tuoheng.admin.mapper;

import com.tuoheng.admin.entity.domain.Tenant;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
* <p>
* 企业管理表 Mapper 接口
* </p>
*
* @author 拓恒
* @since 2022-07-15
*/
public interface TenantMapper extends BaseMapper<Tenant> {

}

+ 130
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionFileMapper.java View File

@@ -0,0 +1,130 @@
package com.tuoheng.admin.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.entity.domain.InspectionFile;
import com.tuoheng.admin.entity.domain.ThInspectionFile;
import com.tuoheng.admin.entity.domain.ThMission;
import com.tuoheng.admin.entity.request.QueryQuestionPictureRequest;
import com.tuoheng.admin.entity.request.QueryQuestionRequest;
import com.tuoheng.admin.entity.request.QuestionInventoryRequest;
import com.tuoheng.admin.entity.vo.QuestionInventoryVo;
import com.tuoheng.admin.entity.vo.QuestionTypeCountVo;
import com.tuoheng.admin.entity.vo.ThInspectionQuestionPictureVo;
import com.tuoheng.admin.entity.vo.ThInspectionQuestionVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ThInspectionFileMapper extends BaseMapper<ThInspectionFile> {

/**
* 查询 巡检任务问题 列表
*
* @param queryQuestionRequest 查询请求参数
* @return 任务问题列表
*/
IPage<ThInspectionQuestionVo> selectQuestionList(@Param("page") IPage page, @Param("request") QueryQuestionRequest queryQuestionRequest,@Param("tenantId") Integer tenantId);

/**
* 查询 巡检任务问题图片 列表
*
* @param request 查询请求参数
* @return 问题图片列表
*/
List<ThInspectionQuestionPictureVo> selectPictureList(@Param("page") Page<ThInspectionQuestionPictureVo> page, @Param("request") QueryQuestionPictureRequest request,@Param("tenantId") Integer tenantId);

/**
* 查询 巡检任务问题图片数量
*
* @param parm parm
* @return
*/
Integer selectCount(@Param("parm") ThInspectionFile parm);

/**
* 查询 巡检任务问题图片 详情
*
* @param id 问题图片ID
* @return 问题图片详情
*/
ThInspectionQuestionPictureVo selectPicture(Integer id,@Param("tenantId") Integer tenantId);

/**
* 查询问题清单
*
* @param param 查询问题清单请求参数
* @return 问题清单
*/
IPage<QuestionInventoryVo> queryQuestionInventory(@Param("page") IPage page, QuestionInventoryRequest param,@Param("tenantId") Integer tenantId);

/**
* 根据工单ID 查询 问题类型数量统计
*
* @param id 工单ID
* @return 问题清单
*/
List<QuestionTypeCountVo> selectQuestionTypeCount(@Param("id") Integer id,@Param("tenantId") Integer tenantId);

/**
* 新增 巡检任务问题图片
*
* @param record 问题图片实体
* @return 受影响的条数
*/
int insert(ThInspectionFile record);

/**
* 批量新增 巡检任务问题图片
*
* @param records 问题图片实体
* @return 受影响的条数
*/
int batchadd(@Param("list") List<InspectionFile> records);

/**
* 审核/修改 巡检任务问题图片
*
* @param record 问题图片实体
* @return 受影响的条数
*/
int updateByPrimaryKey(ThInspectionFile record);

int updateByPrimaryKeySelective(ThInspectionFile record);

/**
* 查询 未审核问题图片数量
*
* @param inspectionId 巡检ID
* @return 未审核问题图片数量
*/
Integer getUnReviewCount(Integer inspectionId,@Param("tenantId") Integer tenantId);

/**
* 查询 已审核问题图片列表
*
* @param inspectionId 巡检ID
* @param tenantId 租户id
* @return 已审核问题图片列表
*/
List<ThInspectionFile> selectReviewPictureList(Integer inspectionId,@Param("tenantId") Integer tenantId);

/**
* 查询 问题图片列表
*
* @param inspectionId 巡检ID
* @return
*/
List<ThInspectionFile> selectByInspectionId(@Param("inspectionId") Integer inspectionId, @Param("fileName") String fileName,@Param("tenantId") Integer tenantId);

/**
* 删除任务相关的ai分析图
*
* @param inspectionId 巡检任务id
* @param tenantId 租户id
* @return
*/
Integer deleteByInspectionId(Integer inspectionId,@Param("tenantId") Integer tenantId);
}

+ 9
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionMapper.java View File

@@ -0,0 +1,9 @@
package com.tuoheng.admin.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tuoheng.admin.entity.domain.ThInspection;

import java.util.List;

public interface ThInspectionMapper extends BaseMapper<ThInspection> {
}

+ 14
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionQuestionItemMapper.java View File

@@ -0,0 +1,14 @@
package com.tuoheng.admin.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tuoheng.admin.entity.domain.InspectionQuestionItem;

/**
* 工单子项表
*
* @author zhuzishuang
* @date 2021/10/13
*/
public interface ThInspectionQuestionItemMapper extends BaseMapper<InspectionQuestionItem> {
}

+ 26
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThInspectionQuestionMapper.java View File

@@ -0,0 +1,26 @@
package com.tuoheng.admin.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tuoheng.admin.entity.domain.ThInspectionQuestion;

/**
* 巡检任务问题工单 mapper
*
* @author zhuzishuang
* @date 2021/9/28
*/
public interface ThInspectionQuestionMapper extends BaseMapper<ThInspectionQuestion> {

int insertSelective(ThInspectionQuestion record);

int deleteByPrimaryKey(Integer id);

int insert(ThInspectionQuestion record);

ThInspectionQuestion selectByPrimaryKey(Integer id);

int updateByPrimaryKeySelective(ThInspectionQuestion record);

int updateByPrimaryKey(ThInspectionQuestion record);
}

+ 18
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/ThMissionMapper.java View File

@@ -0,0 +1,18 @@
package com.tuoheng.admin.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.entity.domain.ThMission;
import com.tuoheng.admin.entity.request.MissionQuery;
import com.tuoheng.admin.entity.vo.AIInspectionVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ThMissionMapper extends BaseMapper<ThMission> {
/**
* 批量删除巡检任务
*
*/
int deleteBatch(@Param("idList") List<Integer> idList, @Param("updateUser") Integer updateUser, @Param("tenantId") Integer tenantId);
}

+ 121
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/oss/PutObjectProgressListener.java View File

@@ -0,0 +1,121 @@
package com.tuoheng.admin.oss;

import com.aliyun.oss.event.ProgressEvent;
import com.aliyun.oss.event.ProgressEventType;
import com.aliyun.vod.upload.impl.VoDProgressListener;

/**
* 上传进度回调方法类
* 当您开启上传进度回调时该事件回调才会生效。
* OSS分片上传成功或失败均触发相应的回调事件,您可根据业务逻辑处理相应的事件回调。
* 当创建音视频信息成功后,此上传进度回调中的videoId为本次上传生成的视频ID,您可以根据视频ID进行音视频管理。
* 当创建图片信息成功后,此上传进度回调中的ImageId为本次上传生成的图片ID,您可以根据视频ID进行图片管理。
*/

public class PutObjectProgressListener implements VoDProgressListener {
/**
* 已成功上传至OSS的字节数
*/
private long bytesWritten = 0;
/**
* 原始文件的总字节数
*/
private long totalBytes = -1;
/**
* 本次上传成功标记
*/
private boolean succeed = false;
/**
* 视频ID
*/
private String videoId;
/**
* 图片ID
*/
private String imageId;

public void progressChanged(ProgressEvent progressEvent) {
long bytes = progressEvent.getBytes();
ProgressEventType eventType = progressEvent.getEventType();
switch (eventType) {
// 开始上传事件
case TRANSFER_STARTED_EVENT:
if (videoId != null) {
System.out.println("qqqqStart to upload videoId " + videoId + "......");
}
if (imageId != null) {
System.out.println("aaaStart to upload imageId " + imageId + "......");
}
break;
// 计算待上传文件总大小事件通知,只有调用本地文件方式上传时支持该事件
case REQUEST_CONTENT_LENGTH_EVENT:
this.totalBytes = bytes;
System.out.println(this.totalBytes + "bytes in total will be uploaded to OSS.");
break;
// 已经上传成功文件大小事件通知
case REQUEST_BYTE_TRANSFER_EVENT:
this.bytesWritten += bytes;
if (this.totalBytes != -1) {
int percent = (int) (this.bytesWritten * 100.0 / this.totalBytes);
System.out.println(bytes + " bytes have been written at this time, upload progress: " +
percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
} else {
//进度条
System.out.println(bytes + " bytes have been written at this time, upload sub total : " +
"(" + this.bytesWritten + ")");
}
break;
// 文件全部上传成功事件通知
case TRANSFER_COMPLETED_EVENT:
this.succeed = true;
if (videoId != null) {
System.out.println("Succeed to upload videoId " + videoId + " , " + this.bytesWritten + " bytes have been transferred in total.");
}
if (imageId != null) {
System.out.println("Succeed to upload imageId " + imageId + " , " + this.bytesWritten + " bytes have been transferred in total.");
}
break;
// 文件上传失败事件通知
case TRANSFER_FAILED_EVENT:
if (videoId != null) {
System.out.println("Failed to upload videoId " + videoId + " , " + this.bytesWritten + " bytes have been transferred.");
}
if (imageId != null) {
System.out.println("Failed to upload imageId " + imageId + " , " + this.bytesWritten + " bytes have been transferred.");
}
break;

default:
break;
}
}

public boolean isSucceed() {
return succeed;
}

public void onVidReady(String videoId) {
setVideoId(videoId);
}

public void onImageIdReady(String imageId) {
setImageId(imageId);
}

public String getVideoId() {
return videoId;
}

public void setVideoId(String videoId) {
this.videoId = videoId;
}

public String getImageId() {
return imageId;
}

public void setImageId(String imageId) {
this.imageId = imageId;
}
}


+ 21
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/oss/RefreshSTSTokenImpl.java View File

@@ -0,0 +1,21 @@
package com.tuoheng.admin.oss;

import com.aliyun.vod.upload.dto.STSTokenDTO;
import com.aliyun.vod.upload.impl.VoDRefreshSTSTokenListener;

/**
* @author vod
* 生成STS信息实现类
* @date 2019/6/5
*/
public class RefreshSTSTokenImpl implements VoDRefreshSTSTokenListener {

public STSTokenDTO onRefreshSTSToken() {
STSTokenDTO stsTokenDTO = new STSTokenDTO();
stsTokenDTO.setAccessKeyId("<your sts AccessKeyId>");
stsTokenDTO.setAccessKeySecret("<your sts AccessKeySecret>");
stsTokenDTO.setSecurityToken("<your sts SecurityToken>");
return stsTokenDTO;
}

}

+ 13
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/IInspectionQuestionItemService.java View File

@@ -0,0 +1,13 @@
package com.tuoheng.admin.service;

import com.tuoheng.admin.entity.domain.InspectionQuestionItem;
import com.tuoheng.common.common.IBaseService;

/**
* 巡检问题工单子表 服务类
*
* @author WangHaoran
* @since 2021-09-30
*/
public interface IInspectionQuestionItemService extends IBaseService<InspectionQuestionItem> {
}

+ 55
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/IMissionService.java View File

@@ -0,0 +1,55 @@
package com.tuoheng.admin.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.domain.ThMission;
import com.tuoheng.admin.entity.request.MissionQuery;
import com.tuoheng.admin.entity.request.MissionRequest;
import com.tuoheng.admin.entity.request.MissionStatusRequest;
import com.tuoheng.admin.entity.vo.MissionVO;
import com.tuoheng.common.common.IBaseService;
import com.tuoheng.common.common.OperationEnum;

import java.util.List;

/**
* @author qiujinyang
* @date 2022/7/26 4:08 下午
*/
public interface IMissionService extends IBaseService<ThMission> {

/**
* 更新巡检任务
*
* @author: zhu_zishuang
* @date: 2021/9/1
*/
boolean updateStatus(MissionStatusRequest missionStatusRequest);


/**
* 查询巡检任务列表
*/
IPage<MissionVO> findList(MissionQuery queryInspectionRequest);

/**
* 查询巡检任务
*/
MissionVO findById(Integer id);

/**
* 新增巡检任务
*
* @author: zhu_zishuang
* @date: 2021/9/1
*/
Integer addMission(MissionRequest request);

/**
* 删除巡检任务
*
* @author: zhu_zishuang
* @date: 2021/9/2
*/
OperationEnum deleteBatch(List<Integer> idList);

}

+ 23
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/IQuestionService.java View File

@@ -0,0 +1,23 @@
package com.tuoheng.admin.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.domain.Question;
import com.tuoheng.admin.entity.request.QuestionQuery;
import com.tuoheng.common.common.IBaseService;

/**
* 巡检问题表 服务类
*
* @author WangHaoran
* @since 2021-09-02
*/
public interface IQuestionService extends IBaseService<Question> {

/**
* 分页查询
*
* @param query
* @return
*/
IPage<Question> queryPage(QuestionQuery query);
}

+ 45
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/ITenantService.java View File

@@ -0,0 +1,45 @@
package com.tuoheng.admin.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tuoheng.admin.entity.domain.Tenant;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tuoheng.admin.entity.dto.TenantDto;
import com.tuoheng.admin.entity.request.TenantQuery;
import com.tuoheng.common.common.IBaseService;

/**
* <p>
* 企业管理表 服务类
* </p>
*
* @author 拓恒
* @since 2022-07-15
*/
public interface ITenantService extends IBaseService<Tenant> {

/**
* 获取租户分页列表
*
* @param tenantQuery 查询条件
* @return
*/
IPage<Tenant> getTenantList(TenantQuery tenantQuery);

/**
* 添加租户
*
* @param tenantDto 实体对象
* @return
*/
boolean addTenant(TenantDto tenantDto);

/**
* 更新租户
*
* @param tenantDto 实体对象
* @return
*/
boolean editTenant(TenantDto tenantDto);


}

+ 31
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/IThInspectionService.java View File

@@ -0,0 +1,31 @@
package com.tuoheng.admin.service;

import com.tuoheng.admin.entity.domain.ThInspection;
import com.tuoheng.admin.entity.domain.ThMission;
import com.tuoheng.admin.entity.request.InspectionRequest;
import com.tuoheng.admin.entity.vo.*;
import com.tuoheng.common.common.IBaseService;
import com.tuoheng.common.utils.JsonResult;

import java.util.List;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 9:37
*/

public interface IThInspectionService extends IBaseService<ThInspection> {

List<InspectionVO> track(Integer id);

Integer track(InspectionRequest inspectionRequest);

List<AirPortVO> airport();

List<AirLineVO> airLine(Integer droneId);

JsonResult executeTask(Integer taskId);

AirWeatherVO getWeather(Integer airportId);
}

+ 19
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/InspectionQuestionItemServiceImpl.java View File

@@ -0,0 +1,19 @@
package com.tuoheng.admin.service.impl;

import com.tuoheng.admin.entity.domain.InspectionQuestionItem;
import com.tuoheng.admin.mapper.ThInspectionQuestionItemMapper;
import com.tuoheng.admin.service.IInspectionQuestionItemService;
import com.tuoheng.common.common.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* 巡检问题工单子表 服务实现类
*
* @author WangHaoran
* @since 2021-09-30
*/
@Service
@Slf4j
public class InspectionQuestionItemServiceImpl extends BaseServiceImpl<ThInspectionQuestionItemMapper, InspectionQuestionItem> implements IInspectionQuestionItemService {
}

+ 189
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/MissionServiceImpl.java View File

@@ -0,0 +1,189 @@
package com.tuoheng.admin.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.common.ServiceExceptionEnum;
import com.tuoheng.admin.entity.domain.*;
import com.tuoheng.admin.entity.request.MissionRequest;
import com.tuoheng.admin.entity.request.MissionQuery;
import com.tuoheng.admin.entity.request.MissionStatusRequest;
import com.tuoheng.admin.entity.vo.MissionVO;
import com.tuoheng.admin.enums.*;
import com.tuoheng.admin.mapper.*;
import com.tuoheng.admin.service.IMissionService;
import com.tuoheng.admin.utils.CodeUtil;
import com.tuoheng.common.common.BaseServiceImpl;
import com.tuoheng.common.common.OperationEnum;
import com.tuoheng.common.config.CommonConfig;
import com.tuoheng.common.exception.ServiceException;
import com.tuoheng.common.utils.*;
import com.tuoheng.system.entity.User;
import com.tuoheng.system.utils.ShiroUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;

/**
* 巡检任务接口实现
*
* @author: zhu_zishuang
* @date: 2021/9/1
*/
@Service
@Slf4j
public class MissionServiceImpl extends BaseServiceImpl<ThMissionMapper, ThMission> implements IMissionService {

@Resource
private ThMissionMapper thMissionMapper;

@Autowired
private RedisUtils redisUtils;


@Override
public Integer addMission(MissionRequest addThMissionRequest) {

ThMission tm=new ThMission();
BeanUtils.copyProperties(addThMissionRequest,tm);

// 根据当前时间,生成任务编码
String code = "XJRW" +CodeUtil.createCodeNo();
tm.setCode(code);
thMissionMapper.insert(tm);
return tm.getId();
}


@Override
public boolean updateStatus(MissionStatusRequest missionStatusRequest) {

//如果发送过来的状态是执行中,那么就说明之前是待执行,查询等待执行的数据,开始飞行
if(AirPortTaskStatusEnum.FLIGHT.getCode()==missionStatusRequest.getStatus()){
ThMission thMission = getRecentlyRecord(missionStatusRequest,TaskStatusEnum.WAIT.getCode());
ThMission thMissionUpdate = setStatus(missionStatusRequest, thMission);

if(thMissionMapper.updateById(thMissionUpdate) > 0){
//任务调用完成之后,调用发送通道,请求DSP需要分析


}

return true;
}else if(AirPortTaskStatusEnum.WAIT.getCode()==missionStatusRequest.getStatus()){

ThMission thMission = getRecentlyRecord(missionStatusRequest,TaskStatusEnum.FLIGHT.getCode());
ThMission thMissionUpdate = setStatus(missionStatusRequest, thMission);
if(thMissionMapper.updateById(thMissionUpdate) > 0){
//任务调用完成之后,调用发送通道,请求DSP关闭请求


}

return true;
}else{
throw new ServiceException(ServiceExceptionEnum.TASK_NOT_STATUS);
}
}

private ThMission setStatus(MissionStatusRequest missionStatusRequest, ThMission thMission) {
ThMission thMissionUpdate = new ThMission();
thMissionUpdate.setId(thMission.getId());
thMissionUpdate.setPushUrl(missionStatusRequest.getPushUrl());
thMissionUpdate.setPullUrl(missionStatusRequest.getPullUrl());
if(missionStatusRequest.getStatus()==AirPortTaskStatusEnum.FLIGHT.getCode()){
thMissionUpdate.setStatus(TaskStatusEnum.FLIGHT.getCode());
}else{
thMissionUpdate.setStatus(TaskStatusEnum.COMPLETE.getCode());
}
return thMissionUpdate;
}

private ThMission getRecentlyRecord(MissionStatusRequest missionStatusRequest,Integer status) {
//获取当前任务里面这个巡检的最近的那一条,修改对应的任务的状态
LambdaQueryWrapper<ThMission> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.orderByAsc(ThMission::getExecutionStartTime);
lambdaQueryWrapper.eq(ThMission::getInspectionLine, missionStatusRequest.getId());
lambdaQueryWrapper.eq(ThMission::getStatus,status);
//lambdaQueryWrapper.eq(ThMission::getTenantId,ShiroUtils.getTenantId());
ThMission thMission = thMissionMapper.selectOne(lambdaQueryWrapper);
return thMission;
}

@Override
public IPage<MissionVO> findList(MissionQuery queryInspectionRequest) {
Page<ThMission> page = new Page<>();
page.setSize(queryInspectionRequest.getLimit());
page.setCurrent(queryInspectionRequest.getPage());
//queryInspectionRequest.setTenantId(ShiroUtils.getTenantId());
LambdaQueryWrapper<ThMission> queryInspection=new LambdaQueryWrapper<>();
queryParam(queryInspectionRequest, queryInspection);

IPage<ThMission> thMissionIPage = thMissionMapper.selectPage(page, queryInspection);

List<MissionVO> result=new ArrayList<>();
thMissionIPage.getRecords().forEach(mission->{
MissionVO missionVO=new MissionVO();
BeanUtils.copyProperties(mission,missionVO);
result.add(missionVO);
});

IPage<MissionVO> resultPage=new Page<>();
resultPage.setCurrent(thMissionIPage.getCurrent());
resultPage.setPages(thMissionIPage.getPages());
resultPage.setSize(thMissionIPage.getSize());
resultPage.setTotal(thMissionIPage.getTotal());
resultPage.setRecords(result);
return resultPage;
}

private void queryParam(MissionQuery queryInspectionRequest, LambdaQueryWrapper<ThMission> queryInspection) {
//编号
if(!StringUtils.isEmpty(queryInspectionRequest.getCode())){
queryInspection.like(ThMission::getCode, queryInspectionRequest.getCode());
}
//任务名称
if(!StringUtils.isEmpty(queryInspectionRequest.getName())){
queryInspection.like(ThMission::getName, queryInspectionRequest.getName());
}
//任务状态
if(!ObjectUtil.isEmpty(queryInspectionRequest.getStatus())){
queryInspection.eq(ThMission::getStatus, queryInspectionRequest.getStatus());
}
//巡检机场
if(!StringUtils.isEmpty(queryInspectionRequest.getAirportId())){
queryInspection.eq(ThMission::getAirportId, queryInspectionRequest.getAirportId());
}
//巡检线路
if(!StringUtils.isEmpty(queryInspectionRequest.getInspectionLine())){
queryInspection.eq(ThMission::getInspectionLine, queryInspectionRequest.getInspectionLine());
}
//任务类型
if(!ObjectUtil.isEmpty(queryInspectionRequest.getInspectionType())){
queryInspection.eq(ThMission::getInspectionType, queryInspectionRequest.getInspectionType());
}
}

@Override
public MissionVO findById(Integer id) {
MissionVO missionVO=new MissionVO();
BeanUtils.copyProperties(thMissionMapper.selectById(id),missionVO);
return missionVO;
}


@Override
public OperationEnum deleteBatch(List<Integer> idList) {
Integer updateUser = ShiroUtils.getUserId();
thMissionMapper.deleteBatch(idList, updateUser, ShiroUtils.getTenantId());
return OperationEnum.DELETE_SUCCESS;
}

}

+ 45
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/QuestionServiceImpl.java View File

@@ -0,0 +1,45 @@
package com.tuoheng.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.common.ServiceExceptionEnum;
import com.tuoheng.admin.entity.domain.Question;
import com.tuoheng.admin.entity.request.QuestionQuery;
import com.tuoheng.admin.mapper.QuestionMapper;
import com.tuoheng.admin.service.IQuestionService;
import com.tuoheng.common.common.BaseServiceImpl;
import com.tuoheng.common.exception.ServiceException;
import com.tuoheng.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* 巡检问题表 服务实现类
*
* @author WangHaoran
* @since 2021-09-02
*/
@Service
public class QuestionServiceImpl extends BaseServiceImpl<QuestionMapper, Question> implements IQuestionService {

@Autowired
private QuestionMapper questionMapper;

@Override
public IPage<Question> queryPage(QuestionQuery query) {
if(null == query.getPage() || null == query.getLimit()){
throw new ServiceException(ServiceExceptionEnum.PARAMETER_IS_NULL);
}
// 获取分页数据
IPage<Question> page = new Page<>(query.getPage(), query.getLimit());
IPage<Question> pageData = questionMapper.selectPage(page, new LambdaQueryWrapper<Question>()
.like(StringUtils.isNotEmpty(query.getContent()), Question::getContent, query.getContent())
.eq(null != query.getName(), Question::getName, query.getName())
.eq(null != query.getType(), Question::getType, query.getType())
.eq(Question::getMark, 1)
.orderByAsc(Question::getSort).orderByDesc(Question::getCreateTime));

return page;
}
}

+ 167
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/TenantServiceImpl.java View File

@@ -0,0 +1,167 @@
package com.tuoheng.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.entity.domain.Tenant;
import com.tuoheng.admin.entity.dto.TenantDto;
import com.tuoheng.admin.entity.request.TenantQuery;
import com.tuoheng.admin.mapper.TenantMapper;
import com.tuoheng.admin.service.ITenantService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tuoheng.common.common.BaseQuery;
import com.tuoheng.common.common.BaseServiceImpl;
import com.tuoheng.common.config.CommonConfig;
import com.tuoheng.common.exception.ServiceException;
import com.tuoheng.common.utils.CommonUtils;
import com.tuoheng.common.utils.DateUtils;
import com.tuoheng.common.utils.JsonResult;
import com.tuoheng.common.utils.StringUtils;
import com.tuoheng.system.entity.Level;
import com.tuoheng.system.entity.User;
import com.tuoheng.system.mapper.LevelMapper;
import com.tuoheng.system.mapper.UserMapper;
import com.tuoheng.system.query.LevelQuery;
import com.tuoheng.system.utils.ShiroUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* <p>
* 企业管理表 服务实现类
* </p>
*
* @author 拓恒
* @since 2022-07-15
*/
@Service
public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> implements ITenantService {

@Autowired
private TenantMapper tenantMapper;
@Autowired
private UserMapper userMapper;

@Override
public IPage<Tenant> getTenantList(TenantQuery tenantQuery) {
// 查询条件
QueryWrapper<Tenant> queryWrapper = new QueryWrapper<>();
// 租户名称
if (!StringUtils.isEmpty(tenantQuery.getName())) {
queryWrapper.like("name", tenantQuery.getName());
}
queryWrapper.eq("mark", 1);
queryWrapper.orderByAsc("sort");

// 查询分页数据
IPage<Tenant> page = new Page<>(tenantQuery.getPage(), tenantQuery.getLimit());
IPage<Tenant> pageData = tenantMapper.selectPage(page, queryWrapper);
pageData.convert(x -> {
// 租户Logo
if (!StringUtils.isEmpty(x.getLogo())) {
x.setLogo(CommonUtils.getImageURL(x.getLogo()));
}
return x;
});
return pageData;
}

/**
* 添加租户
*
* @param tenantDto 实体对象
* @return
*/
@Override
public boolean addTenant(TenantDto tenantDto) {
// 验证是否账号已存在
Integer count2 = userMapper.selectCount(new LambdaQueryWrapper<User>()
.eq(User::getUsername, tenantDto.getUsername())
.eq(User::getMark, 1));
if (count2 > 0) {
throw new ServiceException(0, "系统中已经存在相同的账号信息");
}
// 参数转换
Tenant tenant = new Tenant();
BeanUtils.copyProperties(tenantDto, tenant);
// 租户头像
if (StringUtils.isNotNull(tenantDto.getLogo()) && tenantDto.getLogo().contains(CommonConfig.imageURL)) {
tenant.setLogo(tenantDto.getLogo().replaceAll(CommonConfig.imageURL, ""));
}
// 新建租户数据
int count = tenantMapper.insert(tenant);
if (count == 0) {
throw new ServiceException(0, "租户创建失败");
}
// 创建租户账号
User user = new User();
user.setTenantId(tenant.getId());
user.setRealname(tenantDto.getName());
user.setNickname(tenantDto.getName());
user.setUsername(tenantDto.getUsername());
user.setPassword(CommonUtils.password(tenantDto.getPassword()));
user.setType(1);
user.setIsAdmin(1);
user.setCreateTime(DateUtils.now());
int count3 = userMapper.insert(user);
if (count3 == 0) {
throw new ServiceException(0, "租户登录账号创建失败");
}

return true;
}

/**
* 更新
*
* @param tenantDto 实体对象
* @return
*/
@Override
public boolean editTenant(TenantDto tenantDto) {
// 查询租户信息
Tenant tenant = tenantMapper.selectById(tenantDto.getId());
if (StringUtils.isNull(tenant)) {
throw new ServiceException(0, "租户信息不存在");
}
BeanUtils.copyProperties(tenantDto, tenant);
// 租户头像
if (StringUtils.isNotNull(tenantDto.getLogo()) && tenantDto.getLogo().contains(CommonConfig.imageURL)) {
tenant.setLogo(tenantDto.getLogo().replaceAll(CommonConfig.imageURL, ""));
}
// 更新租户信息
int count = tenantMapper.updateById(tenant);
if (count == 0) {
throw new ServiceException(0, "更新租户信息失败");
}

// 验证账号
Integer count2 = userMapper.selectCount(new LambdaQueryWrapper<User>()
.ne(User::getTenantId, tenant.getId())
.eq(User::getUsername, tenantDto.getUsername())
.eq(User::getMark, 1));
if (count2 > 0) {
throw new ServiceException(0, "系统中已经存在相同的账号信息");
}

// 查询租户账号信息
User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getTenantId, tenant.getId()).eq(User::getMark, 1));
if (StringUtils.isNull(user)) {
throw new ServiceException(0, "租户账号信息不存在");
}
user.setRealname(tenantDto.getName());
user.setNickname(tenantDto.getName());
user.setUsername(tenantDto.getUsername());
user.setPassword(CommonUtils.password(tenantDto.getPassword()));
user.setUpdateTime(DateUtils.now());
int count3 = userMapper.updateById(user);
if (count3 == 0) {
throw new ServiceException(0, "租户账号信息更新失败");
}
return true;
}
}

+ 152
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/ThInspectionServiceImpl.java View File

@@ -0,0 +1,152 @@
package com.tuoheng.admin.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.entity.domain.ThInspection;
import com.tuoheng.admin.entity.request.InspectionRequest;
import com.tuoheng.admin.entity.vo.*;
import com.tuoheng.admin.mapper.ThInspectionMapper;
import com.tuoheng.admin.service.IThInspectionService;
import com.tuoheng.common.common.BaseServiceImpl;
import com.tuoheng.common.config.CommonConfig;
import com.tuoheng.common.exception.ServiceException;
import com.tuoheng.common.utils.HttpUtils;
import com.tuoheng.common.utils.JacksonUtil;
import com.tuoheng.common.utils.JsonResult;
import com.tuoheng.system.utils.ShiroUtils;
import groovy.util.logging.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/28 9:39
*/
@Service
@Slf4j
public class ThInspectionServiceImpl extends BaseServiceImpl<ThInspectionMapper, ThInspection> implements IThInspectionService {


@Autowired
private ThInspectionMapper inspectionMapper;


@Override
public List<InspectionVO> track(Integer id) {

LambdaQueryWrapper<ThInspection> lambdaQueryWrapper=new LambdaQueryWrapper();
lambdaQueryWrapper.eq(ThInspection::getMissionId,id);
//lambdaQueryWrapper.eq(ThInspection::getTenantId, ShiroUtils.getTenantId());
List<InspectionVO> result=new ArrayList<>();
List<ThInspection> thInspections = inspectionMapper.selectList(lambdaQueryWrapper);

for (ThInspection thInspection : thInspections) {
InspectionVO inspectionVO=new InspectionVO();
BeanUtils.copyProperties(thInspection,inspectionVO);
result.add(inspectionVO);
}
return result;
}

@Override
public Integer track(InspectionRequest inspectionRequest) {
ThInspection inspection=new ThInspection();
BeanUtils.copyProperties(inspectionRequest,inspection);
inspectionMapper.insert(inspection);
return inspection.getId();
}

@Override
public List<AirPortVO> airport() {

//这边需要配置到yml文件里面
String url = CommonConfig.airportUrl +"/api/airportInterface/airportList";
String param="page=1&limit=10";
JsonResult jsonResult=new JsonResult();
try {

String airPortStr = HttpUtils.sendGet(url, param);
jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
if(!ObjectUtil.isEmpty(jsonResult.getData()) &&jsonResult.getCode() != 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取机场信息失败,请重试");
}
} catch (Exception e) {
log.error("获取机场信息失败", e);
}

return JSONObject.parseArray(JSONObject.parseObject(JSONObject.toJSONString(jsonResult.getData())).get("records").toString(), AirPortVO.class);
}



@Override
public List<AirLineVO> airLine(Integer droneId) {

//这边需要配置到yml文件里面
String url = CommonConfig.airportUrl +"/api/airportInterface/airportList";
String param="page=1&limit=10&droneId="+droneId;
JsonResult<AirLineVO> jsonResult=new JsonResult<>();
try {

String airPortStr = HttpUtils.sendGet(url, param);
jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
if(!ObjectUtil.isEmpty(jsonResult.getData()) && jsonResult.getCode() != 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取航线信息失败,请重试");
}
} catch (Exception e) {
log.error("更新通道状态失败", e);
}

return JSONObject.parseArray(JSONObject.parseObject(JSONObject.toJSONString(jsonResult.getData())).get("records").toString(), AirLineVO.class);
}

@Override
public JsonResult executeTask(Integer taskId) {
//这边需要配置到yml文件里面
String url = CommonConfig.airportUrl + "/api/airportInterface/executeTask";
String param="taskId="+taskId;
JsonResult jsonResult;
try {

String airPortStr = HttpUtils.sendPost(url, param);
jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
if(!ObjectUtil.isEmpty(jsonResult.getData()) && jsonResult.getCode() != 0) {
return JsonResult.error(JSONObject.parseArray(JSONObject.parseObject(JSONObject.toJSONString(jsonResult.getData())).get("data").toString(), AirExecuteTaskVO.class),"执行任务失败!");
}else{
return JsonResult.error(jsonResult.getMsg());
}
} catch (Exception e) {
log.error("执行任务失败", e);
}
return JsonResult.success();
}

@Override
public AirWeatherVO getWeather(Integer airportId) {
//这边需要配置到yml文件里面
String url = CommonConfig.airportUrl + "/api/airportInterface/getWeather";
String param="airportId="+airportId;
JsonResult jsonResult=new JsonResult();
try {

String weatherStr = HttpUtils.sendGet(url, param);
jsonResult = JacksonUtil.json2pojo(weatherStr, JsonResult.class);
if(jsonResult.getCode() != 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取天气信息失败,请重试");
}
} catch (Exception e) {
log.error("获取天气信息失败", e);
}
return JSONObject.parseObject(JSONObject.toJSONString(jsonResult.getData()),AirWeatherVO.class);
}


}

+ 33
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/task/ExecuteTaskTask.java View File

@@ -0,0 +1,33 @@
package com.tuoheng.admin.task;

import com.tuoheng.admin.service.IMissionService;
import com.tuoheng.admin.service.impl.MissionServiceImpl;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* 定时扫描,然后飞行
*/
@Component
public class ExecuteTaskTask {

private final static Logger LOGGER = LoggerFactory.getLogger(ExecuteTaskTask.class);

@Autowired
private IMissionService inspectionService;

@Autowired
private MissionServiceImpl inspectionServiceImpl;


/**
* 定时飞行巡检任务,如果有问题,重置为飞行失败
*/
@XxlJob("checkAIAnalysisStatus")
public void checkAIAnalysisStatus() {
//定时飞行
}
}

+ 25
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/utils/CodeUtil.java View File

@@ -0,0 +1,25 @@
package com.tuoheng.admin.utils;

import com.tuoheng.common.utils.DateUtils;

import java.util.Random;

/**
* @User qiujinyang
* @Description
* @Date Created by 2022/7/27 13:44
*/
public class CodeUtil {

/**
* 生成报告编号,R+年月日+随机四位数
* @return
*/
public static String createCodeNo(){
String Date = DateUtils.dateTimeNow(DateUtils.YYYYMMDD);
int randomNum = new Random().nextInt(9999) % (9999 - 1000 + 1) + 1000;
String reportNo = Date + randomNum;

return reportNo;
}
}

+ 159
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/utils/GaodeUtil.java View File

@@ -0,0 +1,159 @@
package com.tuoheng.admin.utils;

import com.alibaba.fastjson.JSONObject;
import com.tuoheng.common.config.CommonConfig;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.Map;

@Slf4j
public class GaodeUtil {

/**
* 逆地理编码
*
* @param longitude 经度
* @param latitude 纬度
* @return
*/
public static String getGaodeAddress(String longitude, String latitude) {
String address = null;
JSONObject json = new JSONObject();
try {
json.put("key", CommonConfig.gaodeKey);
json.put("location", longitude + "," + latitude);
log.info("调用高德逆地理编码API请求参数:" + json);
String result = doGet("https://restapi.amap.com/v3/geocode/regeo", json, null);
log.info("调用高德逆地理编码API成功:" + result);
JSONObject resultJson = JSONObject.parseObject(result.trim());
if("1".equals(resultJson.getString("status"))){
address = resultJson.getJSONObject("regeocode").getString("formatted_address");
}
} catch (Exception e) {
log.error("逆地理编码方法异常:", e);
}

return address;
}



/**
* 高德坐标转换
*
* @param longitude 经度
* @param latitude 纬度
* @return
*/
public static JSONObject getGaodeCoordinate(String longitude, String latitude) {
JSONObject json = new JSONObject();
JSONObject param = new JSONObject();
try {
//取六位小数
DecimalFormat df = new DecimalFormat("0.000000");
param.put("key", CommonConfig.gaodeKey);
param.put("locations", df.format(Double.valueOf(longitude)) + "," + df.format(Double.valueOf(latitude)));
param.put("coordsys", "gps");

log.info("调用高德坐标转换API请求参数:" + param);
String result = doGet("https://restapi.amap.com/v3/assistant/coordinate/convert", param, null);
log.info("调用高德坐标转换API成功:" + result);
JSONObject resultJson = JSONObject.parseObject(result.trim());
if("1".equals(resultJson.getString("status"))){
String locations = JSONObject.parseObject(result).getString("locations");
String lonStr = locations.substring(0, locations.indexOf(","));
String latStr = locations.substring(lonStr.length()+1);
json.put("longitude", lonStr);
json.put("latitude", latStr);
}
} catch (Exception e) {
log.error("高德坐标转换方法异常:", e);
}

return json;
}

public static String doGet(String url, JSONObject data, Map<String, String> properties) {
HttpURLConnection connection = null;
InputStream is = null;
BufferedReader br = null;
String result = null;// 返回结果字符串

StringBuffer urlNameString = new StringBuffer().append(url).append("?");
if (data != null) {
for (String key : data.keySet()) {
urlNameString.append(key).append("=").append(data.get(key)).append("&");
}
url = urlNameString.substring(0, urlNameString.lastIndexOf("&"));
}

try {
// 创建远程url连接对象
URL httpUrl = new URL(url);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) httpUrl.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000);
if(null != properties && !properties.isEmpty()){
for (String key:properties.keySet()){
connection.setRequestProperty(key, properties.get(key));
}
}
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 封装输入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// 存放数据
StringBuffer sbf = new StringBuffer();
String temp = null;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}

if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}

connection.disconnect();// 关闭远程连接
}

return result;
}


}

+ 362
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/utils/WordUtilsOld.java View File

@@ -0,0 +1,362 @@
package com.tuoheng.admin.utils;

import com.lowagie.text.*;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.style.RtfParagraphStyle;

import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

/**
* word帮助文件
*/
public class WordUtilsOld {
private Document document;
private String test;
private Map<Integer,String> fontFamily = new HashMap<Integer,String>();

public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
}
public WordUtilsOld(){
this.document = new Document(PageSize.A4);//����ֽ�Ŵ�С
document.newPage();
//init font
if(getSystem()){
fontFamily.put(1, "C:\\Windows\\Fonts\\simhei.ttf");
fontFamily.put(2, "C:\\Windows\\Fonts\\STXINWEI.TTF");
fontFamily.put(3, "C:\\Windows\\Fonts\\simsun.ttc,0");
fontFamily.put(4, "C:\\Windows\\Fonts\\fangsong_GB2312.ttf");
fontFamily.put(5, "C:\\Windows\\Fonts\\times.ttf");
fontFamily.put(6, "C:\\Windows\\Fonts\\simfang.ttf");
}else{
fontFamily.put(1, "/usr/share/fonts/simhei.ttf");
fontFamily.put(2, "/usr/share/fonts/STXINWEI.TTF");
fontFamily.put(3, "/usr/share/fonts/windows/simsun.ttc,0");
fontFamily.put(4, "/usr/share/fonts/fangsong_GB2312.ttf");
fontFamily.put(5, "/usr/share/fonts/times.ttf");
}
}
/** 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
* @param filePath 要操作的文档路径,若文档不存在会自动创建
* @throws com.lowagie.text.DocumentException
* @throws IOException
*/
public void openDocument(String filePath) throws DocumentException,
IOException {
// 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
RtfWriter2.getInstance(this.document, new FileOutputStream(filePath));
this.document.open();
// 设置中文字体
/*this.bfChinese = BaseFont.createFont("STSongStd-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);*/
}
/**
* @param titleStr 标题
* @param fontsize 字体大小
* @param fontStyle 字体样式
* @param elementAlign 对齐方式
* @throws com.lowagie.text.DocumentException
*/
public void insertTitle(String titleStr,float fontsize,int fontStyle,int elementAlign,float before,float after,int fontFamliyType) throws Exception{
BaseFont fontFamliy = BaseFont.createFont(fontFamily.get(3), "GBK", BaseFont.NOT_EMBEDDED);
Font titleFont = new Font(fontFamliy,fontsize, fontStyle);
Paragraph title = new Paragraph(titleStr);
// 设置标题格式对齐方式
title.setAlignment(elementAlign);
title.setFont(titleFont);
title.setSpacingBefore(before);
title.setSpacingAfter(after);
this.document.add(title);
}


/**
* 设置带有目录格式的标题(标题1格式)
*
* @param rtfParagraphStyle 标题1样式
* @param titleStr 标题
* @throws com.lowagie.text.DocumentException
* @throws IOException
*/
public void insertTitlePattern(String titleStr, RtfParagraphStyle rtfParagraphStyle) throws DocumentException, IOException{
Paragraph title = new Paragraph(titleStr);
title.setFont(rtfParagraphStyle);
this.document.add(title);
}

/**
* 设置带有目录格式的标题(标题2格式)
* @param titleStr 标题
* @param rtfParagraphStyle 标题2样式
* @throws com.lowagie.text.DocumentException
*/
public void insertTitlePatternSecond(String titleStr,RtfParagraphStyle rtfParagraphStyle) throws DocumentException{
Paragraph title = new Paragraph(titleStr);
// 设置标题格式对齐方式
title.setFont(rtfParagraphStyle);
this.document.add(title);
}
/**
* 设置带有目录格式的标题(标题3格式)
* @param titleStr 标题
* @param rtfParagraphStyle 标题3样式
* @throws com.lowagie.text.DocumentException
*/
public void insertTitlePatternThird(String titleStr,RtfParagraphStyle rtfParagraphStyle) throws DocumentException{
Paragraph title = new Paragraph(titleStr);
// 设置标题格式对齐方式
title.setFont(rtfParagraphStyle);
this.document.add(title);
}
/**
* @param tableName 标题
* @param fontsize 字体大小
* @param fontStyle 字体样式
* @param elementAlign 对齐方式
* @throws com.lowagie.text.DocumentException
*/
public void insertTableName(String tableName,int fontsize,int fontStyle,int elementAlign) throws DocumentException{
Font titleFont = new Font();
titleFont.setColor(102, 102, 153);
Paragraph title = new Paragraph(tableName);
// 设置标题格式对齐方式
title.setAlignment(elementAlign);
title.setFont(titleFont);
this.document.add(title);
}
/**
* @param contextStr 内容
* @param fontsize 字体大小
* @param fontStyle 字体样式
* @param elementAlign 对齐方式
* @throws com.lowagie.text.DocumentException
* @throws IOException
*/
public void insertContext(String contextStr,int fontsize,int fontStyle,int elementAlign,float firstLineIndent,float before,float after) throws DocumentException, IOException{
// 正文字体风格
BaseFont fontFamliy = BaseFont.createFont(fontFamily.get(3), "GBK", BaseFont.EMBEDDED);
Font contextFont = new Font(fontFamliy, fontsize, fontStyle);
Paragraph context = new Paragraph(contextStr);
//设置行距
context.setLeading(3f);
// 正文格式左对齐
context.setAlignment(elementAlign);
context.setFont(contextFont);
// 离上一段落(标题)空的行数
//context.setSpacingBefore(1);
// 设置第一行空的列数
//context.setFirstLineIndent(20);
context.setFirstLineIndent(firstLineIndent);
context.setSpacingBefore(before);
context.setSpacingAfter(after);
document.add(context);
}
/**
* 插入正文里的注释
* @param contextStr 内容
* @param fontsize 字体大小 5号 10.5
* @param fontStyle 字体样式
* @param elementAlign 对齐方式
* @throws com.lowagie.text.DocumentException
*/
public void insertContextNote(String contextStr,int fontsize,int fontStyle,int elementAlign,float firstLineIndent,float before,float after) throws Exception{

BaseFont fontFamliy = BaseFont.createFont(fontFamily.get(3), "GBK", BaseFont.EMBEDDED);
Font contextFont = new Font(fontFamliy, 10.5f, fontStyle);
Paragraph context = new Paragraph(contextStr);
context.setLeading(3f);
context.setAlignment(elementAlign);
context.setFont(contextFont);
context.setFirstLineIndent(firstLineIndent);
context.setSpacingBefore(before);
context.setSpacingAfter(after);
document.add(context);
}
public void insertContext(Paragraph context) throws Exception{
BaseFont fontFamliy = BaseFont.createFont(fontFamily.get(3), "GBK", BaseFont.EMBEDDED);
Font contextFont = new Font(fontFamliy,12);
context.setFont(contextFont);
document.add(context);
}
/**
* @param imgUrl 图片路径
* @param imageAlign 显示位置
* @param height 显示高度
* @param weight 显示宽度
* @param percent 显示比例
* @param heightPercent 显示高度比例
* @param weightPercent 显示宽度比例
* @param rotation 显示图片旋转角度
* @throws MalformedURLException
* @throws IOException
* @throws com.lowagie.text.DocumentException
*/
public void insertImg(String imgUrl,int imageAlign,int height,int weight,int percent,int heightPercent,int weightPercent,int rotation) throws MalformedURLException, IOException, DocumentException{
// 添加图片
Image img = Image.getInstance(imgUrl);
if(img==null)
return;
img.setAbsolutePosition(0, 0);
img.setAlignment(imageAlign);
img.scaleAbsolute(height, weight);
img.scaleAbsolute(1000, 1000);
img.scalePercent(percent);
img.scalePercent(heightPercent, weightPercent);
img.setRotation(rotation);
document.add(img);
}

/**
* 添加简单表格
* @param column 表格列数(必须)
* @param row 表格行数
* @throws com.lowagie.text.DocumentException
*/
public void insertSimpleTable(int column,int row) throws DocumentException {
Table table=new Table(column);//列数必须设置,而行数则可以按照个人要求来决定是否需要设置
table.setAlignment(Element.ALIGN_CENTER);// 居中显示
table.setAlignment(Element.ALIGN_MIDDLE);// 纵向居中显示
table.setAutoFillEmptyCells(true);// 自动填满
table.setBorderColor(new Color(0, 125, 255));// 边框颜色
table.setBorderWidth(1);// 边框宽度
table.setSpacing(2);// 衬距,
table.setPadding(2);// 即单元格之间的间距
table.setBorder(20);// 边框
for (int i = 0; i < column*3; i++) {
table.addCell(new Cell(""+i));
}
document.add(table);
}
public void insertContext2(String contextStr,int fontsize,int fontStyle,int elementAlign,float firstLineIndent,float hangju,float before,float after,int fontFamliyType) throws DocumentException, IOException{
BaseFont fontFamliy = BaseFont.createFont(fontFamily.get(fontFamliyType), "GBK", BaseFont.EMBEDDED);
Font contextFont = new Font(fontFamliy, fontsize, fontStyle);
Paragraph context = new Paragraph(contextStr);
//设置行距
context.setLeading(hangju);
// 正文格式左对齐
context.setAlignment(elementAlign);
context.setFont(contextFont);
context.setFirstLineIndent(firstLineIndent);
context.setSpacingBefore(before);
context.setSpacingAfter(after);
document.add(context);
}

/**
* 新增
* hxl 2019-3-29
* 设置字体
* @param fontFamliyType
* @return
* @throws Exception
*/
public BaseFont setFont(int fontFamliyType) throws Exception{
BaseFont fontFamliy = BaseFont.createFont(fontFamily.get(3), "GBK", BaseFont.NOT_EMBEDDED);
return fontFamliy;
}
/**
* 在操作完成后必须关闭document,否则即使生成了word文档,打开也会发生错误
* @throws com.lowagie.text.DocumentException
*/
public void closeDocument() throws DocumentException{
this.document.close();
}
//判断操作系统类型
public boolean getSystem(){
if(System.getProperties().getProperty("os.name").toUpperCase().indexOf("WINDOWS")!=-1){
return true;
}
return false;
}

public Map<Integer, String> getFontFamily() {
return fontFamily;
}

public void setFontFamily(Map<Integer, String> fontFamily) {
this.fontFamily = fontFamily;
}

//第一级标题样式
public static RtfParagraphStyle rtfGsBt1 = RtfParagraphStyle.STYLE_HEADING_1;


//第二级标题样式
public static RtfParagraphStyle rtfGsBt2 = RtfParagraphStyle.STYLE_HEADING_2;


//第三级标题样式
public static RtfParagraphStyle rtfGsBt3 = RtfParagraphStyle.STYLE_HEADING_3;


//第四级标题样式
public static RtfParagraphStyle rtfGsBt4 = RtfParagraphStyle.STYLE_HEADING_3;
static {
rtfGsBt2.setAlignment(Element.ALIGN_CENTER);
rtfGsBt2.setStyle(Font.BOLD);
rtfGsBt2.setSize(14);
rtfGsBt2.setSpacingBefore(10);
rtfGsBt2.setSpacingAfter(10);
rtfGsBt2.setKeepTogether(true);
rtfGsBt2.setKeepTogetherWithNext(true);
rtfGsBt2.setFontName("黑体");
rtfGsBt1.setAlignment(Element.ALIGN_CENTER);
rtfGsBt1.setStyle(Font.BOLD);
rtfGsBt1.setSize(22);
rtfGsBt1.setSpacingBefore(10);
rtfGsBt1.setSpacingAfter(10);
rtfGsBt1.setFontName("黑体");
rtfGsBt3.setAlignment(Element.ALIGN_LEFT);
rtfGsBt3.setStyle(Font.BOLD);
rtfGsBt3.setSize(14);
rtfGsBt3.setSpacingBefore(10);
rtfGsBt3.setSpacingAfter(0);
rtfGsBt3.setKeepTogether(true);
//rtfGsBt3.setKeepTogetherWithNext(true);
rtfGsBt3.setFontName("FangSong_GB2312");
rtfGsBt4.setAlignment(Element.ALIGN_LEFT);
rtfGsBt4.setStyle(Font.BOLD);
rtfGsBt4.setSize(14);
rtfGsBt4.setSpacingBefore(10);
rtfGsBt4.setSpacingAfter(0);
rtfGsBt4.setKeepTogether(true);
rtfGsBt4.setKeepTogetherWithNext(true);
rtfGsBt4.setFontName("FangSong_GB2312");
}
}

+ 150
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/utils/XwpfTUtil.java View File

@@ -0,0 +1,150 @@
package com.tuoheng.admin.utils;

import org.apache.poi.xwpf.usermodel.*;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class XwpfTUtil {


/**
* 替换段落里面的变量
*
* @param doc 要替换的文档
* @param params 参数
*/
public void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
this.replaceInPara(para, params);
}
}

/**
* 替换段落里面的变量
*
* @param para 要替换的段落
* @param params 参数
*/
public void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
List<XWPFRun> runs;
Matcher matcher;
if (this.matcher(para.getParagraphText()).find()) {
runs = para.getRuns();

int start = -1;
int end = -1;
String str = "";
for (int i = 0; i < runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.toString();
if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) {
start = i;
}
if ((start != -1)) {
str += runText;
}
if ('}' == runText.charAt(runText.length() - 1)) {
if (start != -1) {
end = i;
break;
}
}
}

for (int i = start; i <= end; i++) {
para.removeRun(i);
i--;
end--;
}

for (String key : params.keySet()) {
if (str.equals(key)) {
para.createRun().setText((String) params.get(key));
break;
}
}


}
}

/**
* 替换表格里面的变量
*
* @param doc 要替换的文档
* @param params 参数
*/
public void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFTable> iterator = doc.getTablesIterator();
XWPFTable table;
List<XWPFTableRow> rows;
List<XWPFTableCell> cells;
List<XWPFParagraph> paras;
while (iterator.hasNext()) {
table = iterator.next();
rows = table.getRows();
for (XWPFTableRow row : rows) {
cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
this.replaceInPara(para, params);
}
}
}
}
}

/**
* 正则匹配字符串
*
* @param str
* @return
*/
private Matcher matcher(String str) {
Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher;
}

/**
* 关闭输入流
*
* @param is
*/
public void close(InputStream is) {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 关闭输出流
*
* @param os
*/
public void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

+ 220
- 0
tuoheng-admin/src/main/resources/application-dev.yml View File

@@ -0,0 +1,220 @@
# 端口配置
server:
port: 9099
servlet:
# 项目的前缀名
context-path: /api
tomcat:
basedir: /data/java/tuoheng_lc/uploads/temp
# 自定义配置
tuoheng:
# 图片域名
image-url: https://image.t-aaron.com/
# OSS域名
oss-url: https://ta-tech-image.oss-cn-shanghai.aliyuncs.com
# 机场域名
airport-url: http://124.223.218.130:9060/
# 视频域名
video-url: https://vod.play.t-aaron.com/
# 高德Key
gaodeKey: 8eb26a06684d34501e5a56dcc2f5af15
# 通道地址
live-channel-domain-url: https://streaming.t-aaron.com/
#阿里云
aliyuncsVod:
accessKeyId: LTAI5tE7KWN9fsuGU7DyfYF4
accessKeySecret: yPPCyfsqWgrTuoz5H4sisY0COclx8E
roleArn: acs:ram::1399733914954856:role/ramosstest
bucketName: ta-tech-image

spring:
# 配置数据源
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://192.168.11.13:3306/tuoheng_lc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&useSSL=true&tinyInt1isBit=false
username: root
password: idontcare
druid:
# 连接池的配置信息
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 5
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
webStatFilter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
statViewServlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.163.1
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.73
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456

# Redis数据源
redis:
# 缓存库默认索引0
database: 0
# Redis服务器地址
host: 192.168.11.13
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
# 连接超时时间(毫秒)
timeout: 6000
# 默认的数据过期时间,主要用于shiro权限管理
expire: 2592000
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 1 # 连接池中的最小空闲连接

servlet:
multipart:
# 过滤springmvc的文件上传
enabled: false
# 单个文件最大值
max-file-size: 50MB
# 上传文件总的最大值
max-request-size: 100MB

#邮件配置
mail:
# 设置邮箱主机
host: smtp.qq.com
# 开启邮箱POP3/SMTP服务,获取客户端授权码(注意并不是邮箱密码,而是授权码)
password:
# 邮箱的用户名
username:
properties:
mail:
smtp:
# 设置是否需要认证,如果为true,那么用户名和密码就必须的。如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
auth: true
starttls:
# STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
enable: true
require: true

alisms:
accessKeyId:
accessKeySecret:
regionId: cn-hangzhou
signName: 拓恒
templateCode:
kafka:
common:
enable: false
bootstrap-servers: 192.168.11.13:9092
alg-online-results-topic: alg-task-results
alg-online-results-group-id: alg-task-group-dev
alg-offline-tasks-topic: alg-offline-tasks
alg-online-tasks-topic: alg-online-tasks
file:
#上传的服务器上的映射文件夹
accessPath: /uploads/
#静态资源对外暴露的访问路径
staticAccessPath: /**
#静态资源实际存储路径
uploadFolder: /data/java/tuoheng_lc/uploads/

# Shiro
shiro:
cipher-key: f/SX5TIve5WWzT4aQlABJA==
cookie-name: shiro-cookie2
user:
# 登录地址
loginUrl: /login
# 权限认证失败地址
unauthorizedUrl: /unauth
# 首页地址
indexUrl: /index
# 验证码开关
captchaEnabled: true
# 验证码类型 math 数组计算 char 字符
captchaType: math
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
httpOnly: true
# 设置Cookie的过期时间,天为单位
maxAge: 30
session:
# Session超时时间(默认30分钟)
expireTime: 300
# 同步session到数据库的周期(默认1分钟)
dbSyncPeriod: 1
# 相隔多久检查一次session的有效性,默认就是10分钟
validationInterval: 10

# 代码生成
generate:
# 作者
author: 拓恒
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: com.tuoheng.system
# 模块名
moduleName: tuoheng-system
# 自动去除表前缀,默认是true
autoRemovePre: true
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
tablePrefix: sys_


# 日志记录
logging:
config: classpath:logback.xml

xxl:
enable: true
job:
admin:
addresses: http://192.168.11.11:8110/xxl-job-admin
accessToken: tuoheng
executor:
appname: xxl-job-executor-lc
address:
ip:
# 多个后台,端口号不能相同
port: 9999
logpath: /data/java/logs/xxl-job/jobhandler
logretentiondays: 15

+ 214
- 0
tuoheng-admin/src/main/resources/application-local.yml View File

@@ -0,0 +1,214 @@
# 端口配置
server:
port: 9099
servlet:
# 项目的前缀名
context-path: /api
tomcat:
basedir: /data/java/tuoheng_lc/uploads/temp
# 自定义配置
tuoheng:
# 图片域名
image-url: http://localhost:9065/api
# OSS域名
oss-url: https://ta-tech-image.oss-cn-shanghai.aliyuncs.com
# 机场域名
airport-url: http://124.223.218.130:9060/
# 视频域名
video-url: http://vod.play.t-aaron.com/
# 高德Key
gaodeKey: 8eb26a06684d34501e5a56dcc2f5af15
# 通道地址
live-channel-domain-url: http://192.168.11.11:9024/
#阿里云
aliyuncsVod:
accessKeyId: LTAI5tE7KWN9fsuGU7DyfYF4
accessKeySecret: yPPCyfsqWgrTuoz5H4sisY0COclx8E
roleArn: acs:ram::1399733914954856:role/ramosstest
bucketName: ta-tech-image

spring:
# 配置数据源
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://192.168.11.13:3306/tuoheng_lc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&useSSL=true&tinyInt1isBit=false
username: root
password: idontcare
druid:
# 连接池的配置信息
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 5
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
webStatFilter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
statViewServlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.163.1
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.73
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456

# Redis数据源
redis:
# 缓存库默认索引0
database: 0
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
# 连接超时时间(毫秒)
timeout: 6000
# 默认的数据过期时间,主要用于shiro权限管理
expire: 2592000
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 1 # 连接池中的最小空闲连接

servlet:
multipart:
# 过滤springmvc的文件上传
enabled: false
# 单个文件最大值
max-file-size: 50MB
# 上传文件总的最大值
max-request-size: 100MB

#邮件配置
mail:
# 设置邮箱主机
host: smtp.qq.com
# 开启邮箱POP3/SMTP服务,获取客户端授权码(注意并不是邮箱密码,而是授权码)
password:
# 邮箱的用户名
username:
properties:
mail:
smtp:
# 设置是否需要认证,如果为true,那么用户名和密码就必须的。如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
auth: true
starttls:
# STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
enable: true
require: true

alisms:
accessKeyId:
accessKeySecret:
regionId: cn-hangzhou
signName: 拓恒
templateCode:
kafka:
common:
enable: false
bootstrap-servers: 192.168.11.13:9092
alg-online-results-topic: alg-task-results
alg-online-results-group-id: alg-task-group-local
alg-offline-tasks-topic: alg-offline-tasks
alg-online-tasks-topic: alg-online-tasks
file:
#上传的服务器上的映射文件夹
accessPath: /uploads/
#静态资源对外暴露的访问路径
staticAccessPath: /**
#静态资源实际存储路径
uploadFolder: E:\Gitea仓库源码\tuoheng_5gai_new\uploads\

# Shiro
shiro:
cipher-key: f/SX5TIve5WWzT4aQlABJA==
cookie-name: shiro-cookie2
user:
# 登录地址
loginUrl: /login
# 权限认证失败地址
unauthorizedUrl: /unauth
# 首页地址
indexUrl: /index
# 验证码开关
captchaEnabled: true
# 验证码类型 math 数组计算 char 字符
captchaType: math
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
httpOnly: true
# 设置Cookie的过期时间,天为单位
maxAge: 30
session:
# Session超时时间(默认30分钟)
expireTime: 300
# 同步session到数据库的周期(默认1分钟)
dbSyncPeriod: 1
# 相隔多久检查一次session的有效性,默认就是10分钟
validationInterval: 10

# 代码生成
generate:
# 作者
author: 拓恒
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: com.tuoheng.system
# 模块名
moduleName: tuoheng-system
# 自动去除表前缀,默认是true
autoRemovePre: true
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
tablePrefix: sys_
xxl:
enable: true
job:
admin:
addresses: http://192.168.11.11:8110/xxl-job-admin
accessToken: tuoheng
executor:
appname: xxl-job-executor-lc
address:
ip:
# 多个后台,端口号不能相同
port: 9999
logpath: /data/java/logs/xxl-job/jobhandler
logretentiondays: 15

+ 214
- 0
tuoheng-admin/src/main/resources/application-prod.yml View File

@@ -0,0 +1,214 @@
# 端口配置
server:
port: 9099
servlet:
# 项目的前缀名
context-path: /api
tomcat:
basedir: /data/java/tuoheng_lc/uploads/temp
# 自定义配置
tuoheng:
# 图片域名
image-url: https://image.t-aaron.com/
# OSS域名
oss-url: https://ta-tech-image.oss-cn-shanghai.aliyuncs.com
# 机场域名
airport-url: http://124.223.218.130:9060/
# 视频域名
video-url: https://vod.play.t-aaron.com/
# 高德Key
gaodeKey: 8eb26a06684d34501e5a56dcc2f5af15
# 通道地址
live-channel-domain-url: https://streaming.t-aaron.com/
#阿里云
aliyuncsVod:
accessKeyId: LTAI5tE7KWN9fsuGU7DyfYF4
accessKeySecret: yPPCyfsqWgrTuoz5H4sisY0COclx8E
roleArn: acs:ram::1399733914954856:role/ramosstest
bucketName: ta-tech-image

spring:
# 配置数据源
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://172.16.1.22:3306/tuoheng_lc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&useSSL=true&tinyInt1isBit=false
username: root
password: TH22#2022
druid:
# 连接池的配置信息
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 5
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
webStatFilter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
statViewServlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.163.1
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.73
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456

# Redis数据源
redis:
# 缓存库默认索引0
database: 0
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
# 连接超时时间(毫秒)
timeout: 6000
# 默认的数据过期时间,主要用于shiro权限管理
expire: 2592000
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 1 # 连接池中的最小空闲连接

servlet:
multipart:
# 过滤springmvc的文件上传
enabled: false
# 单个文件最大值
max-file-size: 50MB
# 上传文件总的最大值
max-request-size: 100MB

#邮件配置
mail:
# 设置邮箱主机
host: smtp.qq.com
# 开启邮箱POP3/SMTP服务,获取客户端授权码(注意并不是邮箱密码,而是授权码)
password:
# 邮箱的用户名
username:
properties:
mail:
smtp:
# 设置是否需要认证,如果为true,那么用户名和密码就必须的。如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
auth: true
starttls:
# STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
enable: true
require: true

alisms:
accessKeyId:
accessKeySecret:
regionId: cn-hangzhou
signName: 拓恒
templateCode:
kafka:
common:
enable: false
bootstrap-servers: 101.132.127.1:19092
alg-online-results-topic: alg-task-results
alg-online-results-group-id: alg-task-group-prod
alg-offline-tasks-topic: alg-offline-tasks
alg-online-tasks-topic: alg-online-tasks
file:
#上传的服务器上的映射文件夹
accessPath: /uploads/
#静态资源对外暴露的访问路径
staticAccessPath: /**
#静态资源实际存储路径
uploadFolder: /data/java/tuoheng_lc/uploads/

# Shiro
shiro:
cipher-key: f/SX5TIve5WWzT4aQlABJA==
cookie-name: shiro-cookie2
user:
# 登录地址
loginUrl: /login
# 权限认证失败地址
unauthorizedUrl: /unauth
# 首页地址
indexUrl: /index
# 验证码开关
captchaEnabled: true
# 验证码类型 math 数组计算 char 字符
captchaType: math
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
httpOnly: true
# 设置Cookie的过期时间,天为单位
maxAge: 30
session:
# Session超时时间(默认30分钟)
expireTime: 300
# 同步session到数据库的周期(默认1分钟)
dbSyncPeriod: 1
# 相隔多久检查一次session的有效性,默认就是10分钟
validationInterval: 10

# 代码生成
generate:
# 作者
author: 拓恒
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: com.tuoheng.system
# 模块名
moduleName: tuoheng-system
# 自动去除表前缀,默认是true
autoRemovePre: true
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
tablePrefix: sys_
xxl:
enable: true
job:
admin:
addresses: http://172.16.1.31:8110/xxl-job-admin
accessToken: tuoheng
executor:
appname: xxl-job-executor-lc
address:
ip:
# 多个后台,端口号不能相同
port: 9999
logpath: /data/java/logs/xxl-job/jobhandler
logretentiondays: 15

+ 214
- 0
tuoheng-admin/src/main/resources/application-test.yml View File

@@ -0,0 +1,214 @@
# 端口配置
server:
port: 9099
servlet:
# 项目的前缀名
context-path: /api
tomcat:
basedir: /data/java/tuoheng_lc/uploads/temp
# 自定义配置
tuoheng:
# 图片域名
image-url: https://image.t-aaron.com/
# OSS域名
oss-url: https://ta-tech-image.oss-cn-shanghai.aliyuncs.com
# 机场域名
airport-url: http://124.223.218.130:9060/
# 视频域名
video-url: https://vod.play.t-aaron.com/
# 高德Key
gaodeKey: 8eb26a06684d34501e5a56dcc2f5af15
# 通道地址
live-channel-domain-url: https://streaming.t-aaron.com/

#阿里云
aliyuncsVod:
accessKeyId: LTAI5tE7KWN9fsuGU7DyfYF4
accessKeySecret: yPPCyfsqWgrTuoz5H4sisY0COclx8E
roleArn: acs:ram::1399733914954856:role/ramosstest
bucketName: ta-tech-image

spring:
# 配置数据源
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://192.168.11.242:3306/tuoheng_lc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&useSSL=true&tinyInt1isBit=false
username: root
password: idontcare
druid:
# 连接池的配置信息
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 5
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
webStatFilter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
statViewServlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.163.1
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.73
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456

# Redis数据源
redis:
# 缓存库默认索引0
database: 0
# Redis服务器地址
host: 192.168.11.242
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
# 连接超时时间(毫秒)
timeout: 6000
# 默认的数据过期时间,主要用于shiro权限管理
expire: 2592000
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 1 # 连接池中的最小空闲连接

servlet:
multipart:
# 过滤springmvc的文件上传
enabled: false
# 单个文件最大值
max-file-size: 50MB
# 上传文件总的最大值
max-request-size: 100MB
#邮件配置
mail:
# 设置邮箱主机
host: smtp.qq.com
# 开启邮箱POP3/SMTP服务,获取客户端授权码(注意并不是邮箱密码,而是授权码)
password:
# 邮箱的用户名
username:
properties:
mail:
smtp:
# 设置是否需要认证,如果为true,那么用户名和密码就必须的。如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
auth: true
starttls:
# STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
enable: true
require: true

alisms:
accessKeyId:
accessKeySecret:
regionId: cn-hangzhou
signName: 拓恒
templateCode:
kafka:
common:
enable: false
bootstrap-servers: 192.168.11.242:9092
alg-online-results-topic: alg-task-results
alg-online-results-group-id: hhz-test
alg-offline-tasks-topic: alg-offline-tasks
alg-online-tasks-topic: alg-online-tasks
file:
#上传的服务器上的映射文件夹
accessPath: /uploads/
#静态资源对外暴露的访问路径
staticAccessPath: /**
#静态资源实际存储路径
uploadFolder: /data/java/tuoheng_lc/uploads/

# Shiro
shiro:
cipher-key: f/SX5TIve5WWzT4aQlABJA==
cookie-name: shiro-cookie2
user:
# 登录地址
loginUrl: /login
# 权限认证失败地址
unauthorizedUrl: /unauth
# 首页地址
indexUrl: /index
# 验证码开关
captchaEnabled: true
# 验证码类型 math 数组计算 char 字符
captchaType: math
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
httpOnly: true
# 设置Cookie的过期时间,天为单位
maxAge: 30
session:
# Session超时时间(默认30分钟)
expireTime: 300
# 同步session到数据库的周期(默认1分钟)
dbSyncPeriod: 1
# 相隔多久检查一次session的有效性,默认就是10分钟
validationInterval: 10

# 代码生成
generate:
# 作者
author: 拓恒
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: com.tuoheng.system
# 模块名
moduleName: tuoheng-system
# 自动去除表前缀,默认是true
autoRemovePre: true
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
tablePrefix: sys_
xxl:
enable: true
job:
admin:
addresses: http://192.168.11.241:8110/xxl-job-admin
accessToken: tuoheng
executor:
appname: xxl-job-executor-lc
address:
ip:
# 多个后台,端口号不能相同
port: 9999
logpath: /data/java/logs/xxl-job/jobhandler
logretentiondays: 15

+ 0
- 0
tuoheng-admin/src/main/resources/application.yml View File


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

Loading…
Cancel
Save