20251124炳辰版本

This commit is contained in:
wxlong
2025-11-25 17:51:39 +08:00
commit 537fba0e06
269 changed files with 34909 additions and 0 deletions

45
.gitignore vendored Normal file
View File

@@ -0,0 +1,45 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### 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/
### VS Code ###
.vscode/
# front-end code
src/main/resources/static/
src/main/resources/templates/
# NGINX
nginx/*
!nginx/conf/
# application.properties
src/main/resources/*.properties
!src/main/resources/application.properties
static

114
.mvn/wrapper/MavenWrapperDownloader.java vendored Normal file
View File

@@ -0,0 +1,114 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.Properties;
public class MavenWrapperDownloader {
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL =
"https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: : " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}

BIN
.mvn/wrapper/maven-wrapper.jar vendored Normal file

Binary file not shown.

1
.mvn/wrapper/maven-wrapper.properties vendored Normal file
View File

@@ -0,0 +1 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip

9
Dockerfile Normal file
View File

@@ -0,0 +1,9 @@
FROM openjdk:8-jdk-alpine
COPY ./target/*.jar app.jar
RUN mkdir -p /usr/local/data
VOLUME ["/usr/local/data"]
ENTRYPOINT ["java","-jar","/app.jar", "--spring.profiles.active=docker", "--postgres.host=db", "--static.file.path=/usr/local/data", "--mybatis.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl"]

4
ModifyLog.md Normal file
View File

@@ -0,0 +1,4 @@
## 20250724 李伯钊
1. 修改获取数据时无法获取关联表及集合表中多媒体文件名的bug本地没有图片无法测试打包压缩
2. 修改Android写入或更新数据时photo字段Photo组件只记录照片名没有拼接路径的问题同时将Android端下载数据的方法给予了反操作
3. [待完成] 需要对新、老数据库中全部的photo字段进行批量修改以满足新代码的逻辑

103
README.md Normal file
View File

@@ -0,0 +1,103 @@
天津移动巡查系统 + 湖北天地图数据采集更新系统的后端工程。
# 架构
后端工程是基于 Spring Boot 的单体应用,主要分为三层,
- 接口层:为客户端程序提供 API
- 业务层:实现具体的业务逻辑
- 数据层:缓存和持久化存储
## 接口层
目前只实现了 HTTP API在代码中表现为各种各样的 `@RestContoller` 类。
## 业务层
因为早期开发时没有固定的规范,代码组织不够合理,业务逻辑的实现代码在 `@RestController` 类和 `@Service` 类中都有出现。
对一些比较重要的业务逻辑的介绍请见后文。
## 数据层
目前通过 PostgreSQL 进行数据化的持久化存储,并基于 Redis 实现了一个简单的缓存中间件。
# 业务流程
从整体上看,后端工程实现的业务逻辑比较复杂,这里只简单介绍主要业务流程所涉及的具体逻辑。目前只有湖北地图院将本系统投入到实际生产中,他们的业务流程包括以下部分:
1. 创建任务:管理员创建新任务,进行采集工具、底图、数据库等方面的配置;
2. 创建数据库:管理员创建该任务对应的数据库,并导入初始数据;
3. 分配任务:管理员为该任务指定外业人员,并根据作业区域、初始数据分布情况等条件进行任务分配;
4. 开展外业:外业人员进行核查、采集等工作,并上传数据;
5. 监管任务:管理员检查任务完成情况。
下面介绍各个环节的具体业务逻辑。
## 创建任务
目前实现了两种创建任务的方式:
- 管理员通过网页端进行各项配置,前端应用将配置项(组织成 JSON发送给后端后端据此创建配置文件和任务
- 管理员通过网页端上传配置文件,后端解析配置文件读取配置项,创建任务。
第一种方式的实现主要在 [`cn.edu.whu.boot.xml.controller.TaskManagementController#createTask`](src/main/java/cn/edu/whu/boot/xml/controller/TaskManagementController.java) 和 [`cn.edu.whu.boot.xml.service.impl.TaskServiceImpl#insertTaskAndXmlEnity`](src/main/java/cn/edu/whu/boot/xml/service/impl/TaskServiceImpl.java) 这两个方法中,第二种方式的实现主要在 [`cn.edu.whu.boot.xml.controller.TaskManagementController#createTaskByXmlFile`](src/main/java/cn/edu/whu/boot/xml/controller/TaskManagementController.java) 和 [`cn.edu.whu.boot.xml.service.impl.TaskServiceImpl#insertTaskAndXmlEnity`](src/main/java/cn/edu/whu/boot/xml/service/impl/TaskServiceImpl.java) 这两个方法中。
这两种实现都涉及到**配置文件**的读/写操作,具体代码在 [`cn.edu.whu.boot.xml.xmlreader.XmlTemplateReader`](src/main/java/cn/edu/whu/boot/xml/xmlreader/XmlTemplateReader.java) 类中。
## 创建数据库
管理员创建任务之后,还需要进行一次手动确认才能创建数据库。创建数据库的步骤为:
1. 在 PostgreSQL 中新建一个 schema该任务相关的所有表都在该 schema 下;
2. 在上一步新建的 schema 下创建表。
这一流程中执行的 SQL 语句都是**根据配置项动态生成的**,相关的代码主要在 [`cn.edu.whu.boot.xml.controller.DataBaseTableController#createTable`](src/main/java/cn/edu/whu/boot/xml/controller/DataBaseTableController.java)、[`cn.edu.whu.boot.xml.controller.DataBaseTableController#buildAllSqlString`](src/main/java/cn/edu/whu/boot/xml/controller/DataBaseTableController.java)、[`cn.edu.whu.boot.xml.service.impl.TableServiceImpl#createTableAndUpdateTask`](src/main/java/cn/edu/whu/boot/xml/service/impl/TableServiceImpl.java) 这些方法中。
管理员可以向表中导入 Shapefile 数据进行初始化,相关代码在 [`cn.edu.whu.boot.collection.controller.ImportController.shpDataMigration`](src/main/java/cn/edu/whu/boot/collection/controller/ImportController.java) 和 [`cn.edu.whu.boot.collection.service.impl.ImportServiceImpl.shpDataInsert`](src/main/java/cn/edu/whu/boot/collection/service/impl/ImportServiceImpl.java) 这两个方法中。
## 分配任务
管理员指定外业人员和上传工作区域 Shapefile 后,系统可自动进行任务分配,即将上一步中导入的数据按照一定的规则分配给外业人员,相关代码主要在 [`cn.edu.whu.boot.allocation.controllers.TaskController#assignCollectingTasks`](src/main/java/cn/edu/whu/boot/allocation/controllers/TaskController.java) 这个方法中。
任务自动分配的业务逻辑比较复杂,更具体的介绍可在[这一文档](docs/任务自动分配.md)中找到。
## 开展外业
外业人员核查/采集数据后会通过移动端程序上传数据后端根据情况进行插入INSERT或更新UPDATE操作相关代码在 [`cn.edu.whu.boot.collection.controller.BaseController#insertAndRecheckData`](src/main/java/cn/edu/whu/boot/collection/controller/BaseController.java)、[`cn.edu.whu.boot.collection.service.impl.BaseServiceImpl.insertData`](src/main/java/cn/edu/whu/boot/collection/service/impl/BaseServiceImpl.java)、[`cn.edu.whu.boot.collection.service.impl.BaseServiceImpl.updateRecheckData`](src/main/java/cn/edu/whu/boot/collection/service/impl/BaseServiceImpl.java) 这几个方法中。
## 监管任务
管理员可在网页端实时查看任务的进行情况,主要涉及到两类信息的查询:
- 任务进度,包括任务总量、已完成量、未完成量和每个外业人员的进度等,代码在 [`cn.edu.whu.boot.statistics.service.ReportService#countWorkloadByUser`](src/main/java/cn/edu/whu/boot/statistics/service/ReportService.java) 这个方法中。
- 外业人员已上传的数据,相关的代码在 [`cn.edu.whu.boot.collection.controller.GetController#getDataByPageNum`](src/main/java/cn/edu/whu/boot/collection/controller/GetController.java) 和 [`cn.edu.whu.boot.collection.service.impl.SearchPageServiceImpl#getPageDataByWorkerAndStatus`](src/main/java/cn/edu/whu/boot/collection/service/impl/SearchPageServiceImpl.java) 这两个方法中;这个接口返回的数据中包含一个状态码字段(`status`),关于该字段含义的解释请见[这一文档](docs/数据状态码字段.md)。
# 部署
如果条件允许的话可以用 [Docker Compose](docker-compose.yaml) 进行部署,否则按顺序执行以下操作:
1. 安装所需的各种软件,包括 JDK 1.8、PostgreSQL (版本至少为 9.6)、 [Redis](https://github.com/microsoftarchive/redis/releases) 和 [NGINX](http://nginx.org/en/download.html)
2. 创建数据库,名称为 `tj_project`,通过 `psql` 或其他工具执行 [`scheme.sql`](postgres/schema.sql) 和 [`tables.sql`](postgres/tables.sql) 这两个 SQL 文件,对数据库进行初始化设置;
- 创建的数据库的名称如果不是 `tj_project`,需要相应地修改 [`scheme.sql`](postgres/schema.sql) 和 [`tables.sql`](postgres/tables.sql) 文件开头 `\c` 命令的参数
3. 运行 `redis-server.exe`,启动 Redis 服务;
4. 修改 [`application.properties`](src/main/resources/application.properties) 中数据库用户名和密码、静态资源存储路径等参数,将后端工程打包成 JAR 文件后启动即可;也可先打包,启动时再通过命令行传入相关参数;
- 最方便的方法是写一个启动脚本,把所需的参数写在脚本内,然后直接通过脚本来启动程序,下面是一个 Windows 脚本的示例:
```
java -jar <jar 文件路径> --server.port=9001
```
- 如果编写了启动脚本,还可以将脚本的快捷方式放在 Startup 目录下(执行 `shell:common startup` 命令可打开该目录),这样系统重启时后端工程也会跟着重启
5. 将[这个文件](nginx/conf/nginx.conf)作为模板配置 Nginx然后运行 `nginx.exe` 启动 NGINX 服务器。
## 将 NGINX 和 Redis 注册为 Windows 服务
1. 关闭正在运行的 NGINX通过 `nginx.exe -s stop` 命令关闭) 和 Redis 实例;
2. 下载并解压 [NSSM](http://nssm.cc/download),以管理员身份在相应的解压目录下启动一个 Powershell 窗口,执行命令 `nssm install`,将 `nginx.exe` 和 `redis-server.exe` 注册为 Windows 服务;
3. 通过 [`Start-Service`](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-service?view=powershell-7.2) 命令启动服务:
```powershell
> Start-Service "nginx"
> Start-Service "redis"
```

41
docker-compose.yaml Normal file
View File

@@ -0,0 +1,41 @@
version: "3.7"
services:
backend:
build: .
container_name: tj-project-app
ports:
- 9001:9000
restart: always
volumes:
- ./mount/backend:/usr/local/data
networks:
- spring-postgres
depends_on:
- db
- redis
db:
build: ./postgres
container_name: tj-project-db
ports:
- 5433:5432
restart: always
volumes:
- ./mount/db:/var/lib/postgresql/data
networks:
- spring-postgres
environment:
- POSTGRES_DB=tj_project
- POSTGRES_PASSWORD=admin503
redis:
image: redis
container_name: tj-project-redis
volumes:
- ./mount/redis:/usr/local/etc/redis
expose:
- 6379
networks:
- spring-postgres
networks:
spring-postgres:

View File

@@ -0,0 +1,23 @@
从总体上看,任务自动分配可以分为两部分,一个是分配工作区域,另一个是分配数据。
# 分配工作区域
目前工作工作区域分配的前提是用户已经上传了包含整个工作区域信息的 Shapefile。
如果用户设置了 [Geohash](https://halfrost.com/go_spatial_search/) 精度,将整个工作区域的外接矩形按照用户选择的精度划分为若干个 Geohash 网格(如果按照用户选择的精度划分出的网格数量小于外业人员数量,则尝试将精度加 1 后再次划分),然后将这些网格尽可能平均地分配给外业人员。
如果用户没有指定 Geohash 精度,则按照以下方法将 Shapefile 中的多边形分配给外业人员:
1. 如果多边形数量等于外业人员数量,随机分配;
2. 如果多边形数量大于 1 但小于外业人员数量,以多边形的面积为权重进行分配,即多边形的面积越大,分配到的人员数量就越多;
3. 如果多边形数量大于外业人员数量,对多边形进行 k-means 聚类,类簇数量等于外业人员数量,然后随机分配每个类簇;
4. 如果只有一个多边形而且外业人员数量大于 1将这个多边形的外接矩形按照合适的 Geohash 精度划分为若干个网格,然后将这些网格尽可能平均地分配给外业人员;确定 Geohash 精度的原则是保证划分后得到的网格数量不小于外业人员数量。
# 分配数据
如果用户提前导入了一些数据,则需要按照以下方法分配数据:
1. 如果只有一个外业人员,将所有数据都分配给该人员;
2. 如果外业人员数量大于 1首先计算每个数据的质心坐标相同的质心只保留一个然后按照以下方法分配
1. 如果质心数量小于外业人员数量,将所有数据尽可能平均地分配给外业人员;
2. 否则,将质心进行聚类,类簇数量等于外业人员数量,然后随机分配每个类簇。

View File

@@ -0,0 +1,35 @@
在数据库中,每条数据都有 3 个字段:
- `collector`:这条数据的上传者的 ID
- `reviewer`:需要到实地对这条数据进行**核查**的外业人员的 ID大多数情况下 `collector != reviewer`
- `status`:状态字段。
将这 3 个字段结合起来分析,可以识别一条数据在整个工作流程中当前所处的阶段。
一条数据从被导入数据库中到被核查,会经历以下 3 个阶段:
| collector | reviewer | status | 阶段 |
| --------- |----------| ------ |---------------------|
| -1 | -1 | 0 | 数据刚被导入到数据库中 |
| -1 | A | 0 | 管理员将数据分配给外业人员 A |
| -1 | A | 1 | 外业人员 A 已经在实地核查过这条数据 |
如果一条数据原本不在数据库中(即所谓的“新增”数据),那么它从被上传到被核查,会经历以下 3 个阶段:
| collector | reviewer | status | 阶段 |
|-----------|----------|--------|---------------------|
| A | -1 | 1 | 外业人员 A 上传了这条数据 |
| A | B | 0 | 管理员将数据分配给外业人员 B |
| A | B | 1 | 外业人员 B 已经在实地核查过这条数据 |
管理员还可以在网页端对**已经被外业人员核查过的数据**进行审核,如果管理员认为数据没问题,则标记为审核通过:
| status |
|--------|
| 2 |
如果管理员将数据标记为审核未通过:
| status |
|--------|
| -1 |

0
environment_check.sh Normal file
View File

427
hs_err_pid15872.log Normal file
View File

@@ -0,0 +1,427 @@
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=15872, tid=0x0000000000003de0
#
# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
--------------- T H R E A D ---------------
Current thread (0x000000002752a800): VMThread [stack: 0x000000002bca0000,0x000000002bda0000] [id=15840]
siginfo: ExceptionCode=0xc0000005, ExceptionInformation=0x0000000000000008 0x0000000000000000
Registers:
RAX=0x000000002f9e8450, RBX=0x00000000373ad4c0, RCX=0x000000003749b0f0, RDX=0x0000000000000000
RSP=0x000000002bd9edb8, RBP=0x00007ffbedd4ed40, RSI=0x0000000000000002, RDI=0x000000002fa2c450
R8 =0x000000002bd9edf0, R9 =0x00007ffc2892c848, R10=0x0000000000000004, R11=0x000000002bd9edf0
R12=0x00007ffbeda57908, R13=0x0000000003601658, R14=0x0000000000000000, R15=0x0000000000000001
RIP=0x0000000000000000, EFLAGS=0x0000000000010206
Top of Stack: (sp=0x000000002bd9edb8)
0x000000002bd9edb8: 00007ffbd0deb263 00007ffbedd4ed40
0x000000002bd9edc8: 0000000000000000 0000000000000000
0x000000002bd9edd8: 0000000000000000 000000002bd9ee50
0x000000002bd9ede8: 00007ffc2890930e 0000000000000000
0x000000002bd9edf8: 0000000000000000 0000000003601658
0x000000002bd9ee08: 00007ffbeda57908 000000002fa2c450
0x000000002bd9ee18: 00007ffc288f6462 0000000000000000
0x000000002bd9ee28: 0000000000000000 0000000000000002
0x000000002bd9ee38: 00007ffc4d5347b1 0000000000000000
0x000000002bd9ee48: 00007ffc4b43f05b 000000002fa0a660
0x000000002bd9ee58: 00007ffc289266e0 00007ffb00000078
0x000000002bd9ee68: 00000000373b32d0 000000002faf8a40
0x000000002bd9ee78: 00007ffc288f9a44 0000000000000001
0x000000002bd9ee88: 00007ffbedd4ed40 000000002faf8b98
0x000000002bd9ee98: 000000002fa2c450 00000000373cbab0
0x000000002bd9eea8: 00007ffbed7f7e04 000000002fa30630
Instructions: (pc=0x0000000000000000)
0xffffffffffffffe0:
Register to memory mapping:
RAX=0x000000002f9e8450 is an unknown value
RBX=0x00000000373ad4c0 is an unknown value
RCX=0x000000003749b0f0 is an unknown value
RDX=0x0000000000000000 is an unknown value
RSP=0x000000002bd9edb8 is an unknown value
RBP=0x00007ffbedd4ed40 is an unknown value
RSI=0x0000000000000002 is an unknown value
RDI=0x000000002fa2c450 is an unknown value
R8 =0x000000002bd9edf0 is an unknown value
R9 =0x00007ffc2892c848 is an unknown value
R10=0x0000000000000004 is an unknown value
R11=0x000000002bd9edf0 is an unknown value
R12=0x00007ffbeda57908 is an unknown value
R13=0x0000000003601658 is an unknown value
R14=0x0000000000000000 is an unknown value
R15=0x0000000000000001 is an unknown value
Stack: [0x000000002bca0000,0x000000002bda0000], sp=0x000000002bd9edb8, free space=1019k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
VM_Operation (0x00000000385aee20): Exit, mode: safepoint, requested by thread 0x000000002e197000
--------------- P R O C E S S ---------------
Java Threads: ( => current thread )
0x00000000317bb000 JavaThread "globalEventExecutor-2-2" [_thread_blocked, id=708, stack(0x0000000034390000,0x0000000034490000)]
0x000000002e197000 JavaThread "SIGINT handler" daemon [_thread_blocked, id=6716, stack(0x00000000384b0000,0x00000000385b0000)]
0x00000000317c4000 JavaThread "FeatureNativeObjectsCleaner" daemon [_thread_blocked, id=15080, stack(0x0000000037aa0000,0x0000000037ba0000)]
0x00000000317c5800 JavaThread "GeometryNativeObjectsCleaner" daemon [_thread_blocked, id=16292, stack(0x00000000379a0000,0x0000000037aa0000)]
0x00000000317bf800 JavaThread "RMI TCP Connection(2)-192.168.1.32" daemon [_thread_in_native, id=2864, stack(0x0000000034790000,0x0000000034890000)]
0x00000000317c2800 JavaThread "DestroyJavaVM" [_thread_blocked, id=16052, stack(0x0000000003610000,0x0000000003710000)]
0x000000002db6c000 JavaThread "JMX server connection timeout 24" daemon [_thread_blocked, id=8940, stack(0x000000002ef80000,0x000000002f080000)]
0x000000002db68800 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=5980, stack(0x000000002ee80000,0x000000002ef80000)]
0x000000002db55800 JavaThread "RMI TCP Connection(1)-192.168.1.32" daemon [_thread_in_native, id=9632, stack(0x000000002ed80000,0x000000002ee80000)]
0x000000002d9a4000 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=12188, stack(0x000000002e8d0000,0x000000002e9d0000)]
0x000000002c87a800 JavaThread "Service Thread" daemon [_thread_blocked, id=9496, stack(0x000000002d800000,0x000000002d900000)]
0x000000002c77b000 JavaThread "C1 CompilerThread11" daemon [_thread_blocked, id=10228, stack(0x000000002d700000,0x000000002d800000)]
0x000000002c772000 JavaThread "C1 CompilerThread10" daemon [_thread_blocked, id=2164, stack(0x000000002d600000,0x000000002d700000)]
0x000000002c767800 JavaThread "C1 CompilerThread9" daemon [_thread_blocked, id=32, stack(0x000000002d500000,0x000000002d600000)]
0x000000002c764800 JavaThread "C1 CompilerThread8" daemon [_thread_blocked, id=8956, stack(0x000000002d400000,0x000000002d500000)]
0x000000002995d800 JavaThread "C2 CompilerThread7" daemon [_thread_blocked, id=17204, stack(0x000000002d300000,0x000000002d400000)]
0x000000002c760000 JavaThread "C2 CompilerThread6" daemon [_thread_blocked, id=6016, stack(0x000000002d200000,0x000000002d300000)]
0x000000002995d000 JavaThread "C2 CompilerThread5" daemon [_thread_blocked, id=10216, stack(0x000000002d000000,0x000000002d100000)]
0x000000002995a000 JavaThread "C2 CompilerThread4" daemon [_thread_blocked, id=6480, stack(0x000000002cf00000,0x000000002d000000)]
0x000000002c74e800 JavaThread "C2 CompilerThread3" daemon [_thread_blocked, id=18876, stack(0x000000002ce00000,0x000000002cf00000)]
0x000000002c74e000 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=17036, stack(0x000000002cd00000,0x000000002ce00000)]
0x000000002c74d000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=13880, stack(0x000000002cc00000,0x000000002cd00000)]
0x000000002c74b800 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=9560, stack(0x000000002cb00000,0x000000002cc00000)]
0x000000002c75d000 JavaThread "Monitor Ctrl-Break" daemon [_thread_in_native, id=2404, stack(0x000000002ca00000,0x000000002cb00000)]
0x0000000029744800 JavaThread "Attach Listener" daemon [_thread_blocked, id=19132, stack(0x000000002c100000,0x000000002c200000)]
0x000000002979d800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=14440, stack(0x000000002c000000,0x000000002c100000)]
0x000000002972a000 JavaThread "Finalizer" daemon [_thread_blocked, id=16324, stack(0x000000002bea0000,0x000000002bfa0000)]
0x0000000029729000 JavaThread "Reference Handler" daemon [_thread_blocked, id=8052, stack(0x000000002bda0000,0x000000002bea0000)]
Other Threads:
=>0x000000002752a800 VMThread [stack: 0x000000002bca0000,0x000000002bda0000] [id=15840]
VM state:at safepoint (shutting down)
VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event])
[0x0000000003710e50] Threads_lock - owner thread: 0x000000002752a800
heap address: 0x00000005c3400000, size: 8140 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x00000007c0000000
Heap:
PSYoungGen total 425472K, used 131639K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000)
eden space 404480K, 32% used [0x0000000716700000,0x000000071e78dc80,0x000000072f200000)
from space 20992K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732300000)
to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000)
ParOldGen total 599552K, used 32010K [0x00000005c3400000, 0x00000005e7d80000, 0x0000000716700000)
object space 599552K, 5% used [0x00000005c3400000,0x00000005c53428b8,0x00000005e7d80000)
Metaspace used 60029K, capacity 63176K, committed 63256K, reserved 1103872K
class space used 7368K, capacity 7950K, committed 7984K, reserved 1048576K
Card table byte_map: [0x0000000012dc0000,0x0000000013db0000] byte_map_base: 0x000000000ffa6000
Marking Bits: (ParMarkBitMap*) 0x000000006a8a4ce0
Begin Bits: [0x0000000015c50000, 0x000000001db80000)
End Bits: [0x000000001db80000, 0x0000000025ab0000)
Polling page: 0x0000000001710000
CodeCache: size=245760Kb used=14111Kb max_used=14194Kb free=231648Kb
bounds [0x0000000003a00000, 0x00000000047e0000, 0x0000000012a00000]
total_blobs=7102 nmethods=6344 adapters=666
compilation: enabled
Compilation events (10 events):
Event: 15.649 Thread 0x000000002c764800 6372 1 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node::predecessor (19 bytes)
Event: 15.649 Thread 0x000000002c764800 nmethod 6372 0x00000000047dbe50 code [0x00000000047dbfc0, 0x00000000047dc188]
Event: 15.649 Thread 0x000000002c767800 6373 1 java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl::accessCheck (17 bytes)
Event: 15.649 Thread 0x000000002c767800 nmethod 6373 0x00000000047dc250 code [0x00000000047dc3c0, 0x00000000047dc528]
Event: 15.649 Thread 0x000000002c772000 6374 ! 1 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry::destroyBean (385 bytes)
Event: 15.649 Thread 0x000000002c77b000 6375 1 io.netty.util.concurrent.SingleThreadEventExecutor::fetchFromScheduledTaskQueue (69 bytes)
Event: 15.649 Thread 0x000000002c77b000 nmethod 6375 0x00000000047dc5d0 code [0x00000000047dc760, 0x00000000047dc9f8]
Event: 15.650 Thread 0x000000002c772000 nmethod 6374 0x0000000003d1a790 code [0x0000000003d1ab20, 0x0000000003d1bcd8]
Event: 15.650 Thread 0x000000002c764800 6376 1 java.util.concurrent.locks.ReentrantLock$Sync::isHeldExclusively (16 bytes)
Event: 15.650 Thread 0x000000002c764800 nmethod 6376 0x0000000003d05810 code [0x0000000003d05960, 0x0000000003d05a90]
GC Heap History (10 events):
Event: 1.126 GC heap before
{Heap before GC invocations=5 (full 1):
PSYoungGen total 283648K, used 172335K [0x0000000716700000, 0x000000072e100000, 0x00000007c0000000)
eden space 262144K, 62% used [0x0000000716700000,0x000000072073ed58,0x0000000726700000)
from space 21504K, 38% used [0x0000000726700000,0x0000000726f0d1e0,0x0000000727c00000)
to space 21504K, 0% used [0x000000072cc00000,0x000000072cc00000,0x000000072e100000)
ParOldGen total 225792K, used 9890K [0x00000005c3400000, 0x00000005d1080000, 0x0000000716700000)
object space 225792K, 4% used [0x00000005c3400000,0x00000005c3da8948,0x00000005d1080000)
Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K
Event: 1.130 GC heap after
Heap after GC invocations=5 (full 1):
PSYoungGen total 359424K, used 13394K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000)
eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000)
from space 18432K, 72% used [0x000000072cc00000,0x000000072d914860,0x000000072de00000)
to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000)
ParOldGen total 225792K, used 9970K [0x00000005c3400000, 0x00000005d1080000, 0x0000000716700000)
object space 225792K, 4% used [0x00000005c3400000,0x00000005c3dbc958,0x00000005d1080000)
Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K
}
Event: 1.130 GC heap before
{Heap before GC invocations=6 (full 2):
PSYoungGen total 359424K, used 13394K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000)
eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000)
from space 18432K, 72% used [0x000000072cc00000,0x000000072d914860,0x000000072de00000)
to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000)
ParOldGen total 225792K, used 9970K [0x00000005c3400000, 0x00000005d1080000, 0x0000000716700000)
object space 225792K, 4% used [0x00000005c3400000,0x00000005c3dbc958,0x00000005d1080000)
Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K
Event: 1.180 GC heap after
Heap after GC invocations=6 (full 2):
PSYoungGen total 359424K, used 0K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000)
eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000)
from space 18432K, 0% used [0x000000072cc00000,0x000000072cc00000,0x000000072de00000)
to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000)
ParOldGen total 402432K, used 19607K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000)
object space 402432K, 4% used [0x00000005c3400000,0x00000005c4725da8,0x00000005dbd00000)
Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K
}
Event: 2.001 GC heap before
{Heap before GC invocations=7 (full 2):
PSYoungGen total 359424K, used 340992K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000)
eden space 340992K, 100% used [0x0000000716700000,0x000000072b400000,0x000000072b400000)
from space 18432K, 0% used [0x000000072cc00000,0x000000072cc00000,0x000000072de00000)
to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000)
ParOldGen total 402432K, used 19607K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000)
object space 402432K, 4% used [0x00000005c3400000,0x00000005c4725da8,0x00000005dbd00000)
Metaspace used 49819K, capacity 52484K, committed 52648K, reserved 1095680K
class space used 6275K, capacity 6791K, committed 6832K, reserved 1048576K
Event: 2.009 GC heap after
Heap after GC invocations=7 (full 2):
PSYoungGen total 362496K, used 21482K [0x0000000716700000, 0x0000000732500000, 0x00000007c0000000)
eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000)
from space 21504K, 99% used [0x000000072b400000,0x000000072c8faa00,0x000000072c900000)
to space 23040K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732500000)
ParOldGen total 402432K, used 21364K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000)
object space 402432K, 5% used [0x00000005c3400000,0x00000005c48dd370,0x00000005dbd00000)
Metaspace used 49819K, capacity 52484K, committed 52648K, reserved 1095680K
class space used 6275K, capacity 6791K, committed 6832K, reserved 1048576K
}
Event: 2.671 GC heap before
{Heap before GC invocations=8 (full 2):
PSYoungGen total 362496K, used 210703K [0x0000000716700000, 0x0000000732500000, 0x00000007c0000000)
eden space 340992K, 55% used [0x0000000716700000,0x0000000721fc94f8,0x000000072b400000)
from space 21504K, 99% used [0x000000072b400000,0x000000072c8faa00,0x000000072c900000)
to space 23040K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732500000)
ParOldGen total 402432K, used 21364K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000)
object space 402432K, 5% used [0x00000005c3400000,0x00000005c48dd370,0x00000005dbd00000)
Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K
Event: 2.677 GC heap after
Heap after GC invocations=8 (full 2):
PSYoungGen total 425472K, used 20137K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000)
eden space 404480K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072f200000)
from space 20992K, 95% used [0x0000000730e80000,0x000000073222a4e8,0x0000000732300000)
to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000)
ParOldGen total 402432K, used 21372K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000)
object space 402432K, 5% used [0x00000005c3400000,0x00000005c48df370,0x00000005dbd00000)
Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K
}
Event: 2.677 GC heap before
{Heap before GC invocations=9 (full 3):
PSYoungGen total 425472K, used 20137K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000)
eden space 404480K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072f200000)
from space 20992K, 95% used [0x0000000730e80000,0x000000073222a4e8,0x0000000732300000)
to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000)
ParOldGen total 402432K, used 21372K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000)
object space 402432K, 5% used [0x00000005c3400000,0x00000005c48df370,0x00000005dbd00000)
Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K
Event: 2.745 GC heap after
Heap after GC invocations=9 (full 3):
PSYoungGen total 425472K, used 0K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000)
eden space 404480K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072f200000)
from space 20992K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732300000)
to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000)
ParOldGen total 599552K, used 32010K [0x00000005c3400000, 0x00000005e7d80000, 0x0000000716700000)
object space 599552K, 5% used [0x00000005c3400000,0x00000005c53428b8,0x00000005e7d80000)
Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K
}
Deoptimization events (0 events):
No events
Classes redefined (0 events):
No events
Internal exceptions (10 events):
Event: 2.819 Thread 0x000000002e29b800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x0000000718461928) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 3.158 Thread 0x000000002e29b800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x00000007188b8760) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 3.266 Thread 0x000000002e29b800 Exception <a 'java/lang/reflect/InvocationTargetException'> (0x00000007190894f8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\reflection.cpp, line 1092]
Event: 3.269 Thread 0x000000002e29b800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x0000000719130938) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 3.269 Thread 0x000000002e29b800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x0000000719131a60) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 3.270 Thread 0x000000002e29b800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x00000007191a7c00) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 15.431 Thread 0x000000002c258800 Exception <a 'java/lang/InterruptedException': sleep interrupted> (0x000000071aff4e68) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\prims\jvm.cpp, line 3340]
Event: 15.435 Thread 0x000000002e197800 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.lambda$toStream$0(Ljava/util/Optional;)Ljava/util/stream/Stream;> (0x000000071b7961c0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\l
Event: 15.435 Thread 0x000000002e197800 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.of(Ljava/lang/Object;)Ljava/util/stream/Stream;> (0x000000071b79c368) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolver.cpp,
Event: 15.435 Thread 0x000000002e197800 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.empty()Ljava/util/stream/Stream;> (0x000000071b7a0220) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolver.cpp, line 620]
Events (10 events):
Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e3f090
Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e44390
Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e47350
Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e4c790
Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e4ea50
Event: 15.651 Executing VM operation: RevokeBias
Event: 15.651 Executing VM operation: RevokeBias done
Event: 15.651 Thread 0x00000000317b8800 Thread exited: 0x00000000317b8800
Event: 15.651 Thread 0x000000002e197800 Thread exited: 0x000000002e197800
Event: 15.652 Executing VM operation: Exit
Dynamic libraries:
0x00007ff600c30000 - 0x00007ff600c67000 E:\Java\jdk1.8.0_201\bin\java.exe
0x00007ffc4d510000 - 0x00007ffc4d708000 C:\Windows\SYSTEM32\ntdll.dll
0x00007ffc4bd90000 - 0x00007ffc4be52000 C:\Windows\System32\KERNEL32.DLL
0x00007ffc4b100000 - 0x00007ffc4b3f6000 C:\Windows\System32\KERNELBASE.dll
0x00007ffc4c230000 - 0x00007ffc4c2e1000 C:\Windows\System32\ADVAPI32.dll
0x00007ffc4b6e0000 - 0x00007ffc4b77e000 C:\Windows\System32\msvcrt.dll
0x00007ffc4b990000 - 0x00007ffc4ba2f000 C:\Windows\System32\sechost.dll
0x00007ffc4c100000 - 0x00007ffc4c223000 C:\Windows\System32\RPCRT4.dll
0x00007ffc4ad40000 - 0x00007ffc4ad67000 C:\Windows\System32\bcrypt.dll
0x00007ffc4b540000 - 0x00007ffc4b6dd000 C:\Windows\System32\USER32.dll
0x00007ffc4b400000 - 0x00007ffc4b422000 C:\Windows\System32\win32u.dll
0x00007ffc4d320000 - 0x00007ffc4d34b000 C:\Windows\System32\GDI32.dll
0x00007ffc4ae80000 - 0x00007ffc4af99000 C:\Windows\System32\gdi32full.dll
0x00007ffc4aba0000 - 0x00007ffc4ac3d000 C:\Windows\System32\msvcp_win.dll
0x00007ffc4b430000 - 0x00007ffc4b530000 C:\Windows\System32\ucrtbase.dll
0x00007ffc3c640000 - 0x00007ffc3c8da000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.5915_none_60b4b9d171f9c7c7\COMCTL32.dll
0x00007ffc4d2f0000 - 0x00007ffc4d31f000 C:\Windows\System32\IMM32.DLL
0x000000006a930000 - 0x000000006aa01000 E:\Java\jdk1.8.0_201\jre\bin\msvcr100.dll
0x000000006a080000 - 0x000000006a924000 E:\Java\jdk1.8.0_201\jre\bin\server\jvm.dll
0x00007ffc4c420000 - 0x00007ffc4c428000 C:\Windows\System32\PSAPI.DLL
0x00007ffc47420000 - 0x00007ffc47429000 C:\Windows\SYSTEM32\WSOCK32.dll
0x00007ffc41df0000 - 0x00007ffc41e17000 C:\Windows\SYSTEM32\WINMM.dll
0x00007ffc46f80000 - 0x00007ffc46f8a000 C:\Windows\SYSTEM32\VERSION.dll
0x00007ffc4cd00000 - 0x00007ffc4cd6b000 C:\Windows\System32\WS2_32.dll
0x00007ffc47410000 - 0x00007ffc4741f000 E:\Java\jdk1.8.0_201\jre\bin\verify.dll
0x00007ffc473e0000 - 0x00007ffc47409000 E:\Java\jdk1.8.0_201\jre\bin\java.dll
0x00007ffc45690000 - 0x00007ffc456b3000 E:\Java\jdk1.8.0_201\jre\bin\instrument.dll
0x00007ffc43d30000 - 0x00007ffc43d46000 E:\Java\jdk1.8.0_201\jre\bin\zip.dll
0x00007ffc4c590000 - 0x00007ffc4ccfe000 C:\Windows\System32\SHELL32.dll
0x00007ffc48c20000 - 0x00007ffc493c4000 C:\Windows\SYSTEM32\windows.storage.dll
0x00007ffc4ba30000 - 0x00007ffc4bd83000 C:\Windows\System32\combase.dll
0x00007ffc4a5d0000 - 0x00007ffc4a5fb000 C:\Windows\SYSTEM32\Wldp.dll
0x00007ffc4d350000 - 0x00007ffc4d41d000 C:\Windows\System32\OLEAUT32.dll
0x00007ffc4cd70000 - 0x00007ffc4ce1d000 C:\Windows\System32\SHCORE.dll
0x00007ffc4b930000 - 0x00007ffc4b98b000 C:\Windows\System32\shlwapi.dll
0x00007ffc4aad0000 - 0x00007ffc4aaf5000 C:\Windows\SYSTEM32\profapi.dll
0x00007ffbfbf40000 - 0x00007ffbfbf5a000 E:\Java\jdk1.8.0_201\jre\bin\net.dll
0x00007ffc3f5e0000 - 0x00007ffc3f7d0000 C:\Windows\SYSTEM32\urlmon.dll
0x00007ffc4a000000 - 0x00007ffc4a00c000 C:\Windows\SYSTEM32\netutils.dll
0x00007ffc3f5b0000 - 0x00007ffc3f5d8000 C:\Windows\SYSTEM32\srvcli.dll
0x00007ffc3f2f0000 - 0x00007ffc3f5af000 C:\Windows\SYSTEM32\iertutil.dll
0x00007ffc4a330000 - 0x00007ffc4a39a000 C:\Windows\system32\mswsock.dll
0x00007ffc4a010000 - 0x00007ffc4a0da000 C:\Windows\SYSTEM32\DNSAPI.dll
0x00007ffc49fc0000 - 0x00007ffc49ffb000 C:\Windows\SYSTEM32\IPHLPAPI.DLL
0x00007ffc4b530000 - 0x00007ffc4b538000 C:\Windows\System32\NSI.dll
0x00007ffc44d70000 - 0x00007ffc44d7a000 C:\Windows\System32\rasadhlp.dll
0x00007ffc43240000 - 0x00007ffc432c0000 C:\Windows\System32\fwpuclnt.dll
0x00007ffc45150000 - 0x00007ffc4515d000 E:\Java\jdk1.8.0_201\jre\bin\management.dll
0x00007ffbf80e0000 - 0x00007ffbf80f1000 E:\Java\jdk1.8.0_201\jre\bin\nio.dll
0x00007ffc4a520000 - 0x00007ffc4a538000 C:\Windows\SYSTEM32\CRYPTSP.dll
0x00007ffc49be0000 - 0x00007ffc49c18000 C:\Windows\system32\rsaenh.dll
0x00007ffc4aa90000 - 0x00007ffc4aabe000 C:\Windows\SYSTEM32\USERENV.dll
0x00007ffc4ad70000 - 0x00007ffc4adf2000 C:\Windows\System32\bcryptprimitives.dll
0x00007ffc4a540000 - 0x00007ffc4a54c000 C:\Windows\SYSTEM32\CRYPTBASE.dll
0x00007ffc451a0000 - 0x00007ffc451b7000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL
0x00007ffc45180000 - 0x00007ffc4519d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL
0x00007ffc34ce0000 - 0x00007ffc34cf7000 C:\Windows\system32\napinsp.dll
0x00007ffc302b0000 - 0x00007ffc302cb000 C:\Windows\system32\pnrpnsp.dll
0x00007ffc30290000 - 0x00007ffc302ad000 C:\Windows\system32\wshbth.dll
0x00007ffc455f0000 - 0x00007ffc4560d000 C:\Windows\system32\NLAapi.dll
0x00007ffc30270000 - 0x00007ffc30282000 C:\Windows\System32\winrnr.dll
0x00007ffc3abe0000 - 0x00007ffc3ac31000 C:\Windows\SYSTEM32\pdh.dll
0x00007ffc43d20000 - 0x00007ffc43d2f000 C:\Windows\System32\perfproc.dll
0x00007ffc1a870000 - 0x00007ffc1a87f000 C:\Windows\System32\perfos.dll
0x00007ffc1b9c0000 - 0x00007ffc1b9e4000 E:\Java\jdk1.8.0_201\jre\bin\sunec.dll
0x00007ffc35b90000 - 0x00007ffc35c38000 E:\Java\jdk1.8.0_201\bin\gdalalljni.dll
0x00007ffc35b00000 - 0x00007ffc35b8d000 E:\Java\jdk1.8.0_201\bin\MSVCP140.dll
0x00007ffc438e0000 - 0x00007ffc438fb000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140.dll
0x00007ffc43cf0000 - 0x00007ffc43cfc000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140_1.dll
0x00007ffbecbd0000 - 0x00007ffbee01d000 E:\Java\jdk1.8.0_201\bin\gdal.dll
0x00007ffc4afa0000 - 0x00007ffc4b0fd000 C:\Windows\System32\CRYPT32.dll
0x00007ffc433a0000 - 0x00007ffc433b9000 E:\Java\jdk1.8.0_201\bin\zlib.dll
0x00007ffc359e0000 - 0x00007ffc35a73000 E:\Java\jdk1.8.0_201\bin\libcurl.dll
0x00007ffc4c2f0000 - 0x00007ffc4c41b000 C:\Windows\System32\ole32.dll
0x00007ffc4c450000 - 0x00007ffc4c4af000 C:\Windows\System32\WLDAP32.dll
0x00007ffc249e0000 - 0x00007ffc24aa0000 C:\Windows\SYSTEM32\ODBC32.dll
0x00007ffc1c440000 - 0x00007ffc1c5a3000 E:\Java\jdk1.8.0_201\bin\libxml2.dll
0x00007ffc1c300000 - 0x00007ffc1c439000 E:\Java\jdk1.8.0_201\bin\libssl-3-x64.dll
0x00007ffbec6f0000 - 0x00007ffbecbc2000 E:\Java\jdk1.8.0_201\bin\libcrypto-3-x64.dll
0x00007ffc358a0000 - 0x00007ffc35954000 E:\Java\jdk1.8.0_201\bin\zstd.dll
0x00007ffbf7f90000 - 0x00007ffbf80dd000 E:\Java\jdk1.8.0_201\bin\tiff.dll
0x00007ffc19400000 - 0x00007ffc196ab000 E:\Java\jdk1.8.0_201\bin\xerces-c_3_2.dll
0x00007ffc3bec0000 - 0x00007ffc3bef5000 E:\Java\jdk1.8.0_201\bin\libpng16.dll
0x00007ffc1bfa0000 - 0x00007ffc1c2fa000 E:\Java\jdk1.8.0_201\bin\proj_9.dll
0x00007ffbec420000 - 0x00007ffbec6e8000 E:\Java\jdk1.8.0_201\bin\sqlite3.dll
0x0000000180000000 - 0x000000018004e000 E:\Java\jdk1.8.0_201\bin\LIBPQ.dll
0x00007ffc35aa0000 - 0x00007ffc35af1000 E:\Java\jdk1.8.0_201\bin\openjp2.dll
0x00007ffc3bea0000 - 0x00007ffc3bec0000 E:\Java\jdk1.8.0_201\bin\pcre.dll
0x00007ffbd1960000 - 0x00007ffbd264b000 E:\Java\jdk1.8.0_201\bin\spatialite.dll
0x00007ffc359b0000 - 0x00007ffc359d9000 E:\Java\jdk1.8.0_201\bin\freexl.dll
0x00007ffbe86e0000 - 0x00007ffbe8d81000 E:\Java\jdk1.8.0_201\bin\libmysql.dll
0x00007ffc35980000 - 0x00007ffc359a2000 E:\Java\jdk1.8.0_201\bin\ogdi.dll
0x00007ffc35870000 - 0x00007ffc3589a000 E:\Java\jdk1.8.0_201\bin\libexpat.dll
0x00007ffc2e8d0000 - 0x00007ffc2e92c000 E:\Java\jdk1.8.0_201\bin\geos_c.dll
0x00007ffc25760000 - 0x00007ffc2585f000 E:\Java\jdk1.8.0_201\bin\iconv-2.dll
0x00007ffc3d020000 - 0x00007ffc3d02c000 C:\Windows\SYSTEM32\Secur32.dll
0x00007ffbe8500000 - 0x00007ffbe86d5000 E:\Java\jdk1.8.0_201\bin\geos.dll
0x00007ffc4a990000 - 0x00007ffc4a99a000 C:\Windows\SYSTEM32\DPAPI.DLL
0x00007ffc4aa50000 - 0x00007ffc4aa82000 C:\Windows\SYSTEM32\SSPICLI.DLL
0x00007ffc288f0000 - 0x00007ffc28957000 E:\gdal\bin\gdalplugins\ogr_FileGDB.dll
0x00007ffbd0dd0000 - 0x00007ffbd1952000 E:\Java\jdk1.8.0_201\bin\FileGDBAPI.dll
0x00007ffc485d0000 - 0x00007ffc487d1000 C:\Windows\SYSTEM32\dbghelp.dll
VM Arguments:
jvm_args: -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\lib\idea_rt.jar=53785 -Dfile.encoding=UTF-8
java_command: cn.edu.whu.boot.BootApplication
java_class_path (initial): E:\Java\jdk1.8.0_201\jre\lib\charsets.jar;E:\Java\jdk1.8.0_201\jre\lib\deploy.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_201\jre\lib\javaws.jar;E:\Java\jdk1.8.0_201\jre\lib\jce.jar;E:\Java\jdk1.8.0_201\jre\lib\jfr.jar;E:\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_201\jre\lib\jsse.jar;E:\Java\jdk1.8.0_201\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_201\jre\lib\plugin.jar;E:\Java\jdk1.8.0_201\jre\lib\resources.jar;E:\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\503\TJ_project\lydc_backend\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.0.RELEASE\spring-boot-starter-web-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.0.RELEASE\spring-boot-starter-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.3.0.RELEASE\spring-boot-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.0.RELEASE\spring-boot-starter-logging-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.2\log4j-to-slf4j-2.13.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-a
Launcher Type: SUN_STANDARD
Environment Variables:
JAVA_HOME=E:\Java\jdk1.8.0_201
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;E:\gdal\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\bin;
USERNAME=Administrator
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 183 Stepping 1, GenuineIntel
--------------- S Y S T E M ---------------
OS: Windows 10.0 , 64 bit Build 19041 (10.0.19041.5915)
CPU:total 28 (initial active 28) (14 cores per cpu, 2 threads per core) family 6 model 183 stepping 1, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx
Memory: 4k page, physical 33338604k(22288736k free), swap 38319340k(24209488k free)
vm_info: Java HotSpot(TM) 64-Bit Server VM (25.201-b09) for windows-amd64 JRE (1.8.0_201-b09), built on Dec 15 2018 18:36:39 by "java_re" with MS VC++ 10.0 (VS2010)
time: Mon Nov 03 21:25:38 2025
timezone: <20>й<EFBFBD><D0B9><EFBFBD>׼ʱ<D7BC><CAB1>
elapsed time: 16 seconds (0d 0h 0m 16s)

532
hs_err_pid17356.log Normal file
View File

@@ -0,0 +1,532 @@
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffbecc04fa0, pid=17356, tid=0x0000000000000d44
#
# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [gdal.dll+0x34fa0]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
--------------- T H R E A D ---------------
Current thread (0x00000000302d2000): JavaThread "http-nio-0.0.0.0-9001-exec-1" daemon [_thread_in_native, id=3396, stack(0x0000000032b90000,0x0000000032c90000)]
siginfo: ExceptionCode=0xc0000005, reading address 0x0000000000000000
Registers:
RAX=0x0000000036790960, RBX=0xffffffffffffffff, RCX=0x0000000000000000, RDX=0x00007ffbedaebff0
RSP=0x0000000032c8ca20, RBP=0x000000000000195f, RSI=0x00007ffbedaebff0, RDI=0x0000000000000000
R8 =0x000000000000195f, R9 =0x0000000000000001, R10=0x00000000367ba320, R11=0x0000000036968cf1
R12=0x00000000367b9ba0, R13=0x00000000367ba560, R14=0x0000000000000004, R15=0x000000000000000a
RIP=0x00007ffbecc04fa0, EFLAGS=0x0000000000010202
Top of Stack: (sp=0x0000000032c8ca20)
0x0000000032c8ca20: 0000000036a26760 00007ffbece518fa
0x0000000032c8ca30: 00000000367b9ba0 0000000000000000
0x0000000032c8ca40: 0000000000000004 00007ffbecc05012
0x0000000032c8ca50: 0000000000000000 00007ffbedaebff0
0x0000000032c8ca60: 0000000000000009 00007ffc4b450c06
0x0000000032c8ca70: 00000000367ba560 00007ffbece491c3
0x0000000032c8ca80: 0000000000000004 00007ffbece4d1f1
0x0000000032c8ca90: 0000000000000014 000000000000000a
0x0000000032c8caa0: 0000000000000014 00007ffbece4d87b
0x0000000032c8cab0: 0000000000000014 000000000000000a
0x0000000032c8cac0: 00000000367b9ba0 00000000302d2000
0x0000000032c8cad0: 00000000367b9ba0 0000000033bf2be8
0x0000000032c8cae0: 0000000000000000 0000000000000001
0x0000000032c8caf0: 00000000367ba560 0000000032c8cc68
0x0000000032c8cb00: 00000000367b9ba0 00007ffbece4d5f3
0x0000000032c8cb10: 000000000000000a 0000000000000014
Instructions: (pc=0x00007ffbecc04fa0)
0x00007ffbecc04f80: 48 89 5c 24 08 48 89 74 24 10 57 48 83 ec 20 48
0x00007ffbecc04f90: 8b f9 48 c7 c3 ff ff ff ff 0f 1f 80 00 00 00 00
0x00007ffbecc04fa0: 80 7c 19 01 00 48 8d 5b 01 75 f5 48 8d 4b 01 ff
0x00007ffbecc04fb0: 15 4b fb e9 00 48 8b f0 48 85 c0 75 10 48 8b 5c
Register to memory mapping:
RAX=0x0000000036790960 is an unknown value
RBX=0xffffffffffffffff is an unknown value
RCX=0x0000000000000000 is an unknown value
RDX=0x00007ffbedaebff0 is an unknown value
RSP=0x0000000032c8ca20 is pointing into the stack for thread: 0x00000000302d2000
RBP=0x000000000000195f is an unknown value
RSI=0x00007ffbedaebff0 is an unknown value
RDI=0x0000000000000000 is an unknown value
R8 =0x000000000000195f is an unknown value
R9 =0x0000000000000001 is an unknown value
R10=0x00000000367ba320 is an unknown value
R11=0x0000000036968cf1 is an unknown value
R12=0x00000000367b9ba0 is an unknown value
R13=0x00000000367ba560 is an unknown value
R14=0x0000000000000004 is an unknown value
R15=0x000000000000000a is an unknown value
Stack: [0x0000000032b90000,0x0000000032c90000], sp=0x0000000032c8ca20, free space=1010k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [gdal.dll+0x34fa0]
C [gdal.dll+0x35012]
C [gdal.dll+0x27d1f1]
C [gdal.dll+0x27d5f3]
C [gdal.dll+0xc27149]
C [gdalalljni.dll+0x5307f]
C 0x0000000002eb8c67
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j org.gdal.ogr.ogrJNI.Layer_CreateFeature(JLorg/gdal/ogr/Layer;JLorg/gdal/ogr/Feature;)I+0
j org.gdal.ogr.Layer.CreateFeature(Lorg/gdal/ogr/Feature;)I+10
j cn.edu.whu.boot.collection.controller.ExportController.addGeometryLayerToGdb(Lorg/gdal/ogr/DataSource;Lcn/edu/whu/boot/xml/xmlreader/bean/Table;Ljava/lang/String;Ljava/util/List;)V+727
j cn.edu.whu.boot.collection.controller.ExportController.taskGdbExport(Ljava/lang/Integer;ZLjavax/servlet/http/HttpServletResponse;)Ljava/lang/String;+793
v ~StubRoutines::call_stub
J 1981 sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (0 bytes) @ 0x000000000346a5ff [0x000000000346a580+0x7f]
J 1980 C1 sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (104 bytes) @ 0x000000000346ada4 [0x000000000346a9e0+0x3c4]
J 1971 C1 sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (10 bytes) @ 0x0000000003467c24 [0x0000000003467be0+0x44]
J 1970 C1 java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (62 bytes) @ 0x00000000034683a4 [0x00000000034682a0+0x104]
j org.springframework.web.method.support.InvocableHandlerMethod.doInvoke([Ljava/lang/Object;)Ljava/lang/Object;+16
j org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(Lorg/springframework/web/context/request/NativeWebRequest;Lorg/springframework/web/method/support/ModelAndViewContainer;[Ljava/lang/Object;)Ljava/lang/Object;+56
j org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(Lorg/springframework/web/context/request/ServletWebRequest;Lorg/springframework/web/method/support/ModelAndViewContainer;[Ljava/lang/Object;)V+4
j org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Lorg/springframework/web/method/HandlerMethod;)Lorg/springframework/web/servlet/ModelAndView;+244
j org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Lorg/springframework/web/method/HandlerMethod;)Lorg/springframework/web/servlet/ModelAndView;+81
j org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/Object;)Lorg/springframework/web/servlet/ModelAndView;+7
j org.springframework.web.servlet.DispatcherServlet.doDispatch(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+257
j org.springframework.web.servlet.DispatcherServlet.doService(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+212
j org.springframework.web.servlet.FrameworkServlet.processRequest(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+71
j org.springframework.web.servlet.FrameworkServlet.doGet(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+3
j javax.servlet.http.HttpServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+35
j org.springframework.web.servlet.FrameworkServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+33
j javax.servlet.http.HttpServlet.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+36
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+304
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.apache.tomcat.websocket.server.WsFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+21
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+13
j org.apache.shiro.web.servlet.AbstractShiroFilter$1.call()Ljava/lang/Object;+31
j org.apache.shiro.subject.support.SubjectCallable.doCall(Ljava/util/concurrent/Callable;)Ljava/lang/Object;+1
j org.apache.shiro.subject.support.SubjectCallable.call()Ljava/lang/Object;+14
j org.apache.shiro.subject.support.DelegatingSubject.execute(Ljava/util/concurrent/Callable;)Ljava/lang/Object;+7
j org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+47
j org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+113
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.springframework.web.filter.RequestContextFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+21
j org.springframework.web.filter.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+147
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.springframework.web.filter.FormContentFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+38
j org.springframework.web.filter.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+147
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+44
j org.springframework.session.web.http.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+118
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+53
j org.springframework.web.filter.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+147
j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135
j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101
j org.apache.catalina.core.StandardWrapperValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+694
j org.apache.catalina.core.StandardContextValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+166
j org.apache.catalina.authenticator.AuthenticatorBase.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+260
j org.apache.catalina.core.StandardHostValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+114
j org.apache.catalina.valves.ErrorReportValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+6
j org.apache.catalina.core.StandardEngineValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+45
j org.apache.catalina.connector.CoyoteAdapter.service(Lorg/apache/coyote/Request;Lorg/apache/coyote/Response;)V+199
j org.apache.coyote.http11.Http11Processor.service(Lorg/apache/tomcat/util/net/SocketWrapperBase;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState;+735
j org.apache.coyote.AbstractProcessorLight.process(Lorg/apache/tomcat/util/net/SocketWrapperBase;Lorg/apache/tomcat/util/net/SocketEvent;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState;+170
j org.apache.coyote.AbstractProtocol$ConnectionHandler.process(Lorg/apache/tomcat/util/net/SocketWrapperBase;Lorg/apache/tomcat/util/net/SocketEvent;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState;+505
j org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun()V+214
j org.apache.tomcat.util.net.SocketProcessorBase.run()V+21
j java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+95
j java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5
j org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run()V+4
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub
--------------- P R O C E S S ---------------
Java Threads: ( => current thread )
0x0000000030aed000 JavaThread "FeatureNativeObjectsCleaner" daemon [_thread_blocked, id=15244, stack(0x0000000036f60000,0x0000000037060000)]
0x0000000030aec800 JavaThread "GeometryNativeObjectsCleaner" daemon [_thread_blocked, id=3820, stack(0x0000000036e60000,0x0000000036f60000)]
0x0000000030aea000 JavaThread "MessageBroker-5" [_thread_blocked, id=11528, stack(0x0000000036560000,0x0000000036660000)]
0x0000000030af0000 JavaThread "lettuce-eventExecutorLoop-1-1" daemon [_thread_blocked, id=17248, stack(0x0000000035270000,0x0000000035370000)]
0x0000000030ae2800 JavaThread "lettuce-nioEventLoop-4-1" daemon [_thread_in_native, id=5596, stack(0x0000000034160000,0x0000000034260000)]
0x0000000030ae9800 JavaThread "SessionValidationThread-1" daemon [_thread_blocked, id=18952, stack(0x0000000033d90000,0x0000000033e90000)]
0x0000000030ae3800 JavaThread "RMI TCP Connection(2)-192.168.1.32" daemon [_thread_in_native, id=17612, stack(0x0000000033a90000,0x0000000033b90000)]
0x0000000030ae2000 JavaThread "MessageBroker-4" [_thread_blocked, id=9588, stack(0x0000000033990000,0x0000000033a90000)]
0x0000000030ae8800 JavaThread "DestroyJavaVM" [_thread_blocked, id=9444, stack(0x0000000002a40000,0x0000000002b40000)]
0x0000000030ae1000 JavaThread "MessageBroker-3" [_thread_blocked, id=17364, stack(0x0000000033890000,0x0000000033990000)]
0x0000000030ae8000 JavaThread "MessageBroker-2" [_thread_blocked, id=18688, stack(0x0000000033790000,0x0000000033890000)]
0x0000000030ae5800 JavaThread "http-nio-0.0.0.0-9001-Acceptor" daemon [_thread_in_native, id=1752, stack(0x0000000033690000,0x0000000033790000)]
0x0000000030ae5000 JavaThread "http-nio-0.0.0.0-9001-ClientPoller" daemon [_thread_in_native, id=16100, stack(0x0000000033590000,0x0000000033690000)]
0x0000000030ae6800 JavaThread "http-nio-0.0.0.0-9001-exec-10" daemon [_thread_blocked, id=18992, stack(0x0000000033490000,0x0000000033590000)]
0x0000000030ae4000 JavaThread "http-nio-0.0.0.0-9001-exec-9" daemon [_thread_blocked, id=14280, stack(0x0000000033390000,0x0000000033490000)]
0x0000000030ae7000 JavaThread "http-nio-0.0.0.0-9001-exec-8" daemon [_thread_blocked, id=13748, stack(0x0000000033290000,0x0000000033390000)]
0x00000000302ce800 JavaThread "http-nio-0.0.0.0-9001-exec-7" daemon [_thread_blocked, id=16148, stack(0x0000000033190000,0x0000000033290000)]
0x00000000302cd800 JavaThread "http-nio-0.0.0.0-9001-exec-6" daemon [_thread_blocked, id=19248, stack(0x0000000033090000,0x0000000033190000)]
0x00000000302d4800 JavaThread "http-nio-0.0.0.0-9001-exec-5" daemon [_thread_blocked, id=11532, stack(0x0000000032f90000,0x0000000033090000)]
0x00000000302d3000 JavaThread "http-nio-0.0.0.0-9001-exec-4" daemon [_thread_blocked, id=1884, stack(0x0000000032e90000,0x0000000032f90000)]
0x00000000302d0000 JavaThread "http-nio-0.0.0.0-9001-exec-3" daemon [_thread_blocked, id=252, stack(0x0000000032d90000,0x0000000032e90000)]
0x00000000302cf000 JavaThread "http-nio-0.0.0.0-9001-exec-2" daemon [_thread_blocked, id=15996, stack(0x0000000032c90000,0x0000000032d90000)]
=>0x00000000302d2000 JavaThread "http-nio-0.0.0.0-9001-exec-1" daemon [_thread_in_native, id=3396, stack(0x0000000032b90000,0x0000000032c90000)]
0x00000000302d1800 JavaThread "http-nio-0.0.0.0-9001-BlockPoller" daemon [_thread_in_native, id=3532, stack(0x0000000032a90000,0x0000000032b90000)]
0x00000000302d0800 JavaThread "MessageBroker-1" [_thread_blocked, id=2416, stack(0x0000000032190000,0x0000000032290000)]
0x00000000302d3800 JavaThread "HikariPool-1 connection adder" daemon [_thread_blocked, id=3952, stack(0x0000000031e90000,0x0000000031f90000)]
0x0000000028d47000 JavaThread "container-0" [_thread_blocked, id=3140, stack(0x0000000031d90000,0x0000000031e90000)]
0x0000000028d48800 JavaThread "Catalina-utility-2" [_thread_blocked, id=7696, stack(0x0000000031c90000,0x0000000031d90000)]
0x0000000028d44800 JavaThread "Catalina-utility-1" [_thread_blocked, id=13188, stack(0x0000000031b90000,0x0000000031c90000)]
0x0000000028d42000 JavaThread "HikariPool-1 housekeeper" daemon [_thread_blocked, id=15844, stack(0x0000000031890000,0x0000000031990000)]
0x000000002b6ac800 JavaThread "PostgreSQL-JDBC-SharedTimer-1" daemon [_thread_blocked, id=9172, stack(0x0000000031790000,0x0000000031890000)]
0x000000002cf80800 JavaThread "JMX server connection timeout 24" daemon [_thread_blocked, id=17704, stack(0x000000002e380000,0x000000002e480000)]
0x000000002cf3a800 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=17464, stack(0x000000002e280000,0x000000002e380000)]
0x000000002cef7000 JavaThread "RMI TCP Connection(1)-192.168.1.32" daemon [_thread_in_native, id=10332, stack(0x000000002e180000,0x000000002e280000)]
0x000000002cdb7000 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=19092, stack(0x000000002dcd0000,0x000000002ddd0000)]
0x000000002bc6b800 JavaThread "Service Thread" daemon [_thread_blocked, id=14408, stack(0x000000002cc00000,0x000000002cd00000)]
0x000000002bb7f000 JavaThread "C1 CompilerThread11" daemon [_thread_blocked, id=17812, stack(0x000000002cb00000,0x000000002cc00000)]
0x000000002bb76000 JavaThread "C1 CompilerThread10" daemon [_thread_blocked, id=19160, stack(0x000000002ca00000,0x000000002cb00000)]
0x000000002bb73800 JavaThread "C1 CompilerThread9" daemon [_thread_blocked, id=13504, stack(0x000000002c900000,0x000000002ca00000)]
0x000000002bb6a800 JavaThread "C1 CompilerThread8" daemon [_thread_blocked, id=17204, stack(0x000000002c800000,0x000000002c900000)]
0x000000002bb67800 JavaThread "C2 CompilerThread7" daemon [_thread_blocked, id=4436, stack(0x000000002c700000,0x000000002c800000)]
0x000000002bb5f000 JavaThread "C2 CompilerThread6" daemon [_thread_blocked, id=2332, stack(0x000000002c600000,0x000000002c700000)]
0x000000002bb5c000 JavaThread "C2 CompilerThread5" daemon [_thread_blocked, id=17980, stack(0x000000002c500000,0x000000002c600000)]
0x000000002bb59800 JavaThread "C2 CompilerThread4" daemon [_thread_blocked, id=9096, stack(0x000000002c300000,0x000000002c400000)]
0x000000002bb58800 JavaThread "C2 CompilerThread3" daemon [_thread_blocked, id=2784, stack(0x000000002c200000,0x000000002c300000)]
0x000000002bb58000 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=8084, stack(0x000000002c100000,0x000000002c200000)]
0x000000002bb57000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=17652, stack(0x000000002c000000,0x000000002c100000)]
0x000000002bb55800 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=14620, stack(0x000000002bf00000,0x000000002c000000)]
0x000000002bb54000 JavaThread "Monitor Ctrl-Break" daemon [_thread_in_native, id=6068, stack(0x000000002be00000,0x000000002bf00000)]
0x0000000028bba000 JavaThread "Attach Listener" daemon [_thread_blocked, id=18180, stack(0x000000002b500000,0x000000002b600000)]
0x0000000028c15000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=13996, stack(0x000000002b400000,0x000000002b500000)]
0x0000000028b9d800 JavaThread "Finalizer" daemon [_thread_blocked, id=7232, stack(0x000000002b300000,0x000000002b400000)]
0x0000000028b97800 JavaThread "Reference Handler" daemon [_thread_blocked, id=17012, stack(0x000000002b200000,0x000000002b300000)]
Other Threads:
0x00000000269cc000 VMThread [stack: 0x000000002b100000,0x000000002b200000] [id=7748]
0x000000002cdbe800 WatcherThread [stack: 0x000000002ddd0000,0x000000002ded0000] [id=18648]
VM state:not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
heap address: 0x00000005c3400000, size: 8140 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x00000007c0000000
Heap:
PSYoungGen total 413696K, used 44369K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000)
eden space 393216K, 11% used [0x0000000716700000,0x0000000719254530,0x000000072e700000)
from space 20480K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731b80000)
to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000)
ParOldGen total 608768K, used 32122K [0x00000005c3400000, 0x00000005e8680000, 0x0000000716700000)
object space 608768K, 5% used [0x00000005c3400000,0x00000005c535e8b0,0x00000005e8680000)
Metaspace used 59500K, capacity 62494K, committed 62616K, reserved 1103872K
class space used 7280K, capacity 7807K, committed 7856K, reserved 1048576K
Card table byte_map: [0x0000000012260000,0x0000000013250000] byte_map_base: 0x000000000f446000
Marking Bits: (ParMarkBitMap*) 0x000000006a8a4ce0
Begin Bits: [0x00000000150f0000, 0x000000001d020000)
End Bits: [0x000000001d020000, 0x0000000024f50000)
Polling page: 0x0000000000c00000
CodeCache: size=245760Kb used=13881Kb max_used=13881Kb free=231878Kb
bounds [0x0000000002ea0000, 0x0000000003c30000, 0x0000000011ea0000]
total_blobs=6937 nmethods=6187 adapters=659
compilation: enabled
Compilation events (10 events):
Event: 4.508 Thread 0x000000002bb7f000 6183 1 org.postgresql.jdbc.PgResultSet::checkColumnIndex (54 bytes)
Event: 4.508 Thread 0x000000002bb73800 nmethod 6182 0x0000000003c27550 code [0x0000000003c27700, 0x0000000003c27b88]
Event: 4.508 Thread 0x000000002bb73800 6184 1 org.apache.ibatis.type.TypeHandlerRegistry::hasTypeHandler (7 bytes)
Event: 4.508 Thread 0x000000002bb6a800 nmethod 6176 0x0000000003c27e50 code [0x0000000003c27fc0, 0x0000000003c282d8]
Event: 4.508 Thread 0x000000002bb73800 nmethod 6184 0x0000000003c28490 code [0x0000000003c285e0, 0x0000000003c28748]
Event: 4.508 Thread 0x000000002bb7f000 nmethod 6183 0x0000000003c287d0 code [0x0000000003c28980, 0x0000000003c28e78]
Event: 4.508 Thread 0x000000002bb76000 6186 1 org.postgresql.core.PGStream::receiveChar (22 bytes)
Event: 4.508 Thread 0x000000002bb6a800 6187 1 org.postgresql.core.VisibleBufferedInputStream::read (31 bytes)
Event: 4.508 Thread 0x000000002bb76000 nmethod 6186 0x0000000003c29250 code [0x0000000003c293c0, 0x0000000003c295d8]
Event: 4.508 Thread 0x000000002bb6a800 nmethod 6187 0x0000000003c29790 code [0x0000000003c29900, 0x0000000003c29aa8]
GC Heap History (10 events):
Event: 1.137 GC heap before
{Heap before GC invocations=5 (full 1):
PSYoungGen total 283648K, used 174161K [0x0000000716700000, 0x000000072de80000, 0x00000007c0000000)
eden space 262144K, 63% used [0x0000000716700000,0x0000000720905518,0x0000000726700000)
from space 21504K, 38% used [0x0000000726700000,0x0000000726f0f280,0x0000000727c00000)
to space 21504K, 0% used [0x000000072c980000,0x000000072c980000,0x000000072de80000)
ParOldGen total 227840K, used 9897K [0x00000005c3400000, 0x00000005d1280000, 0x0000000716700000)
object space 227840K, 4% used [0x00000005c3400000,0x00000005c3daa578,0x00000005d1280000)
Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K
Event: 1.141 GC heap after
Heap after GC invocations=5 (full 1):
PSYoungGen total 355840K, used 13174K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000)
eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000)
from space 17920K, 73% used [0x000000072c980000,0x000000072d65da90,0x000000072db00000)
to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000)
ParOldGen total 227840K, used 9977K [0x00000005c3400000, 0x00000005d1280000, 0x0000000716700000)
object space 227840K, 4% used [0x00000005c3400000,0x00000005c3dbe588,0x00000005d1280000)
Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K
}
Event: 1.141 GC heap before
{Heap before GC invocations=6 (full 2):
PSYoungGen total 355840K, used 13174K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000)
eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000)
from space 17920K, 73% used [0x000000072c980000,0x000000072d65da90,0x000000072db00000)
to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000)
ParOldGen total 227840K, used 9977K [0x00000005c3400000, 0x00000005d1280000, 0x0000000716700000)
object space 227840K, 4% used [0x00000005c3400000,0x00000005c3dbe588,0x00000005d1280000)
Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K
Event: 1.188 GC heap after
Heap after GC invocations=6 (full 2):
PSYoungGen total 355840K, used 0K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000)
eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000)
from space 17920K, 0% used [0x000000072c980000,0x000000072c980000,0x000000072db00000)
to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000)
ParOldGen total 408064K, used 19598K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000)
object space 408064K, 4% used [0x00000005c3400000,0x00000005c4723968,0x00000005dc280000)
Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K
class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K
}
Event: 2.123 GC heap before
{Heap before GC invocations=7 (full 2):
PSYoungGen total 355840K, used 337920K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000)
eden space 337920K, 100% used [0x0000000716700000,0x000000072b100000,0x000000072b100000)
from space 17920K, 0% used [0x000000072c980000,0x000000072c980000,0x000000072db00000)
to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000)
ParOldGen total 408064K, used 19598K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000)
object space 408064K, 4% used [0x00000005c3400000,0x00000005c4723968,0x00000005dc280000)
Metaspace used 49543K, capacity 52198K, committed 52392K, reserved 1095680K
class space used 6239K, capacity 6760K, committed 6832K, reserved 1048576K
Event: 2.131 GC heap after
Heap after GC invocations=7 (full 2):
PSYoungGen total 359424K, used 21498K [0x0000000716700000, 0x0000000731d80000, 0x00000007c0000000)
eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000)
from space 21504K, 99% used [0x000000072b100000,0x000000072c5feb08,0x000000072c600000)
to space 22528K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731d80000)
ParOldGen total 408064K, used 21202K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000)
object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b4ba0,0x00000005dc280000)
Metaspace used 49543K, capacity 52198K, committed 52392K, reserved 1095680K
class space used 6239K, capacity 6760K, committed 6832K, reserved 1048576K
}
Event: 4.059 GC heap before
{Heap before GC invocations=8 (full 2):
PSYoungGen total 359424K, used 213127K [0x0000000716700000, 0x0000000731d80000, 0x00000007c0000000)
eden space 337920K, 56% used [0x0000000716700000,0x0000000722223468,0x000000072b100000)
from space 21504K, 99% used [0x000000072b100000,0x000000072c5feb08,0x000000072c600000)
to space 22528K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731d80000)
ParOldGen total 408064K, used 21202K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000)
object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b4ba0,0x00000005dc280000)
Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K
Event: 4.066 GC heap after
Heap after GC invocations=8 (full 2):
PSYoungGen total 413696K, used 20130K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000)
eden space 393216K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072e700000)
from space 20480K, 98% used [0x0000000730780000,0x0000000731b289d0,0x0000000731b80000)
to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000)
ParOldGen total 408064K, used 21210K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000)
object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b6ba0,0x00000005dc280000)
Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K
}
Event: 4.066 GC heap before
{Heap before GC invocations=9 (full 3):
PSYoungGen total 413696K, used 20130K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000)
eden space 393216K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072e700000)
from space 20480K, 98% used [0x0000000730780000,0x0000000731b289d0,0x0000000731b80000)
to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000)
ParOldGen total 408064K, used 21210K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000)
object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b6ba0,0x00000005dc280000)
Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K
Event: 4.132 GC heap after
Heap after GC invocations=9 (full 3):
PSYoungGen total 413696K, used 0K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000)
eden space 393216K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072e700000)
from space 20480K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731b80000)
to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000)
ParOldGen total 608768K, used 32122K [0x00000005c3400000, 0x00000005e8680000, 0x0000000716700000)
object space 608768K, 5% used [0x00000005c3400000,0x00000005c535e8b0,0x00000005e8680000)
Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K
class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K
}
Deoptimization events (0 events):
No events
Classes redefined (0 events):
No events
Internal exceptions (10 events):
Event: 4.209 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x00000007183cfb70) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x000000071843ec78) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x00000007184403e0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x0000000718441b00) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x00000007184468b8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x0000000718448f90) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x000000071844a6d8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x000000071844bdd8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.210 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x000000071844d320) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 4.492 Thread 0x00000000302d2000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x0000000718c4e720) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Events (10 events):
Event: 4.551 loading class org/gdal/ogr/FieldDefn done
Event: 4.582 loading class org/gdal/ogr/FeatureDefn
Event: 4.582 loading class org/gdal/ogr/FeatureDefn done
Event: 4.583 loading class org/gdal/ogr/Feature
Event: 4.583 loading class org/gdal/ogr/Feature done
Event: 4.583 loading class org/gdal/ogr/FeatureNative
Event: 4.583 loading class org/gdal/ogr/FeatureNative done
Event: 4.583 loading class org/gdal/ogr/FeatureNative$1
Event: 4.583 loading class org/gdal/ogr/FeatureNative$1 done
Event: 4.584 Thread 0x0000000030aed000 Thread added: 0x0000000030aed000
Dynamic libraries:
0x00007ff600c30000 - 0x00007ff600c67000 E:\Java\jdk1.8.0_201\bin\java.exe
0x00007ffc4d510000 - 0x00007ffc4d708000 C:\Windows\SYSTEM32\ntdll.dll
0x00007ffc4bd90000 - 0x00007ffc4be52000 C:\Windows\System32\KERNEL32.DLL
0x00007ffc4b100000 - 0x00007ffc4b3f6000 C:\Windows\System32\KERNELBASE.dll
0x00007ffc4c230000 - 0x00007ffc4c2e1000 C:\Windows\System32\ADVAPI32.dll
0x00007ffc4b6e0000 - 0x00007ffc4b77e000 C:\Windows\System32\msvcrt.dll
0x00007ffc4b990000 - 0x00007ffc4ba2f000 C:\Windows\System32\sechost.dll
0x00007ffc4c100000 - 0x00007ffc4c223000 C:\Windows\System32\RPCRT4.dll
0x00007ffc4ad40000 - 0x00007ffc4ad67000 C:\Windows\System32\bcrypt.dll
0x00007ffc4b540000 - 0x00007ffc4b6dd000 C:\Windows\System32\USER32.dll
0x00007ffc4b400000 - 0x00007ffc4b422000 C:\Windows\System32\win32u.dll
0x00007ffc4d320000 - 0x00007ffc4d34b000 C:\Windows\System32\GDI32.dll
0x00007ffc4ae80000 - 0x00007ffc4af99000 C:\Windows\System32\gdi32full.dll
0x00007ffc4aba0000 - 0x00007ffc4ac3d000 C:\Windows\System32\msvcp_win.dll
0x00007ffc4b430000 - 0x00007ffc4b530000 C:\Windows\System32\ucrtbase.dll
0x00007ffc3c640000 - 0x00007ffc3c8da000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.5915_none_60b4b9d171f9c7c7\COMCTL32.dll
0x00007ffc4d2f0000 - 0x00007ffc4d31f000 C:\Windows\System32\IMM32.DLL
0x000000006a930000 - 0x000000006aa01000 E:\Java\jdk1.8.0_201\jre\bin\msvcr100.dll
0x000000006a080000 - 0x000000006a924000 E:\Java\jdk1.8.0_201\jre\bin\server\jvm.dll
0x00007ffc4c420000 - 0x00007ffc4c428000 C:\Windows\System32\PSAPI.DLL
0x00007ffc47420000 - 0x00007ffc47429000 C:\Windows\SYSTEM32\WSOCK32.dll
0x00007ffc46f80000 - 0x00007ffc46f8a000 C:\Windows\SYSTEM32\VERSION.dll
0x00007ffc41df0000 - 0x00007ffc41e17000 C:\Windows\SYSTEM32\WINMM.dll
0x00007ffc4cd00000 - 0x00007ffc4cd6b000 C:\Windows\System32\WS2_32.dll
0x00007ffc47410000 - 0x00007ffc4741f000 E:\Java\jdk1.8.0_201\jre\bin\verify.dll
0x00007ffc473e0000 - 0x00007ffc47409000 E:\Java\jdk1.8.0_201\jre\bin\java.dll
0x00007ffc456a0000 - 0x00007ffc456c3000 E:\Java\jdk1.8.0_201\jre\bin\instrument.dll
0x00007ffc43d30000 - 0x00007ffc43d46000 E:\Java\jdk1.8.0_201\jre\bin\zip.dll
0x00007ffc4c590000 - 0x00007ffc4ccfe000 C:\Windows\System32\SHELL32.dll
0x00007ffc48c20000 - 0x00007ffc493c4000 C:\Windows\SYSTEM32\windows.storage.dll
0x00007ffc4ba30000 - 0x00007ffc4bd83000 C:\Windows\System32\combase.dll
0x00007ffc4a5d0000 - 0x00007ffc4a5fb000 C:\Windows\SYSTEM32\Wldp.dll
0x00007ffc4d350000 - 0x00007ffc4d41d000 C:\Windows\System32\OLEAUT32.dll
0x00007ffc4cd70000 - 0x00007ffc4ce1d000 C:\Windows\System32\SHCORE.dll
0x00007ffc4b930000 - 0x00007ffc4b98b000 C:\Windows\System32\shlwapi.dll
0x00007ffc4aad0000 - 0x00007ffc4aaf5000 C:\Windows\SYSTEM32\profapi.dll
0x00007ffbfbf40000 - 0x00007ffbfbf5a000 E:\Java\jdk1.8.0_201\jre\bin\net.dll
0x00007ffc3f5e0000 - 0x00007ffc3f7d0000 C:\Windows\SYSTEM32\urlmon.dll
0x00007ffc3f2f0000 - 0x00007ffc3f5af000 C:\Windows\SYSTEM32\iertutil.dll
0x00007ffc3f5b0000 - 0x00007ffc3f5d8000 C:\Windows\SYSTEM32\srvcli.dll
0x00007ffc4a000000 - 0x00007ffc4a00c000 C:\Windows\SYSTEM32\netutils.dll
0x00007ffc4a330000 - 0x00007ffc4a39a000 C:\Windows\system32\mswsock.dll
0x00007ffc4a010000 - 0x00007ffc4a0da000 C:\Windows\SYSTEM32\DNSAPI.dll
0x00007ffc49fc0000 - 0x00007ffc49ffb000 C:\Windows\SYSTEM32\IPHLPAPI.DLL
0x00007ffc4b530000 - 0x00007ffc4b538000 C:\Windows\System32\NSI.dll
0x00007ffc44d70000 - 0x00007ffc44d7a000 C:\Windows\System32\rasadhlp.dll
0x00007ffc43240000 - 0x00007ffc432c0000 C:\Windows\System32\fwpuclnt.dll
0x00007ffc45150000 - 0x00007ffc4515d000 E:\Java\jdk1.8.0_201\jre\bin\management.dll
0x00007ffbf80e0000 - 0x00007ffbf80f1000 E:\Java\jdk1.8.0_201\jre\bin\nio.dll
0x00007ffc4a520000 - 0x00007ffc4a538000 C:\Windows\SYSTEM32\CRYPTSP.dll
0x00007ffc49be0000 - 0x00007ffc49c18000 C:\Windows\system32\rsaenh.dll
0x00007ffc4aa90000 - 0x00007ffc4aabe000 C:\Windows\SYSTEM32\USERENV.dll
0x00007ffc4ad70000 - 0x00007ffc4adf2000 C:\Windows\System32\bcryptprimitives.dll
0x00007ffc4a540000 - 0x00007ffc4a54c000 C:\Windows\SYSTEM32\CRYPTBASE.dll
0x00007ffc451a0000 - 0x00007ffc451b7000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL
0x00007ffc45180000 - 0x00007ffc4519d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL
0x00007ffc34ce0000 - 0x00007ffc34cf7000 C:\Windows\system32\napinsp.dll
0x00007ffc302b0000 - 0x00007ffc302cb000 C:\Windows\system32\pnrpnsp.dll
0x00007ffc30290000 - 0x00007ffc302ad000 C:\Windows\system32\wshbth.dll
0x00007ffc455f0000 - 0x00007ffc4560d000 C:\Windows\system32\NLAapi.dll
0x00007ffc30270000 - 0x00007ffc30282000 C:\Windows\System32\winrnr.dll
0x00007ffc3abe0000 - 0x00007ffc3ac31000 C:\Windows\SYSTEM32\pdh.dll
0x00007ffc43d20000 - 0x00007ffc43d2f000 C:\Windows\System32\perfproc.dll
0x00007ffc1a870000 - 0x00007ffc1a87f000 C:\Windows\System32\perfos.dll
0x00007ffc1b9c0000 - 0x00007ffc1b9e4000 E:\Java\jdk1.8.0_201\jre\bin\sunec.dll
0x00007ffc35b60000 - 0x00007ffc35c08000 E:\Java\jdk1.8.0_201\bin\gdalalljni.dll
0x00007ffc359f0000 - 0x00007ffc35a7d000 E:\Java\jdk1.8.0_201\bin\MSVCP140.dll
0x00007ffbecbd0000 - 0x00007ffbee01d000 E:\Java\jdk1.8.0_201\bin\gdal.dll
0x00007ffc438e0000 - 0x00007ffc438fb000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140.dll
0x00007ffc43cf0000 - 0x00007ffc43cfc000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140_1.dll
0x00007ffc4afa0000 - 0x00007ffc4b0fd000 C:\Windows\System32\CRYPT32.dll
0x00007ffc433a0000 - 0x00007ffc433b9000 E:\Java\jdk1.8.0_201\bin\zlib.dll
0x00007ffc4c2f0000 - 0x00007ffc4c41b000 C:\Windows\System32\ole32.dll
0x00007ffc358c0000 - 0x00007ffc35953000 E:\Java\jdk1.8.0_201\bin\libcurl.dll
0x00007ffc249e0000 - 0x00007ffc24aa0000 C:\Windows\SYSTEM32\ODBC32.dll
0x00007ffc1c440000 - 0x00007ffc1c5a3000 E:\Java\jdk1.8.0_201\bin\libxml2.dll
0x00007ffbec6f0000 - 0x00007ffbecbc2000 E:\Java\jdk1.8.0_201\bin\libcrypto-3-x64.dll
0x00007ffc1c300000 - 0x00007ffc1c439000 E:\Java\jdk1.8.0_201\bin\libssl-3-x64.dll
0x00007ffc4c450000 - 0x00007ffc4c4af000 C:\Windows\System32\WLDAP32.dll
0x00007ffc257a0000 - 0x00007ffc25854000 E:\Java\jdk1.8.0_201\bin\zstd.dll
0x00007ffc1bfa0000 - 0x00007ffc1c2fa000 E:\Java\jdk1.8.0_201\bin\proj_9.dll
0x00007ffc19400000 - 0x00007ffc196ab000 E:\Java\jdk1.8.0_201\bin\xerces-c_3_2.dll
0x00007ffc3bec0000 - 0x00007ffc3bef5000 E:\Java\jdk1.8.0_201\bin\libpng16.dll
0x00007ffbf7f90000 - 0x00007ffbf80dd000 E:\Java\jdk1.8.0_201\bin\tiff.dll
0x0000000180000000 - 0x000000018004e000 E:\Java\jdk1.8.0_201\bin\LIBPQ.dll
0x00007ffc35b00000 - 0x00007ffc35b51000 E:\Java\jdk1.8.0_201\bin\openjp2.dll
0x00007ffbec420000 - 0x00007ffbec6e8000 E:\Java\jdk1.8.0_201\bin\sqlite3.dll
0x00007ffc3bea0000 - 0x00007ffc3bec0000 E:\Java\jdk1.8.0_201\bin\pcre.dll
0x00007ffc359c0000 - 0x00007ffc359e9000 E:\Java\jdk1.8.0_201\bin\freexl.dll
0x00007ffc35990000 - 0x00007ffc359b2000 E:\Java\jdk1.8.0_201\bin\ogdi.dll
0x00007ffbd1960000 - 0x00007ffbd264b000 E:\Java\jdk1.8.0_201\bin\spatialite.dll
0x00007ffbe86e0000 - 0x00007ffbe8d81000 E:\Java\jdk1.8.0_201\bin\libmysql.dll
0x00007ffc35890000 - 0x00007ffc358ba000 E:\Java\jdk1.8.0_201\bin\libexpat.dll
0x00007ffbfac00000 - 0x00007ffbfacff000 E:\Java\jdk1.8.0_201\bin\iconv-2.dll
0x00007ffc35830000 - 0x00007ffc3588c000 E:\Java\jdk1.8.0_201\bin\geos_c.dll
0x00007ffc3d020000 - 0x00007ffc3d02c000 C:\Windows\SYSTEM32\Secur32.dll
0x00007ffc4a990000 - 0x00007ffc4a99a000 C:\Windows\SYSTEM32\DPAPI.DLL
0x00007ffbe8500000 - 0x00007ffbe86d5000 E:\Java\jdk1.8.0_201\bin\geos.dll
0x00007ffc4aa50000 - 0x00007ffc4aa82000 C:\Windows\SYSTEM32\SSPICLI.DLL
0x00007ffc357a0000 - 0x00007ffc35807000 E:\gdal\bin\gdalplugins\ogr_FileGDB.dll
0x00007ffbb1770000 - 0x00007ffbb22f2000 E:\Java\jdk1.8.0_201\bin\FileGDBAPI.dll
0x00007ffc485d0000 - 0x00007ffc487d1000 C:\Windows\SYSTEM32\dbghelp.dll
VM Arguments:
jvm_args: -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\lib\idea_rt.jar=56029 -Dfile.encoding=UTF-8
java_command: cn.edu.whu.boot.BootApplication
java_class_path (initial): E:\Java\jdk1.8.0_201\jre\lib\charsets.jar;E:\Java\jdk1.8.0_201\jre\lib\deploy.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_201\jre\lib\javaws.jar;E:\Java\jdk1.8.0_201\jre\lib\jce.jar;E:\Java\jdk1.8.0_201\jre\lib\jfr.jar;E:\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_201\jre\lib\jsse.jar;E:\Java\jdk1.8.0_201\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_201\jre\lib\plugin.jar;E:\Java\jdk1.8.0_201\jre\lib\resources.jar;E:\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\503\TJ_project\lydc_backend\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.0.RELEASE\spring-boot-starter-web-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.0.RELEASE\spring-boot-starter-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.3.0.RELEASE\spring-boot-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.0.RELEASE\spring-boot-starter-logging-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.2\log4j-to-slf4j-2.13.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-a
Launcher Type: SUN_STANDARD
Environment Variables:
JAVA_HOME=E:\Java\jdk1.8.0_201
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;E:\gdal\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\bin;
USERNAME=Administrator
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 183 Stepping 1, GenuineIntel
--------------- S Y S T E M ---------------
OS: Windows 10.0 , 64 bit Build 19041 (10.0.19041.5915)
CPU:total 28 (initial active 28) (14 cores per cpu, 2 threads per core) family 6 model 183 stepping 1, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx
Memory: 4k page, physical 33338604k(21598564k free), swap 38319340k(23322232k free)
vm_info: Java HotSpot(TM) 64-Bit Server VM (25.201-b09) for windows-amd64 JRE (1.8.0_201-b09), built on Dec 15 2018 18:36:39 by "java_re" with MS VC++ 10.0 (VS2010)
time: Mon Nov 03 22:03:53 2025
timezone: <20>й<EFBFBD><D0B9><EFBFBD>׼ʱ<D7BC><CAB1>
elapsed time: 4 seconds (0d 0h 0m 4s)

335
hs_err_pid26132.log Normal file
View File

@@ -0,0 +1,335 @@
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate
# Possible reasons:
# The system is out of physical RAM or swap space
# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# JVM is running with Unscaled Compressed Oops mode in which the Java heap is
# placed in the first 4GB address space. The Java Heap base address is the
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
# to set the Java Heap base and to place the Java Heap above 4GB virtual address.
# This output file may be truncated or incomplete.
#
# Out of Memory Error (allocation.cpp:273), pid=26132, tid=0x0000000000004654
#
# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops)
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
--------------- T H R E A D ---------------
Current thread (0x000000001a6d0800): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=18004, stack(0x000000001ac80000,0x000000001ad80000)]
Stack: [0x000000001ac80000,0x000000001ad80000]
[error occurred during error reporting (printing stack bounds), id 0xc0000005]
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
Current CompileTask:
C2: 4016 2672 4 java.net.URLClassLoader$1::run (5 bytes)
--------------- P R O C E S S ---------------
Java Threads: ( => current thread )
0x000000001a70c000 JavaThread "Service Thread" daemon [_thread_blocked, id=12020, stack(0x000000001b080000,0x000000001b180000)]
0x000000001a707800 JavaThread "C1 CompilerThread3" daemon [_thread_blocked, id=2948, stack(0x000000001af80000,0x000000001b080000)]
0x000000001a706800 JavaThread "C2 CompilerThread2" daemon [_thread_in_native, id=24492, stack(0x000000001ae80000,0x000000001af80000)]
0x000000001a6a0000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=4248, stack(0x000000001ad80000,0x000000001ae80000)]
=>0x000000001a6d0800 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=18004, stack(0x000000001ac80000,0x000000001ad80000)]
0x000000001a6cd000 JavaThread "Monitor Ctrl-Break" daemon [_thread_in_native, id=13804, stack(0x000000001ab80000,0x000000001ac80000)]
0x0000000019c1a800 JavaThread "Attach Listener" daemon [_thread_blocked, id=14800, stack(0x000000001a280000,0x000000001a380000)]
0x0000000019bc4000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=10388, stack(0x000000001a180000,0x000000001a280000)]
0x0000000017da5800 JavaThread "Finalizer" daemon [_thread_blocked, id=24888, stack(0x000000001a080000,0x000000001a180000)]
0x0000000019ba0800 JavaThread "Reference Handler" daemon [_thread_blocked, id=14852, stack(0x0000000019f80000,0x000000001a080000)]
0x0000000002cbb000 JavaThread "main" [_thread_in_vm, id=11252, stack(0x0000000002ae0000,0x0000000002be0000)]
Other Threads:
0x0000000017d96800 VMThread [stack: 0x0000000019a80000,0x0000000019b80000] [id=23260]
0x000000001a6a0800 WatcherThread [stack: 0x000000001b180000,0x000000001b280000] [id=6328]
VM state:not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
heap address: 0x0000000082800000, size: 2008 MB, Compressed Oops mode: 32-bit
Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x0000000100000000
Heap:
PSYoungGen total 70656K, used 48501K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 68% used [0x00000000d6300000,0x00000000d8edf6b0,0x00000000da300000)
from space 5120K, 69% used [0x00000000da300000,0x00000000da67ddb8,0x00000000da800000)
to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
ParOldGen total 61952K, used 8032K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd8168,0x0000000086480000)
Metaspace used 25650K, capacity 26730K, committed 27008K, reserved 1073152K
class space used 3158K, capacity 3363K, committed 3456K, reserved 1048576K
Card table byte_map: [0x0000000012270000,0x0000000012660000] byte_map_base: 0x0000000011e5c000
Marking Bits: (ParMarkBitMap*) 0x00000000520a4ce0
Begin Bits: [0x0000000013100000, 0x0000000015060000)
End Bits: [0x0000000015060000, 0x0000000016fc0000)
Polling page: 0x0000000000990000
CodeCache: size=245760Kb used=9587Kb max_used=9596Kb free=236172Kb
bounds [0x0000000002eb0000, 0x0000000003820000, 0x0000000011eb0000]
total_blobs=3151 nmethods=2784 adapters=278
compilation: enabled
Compilation events (10 events):
Event: 3.991 Thread 0x000000001a707800 nmethod 2783 0x0000000003810f50 code [0x0000000003811100, 0x00000000038116d0]
Event: 3.993 Thread 0x000000001a707800 2784 3 sun.misc.ProxyGenerator$ProxyMethod::<init> (14 bytes)
Event: 3.993 Thread 0x000000001a707800 nmethod 2784 0x0000000003811990 code [0x0000000003811b00, 0x0000000003811c88]
Event: 3.993 Thread 0x000000001a707800 2785 3 sun.misc.ProxyGenerator$ProxyMethod::<init> (64 bytes)
Event: 3.993 Thread 0x000000001a707800 nmethod 2785 0x0000000003811d50 code [0x0000000003811f20, 0x00000000038127c8]
Event: 3.995 Thread 0x000000001a6a0000 nmethod 2780 0x0000000003815d90 code [0x0000000003815f00, 0x0000000003816458]
Event: 3.998 Thread 0x000000001a707800 2786 3 org.springframework.beans.factory.support.AbstractBeanDefinition::resolveBeanClass (24 bytes)
Event: 3.998 Thread 0x000000001a707800 nmethod 2786 0x0000000003815290 code [0x0000000003815440, 0x0000000003815b98]
Event: 3.998 Thread 0x000000001a707800 2787 1 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition::getFactoryMethodMetadata (5 bytes)
Event: 3.999 Thread 0x000000001a707800 nmethod 2787 0x000000000380d710 code [0x000000000380d860, 0x000000000380d970]
GC Heap History (10 events):
Event: 3.025 GC heap before
{Heap before GC invocations=4 (full 0):
PSYoungGen total 70656K, used 53941K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 74% used [0x00000000d6300000,0x00000000d92afe28,0x00000000da300000)
from space 5120K, 99% used [0x00000000da300000,0x00000000da7fd7a0,0x00000000da800000)
to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
ParOldGen total 86016K, used 5530K [0x0000000082800000, 0x0000000087c00000, 0x00000000d6300000)
object space 86016K, 6% used [0x0000000082800000,0x0000000082d66800,0x0000000087c00000)
Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K
class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K
Event: 3.030 GC heap after
Heap after GC invocations=4 (full 0):
PSYoungGen total 70656K, used 5112K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000)
from space 5120K, 99% used [0x00000000da800000,0x00000000dacfe218,0x00000000dad00000)
to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000)
ParOldGen total 86016K, used 8494K [0x0000000082800000, 0x0000000087c00000, 0x00000000d6300000)
object space 86016K, 9% used [0x0000000082800000,0x000000008304b9e8,0x0000000087c00000)
Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K
class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K
}
Event: 3.030 GC heap before
{Heap before GC invocations=5 (full 1):
PSYoungGen total 70656K, used 5112K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000)
from space 5120K, 99% used [0x00000000da800000,0x00000000dacfe218,0x00000000dad00000)
to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000)
ParOldGen total 86016K, used 8494K [0x0000000082800000, 0x0000000087c00000, 0x00000000d6300000)
object space 86016K, 9% used [0x0000000082800000,0x000000008304b9e8,0x0000000087c00000)
Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K
class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K
Event: 3.067 GC heap after
Heap after GC invocations=5 (full 1):
PSYoungGen total 70656K, used 0K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000)
from space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000)
ParOldGen total 61952K, used 8008K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd2168,0x0000000086480000)
Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K
class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K
}
Event: 3.218 GC heap before
{Heap before GC invocations=6 (full 1):
PSYoungGen total 70656K, used 65536K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 100% used [0x00000000d6300000,0x00000000da300000,0x00000000da300000)
from space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000)
ParOldGen total 61952K, used 8008K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd2168,0x0000000086480000)
Metaspace used 21384K, capacity 22234K, committed 22576K, reserved 1069056K
class space used 2605K, capacity 2819K, committed 2944K, reserved 1048576K
Event: 3.219 GC heap after
Heap after GC invocations=6 (full 1):
PSYoungGen total 70656K, used 1574K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000)
from space 5120K, 30% used [0x00000000da300000,0x00000000da489a78,0x00000000da800000)
to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
ParOldGen total 61952K, used 8016K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd4168,0x0000000086480000)
Metaspace used 21384K, capacity 22234K, committed 22576K, reserved 1069056K
class space used 2605K, capacity 2819K, committed 2944K, reserved 1048576K
}
Event: 3.318 GC heap before
{Heap before GC invocations=7 (full 1):
PSYoungGen total 70656K, used 67110K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 100% used [0x00000000d6300000,0x00000000da300000,0x00000000da300000)
from space 5120K, 30% used [0x00000000da300000,0x00000000da489a78,0x00000000da800000)
to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
ParOldGen total 61952K, used 8016K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd4168,0x0000000086480000)
Metaspace used 21584K, capacity 22454K, committed 22576K, reserved 1069056K
class space used 2627K, capacity 2827K, committed 2944K, reserved 1048576K
Event: 3.320 GC heap after
Heap after GC invocations=7 (full 1):
PSYoungGen total 70656K, used 1301K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000)
from space 5120K, 25% used [0x00000000da800000,0x00000000da9454b0,0x00000000dad00000)
to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000)
ParOldGen total 61952K, used 8024K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd6168,0x0000000086480000)
Metaspace used 21584K, capacity 22454K, committed 22576K, reserved 1069056K
class space used 2627K, capacity 2827K, committed 2944K, reserved 1048576K
}
Event: 3.567 GC heap before
{Heap before GC invocations=8 (full 1):
PSYoungGen total 70656K, used 66837K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 100% used [0x00000000d6300000,0x00000000da300000,0x00000000da300000)
from space 5120K, 25% used [0x00000000da800000,0x00000000da9454b0,0x00000000dad00000)
to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000)
ParOldGen total 61952K, used 8024K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd6168,0x0000000086480000)
Metaspace used 23251K, capacity 24186K, committed 24320K, reserved 1071104K
class space used 2847K, capacity 3043K, committed 3072K, reserved 1048576K
Event: 3.569 GC heap after
Heap after GC invocations=8 (full 1):
PSYoungGen total 70656K, used 3575K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000)
eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000)
from space 5120K, 69% used [0x00000000da300000,0x00000000da67ddb8,0x00000000da800000)
to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000)
ParOldGen total 61952K, used 8032K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000)
object space 61952K, 12% used [0x0000000082800000,0x0000000082fd8168,0x0000000086480000)
Metaspace used 23251K, capacity 24186K, committed 24320K, reserved 1071104K
class space used 2847K, capacity 3043K, committed 3072K, reserved 1048576K
}
Deoptimization events (10 events):
Event: 3.304 Thread 0x0000000002cbb000 Uncommon trap: reason=array_check action=maybe_recompile pc=0x00000000035dfa40 method=java.util.AbstractCollection.toArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 119
Event: 3.305 Thread 0x0000000002cbb000 Uncommon trap: reason=array_check action=maybe_recompile pc=0x00000000035dfa40 method=java.util.AbstractCollection.toArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 119
Event: 3.305 Thread 0x0000000002cbb000 Uncommon trap: reason=array_check action=maybe_recompile pc=0x00000000035dfa40 method=java.util.AbstractCollection.toArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 119
Event: 3.397 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000000003355080 method=java.util.regex.Matcher.reset()Ljava/util/regex/Matcher; @ 47
Event: 3.408 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000000034e4868 method=org.springframework.core.annotation.MergedAnnotationsCollection.isMappingForType(Lorg/springframework/core/annotation/AnnotationTypeMapping;Ljava/lang/Object;)Z @ 13
Event: 3.706 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000000036a5fec method=org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(Ljava/lang/String;)Lorg/springframework/beans/factory/support/RootBeanDefinition;
Event: 3.716 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000000036adb3c method=org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(Ljava/lang/String;Z)Ljava/lang/Object; @ 20
Event: 3.904 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000000373f3a4 method=org.springframework.core.ResolvableType$1.isAssignableFrom(Ljava/lang/Class;)Z @ 15
Event: 3.979 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000000003495788 method=org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(Lorg/springframework/util/ConcurrentReferenceHashMap$Reference;Ljava/lang/Object;I)Lorg/springframewo
Event: 3.979 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000000348f468 method=org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(Lorg/springframework/util/ConcurrentReferenceHashMap$Reference;Ljava/lang/Object;I)Lorg/springframewo
Classes redefined (0 events):
No events
Internal exceptions (10 events):
Event: 2.411 Thread 0x0000000002cbb000 Exception <a 'java/lang/ClassNotFoundException': org/springframework/beans/factory/AwareCustomizer> (0x00000000d9521960) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, line 210
Event: 2.412 Thread 0x0000000002cbb000 Exception <a 'java/lang/ClassNotFoundException': org/springframework/beans/factory/BeanClassLoaderAwareCustomizer> (0x00000000d954b098) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionar
Event: 2.412 Thread 0x0000000002cbb000 Exception <a 'java/lang/ClassNotFoundException': org/springframework/beans/factory/AwareCustomizer> (0x00000000d956dea0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, line 210
Event: 2.413 Thread 0x0000000002cbb000 Exception <a 'java/lang/ClassNotFoundException': org/springframework/context/EnvironmentAwareCustomizer> (0x00000000d95922a8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, lin
Event: 2.413 Thread 0x0000000002cbb000 Exception <a 'java/lang/ClassNotFoundException': org/springframework/beans/factory/AwareCustomizer> (0x00000000d95b4f90) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, line 210
Event: 2.805 Thread 0x0000000002cbb000 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.lambda$or$2(Ljava/util/function/Predicate;Ljava/lang/Object;)Z> (0x00000000d6e032f8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\lin
Event: 2.928 Thread 0x0000000002cbb000 Exception <a 'java/lang/IncompatibleClassChangeError': Found class java.lang.Object, but interface was expected> (0x00000000d81e3a28) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolver.cp
Event: 2.967 Thread 0x0000000002cbb000 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.lambda$getAllAnnotationAttributes$0(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/util/MultiValueMap;> (0x00000000d868ebe8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cyg
Event: 2.968 Thread 0x0000000002cbb000 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.lambda$identity$2(Ljava/lang/Object;)Ljava/lang/Object;> (0x00000000d86a59a0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolv
Event: 3.685 Thread 0x0000000002cbb000 Exception <a 'java/lang/NoSuchMethodError': java.lang.Object.lambda$getRequiredAttribute$0(Ljava/lang/String;)Ljava/lang/IllegalArgumentException;> (0x00000000d6ca0680) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\s
Events (10 events):
Event: 4.012 loading class org/springframework/cglib/core/ObjectSwitchCallback
Event: 4.012 loading class org/springframework/cglib/core/ObjectSwitchCallback done
Event: 4.013 loading class org/springframework/cglib/proxy/Enhancer$1
Event: 4.013 loading class org/springframework/cglib/proxy/Enhancer$1 done
Event: 4.013 loading class org/springframework/cglib/core/AbstractClassGenerator$Source
Event: 4.013 loading class org/springframework/cglib/core/AbstractClassGenerator$Source done
Event: 4.014 loading class org/springframework/cglib/proxy/Enhancer$EnhancerKey
Event: 4.014 loading class org/springframework/cglib/proxy/Enhancer$EnhancerKey done
Event: 4.014 loading class org/springframework/cglib/core/KeyFactory
Event: 4.014 loading class org/springframework/cglib/core/KeyFactory done
Dynamic libraries:
0x00007ff6c8260000 - 0x00007ff6c8297000 E:\Java\jdk1.8.0_201\bin\java.exe
0x00007ffd2e2d0000 - 0x00007ffd2e4c8000 C:\WINDOWS\SYSTEM32\ntdll.dll
0x00007ffd2c600000 - 0x00007ffd2c6c2000 C:\WINDOWS\System32\KERNEL32.DLL
0x00007ffd2be00000 - 0x00007ffd2c0ff000 C:\WINDOWS\System32\KERNELBASE.dll
0x00007ffd2d210000 - 0x00007ffd2d2c1000 C:\WINDOWS\System32\ADVAPI32.dll
0x00007ffd2cef0000 - 0x00007ffd2cf8e000 C:\WINDOWS\System32\msvcrt.dll
0x00007ffd2cde0000 - 0x00007ffd2ce7f000 C:\WINDOWS\System32\sechost.dll
0x00007ffd2c6f0000 - 0x00007ffd2c813000 C:\WINDOWS\System32\RPCRT4.dll
0x00007ffd2ba00000 - 0x00007ffd2ba27000 C:\WINDOWS\System32\bcrypt.dll
0x00007ffd2d010000 - 0x00007ffd2d1ad000 C:\WINDOWS\System32\USER32.dll
0x00007ffd2c220000 - 0x00007ffd2c242000 C:\WINDOWS\System32\win32u.dll
0x00007ffd2e260000 - 0x00007ffd2e28b000 C:\WINDOWS\System32\GDI32.dll
0x00007ffd2c100000 - 0x00007ffd2c217000 C:\WINDOWS\System32\gdi32full.dll
0x00007ffd2b960000 - 0x00007ffd2b9fd000 C:\WINDOWS\System32\msvcp_win.dll
0x00007ffd2bba0000 - 0x00007ffd2bca0000 C:\WINDOWS\System32\ucrtbase.dll
0x00007ffd1c6d0000 - 0x00007ffd1c96a000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.4355_none_60b8b9eb71f62e16\COMCTL32.dll
0x00007ffd2e230000 - 0x00007ffd2e25f000 C:\WINDOWS\System32\IMM32.DLL
0x0000000052620000 - 0x00000000526f1000 E:\Java\jdk1.8.0_201\jre\bin\msvcr100.dll
0x0000000051880000 - 0x0000000052124000 E:\Java\jdk1.8.0_201\jre\bin\server\jvm.dll
0x00007ffd2cd20000 - 0x00007ffd2cd28000 C:\WINDOWS\System32\PSAPI.DLL
0x00007ffd1eb90000 - 0x00007ffd1ebb7000 C:\WINDOWS\SYSTEM32\WINMM.dll
0x00007ffd24c90000 - 0x00007ffd24c9a000 C:\WINDOWS\SYSTEM32\VERSION.dll
0x00007ffd1b7f0000 - 0x00007ffd1b7f9000 C:\WINDOWS\SYSTEM32\WSOCK32.dll
0x00007ffd2ce80000 - 0x00007ffd2ceeb000 C:\WINDOWS\System32\WS2_32.dll
0x00007ffd247c0000 - 0x00007ffd247cf000 E:\Java\jdk1.8.0_201\jre\bin\verify.dll
0x00007ffd1e290000 - 0x00007ffd1e2b9000 E:\Java\jdk1.8.0_201\jre\bin\java.dll
0x00007ffd0c570000 - 0x00007ffd0c593000 E:\Java\jdk1.8.0_201\jre\bin\instrument.dll
0x00007ffd234f0000 - 0x00007ffd23506000 E:\Java\jdk1.8.0_201\jre\bin\zip.dll
0x00007ffd2d9f0000 - 0x00007ffd2e15e000 C:\WINDOWS\System32\SHELL32.dll
0x00007ffd299e0000 - 0x00007ffd2a184000 C:\WINDOWS\SYSTEM32\windows.storage.dll
0x00007ffd2c820000 - 0x00007ffd2cb75000 C:\WINDOWS\System32\combase.dll
0x00007ffd2b2c0000 - 0x00007ffd2b2ef000 C:\WINDOWS\SYSTEM32\Wldp.dll
0x00007ffd2e160000 - 0x00007ffd2e22d000 C:\WINDOWS\System32\OLEAUT32.dll
0x00007ffd2cd30000 - 0x00007ffd2cddd000 C:\WINDOWS\System32\SHCORE.dll
0x00007ffd2d400000 - 0x00007ffd2d455000 C:\WINDOWS\System32\shlwapi.dll
0x00007ffd2b890000 - 0x00007ffd2b8b4000 C:\WINDOWS\SYSTEM32\profapi.dll
0x00007ffd22910000 - 0x00007ffd2292a000 E:\Java\jdk1.8.0_201\jre\bin\net.dll
0x00007ffd225b0000 - 0x00007ffd227a1000 C:\WINDOWS\SYSTEM32\urlmon.dll
0x00007ffd21cb0000 - 0x00007ffd21f6f000 C:\WINDOWS\SYSTEM32\iertutil.dll
0x00007ffd21c80000 - 0x00007ffd21ca8000 C:\WINDOWS\SYSTEM32\srvcli.dll
0x00007ffd2ae10000 - 0x00007ffd2ae1c000 C:\WINDOWS\SYSTEM32\netutils.dll
0x00007ffd2b020000 - 0x00007ffd2b08a000 C:\WINDOWS\system32\mswsock.dll
0x00007ffd239a0000 - 0x00007ffd239ad000 E:\Java\jdk1.8.0_201\jre\bin\management.dll
0x00007ffd1d090000 - 0x00007ffd1d0a7000 C:\WINDOWS\system32\napinsp.dll
0x00007ffd1d030000 - 0x00007ffd1d04b000 C:\WINDOWS\system32\pnrpnsp.dll
0x00007ffd269b0000 - 0x00007ffd269c5000 C:\WINDOWS\system32\wshbth.dll
0x00007ffd26990000 - 0x00007ffd269ad000 C:\WINDOWS\system32\NLAapi.dll
0x00007ffd2ad00000 - 0x00007ffd2ad3b000 C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL
0x00007ffd2ad40000 - 0x00007ffd2ae0a000 C:\WINDOWS\SYSTEM32\DNSAPI.dll
0x00007ffd2cd10000 - 0x00007ffd2cd18000 C:\WINDOWS\System32\NSI.dll
0x00007ffd1cec0000 - 0x00007ffd1ced2000 C:\WINDOWS\System32\winrnr.dll
0x00007ffd24c10000 - 0x00007ffd24c1a000 C:\Windows\System32\rasadhlp.dll
0x00007ffd22470000 - 0x00007ffd224f0000 C:\WINDOWS\System32\fwpuclnt.dll
0x00007ffd20b10000 - 0x00007ffd20b21000 E:\Java\jdk1.8.0_201\jre\bin\nio.dll
VM Arguments:
jvm_args: -javaagent:E:\IntelliJ IDEA Community Edition 2024.3.4\lib\idea_rt.jar=55795 -Dfile.encoding=UTF-8
java_command: cn.edu.whu.boot.BootApplication
java_class_path (initial): E:\Java\jdk1.8.0_201\jre\lib\charsets.jar;E:\Java\jdk1.8.0_201\jre\lib\deploy.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_201\jre\lib\javaws.jar;E:\Java\jdk1.8.0_201\jre\lib\jce.jar;E:\Java\jdk1.8.0_201\jre\lib\jfr.jar;E:\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_201\jre\lib\jsse.jar;E:\Java\jdk1.8.0_201\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_201\jre\lib\plugin.jar;E:\Java\jdk1.8.0_201\jre\lib\resources.jar;E:\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\TJ\Դ<><D4B4>\<5C><><EFBFBD><EFBFBD>\target\classes;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.0.RELEASE\spring-boot-starter-web-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.0.RELEASE\spring-boot-starter-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot\2.3.0.RELEASE\spring-boot-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.0.RELEASE\spring-boot-starter-logging-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\dbc\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\dbc\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.2\log4j-to-slf4j-2.13.2.jar;C:\Users\dbc\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.2\log4j-api-2.13.2.jar;C:\Users\dbc\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to
Launcher Type: SUN_STANDARD
Environment Variables:
JAVA_HOME=E:\Java\jdk1.8.0_201
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\dotnet\;D:\Microsoft VS Code\bin;C:\Gridknow\zgdll32;C:\Gridknow\zgdll64;E:\Java\jdk1.8.0_201\bin;C:\Users\dbc\AppData\Local\Programs\Python\Python310;D:\Git\cmd;C:\Users\dbc\AppData\Local\Programs\Python\Python310\Scripts;D:\TJ\apache-maven-3.8.8-bin\apache-maven-3.8.8\bin;D:\nodejs\;C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\IBM\SPSS\Statistics\25\JRE\bin;C:\Program Files (x86)\dotnet\;D:\Microsoft VS Code\bin;C:\Program Files\MATLAB\R2021a\bin;C:\Users\dbc\AppData\Local\Programs\Python\Python310\Scripts;C:\Program Files (x86)\Microsoft\Edge\Application;D:\pycharm\PyCharm Community Edition 2023.1.3\bin;;E:\IntelliJ IDEA Community Edition 2024.3.4\bin;;E:\WebStorm 2024.3.4\bin;;C:\Users\dbc\AppData\Roaming\npm
USERNAME=dbc
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 12, GenuineIntel
--------------- S Y S T E M ---------------
OS: Windows 10.0 , 64 bit Build 19041 (10.0.19041.5198)
CPU:total 8 (initial active 8) (4 cores per cpu, 2 threads per core) family 6 model 142 stepping 12, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx
Memory: 4k page, physical 8218420k(1038732k free), swap 23270192k(1704k free)
vm_info: Java HotSpot(TM) 64-Bit Server VM (25.201-b09) for windows-amd64 JRE (1.8.0_201-b09), built on Dec 15 2018 18:36:39 by "java_re" with MS VC++ 10.0 (VS2010)
time: Fri Mar 07 23:36:20 2025
timezone: <20>й<EFBFBD><D0B9><EFBFBD>׼ʱ<D7BC><CAB1>
elapsed time: 4 seconds (0d 0h 0m 4s)

BIN
libs/gdal.jar Normal file

Binary file not shown.

BIN
libs/gdalalljni.dll Normal file

Binary file not shown.

286
mvnw vendored Normal file
View File

@@ -0,0 +1,286 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
# TODO classpath?
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
wget "$jarUrl" -O "$wrapperJarPath"
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
curl -o "$wrapperJarPath" "$jarUrl"
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

161
mvnw.cmd vendored Normal file
View File

@@ -0,0 +1,161 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
echo Found %WRAPPER_JAR%
) else (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
echo Finished downloading %WRAPPER_JAR%
)
@REM End of extension
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%

26
nginx/conf/fastcgi.conf Normal file
View File

@@ -0,0 +1,26 @@
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

25
nginx/conf/fastcgi_params Normal file
View File

@@ -0,0 +1,25 @@
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

109
nginx/conf/koi-utf Normal file
View File

@@ -0,0 +1,109 @@
# This map is not a full koi8-r <> utf8 map: it does not contain
# box-drawing and some other characters. Besides this map contains
# several koi8-u and Byelorussian letters which are not in koi8-r.
# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
# map instead.
charset_map koi8-r utf-8 {
80 E282AC ; # euro
95 E280A2 ; # bullet
9A C2A0 ; # &nbsp;
9E C2B7 ; # &middot;
A3 D191 ; # small yo
A4 D194 ; # small Ukrainian ye
A6 D196 ; # small Ukrainian i
A7 D197 ; # small Ukrainian yi
AD D291 ; # small Ukrainian soft g
AE D19E ; # small Byelorussian short u
B0 C2B0 ; # &deg;
B3 D081 ; # capital YO
B4 D084 ; # capital Ukrainian YE
B6 D086 ; # capital Ukrainian I
B7 D087 ; # capital Ukrainian YI
B9 E28496 ; # numero sign
BD D290 ; # capital Ukrainian soft G
BE D18E ; # capital Byelorussian short U
BF C2A9 ; # (C)
C0 D18E ; # small yu
C1 D0B0 ; # small a
C2 D0B1 ; # small b
C3 D186 ; # small ts
C4 D0B4 ; # small d
C5 D0B5 ; # small ye
C6 D184 ; # small f
C7 D0B3 ; # small g
C8 D185 ; # small kh
C9 D0B8 ; # small i
CA D0B9 ; # small j
CB D0BA ; # small k
CC D0BB ; # small l
CD D0BC ; # small m
CE D0BD ; # small n
CF D0BE ; # small o
D0 D0BF ; # small p
D1 D18F ; # small ya
D2 D180 ; # small r
D3 D181 ; # small s
D4 D182 ; # small t
D5 D183 ; # small u
D6 D0B6 ; # small zh
D7 D0B2 ; # small v
D8 D18C ; # small soft sign
D9 D18B ; # small y
DA D0B7 ; # small z
DB D188 ; # small sh
DC D18D ; # small e
DD D189 ; # small shch
DE D187 ; # small ch
DF D18A ; # small hard sign
E0 D0AE ; # capital YU
E1 D090 ; # capital A
E2 D091 ; # capital B
E3 D0A6 ; # capital TS
E4 D094 ; # capital D
E5 D095 ; # capital YE
E6 D0A4 ; # capital F
E7 D093 ; # capital G
E8 D0A5 ; # capital KH
E9 D098 ; # capital I
EA D099 ; # capital J
EB D09A ; # capital K
EC D09B ; # capital L
ED D09C ; # capital M
EE D09D ; # capital N
EF D09E ; # capital O
F0 D09F ; # capital P
F1 D0AF ; # capital YA
F2 D0A0 ; # capital R
F3 D0A1 ; # capital S
F4 D0A2 ; # capital T
F5 D0A3 ; # capital U
F6 D096 ; # capital ZH
F7 D092 ; # capital V
F8 D0AC ; # capital soft sign
F9 D0AB ; # capital Y
FA D097 ; # capital Z
FB D0A8 ; # capital SH
FC D0AD ; # capital E
FD D0A9 ; # capital SHCH
FE D0A7 ; # capital CH
FF D0AA ; # capital hard sign
}

103
nginx/conf/koi-win Normal file
View File

@@ -0,0 +1,103 @@
charset_map koi8-r windows-1251 {
80 88 ; # euro
95 95 ; # bullet
9A A0 ; # &nbsp;
9E B7 ; # &middot;
A3 B8 ; # small yo
A4 BA ; # small Ukrainian ye
A6 B3 ; # small Ukrainian i
A7 BF ; # small Ukrainian yi
AD B4 ; # small Ukrainian soft g
AE A2 ; # small Byelorussian short u
B0 B0 ; # &deg;
B3 A8 ; # capital YO
B4 AA ; # capital Ukrainian YE
B6 B2 ; # capital Ukrainian I
B7 AF ; # capital Ukrainian YI
B9 B9 ; # numero sign
BD A5 ; # capital Ukrainian soft G
BE A1 ; # capital Byelorussian short U
BF A9 ; # (C)
C0 FE ; # small yu
C1 E0 ; # small a
C2 E1 ; # small b
C3 F6 ; # small ts
C4 E4 ; # small d
C5 E5 ; # small ye
C6 F4 ; # small f
C7 E3 ; # small g
C8 F5 ; # small kh
C9 E8 ; # small i
CA E9 ; # small j
CB EA ; # small k
CC EB ; # small l
CD EC ; # small m
CE ED ; # small n
CF EE ; # small o
D0 EF ; # small p
D1 FF ; # small ya
D2 F0 ; # small r
D3 F1 ; # small s
D4 F2 ; # small t
D5 F3 ; # small u
D6 E6 ; # small zh
D7 E2 ; # small v
D8 FC ; # small soft sign
D9 FB ; # small y
DA E7 ; # small z
DB F8 ; # small sh
DC FD ; # small e
DD F9 ; # small shch
DE F7 ; # small ch
DF FA ; # small hard sign
E0 DE ; # capital YU
E1 C0 ; # capital A
E2 C1 ; # capital B
E3 D6 ; # capital TS
E4 C4 ; # capital D
E5 C5 ; # capital YE
E6 D4 ; # capital F
E7 C3 ; # capital G
E8 D5 ; # capital KH
E9 C8 ; # capital I
EA C9 ; # capital J
EB CA ; # capital K
EC CB ; # capital L
ED CC ; # capital M
EE CD ; # capital N
EF CE ; # capital O
F0 CF ; # capital P
F1 DF ; # capital YA
F2 D0 ; # capital R
F3 D1 ; # capital S
F4 D2 ; # capital T
F5 D3 ; # capital U
F6 C6 ; # capital ZH
F7 C2 ; # capital V
F8 DC ; # capital soft sign
F9 DB ; # capital Y
FA C7 ; # capital Z
FB D8 ; # capital SH
FC DD ; # capital E
FD D9 ; # capital SHCH
FE D7 ; # capital CH
FF DA ; # capital hard sign
}

97
nginx/conf/mime.types Normal file
View File

@@ -0,0 +1,97 @@
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}

72
nginx/conf/nginx.conf Normal file
View File

@@ -0,0 +1,72 @@
worker_processes auto; ## Default: 1
worker_rlimit_nofile 8192;
events {
worker_connections 1024; ## Default: 1024
}
http {
sendfile on;
tcp_nopush on;
log_not_found off;
gzip on;
include mime.types; # web pages might not be rendered properly if mime.types not included
default_type application/octet-stream;
client_max_body_size 500M;
keepalive_timeout 30s;
upstream backend {
server localhost:9001;
}
# the Connection header will be correctly set to close when the Upgrade header in the request is set to ''.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 9000;
# This is the default block since / matches all requests.
# It should be used to serve static files.
location / {
# Search ./resources/xxx first;
# if not found, search ./resources/index.html instead;
# if still not found, respond 404.
root ./resources;
try_files $uri /index.html =404;
}
# Both the trailing slashes in location and proxy_pass matter
# because if the proxy_pass directive is specified with a URI,
# then when a request is passed to the server,
# the part of a normalized request URI matching the location is replaced by a URI specified in the directive
location /api/ {
# /api/** will be forwarded to http://backend/**
proxy_pass http://backend/;
# For NGINX to send the Upgrade request from the client to the backend server,
# the Upgrade and Connection headers must be set explicitly
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
location = /allocation/assignment { # This is an exact match.
# /allocation/assignment will be forwarded to http://backend/allocation/assignment
proxy_pass http://backend;
}
location /get/ {
# /get/** will be forwarded to http://backend/get/**
proxy_pass http://backend;
}
location = /export/taskTableDataExport {
proxy_pass http://backend;
}
location = /task/createTaskByXmlFile {
proxy_pass http://backend;
}
}
}

17
nginx/conf/scgi_params Normal file
View File

@@ -0,0 +1,17 @@
scgi_param REQUEST_METHOD $request_method;
scgi_param REQUEST_URI $request_uri;
scgi_param QUERY_STRING $query_string;
scgi_param CONTENT_TYPE $content_type;
scgi_param DOCUMENT_URI $document_uri;
scgi_param DOCUMENT_ROOT $document_root;
scgi_param SCGI 1;
scgi_param SERVER_PROTOCOL $server_protocol;
scgi_param REQUEST_SCHEME $scheme;
scgi_param HTTPS $https if_not_empty;
scgi_param REMOTE_ADDR $remote_addr;
scgi_param REMOTE_PORT $remote_port;
scgi_param SERVER_PORT $server_port;
scgi_param SERVER_NAME $server_name;

17
nginx/conf/uwsgi_params Normal file
View File

@@ -0,0 +1,17 @@
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

126
nginx/conf/win-utf Normal file
View File

@@ -0,0 +1,126 @@
# This map is not a full windows-1251 <> utf8 map: it does not
# contain Serbian and Macedonian letters. If you need a full map,
# use contrib/unicode2nginx/win-utf map instead.
charset_map windows-1251 utf-8 {
82 E2809A ; # single low-9 quotation mark
84 E2809E ; # double low-9 quotation mark
85 E280A6 ; # ellipsis
86 E280A0 ; # dagger
87 E280A1 ; # double dagger
88 E282AC ; # euro
89 E280B0 ; # per mille
91 E28098 ; # left single quotation mark
92 E28099 ; # right single quotation mark
93 E2809C ; # left double quotation mark
94 E2809D ; # right double quotation mark
95 E280A2 ; # bullet
96 E28093 ; # en dash
97 E28094 ; # em dash
99 E284A2 ; # trade mark sign
A0 C2A0 ; # &nbsp;
A1 D18E ; # capital Byelorussian short U
A2 D19E ; # small Byelorussian short u
A4 C2A4 ; # currency sign
A5 D290 ; # capital Ukrainian soft G
A6 C2A6 ; # borken bar
A7 C2A7 ; # section sign
A8 D081 ; # capital YO
A9 C2A9 ; # (C)
AA D084 ; # capital Ukrainian YE
AB C2AB ; # left-pointing double angle quotation mark
AC C2AC ; # not sign
AD C2AD ; # soft hypen
AE C2AE ; # (R)
AF D087 ; # capital Ukrainian YI
B0 C2B0 ; # &deg;
B1 C2B1 ; # plus-minus sign
B2 D086 ; # capital Ukrainian I
B3 D196 ; # small Ukrainian i
B4 D291 ; # small Ukrainian soft g
B5 C2B5 ; # micro sign
B6 C2B6 ; # pilcrow sign
B7 C2B7 ; # &middot;
B8 D191 ; # small yo
B9 E28496 ; # numero sign
BA D194 ; # small Ukrainian ye
BB C2BB ; # right-pointing double angle quotation mark
BF D197 ; # small Ukrainian yi
C0 D090 ; # capital A
C1 D091 ; # capital B
C2 D092 ; # capital V
C3 D093 ; # capital G
C4 D094 ; # capital D
C5 D095 ; # capital YE
C6 D096 ; # capital ZH
C7 D097 ; # capital Z
C8 D098 ; # capital I
C9 D099 ; # capital J
CA D09A ; # capital K
CB D09B ; # capital L
CC D09C ; # capital M
CD D09D ; # capital N
CE D09E ; # capital O
CF D09F ; # capital P
D0 D0A0 ; # capital R
D1 D0A1 ; # capital S
D2 D0A2 ; # capital T
D3 D0A3 ; # capital U
D4 D0A4 ; # capital F
D5 D0A5 ; # capital KH
D6 D0A6 ; # capital TS
D7 D0A7 ; # capital CH
D8 D0A8 ; # capital SH
D9 D0A9 ; # capital SHCH
DA D0AA ; # capital hard sign
DB D0AB ; # capital Y
DC D0AC ; # capital soft sign
DD D0AD ; # capital E
DE D0AE ; # capital YU
DF D0AF ; # capital YA
E0 D0B0 ; # small a
E1 D0B1 ; # small b
E2 D0B2 ; # small v
E3 D0B3 ; # small g
E4 D0B4 ; # small d
E5 D0B5 ; # small ye
E6 D0B6 ; # small zh
E7 D0B7 ; # small z
E8 D0B8 ; # small i
E9 D0B9 ; # small j
EA D0BA ; # small k
EB D0BB ; # small l
EC D0BC ; # small m
ED D0BD ; # small n
EE D0BE ; # small o
EF D0BF ; # small p
F0 D180 ; # small r
F1 D181 ; # small s
F2 D182 ; # small t
F3 D183 ; # small u
F4 D184 ; # small f
F5 D185 ; # small kh
F6 D186 ; # small ts
F7 D187 ; # small ch
F8 D188 ; # small sh
F9 D189 ; # small shch
FA D18A ; # small hard sign
FB D18B ; # small y
FC D18C ; # small soft sign
FD D18D ; # small e
FE D18E ; # small yu
FF D18F ; # small ya
}

314
pom.xml Normal file
View File

@@ -0,0 +1,314 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.edu.whu</groupId>
<artifactId>boot</artifactId>
<version>3.0</version>
<name>Android</name>
<!--打包放开-->
<!--<packaging>war</packaging>-->
<packaging>jar</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- <geotools.version>20.3</geotools.version>-->
<geotools.version>25.2</geotools.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--打包放开-->
<!--去除内嵌tomcat-->
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<!--这里指定打war包的时不再需要tomcat相关的包但是本地运行时必须注释掉否则会报错-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
<!--<version>1.3.5.RELEASE</version>-->
<!--<scope>provided</scope>-->
<!--</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<!--Hutool Java工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
<!-- JDOM 和 dom4j 写 XML文件依赖 -->
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
<!-- 本次数据库使用 porstgre数据库 和 MyBatis访问数据库 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- PageHelper分页查询-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!--文件夹压缩与解压-->
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
<!-- session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
<!-- Shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.4.0</version>
</dependency>
<!-- Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<!-- Mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- ESRI geometry -->
<!-- For reading Shapefile -->
<dependency>
<groupId>com.esri.geometry</groupId>
<artifactId>esri-geometry-api</artifactId>
<version>2.2.2</version>
</dependency>
<!-- For geometry operations -->
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>1.18.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
<!-- GeoJSON -->
<dependency>
<groupId>de.grundid.opendatalab</groupId>
<artifactId>geojson-jackson</artifactId>
<version>1.8.1</version>
</dependency>
<!-- 导入配置文件处理器,配置文件进行绑定时就会有提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--读写Excel文件-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<!--GeoTools读写shp相关依赖-->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.geotools/gt-geojson -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.gdal</groupId>
<artifactId>gdal</artifactId>
<version>3.10.3</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.vividsolutions</groupId>-->
<!-- <artifactId>jts</artifactId>-->
<!-- <version>1.13</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.6</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>3.14.15</version>
</dependency>
</dependencies>
<!--上面gt-geojson添加依赖遇到not fount可手动配置maven repository解决 -->
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot Repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--避免编译war出现test的错误-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

10
postgres/Dockerfile Normal file
View File

@@ -0,0 +1,10 @@
FROM postgres:12
# install PostGIS extension
RUN apt-get update && apt install -y postgis postgresql-12-postgis-3
RUN mkdir -p /docker-entrypoint-initdb.d
# create app database and restore data
COPY ./schema.sql /docker-entrypoint-initdb.d/schema.sql
COPY ./tables.sql /docker-entrypoint-initdb.d/tables.sql

954
postgres/schema.sql Normal file
View File

@@ -0,0 +1,954 @@
--
-- PostgreSQL database dump
--
-- Dumped from database version 10.9
-- Dumped by pg_dump version 12.5
\c tj_project
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA public;
--
-- Name: EXTENSION postgis; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION postgis IS 'PostGIS geometry, geography, and raster spatial types and functions';
--
-- Name: trigger_set_timestamp(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.trigger_set_timestamp() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
NEW.update_time = NOW();
RETURN NEW;
END;$$;
ALTER FUNCTION public.trigger_set_timestamp() OWNER TO postgres;
--
-- Name: apkversion; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.apkversion (
versionid numeric(2,1),
version_code character varying(100),
apkpath character varying(100),
description text
);
ALTER TABLE public.apkversion OWNER TO postgres;
--
-- Name: task; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task (
id integer NOT NULL,
task_name character varying(255),
operator character varying(255),
create_time timestamp(6) without time zone,
modify_time timestamp(6) without time zone,
xml_id integer,
has_create_tables smallint,
config text,
database_name character varying(255),
introduction character varying(255),
upload_deadline character varying(10),
create_tables_md5code character varying(255),
is_allocation_optional smallint DEFAULT 0,
is_reviewer_restricted smallint DEFAULT 1
);
ALTER TABLE public.task OWNER TO postgres;
--
-- Name: COLUMN task.is_allocation_optional; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task.is_allocation_optional IS '0 表示该任务必须分配1 表示无需分配';
--
-- Name: task_cell; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task_cell (
id integer NOT NULL,
task_id integer NOT NULL,
geohash character varying(20) NOT NULL,
geojson text NOT NULL
);
ALTER TABLE public.task_cell OWNER TO postgres;
--
-- Name: task_cell_data; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task_cell_data (
id integer NOT NULL,
task_id integer NOT NULL,
table_name character varying(255) NOT NULL,
data_id integer NOT NULL,
cell_geohash character varying(255) NOT NULL
);
ALTER TABLE public.task_cell_data OWNER TO postgres;
--
-- Name: TABLE task_cell_data; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.task_cell_data IS '网格和数据的对应关系';
--
-- Name: COLUMN task_cell_data.table_name; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_cell_data.table_name IS '数据所在的表';
--
-- Name: COLUMN task_cell_data.cell_geohash; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_cell_data.cell_geohash IS '网格的 Geohash作为网格的标识';
--
-- Name: task_cell_data_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_cell_data_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.task_cell_data_id_seq OWNER TO postgres;
--
-- Name: task_cell_data_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_cell_data_id_seq OWNED BY public.task_cell_data.id;
--
-- Name: task_cell_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_cell_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.task_cell_id_seq OWNER TO postgres;
--
-- Name: task_cell_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_cell_id_seq OWNED BY public.task_cell.id;
--
-- Name: task_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
MAXVALUE 2147483647
CACHE 1;
ALTER TABLE public.task_id_seq OWNER TO postgres;
--
-- Name: task_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_id_seq OWNED BY public.task.id;
--
-- Name: task_image; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task_image (
id integer NOT NULL,
file_name character varying(255) NOT NULL,
bbox public.geometry NOT NULL,
task_id integer NOT NULL
);
ALTER TABLE public.task_image OWNER TO postgres;
--
-- Name: TABLE task_image; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.task_image IS '加密影像';
--
-- Name: COLUMN task_image.file_name; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_image.file_name IS 'tpkx 文件的名称';
--
-- Name: COLUMN task_image.bbox; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_image.bbox IS '外接矩形';
--
-- Name: COLUMN task_image.task_id; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_image.task_id IS '任务ID';
--
-- Name: task_image_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_image_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.task_image_id_seq OWNER TO postgres;
--
-- Name: task_image_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_image_id_seq OWNED BY public.task_image.id;
--
-- Name: task_select_id; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task_select_id (
id bigint NOT NULL,
select_order smallint NOT NULL,
select_id text NOT NULL,
src_task_id integer NOT NULL,
src_table_name character varying(50) NOT NULL,
dest_task_id integer NOT NULL,
dest_table_name character varying(50) NOT NULL
);
ALTER TABLE public.task_select_id OWNER TO postgres;
--
-- Name: COLUMN task_select_id.select_order; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_select_id.select_order IS '抽取顺序';
--
-- Name: COLUMN task_select_id.select_id; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_select_id.select_id IS '抽取的id字符串用逗号隔开';
--
-- Name: task_select_id_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_select_id_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.task_select_id_id_seq OWNER TO postgres;
--
-- Name: task_select_id_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_select_id_id_seq OWNED BY public.task_select_id.id;
--
-- Name: task_user_cell; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task_user_cell (
id integer NOT NULL,
task_id integer NOT NULL,
user_id integer NOT NULL,
cell_geohash character varying(255) NOT NULL
);
ALTER TABLE public.task_user_cell OWNER TO postgres;
--
-- Name: TABLE task_user_cell; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.task_user_cell IS '外业人员和在任务中分配到的网格的对应关系';
--
-- Name: COLUMN task_user_cell.cell_geohash; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_user_cell.cell_geohash IS '用来标识网格的 Geohash';
--
-- Name: task_user_cell_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_user_cell_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.task_user_cell_id_seq OWNER TO postgres;
--
-- Name: task_user_cell_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_user_cell_id_seq OWNED BY public.task_user_cell.id;
--
-- Name: task_user_role; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.task_user_role (
id integer NOT NULL,
task_id integer NOT NULL,
user_id integer NOT NULL,
work_role smallint DEFAULT 0 NOT NULL
);
ALTER TABLE public.task_user_role OWNER TO postgres;
--
-- Name: TABLE task_user_role; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.task_user_role IS '某个任务中外业人员的身份(审核人员或采集人员)';
--
-- Name: COLUMN task_user_role.work_role; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON COLUMN public.task_user_role.work_role IS '1审核人员 0采集人员';
--
-- Name: task_user_role_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.task_user_role_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.task_user_role_id_seq OWNER TO postgres;
--
-- Name: task_user_role_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.task_user_role_id_seq OWNED BY public.task_user_role.id;
--
-- Name: upms_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.upms_log_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.upms_log_id_seq OWNER TO postgres;
--
-- Name: user_permission; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.user_permission (
id integer NOT NULL,
description character varying NOT NULL,
create_time timestamp without time zone DEFAULT now() NOT NULL,
update_time timestamp without time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.user_permission OWNER TO postgres;
--
-- Name: TABLE user_permission; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.user_permission IS '用户权限';
--
-- Name: user_permission_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.user_permission_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.user_permission_id_seq OWNER TO postgres;
--
-- Name: user_permission_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.user_permission_id_seq OWNED BY public.user_permission.id;
--
-- Name: user_role; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.user_role (
id integer NOT NULL,
name character varying NOT NULL,
create_time timestamp without time zone DEFAULT now() NOT NULL,
update_time timestamp without time zone DEFAULT now() NOT NULL,
code integer NOT NULL
);
ALTER TABLE public.user_role OWNER TO postgres;
--
-- Name: TABLE user_role; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.user_role IS '用户角色';
--
-- Name: user_role_code; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.user_role_code (
id integer NOT NULL,
code integer NOT NULL,
role integer NOT NULL
);
ALTER TABLE public.user_role_code OWNER TO postgres;
--
-- Name: user_role_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.user_role_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.user_role_id_seq OWNER TO postgres;
--
-- Name: user_role_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.user_role_id_seq OWNED BY public.user_role.id;
--
-- Name: user_role_permission; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.user_role_permission (
id integer NOT NULL,
role integer NOT NULL,
permission integer NOT NULL,
create_time timestamp without time zone DEFAULT now() NOT NULL,
update_time timestamp without time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.user_role_permission OWNER TO postgres;
--
-- Name: TABLE user_role_permission; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.user_role_permission IS '角色-权限对照';
--
-- Name: user_role_premission_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.user_role_premission_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.user_role_premission_id_seq OWNER TO postgres;
--
-- Name: user_role_premission_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.user_role_premission_id_seq OWNED BY public.user_role_permission.id;
--
-- Name: user_staff; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.user_staff (
id integer NOT NULL,
username character varying NOT NULL,
password character varying NOT NULL,
salt character varying NOT NULL,
phone character varying,
email character varying,
role integer NOT NULL,
create_time timestamp without time zone DEFAULT now() NOT NULL,
update_time timestamp without time zone DEFAULT now() NOT NULL,
real_name character varying(255) NOT NULL
);
ALTER TABLE public.user_staff OWNER TO postgres;
--
-- Name: TABLE user_staff; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON TABLE public.user_staff IS '人员信息';
--
-- Name: user_staff_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.user_staff_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.user_staff_id_seq OWNER TO postgres;
--
-- Name: user_staff_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.user_staff_id_seq OWNED BY public.user_staff.id;
--
-- Name: userinfo_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.userinfo_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.userinfo_id_seq OWNER TO postgres;
--
-- Name: xml; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.xml (
id integer NOT NULL,
file_name character varying(255),
md5_code character varying(255),
file_path text,
create_time timestamp(6) without time zone,
modify_time timestamp(6) without time zone
);
ALTER TABLE public.xml OWNER TO postgres;
--
-- Name: xml_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.xml_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
MAXVALUE 2147483647
CACHE 1;
ALTER TABLE public.xml_id_seq OWNER TO postgres;
--
-- Name: xml_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.xml_id_seq OWNED BY public.xml.id;
--
-- Name: task id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task ALTER COLUMN id SET DEFAULT nextval('public.task_id_seq'::regclass);
--
-- Name: task_cell id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_cell ALTER COLUMN id SET DEFAULT nextval('public.task_cell_id_seq'::regclass);
--
-- Name: task_cell_data id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_cell_data ALTER COLUMN id SET DEFAULT nextval('public.task_cell_data_id_seq'::regclass);
--
-- Name: task_image id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_image ALTER COLUMN id SET DEFAULT nextval('public.task_image_id_seq'::regclass);
--
-- Name: task_select_id id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_select_id ALTER COLUMN id SET DEFAULT nextval('public.task_select_id_id_seq'::regclass);
--
-- Name: task_user_cell id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_user_cell ALTER COLUMN id SET DEFAULT nextval('public.task_user_cell_id_seq'::regclass);
--
-- Name: task_user_role id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_user_role ALTER COLUMN id SET DEFAULT nextval('public.task_user_role_id_seq'::regclass);
--
-- Name: user_permission id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_permission ALTER COLUMN id SET DEFAULT nextval('public.user_permission_id_seq'::regclass);
--
-- Name: user_role id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_role ALTER COLUMN id SET DEFAULT nextval('public.user_role_id_seq'::regclass);
--
-- Name: user_role_permission id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_role_permission ALTER COLUMN id SET DEFAULT nextval('public.user_role_premission_id_seq'::regclass);
--
-- Name: user_staff id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_staff ALTER COLUMN id SET DEFAULT nextval('public.user_staff_id_seq'::regclass);
--
-- Name: xml id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.xml ALTER COLUMN id SET DEFAULT nextval('public.xml_id_seq'::regclass);
--
-- Name: task_cell_data task_cell_data_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_cell_data
ADD CONSTRAINT task_cell_data_pkey PRIMARY KEY (id);
--
-- Name: task_cell task_cell_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_cell
ADD CONSTRAINT task_cell_pkey PRIMARY KEY (id);
--
-- Name: task_image task_image_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_image
ADD CONSTRAINT task_image_pkey PRIMARY KEY (id);
--
-- Name: task task_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task
ADD CONSTRAINT task_pkey PRIMARY KEY (id);
--
-- Name: task_select_id task_select_id_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_select_id
ADD CONSTRAINT task_select_id_pkey PRIMARY KEY (id);
--
-- Name: task_user_cell task_user_cell_pk; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_user_cell
ADD CONSTRAINT task_user_cell_pk UNIQUE (task_id, user_id, cell_geohash);
--
-- Name: task_user_cell task_user_cell_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_user_cell
ADD CONSTRAINT task_user_cell_pkey PRIMARY KEY (id);
--
-- Name: task_user_role task_user_role_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_user_role
ADD CONSTRAINT task_user_role_pkey PRIMARY KEY (id);
--
-- Name: user_permission unique_description; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_permission
ADD CONSTRAINT unique_description UNIQUE (description);
--
-- Name: user_staff unique_email; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_staff
ADD CONSTRAINT unique_email UNIQUE (email);
--
-- Name: user_staff unique_phone; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_staff
ADD CONSTRAINT unique_phone UNIQUE (phone);
--
-- Name: user_staff unique_username; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_staff
ADD CONSTRAINT unique_username UNIQUE (username);
--
-- Name: user_permission user_permission_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_permission
ADD CONSTRAINT user_permission_pkey PRIMARY KEY (id);
--
-- Name: user_role_code user_role_code_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_role_code
ADD CONSTRAINT user_role_code_pkey PRIMARY KEY (id);
--
-- Name: user_role user_role_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_role
ADD CONSTRAINT user_role_pkey PRIMARY KEY (id);
--
-- Name: user_role_permission user_role_premission_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_role_permission
ADD CONSTRAINT user_role_premission_pkey PRIMARY KEY (id);
--
-- Name: user_staff user_staff_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.user_staff
ADD CONSTRAINT user_staff_pkey PRIMARY KEY (id);
--
-- Name: xml xml_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.xml
ADD CONSTRAINT xml_pkey PRIMARY KEY (id);
--
-- Name: geom_idx; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX geom_idx ON public.task_image USING gist (bbox);
--
-- Name: task_user_role_task_id_user_id_uindex; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX task_user_role_task_id_user_id_uindex ON public.task_user_role USING btree (task_id, user_id);
--
-- Name: user_permission update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres
--
CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_permission FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp();
--
-- Name: user_role update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres
--
CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_role FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp();
--
-- Name: user_role_permission update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres
--
CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_role_permission FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp();
--
-- Name: user_staff update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres
--
CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_staff FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp();
--
-- Name: task_image task_image_task_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.task_image
ADD CONSTRAINT task_image_task_id_fk FOREIGN KEY (task_id) REFERENCES public.task(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- PostgreSQL database dump complete
--

143
postgres/tables.sql Normal file
View File

@@ -0,0 +1,143 @@
--
-- PostgreSQL database dump
--
-- Dumped from database version 10.9
-- Dumped by pg_dump version 12.5
\c tj_project
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
--
-- Data for Name: user_permission; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.user_permission (id, description, create_time, update_time) FROM stdin;
1 task:assign 2019-08-31 14:19:35.575579 2019-10-02 10:31:40.271308
5 task:changeCellToUser 2019-09-03 20:30:46.841232 2019-10-02 10:37:04.694562
8 task:changeDataToUser 2019-09-06 17:07:08.275077 2019-10-02 10:38:06.45885
9 image:readById 2019-09-17 13:56:53.821037 2019-10-02 10:38:21.167537
10 image:readAll 2019-09-21 11:22:57.499138 2019-10-02 10:38:24.540783
11 route:insert 2019-09-21 11:23:07.825939 2019-10-02 10:39:23.960188
12 draft:insert 2019-09-22 17:32:04.898064 2019-10-02 10:40:00.7865
13 draft:readField 2019-09-22 17:32:11.280443 2019-10-02 10:40:37.917048
4 taskCell:readByUser 2019-09-03 18:15:23.726681 2019-10-02 10:41:50.32412
3 taskCell:readAll 2019-08-31 14:19:35.575579 2019-10-02 10:42:16.975154
2 task:read 2019-08-31 14:19:35.575579 2019-10-02 10:42:38.926339
14 user:read 2019-09-22 17:32:15.992382 2019-10-02 10:44:23.348406
15 user:readWorker 2019-09-22 17:32:35.548298 2019-10-02 10:44:33.080585
16 user:changeRole 2019-09-26 12:47:46.917506 2019-10-02 10:45:25.811784
17 image:upload 2019-10-05 14:36:39.893348 2019-10-05 14:36:39.893348
20 task:readWorker 2019-10-28 10:19:27.442628 2019-10-28 10:19:27.442628
21 task:checkWorkerStatus 2019-10-28 22:14:59.969087 2019-10-28 22:14:59.969087
19 task:deleteWorker 2019-10-24 22:06:08.085745 2019-10-28 22:15:57.361321
18 task:appendWorkersToTask 2019-10-24 22:05:51.995991 2019-10-28 22:16:25.889528
23 task:deleteWorkerFromCell 2019-10-28 22:17:57.761998 2019-10-28 22:17:57.761998
22 task:appendWorkersToCell 2019-10-28 22:16:28.807395 2019-12-02 15:40:56.904664
24 user:new 2019-12-02 15:41:23.812324 2019-12-02 15:44:31.483289
\.
--
-- Data for Name: user_role; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.user_role (id, name, create_time, update_time, code) FROM stdin;
1 SuperAdmin 2019-08-31 14:18:26.330858 2019-10-28 16:26:56.834742 1234
2 Leader 2019-08-31 14:18:26.330858 2019-10-28 16:26:58.388278 1235
3 Admin 2019-08-31 14:18:26.330858 2019-10-28 16:27:03.116832 1236
4 Worker 2019-08-31 14:18:26.330858 2019-10-28 16:27:16.036296 1237
5 Operator 2019-12-13 10:40:31.519547 2019-12-13 10:40:31.519547 1238
\.
--
-- Data for Name: user_role_code; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.user_role_code (id, code, role) FROM stdin;
1 1234 1
2 1235 2
3 1236 3
4 1237 4
\.
--
-- Data for Name: user_role_permission; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.user_role_permission (id, role, permission, create_time, update_time) FROM stdin;
4 3 4 2019-09-03 18:16:08.794205 2019-09-03 18:16:08.794205
2 3 2 2019-08-31 14:15:36.318695 2019-09-03 19:52:45.774985
1 3 1 2019-08-31 14:15:36.318695 2019-09-03 19:52:56.065802
9 3 16 2019-09-03 20:31:19.021642 2019-10-02 10:52:25.439733
3 3 3 2019-08-31 14:15:36.318695 2019-10-02 10:52:28.279986
5 3 5 2019-09-03 19:53:59.515434 2019-10-02 10:52:29.78855
6 3 8 2019-09-03 19:54:05.128648 2019-10-02 10:52:31.211962
7 3 14 2019-09-03 19:54:10.39031 2019-10-02 10:52:32.402753
8 3 15 2019-09-03 19:54:15.313807 2019-10-02 10:52:38.751726
10 4 9 2019-09-06 17:07:41.129591 2019-10-02 10:52:57.190981
11 4 10 2019-09-17 13:57:19.906336 2019-10-02 10:53:00.996116
12 4 11 2019-09-21 11:23:56.517606 2019-10-02 10:53:12.855955
13 4 12 2019-09-21 11:24:01.694544 2019-10-02 10:53:14.285944
14 4 13 2019-09-22 17:32:59.032636 2019-10-02 10:53:16.372835
15 3 9 2019-10-05 10:34:09.764426 2019-10-05 10:34:09.764426
16 3 10 2019-10-05 10:34:17.086963 2019-10-05 10:34:26.680047
17 3 17 2019-10-05 14:36:55.519405 2019-10-05 14:36:55.519405
18 3 18 2019-10-24 22:06:39.062327 2019-10-24 22:06:39.062327
19 3 19 2019-10-24 22:06:47.173313 2019-10-24 22:06:47.173313
20 3 20 2019-10-28 10:19:40.53637 2019-10-28 10:19:40.53637
22 3 22 2019-10-28 22:16:35.837969 2019-10-28 22:16:35.837969
21 3 21 2019-10-28 22:15:10.604473 2019-10-28 22:16:37.872189
23 3 23 2019-10-28 22:18:03.235823 2019-10-28 22:18:03.235823
24 3 24 2019-12-02 15:41:37.668403 2019-12-02 15:41:47.024277
25 5 1 2019-12-13 11:36:43.022671 2019-12-13 11:36:43.022671
26 5 2 2019-12-13 11:36:51.911982 2019-12-13 11:36:51.911982
27 5 3 2019-12-13 11:37:00.407219 2019-12-13 11:37:00.407219
28 5 4 2019-12-13 11:37:08.260826 2019-12-13 11:37:08.260826
29 5 5 2019-12-13 11:37:13.422231 2019-12-13 11:37:13.422231
30 5 8 2019-12-13 11:37:21.09809 2019-12-13 11:37:21.09809
31 5 18 2019-12-13 11:37:39.726519 2019-12-13 11:37:39.726519
32 5 19 2019-12-13 11:37:44.602842 2019-12-13 11:37:44.602842
33 5 20 2019-12-13 11:37:51.401845 2019-12-13 11:37:51.401845
34 5 21 2019-12-13 11:37:56.59423 2019-12-13 11:37:56.59423
35 5 22 2019-12-13 11:38:10.321722 2019-12-13 11:38:10.321722
36 5 23 2019-12-13 11:38:17.356067 2019-12-13 11:38:17.356067
\.
--
-- Name: user_permission_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.user_permission_id_seq', 25, true);
--
-- Name: user_role_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.user_role_id_seq', 6, false);
--
-- Name: user_role_premission_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.user_role_premission_id_seq', 37, true);
--
-- PostgreSQL database dump complete
--

4030
replay_pid26132.log Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,79 @@
package cn.edu.whu.boot;
import cn.edu.whu.boot.common.domain.CommonConstant;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableAsync;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@SpringBootApplication
@MapperScan("cn.edu.whu.boot.*.mapper")
@EnableAsync
@EnableCaching
public class BootApplication extends SpringBootServletInitializer implements CommandLineRunner{
/**
* 必要的文件夹对应的路径
*/
@Value("${MediaPath}")
private String mediaPath;
@Value("${HistoryMediaPath}")
private String historyMediaPath;
@Value("${XmlFilePath}")
private String xmlFilePath;
@Value("${tpk.root}")
private String tpkRoot;
@Value("${tpkx.root}")
private String tpkxRoot;
@Value("${ApkFilePath}")
private String apkFilePath;
@Value("${photozippath}")
private String photozippath;
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
/**
* 打成war包需要
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return super.configure(builder);
}
/**
* 创建必要的文件夹
*/
@Override
public void run(String... args) throws Exception{
List<String> paths = new ArrayList<>();
paths.add(mediaPath);
paths.add(historyMediaPath);
paths.add(xmlFilePath);
paths.add(tpkRoot);
paths.add(tpkxRoot);
paths.add(CommonConstant.TEMP_FILE_PATHNAME);
paths.add(apkFilePath);
paths.add(photozippath);
paths.forEach(path -> {
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
});
}
}

View File

@@ -0,0 +1,93 @@
package cn.edu.whu.boot.allocation.controllers;
import cn.edu.whu.boot.allocation.controllers.dtos.TableField;
import cn.edu.whu.boot.allocation.entities.Draft;
import cn.edu.whu.boot.allocation.services.DraftService;
import cn.edu.whu.boot.common.utils.collection.OtherUtil;
import cn.edu.whu.boot.common.domain.ResultMessage;
import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil;
import cn.edu.whu.boot.xml.service.ITaskService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/draft")
public class DraftController {
@Autowired
private DraftService draftService;
@Autowired
private ITaskService taskService;
private static Logger logger = LoggerFactory.getLogger(DraftController.class);
@RequestMapping("/insert")
@ResponseBody
public ResultMessage insertDraft(@RequestParam("detail") @NotBlank(message = "数据不能为空") String detail)
{
JSONObject jsonObject = JSON.parseObject(detail);
int taskId = jsonObject.getInteger("taskId");
JSONObject draftJsonObj = jsonObject.getJSONObject("draft");
Draft draft = JSON.toJavaObject(draftJsonObj, Draft.class);
draft.setDate(OtherUtil.changeTimeString(draft.getDate()));
byte[] shapeByte = Base64.getDecoder().decode(draft.getShape());
draft.setShape(new String(shapeByte));
draftService.insert(PostgreSqlUtil.transformString(taskService.getTaskById(taskId).getDatabaseName()), draft);
return ResultMessage.success(null);
}
@RequestMapping("/fields")
@ResponseBody
public ResultMessage getDraftField() {
Map<String, TableField> map = new HashMap<>();
TableField tableField;
tableField = new TableField();
tableField.setName("upload");
tableField.setType("int");
tableField.setChinese("ID");
map.put("upload", tableField);
tableField = new TableField();
tableField.setName("userName");
tableField.setType("String");
tableField.setChinese("采集人员");
map.put("userName", tableField);
tableField = new TableField();
tableField.setName("date");
tableField.setType("Date");
tableField.setChinese("绘制时间");
map.put("date", tableField);
tableField = new TableField();
tableField.setName("shape");
tableField.setType("String");
tableField.setChinese("草图shape");
map.put("shape", tableField);
tableField = new TableField();
tableField.setName("uploadTime");
tableField.setType("Date");
tableField.setChinese("上传时间");
map.put("uploadTime", tableField);
return new ResultMessage<>(true, "成功获取草图表字段对照名称", map);
}
}

View File

@@ -0,0 +1,329 @@
package cn.edu.whu.boot.allocation.controllers;
import cn.edu.whu.boot.allocation.controllers.dtos.ImageWithUrl;
import cn.edu.whu.boot.allocation.controllers.dtos.MapServerInitialExtent;
import cn.edu.whu.boot.allocation.controllers.dtos.MapServerRoot;
import cn.edu.whu.boot.allocation.entities.Image;
import cn.edu.whu.boot.allocation.services.ImageService;
import cn.edu.whu.boot.allocation.services.TaskCellService;
import cn.edu.whu.boot.allocation.services.TaskInfoService;
import cn.edu.whu.boot.common.domain.ResultMessage;
import cn.edu.whu.boot.common.utils.allocation.TpkEncryptHelper;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Polygon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@RestController
@Validated
public class ImageController {
private final ObjectMapper objectMapper = new ObjectMapper();
private final GeometryFactory geometryFactory = new GeometryFactory();
private final Logger logger = LoggerFactory.getLogger(ImageController.class);
private final TaskCellService taskCellService;
private final ImageService imageService;
private final TaskInfoService taskInfoService;
@Value("${tpk.root}")
private String tpkRoot;
@Value("${tpkx.root}")
private String tpkxRoot;
public ImageController(TaskCellService taskCellService, ImageService imageService, TaskInfoService taskInfoService) {
this.taskCellService = taskCellService;
this.imageService = imageService;
this.taskInfoService = taskInfoService;
}
/**
* 上传影像文件,加密之后存在服务器上
*
* @param taskId 任务 ID
* @param file 影像文件
*/
@RequestMapping("/image/new")
@ResponseBody
public ResultMessage uploadImage(@RequestParam("image") @NotNull(message = "必须上传影像文件")
MultipartFile file,
@RequestParam @Positive
int taskId) throws Exception {
// 检查上传的文件
if (file.getSize() == 0) {
throw new Exception("上传的文件没有内容");
}
Optional<String> optionalFilename = Optional.ofNullable(file.getOriginalFilename());
optionalFilename.orElseThrow(() -> new Exception("非法的文件名"));
String filename = optionalFilename.get();
if (!filename.endsWith(".tpk")) {
throw new Exception("上传的不是 .tpk 文件");
}
String tpkFilename = taskId + "_" + filename;
String tpkxFilename = tpkFilename.substring(0, tpkFilename.lastIndexOf(".") + 1) + "tpkx";
if (imageService.countByFilename(tpkxFilename) != 0) {
throw new Exception("存在同名文件,请更改文件名");
}
String tpkUrl = tpkRoot + tpkFilename;
try (InputStream in = file.getInputStream()) {
// 将 .tpk 文件存在本地
File tpkFile = new File(tpkUrl);
if (tpkFile.exists()) {
Files.delete(Paths.get(tpkUrl));
}
Files.copy(in, tpkFile.toPath());
// 加密
TpkEncryptHelper.encryptTpk(tpkUrl, tpkxRoot);
// 解析 TPK 文件,获取经纬度范围
MapServerInitialExtent extent = getExtentFromTPK(tpkUrl);
if (extent == null) {
throw new Exception("无法从 TPK 中获取经纬度范围");
}
// 在 task_image 中插入一条新记录
int id = imageService.insert(new Image(tpkxFilename, taskId, extent.getXmin(), extent.getYmin(), extent.getXmax(), extent.getYmax()));
ResultMessage<Integer> message = new ResultMessage<>(true, "成功上传影像");
message.setData(id);
return message;
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultMessage<>(false, "上传失败");
} finally {
// 删除原始 TPK 文件,保证服务器上只保存加密后的文件
try {
Files.delete(Paths.get(tpkUrl));
} catch (Exception e) {
logger.warn("无法删除 TPK" + e.getMessage());
}
}
}
private MapServerInitialExtent getExtentFromTPK(String tpkUrl) throws IOException {
try (ZipFile zip = new ZipFile(tpkUrl)) {
for (Enumeration<? extends ZipEntry> e = zip.entries(); e.hasMoreElements(); ) {
ZipEntry entry = e.nextElement();
if (!entry.isDirectory()) {
if (FilenameUtils.getName(entry.getName()).equals("mapserver.json")) {
try (InputStream in = zip.getInputStream(entry)) {
MapServerRoot root = JSON.parseObject(IOUtils.toString(in, StandardCharsets.UTF_8), MapServerRoot.class);
return root.getContents().getInitialExtent();
}
}
}
}
}
throw new IOException("TPK 不包含 mapserver.json");
}
/**
* 获取指定任务的影像文件
*
* @param taskId 任务 ID
* @param page 页码
* @param count 每页的数据量
*/
@RequestMapping("/images")
@ResponseBody
public ResultMessage getImagesByTaskId(@RequestParam @Positive int taskId,
@RequestParam(defaultValue = "1") @Positive int page,
@RequestParam(defaultValue = "10") @Positive int count) {
// 统计该任务的影像文件
int total = imageService.countByTaskId(taskId);
int totalPages = (int) Math.ceil((double) total / count);
if (page > totalPages) {
return new ResultMessage<>(false, "请求的页码大于总页数");
}
// 获取指定范围内的数据
List<Map<String, Object>> images = imageService.findByTaskIdPaginated(taskId, page, count);
Map<String, Object> data = new HashMap<>();
data.put("total", totalPages);
data.put("data", images);
return new ResultMessage<>(true, "成功获取影像文件列表", data);
}
/**
* 删除影像文件
*
* @param str 影像文件 ID 列表字符串,每个 ID 之间用逗号隔开
*/
@RequestMapping("/image/delete")
@ResponseBody
public ResultMessage deleteImages(@RequestParam("ids") @NotBlank String str) {
List<Integer> ids = Arrays.stream(str.split(",")).mapToInt(Integer::parseInt).boxed().collect(Collectors.toList());
List<String> filenames = imageService.findFilenamesInIds(ids);
if (!filenames.isEmpty()) {
for (String filename : filenames) {
try {
// 删除原始 TPK 文件
File tpkFile = new File(tpkRoot + filename.replace(".tpkx", ".tpk"));
if (tpkFile.exists()) {
if (!tpkFile.delete()) {
logger.warn("无法删除 TPK 文件 " + tpkFile.getPath());
}
}
// 删除加密文件
File tpkxFile = new File(tpkxRoot + filename);
if (tpkxFile.exists()) {
if (!tpkxFile.delete()) {
logger.warn("无法删除 TPKX 文件 " + tpkxFile.getPath());
}
}
} catch (Exception e) {
logger.warn(e.getMessage());
}
}
}
imageService.deleteInIds(ids);
return new ResultMessage<>(true, "成功删除文件");
}
/**
* 外业人员获取某个任务中与其相关的所有影像
*
* @param taskId 任务 ID
* @param userId 外业人员 ID
*/
@RequestMapping("/image/all")
@ResponseBody
public ResultMessage getImageList(@RequestParam("taskId")
@NotNull(message = "任务 ID 不能为空")
int taskId,
@RequestParam("userId")
@NotNull(message = "人员 ID 不能为空")
int userId) {
// 获取该任务对应的影像
List<Image> images = imageService.findByTaskId(taskId);
if (taskInfoService.isTaskAllocationOptional(taskId)) {
List<ImageWithUrl> result = images
.stream()
.map(image -> new ImageWithUrl(image.getId(), "/tpkx/" + image.getFilename(), image.getMinLon(), image.getMinLat(), image.getMaxLon(), image.getMaxLat()))
.collect(Collectors.toList());
return new ResultMessage<>(true, "成功获取影像列表", result);
}
// 获取任务涉及的网格
List<ImageWithUrl> filteredImages = new ArrayList<>();
List<Polygon> cells = new ArrayList<>();
for (String geojson : taskCellService.findGeojsonByTaskIdAndUserId(taskId, userId)) {
Polygon cell = fromGeoJsonToPolygon(geojson);
if (cell != null) {
cells.add(cell);
}
}
// 筛选出与任务网格相交的影像
if (!cells.isEmpty()) {
for (Image image : images) {
double xmin = image.getMinLon();
double ymin = image.getMinLat();
double xmax = image.getMaxLon();
double ymax = image.getMaxLat();
Coordinate[] shell = {new Coordinate(xmin, ymin), new Coordinate(xmin, ymax), new Coordinate(xmax, ymax), new Coordinate(xmax, ymin), new Coordinate(xmin, ymin)};
Polygon imageBoundary = geometryFactory.createPolygon(shell);
for (Polygon cell : cells) {
if (cell.intersects(imageBoundary)) {
filteredImages.add(new ImageWithUrl(image.getId(), "/tpkx/" + image.getFilename(), xmin, ymin, xmax, ymax));
break;
}
}
}
}
return new ResultMessage<>(true, "成功获取影像列表", filteredImages);
}
/**
* 将 GeoJSON 字符串转换为 org.locationtech.jts.geom.Polygon 对象
*
* @param geojson 表示一个多边形的 GeoJSON 字符串
* @return org.locationtech.jts.geom.Polygon 对象
*/
private Polygon fromGeoJsonToPolygon(String geojson) {
if (geojson == null || geojson.equals("")) {
return null;
}
org.geojson.Feature feature;
try {
feature = objectMapper.readValue(geojson, org.geojson.Feature.class);
} catch (IOException e) {
logger.error("无法解析数据:{},数据应为标准的 GeoJSON 格式", geojson);
return null;
}
Coordinate[] shell = ((org.geojson.Polygon) feature.getGeometry())
.getCoordinates()
.stream()
.flatMap(lngLatAlts -> lngLatAlts.stream().map(lngLatAlt -> new Coordinate(lngLatAlt.getLongitude(), lngLatAlt.getLatitude())))
.toArray(Coordinate[]::new);
return geometryFactory.createPolygon(shell);
}
/**
* 返回加密影像的 URL
*
* @param imageId 影像 ID
*/
@RequestMapping("/image")
@ResponseBody
public ResultMessage getImageUrl(@RequestParam("imageId")
@NotNull(message = "必须上传影像 ID")
int imageId) throws Exception {
Optional<String> optional = imageService.findFilenameById(imageId);
if (!optional.isPresent()) {
throw new Exception("影像不存在");
}
return new ResultMessage<>(true, "成功获取影像 URL", "/tpkx/" + optional.get());
}
/**
* 下载加密 TPKX 影像
*
* @param filename .tpkx 文件名
* @throws IOException 读取文件异常
*/
@RequestMapping("/tpkx/{filename}")
public ResponseEntity<Resource> downloadImage(@PathVariable("filename") String filename) throws IOException {
File tpkxFile = new File(tpkxRoot + filename);
Path path = Paths.get(tpkxFile.getAbsolutePath());
ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));
return ResponseEntity
.ok()
.contentLength(tpkxFile.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
}
}

View File

@@ -0,0 +1,139 @@
package cn.edu.whu.boot.allocation.controllers;
import cn.edu.whu.boot.allocation.entities.RouteLine;
import cn.edu.whu.boot.allocation.services.RouteLineService;
import cn.edu.whu.boot.allocation.services.TaskUserRoleService;
import cn.edu.whu.boot.collection.dto.Feature;
import cn.edu.whu.boot.collection.dto.GeometryType;
import cn.edu.whu.boot.common.domain.CommonConstant;
import cn.edu.whu.boot.common.domain.ResultMessage;
import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil;
import cn.edu.whu.boot.user.entities.User;
import cn.edu.whu.boot.user.services.UserService;
import cn.edu.whu.boot.xml.domain.Task;
import cn.edu.whu.boot.xml.service.ITaskService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotEmpty;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("route")
public class RouteLineController {
@Autowired
private RouteLineService routeLineService;
@Autowired
private ITaskService taskService;
@Autowired
private UserService userService;
@Autowired
private TaskUserRoleService taskUserRoleService;
private static Logger logger = LoggerFactory.getLogger(RouteLineController.class);
/**
* 上传轨迹数据
* @param detail 轨迹数据,格式为 JSON 字符串
*/
@RequestMapping(value="insert",produces="text/html;charset=UTF-8")
public String uploadRoute(@RequestParam("detail") @NotEmpty(message = "数据不能为空") String detail)
{
JSONObject jsonObject = JSON.parseObject(detail);
int taskId = jsonObject.getInteger("taskId");
JSONObject routeLineJsonObj = jsonObject.getJSONObject("routeLine");
RouteLine routeLine = JSON.toJavaObject(routeLineJsonObj, RouteLine.class);
routeLine.setUploadTime(new Date());
byte[] result = Base64.getDecoder().decode(routeLine.getPolyline());
// routeLine的Polyline为标准的GeoJson格式主要是方便网页端获取,要判断前端传来的是path还是point
Feature feature = new Feature();
feature.setType(CommonConstant.FEATURE);
GeometryType geometryType = new GeometryType();
JSONObject shapeJson = JSON.parseObject(new String(result));
if (shapeJson.containsKey(CommonConstant.PATHS)){
geometryType.setType(CommonConstant.LINESTRING);
List<List<Double>> pathList = ((List<List<List<Double>>>)shapeJson.get(CommonConstant.PATHS)).get(0);
geometryType.setCoordinates(pathList);
}
else{
geometryType.setType(CommonConstant.POINT);
List<Double> coordinateList = new ArrayList<>();
coordinateList.add(shapeJson.getDouble(CommonConstant.X));
coordinateList.add(shapeJson.getDouble(CommonConstant.Y));
geometryType.setCoordinates(coordinateList);
}
feature.setGeometry(geometryType);
routeLine.setPolyline(JSON.toJSONString(feature));
Task task = taskService.getTaskById(taskId);
routeLineService.insertRouteLine(PostgreSqlUtil.transformString(task.getDatabaseName()), routeLine);
return new ResultMessage(true, "轨迹上传成功").toString();
}
/**
* 获取某个任务下所有工作人员的名单
* @param taskId 任务id
*/
@RequestMapping(value="getWorkerForTask",produces="text/html;charset=UTF-8")
public String getWorkerForTask(Integer taskId)
{
List<Map<String, String>> result = taskService
.getWorkersByTask(taskId)
.stream()
.map(user -> {
Map<String, String> map = new HashMap<>();
map.put("userId", String.valueOf(user.getId()));
map.put("userName", user.getUsername());
return map;
})
.collect(Collectors.toList());
return result.isEmpty() ? new ResultMessage<>(false,"该任务下无工作人员", null).toString() : new ResultMessage<>(true,CommonConstant.SUCCEED, result).toString();
}
/**
* 获取某用户id在某个时间段内的轨迹数据并以标准的Feature格式传给前端。数据库中的记录只要与该时间端相交就返回
* @param taskId 任务Id
* @param userId 用户Id
* @param beginTime 开始时间
* @param stopTime 结束时间
*/
@RequestMapping(value="getRouteByUserId",produces="text/html;charset=UTF-8")
public String getRoute(Integer taskId, Integer userId, String beginTime, String stopTime)
{
Task task = taskService.getTaskById(taskId);
User user = userService.findById(userId).get();
List<RouteLine> routeLineStringList;
if (beginTime != null && !beginTime.equals("") && stopTime != null && !stopTime.equals(""))
{
routeLineStringList = routeLineService.findByNameAndTime(PostgreSqlUtil.transformString(task.getDatabaseName()),
user.getUsername(), beginTime, stopTime);
}
else
{
routeLineStringList = routeLineService.findByName(PostgreSqlUtil.transformString(task.getDatabaseName()),
user.getUsername());
}
if (routeLineStringList == null)
{
return new ResultMessage<>(false, "轨迹为空", null).toString();
}
else
{
return new ResultMessage<>(true, CommonConstant.SUCCEED, routeLineStringList).toString();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,50 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class Cell {
private Worker worker;
private String geohash;
private String geojson;
public Cell()
{
}
public Cell(Worker worker , String geohash , String geojson)
{
this.worker = worker;
this.geohash = geohash;
this.geojson = geojson;
}
public String getGeohash()
{
return geohash;
}
public void setGeohash(String geohash)
{
this.geohash = geohash;
}
public String getGeojson()
{
return geojson;
}
public void setGeojson(String geojson)
{
this.geojson = geojson;
}
public Worker getWorker()
{
return worker;
}
public void setWorker(Worker worker)
{
this.worker = worker;
}
}

View File

@@ -0,0 +1,44 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
import org.geojson.Feature;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomFeatureCollection {
private final String type = "FeatureCollection";
private final Map<String, Object> crs = new HashMap<String, Object>() {{
put("type", "EPSG");
put("properties", new HashMap<String, Object>() {{
put("code", "4326");
}});
}};
public CustomFeatureCollection() {
}
public CustomFeatureCollection(List<Feature> features) {
this.features = features;
}
private List<Feature> features;
public String getType() {
return type;
}
public Map<String, Object> getCrs() {
return crs;
}
public List<Feature> getFeatures() {
return features;
}
public void setFeatures(List<Feature> features) {
this.features = features;
}
}

View File

@@ -0,0 +1,59 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class Data {
private Worker worker;
private String table;
private Long id;
private String geojson;
public Data(Worker worker , String table , Long id , String geojson)
{
this.worker = worker;
this.table = table;
this.id = id;
this.geojson = geojson;
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getGeojson()
{
return geojson;
}
public void setGeojson(String geojson)
{
this.geojson = geojson;
}
public Worker getWorker()
{
return worker;
}
public void setWorker(Worker worker)
{
this.worker = worker;
}
public String getTable()
{
return table;
}
public void setTable(String table)
{
this.table = table;
}
}

View File

@@ -0,0 +1,89 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class ImageWithUrl {
private Integer id;
private String url;
private Double minLon;
private Double minLat;
private Double maxLon;
private Double maxLat;
public ImageWithUrl()
{
}
public ImageWithUrl(Integer id , String url , Double minLon , Double minLat , Double maxLon , Double maxLat)
{
this.id = id;
this.url = url;
this.minLon = minLon;
this.minLat = minLat;
this.maxLon = maxLon;
this.maxLat = maxLat;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
}
public Double getMinLon()
{
return minLon;
}
public void setMinLon(Double minLon)
{
this.minLon = minLon;
}
public Double getMinLat()
{
return minLat;
}
public void setMinLat(Double minLat)
{
this.minLat = minLat;
}
public Double getMaxLon()
{
return maxLon;
}
public void setMaxLon(Double maxLon)
{
this.maxLon = maxLon;
}
public Double getMaxLat()
{
return maxLat;
}
public void setMaxLat(Double maxLat)
{
this.maxLat = maxLat;
}
}

View File

@@ -0,0 +1,13 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class MapServerContents {
private MapServerInitialExtent initialExtent;
public MapServerInitialExtent getInitialExtent() {
return initialExtent;
}
public void setInitialExtent(MapServerInitialExtent initialExtent) {
this.initialExtent = initialExtent;
}
}

View File

@@ -0,0 +1,43 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class MapServerInitialExtent {
private Double xmin;
private Double ymin;
private Double xmax;
private Double ymax;
public Double getXmin() {
return xmin;
}
public void setXmin(Double xmin) {
this.xmin = xmin;
}
public Double getYmin() {
return ymin;
}
public void setYmin(Double ymin) {
this.ymin = ymin;
}
public Double getXmax() {
return xmax;
}
public void setXmax(Double xmax) {
this.xmax = xmax;
}
public Double getYmax() {
return ymax;
}
public void setYmax(Double ymax) {
this.ymax = ymax;
}
}

View File

@@ -0,0 +1,13 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class MapServerRoot {
private MapServerContents contents;
public MapServerContents getContents() {
return contents;
}
public void setContents(MapServerContents contents) {
this.contents = contents;
}
}

View File

@@ -0,0 +1,10 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class Pair<X, Y> {
public final X x;
public final Y y;
public Pair(X x, Y y) {
this.x = x;
this.y = y;
}
}

View File

@@ -0,0 +1,71 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
public class TableField {
/**
* 字段名
*/
private String name;
/**
* 字段类型
*/
private String type;
/**
* 是否为空
*/
private boolean notNull;
/**
* 备注
*/
private String comment;
/**
* 中文名
*/
private String chinese;
//region getter and setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isNotNull() {
return notNull;
}
public void setNotNull(boolean notNull) {
this.notNull = notNull;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getChinese() {
return chinese;
}
public void setChinese(String chinese) {
this.chinese = chinese;
}
}

View File

@@ -0,0 +1,106 @@
package cn.edu.whu.boot.allocation.controllers.dtos;
import java.util.Objects;
/**
* 用于接收外业人员列表
*/
public class Worker {
private Integer id;
private String username;
// 0: 采集人员
// 1审核人员
private Integer role;
private String geohash;
private String geojson;
public Worker() {
}
public Worker(Integer id, String username, Integer role) {
this.id = id;
this.username = username;
this.role = role;
}
public Worker(Integer id, Integer role, String geohash) {
this.id = id;
this.role = role;
this.geohash = geohash;
}
public Integer getId() {
return id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getRole() {
return role;
}
public void setRole(Integer role) {
this.role = role;
}
/**
* 是否为采集人员
*/
public boolean isCollector() {
return role.equals(0);
}
/**
* 是否为审核人员
*/
public boolean isInspector() {
return role.equals(1);
}
public String getGeohash() {
return geohash;
}
public void setGeohash(String geohash) {
this.geohash = geohash;
}
public String getGeojson() {
return geojson;
}
public void setGeojson(String geojson) {
this.geojson = geojson;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Worker worker = (Worker) o;
return Objects.equals(id, worker.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}

View File

@@ -0,0 +1,60 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
public class Draft implements Serializable {
private static final long serialVersionUID = 928802847368958369L;
private Integer iD;
private Integer collectorId;
private String userName;
private String date;
private String shape;
public String getShape() {
return shape;
}
public void setShape(String shape) {
this.shape = shape;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getiD()
{
return iD;
}
public void setiD(Integer iD)
{
this.iD = iD;
}
public Integer getCollectorId() {
return collectorId;
}
public void setCollectorId(Integer collectorId) {
this.collectorId = collectorId;
}
}

View File

@@ -0,0 +1,90 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
public class Image implements Serializable{
private static final long serialVersionUID = -3667769005593579199L;
private Integer id;
private Integer taskId;
private String filename;
private Double minLon;
private Double minLat;
private Double maxLon;
private Double maxLat;
public Image() {
}
public Image(String filename, Integer taskId, Double minLon, Double minLat, Double maxLon, Double maxLat) {
this.filename = filename;
this.taskId = taskId;
this.minLon = minLon;
this.minLat = minLat;
this.maxLon = maxLon;
this.maxLat = maxLat;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public Double getMinLon() {
return minLon;
}
public void setMinLon(Double minLon) {
this.minLon = minLon;
}
public Double getMinLat() {
return minLat;
}
public void setMinLat(Double minLat) {
this.minLat = minLat;
}
public Double getMaxLon() {
return maxLon;
}
public void setMaxLon(Double maxLon) {
this.maxLon = maxLon;
}
public Double getMaxLat() {
return maxLat;
}
public void setMaxLat(Double maxLat) {
this.maxLat = maxLat;
}
public Integer getTaskId() {
return taskId;
}
public void setTaskId(Integer taskId) {
this.taskId = taskId;
}
}

View File

@@ -0,0 +1,103 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
import java.util.Date;
public class RouteLine implements Serializable{
private static final long serialVersionUID = -4234791937496046197L;
private Integer id;
private Integer collectorId;
private String name;
private String polyline;
private String begindate;
private String stopdate;
private Date uploadTime;
private String primaryKeySeq;
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPolyline()
{
return polyline;
}
public void setPolyline(String polyline)
{
this.polyline = polyline;
}
public String getBegindate()
{
return begindate;
}
public void setBegindate(String begindate)
{
this.begindate = begindate;
}
public String getStopdate()
{
return stopdate;
}
public void setStopdate(String stopdate)
{
this.stopdate = stopdate;
}
public Date getUploadTime()
{
return uploadTime;
}
public void setUploadTime(Date uploadTime)
{
this.uploadTime = uploadTime;
}
public String getPrimaryKeySeq()
{
return primaryKeySeq;
}
public void setPrimaryKeySeq(String primaryKeySeq)
{
this.primaryKeySeq = primaryKeySeq;
}
public Integer getCollectorId() {
return collectorId;
}
public void setCollectorId(Integer collectorId) {
this.collectorId = collectorId;
}
}

View File

@@ -0,0 +1,79 @@
package cn.edu.whu.boot.allocation.entities;
public class TaskCell {
private Integer id;
private Integer taskId;
private String geohash;
private String geojson;
public TaskCell() {
}
public TaskCell(Integer taskId, String geohash, String geojson) {
this.taskId = taskId;
this.geohash = geohash;
this.geojson = geojson;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getTaskId() {
return taskId;
}
public void setTaskId(Integer taskId) {
this.taskId = taskId;
}
public String getGeohash() {
return geohash;
}
public void setGeohash(String geohash) {
this.geohash = geohash;
}
public String getGeojson() {
return geojson;
}
public void setGeojson(String geojson) {
this.geojson = geojson;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + taskId.hashCode();
result = 31 * result + geohash.hashCode();
result = 31 * result + geojson.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (!(obj instanceof TaskCell)) {
return false;
}
TaskCell it = (TaskCell) obj;
return this.taskId.equals(it.taskId)
&& this.geohash.equals(it.geohash)
&& this.geojson.equals(it.geojson);
}
}

View File

@@ -0,0 +1,67 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
public class TaskCellData implements Serializable{
private static final long serialVersionUID = -5939625198144474917L;
private Integer id;
private Integer taskId;
private String tableName;
private Long dataId;
private String cellGeohash;
public TaskCellData() {
}
public TaskCellData(Integer taskId, String tableName, Long dataId, String cellGeohash) {
this.taskId = taskId;
this.tableName = tableName;
this.dataId = dataId;
this.cellGeohash = cellGeohash;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getTaskId() {
return taskId;
}
public void setTaskId(Integer taskId) {
this.taskId = taskId;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Long getDataId() {
return dataId;
}
public void setDataId(Long dataId) {
this.dataId = dataId;
}
public String getCellGeohash() {
return cellGeohash;
}
public void setCellGeohash(String cellGeohash) {
this.cellGeohash = cellGeohash;
}
}

View File

@@ -0,0 +1,68 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
public class TaskToUser implements Serializable{
private static final long serialVersionUID = -1638320551511254937L;
private Integer id;
private Integer task;
private Integer user;
private String cell;
private Integer captain;
public TaskToUser() {
}
public TaskToUser(Integer task, Integer user, String cell, Integer captain) {
this.task = task;
this.user = user;
this.cell = cell;
this.captain = captain;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getTask() {
return task;
}
public void setTask(Integer task) {
this.task = task;
}
public Integer getUser() {
return user;
}
public void setUser(Integer user) {
this.user = user;
}
public String getCell() {
return cell;
}
public void setCell(String cell) {
this.cell = cell;
}
public Integer getCaptain() {
return captain;
}
public void setCaptain(Integer captain) {
this.captain = captain;
}
}

View File

@@ -0,0 +1,71 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
import java.util.Objects;
public class TaskUserCell implements Serializable{
private static final long serialVersionUID = -1326635728899511955L;
private Integer id;
private Integer taskId;
private Integer userId;
private String cellGeohash;
public TaskUserCell() {
}
public TaskUserCell(Integer taskId, Integer userId, String cellGeohash) {
this.taskId = taskId;
this.userId = userId;
this.cellGeohash = cellGeohash;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getTaskId() {
return taskId;
}
public void setTaskId(Integer taskId) {
this.taskId = taskId;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getCellGeohash() {
return cellGeohash;
}
public void setCellGeohash(String cellGeohash) {
this.cellGeohash = cellGeohash;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TaskUserCell that = (TaskUserCell) o;
return taskId.equals(that.taskId) && userId.equals(that.userId) && cellGeohash.equals(that.cellGeohash);
}
@Override
public int hashCode() {
return Objects.hash(taskId, userId, cellGeohash);
}
}

View File

@@ -0,0 +1,67 @@
package cn.edu.whu.boot.allocation.entities;
import java.io.Serializable;
public class TaskUserRole implements Serializable{
private static final long serialVersionUID = 2002012690341409624L;
private Integer id;
private Integer taskId;
private Integer userId;
// 1审核人员
// 0采集人员
private Integer workRole;
public TaskUserRole() {
}
public TaskUserRole(Integer taskId, Integer userId, Integer workRole) {
this.taskId = taskId;
this.userId = userId;
this.workRole = workRole;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getTaskId() {
return taskId;
}
public void setTaskId(Integer taskId) {
this.taskId = taskId;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getWorkRole() {
return workRole;
}
public void setWorkRole(Integer workRole) {
this.workRole = workRole;
}
public boolean isCollector() {
return this.workRole.equals(0);
}
public boolean isInspector() {
return this.workRole.equals(1);
}
}

View File

@@ -0,0 +1,11 @@
package cn.edu.whu.boot.allocation.exceptions;
public class InvalidAssignmentStatus extends Exception {
public InvalidAssignmentStatus() {
super();
}
public InvalidAssignmentStatus(String message) {
super(message);
}
}

View File

@@ -0,0 +1,10 @@
package cn.edu.whu.boot.allocation.exceptions;
public class InvalidShapefileException extends Exception {
public InvalidShapefileException() {
}
public InvalidShapefileException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,11 @@
package cn.edu.whu.boot.allocation.exceptions;
public class InvalidUserRoleCodeException extends Exception {
public InvalidUserRoleCodeException() {
super();
}
public InvalidUserRoleCodeException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,13 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.entities.Draft;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@Repository
public interface DraftMapper {
int insert(@Param("databaseName") String databaseName , @Param("draft") Draft draft);
}

View File

@@ -0,0 +1,59 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.entities.Image;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface ImageMapper {
@Select("SELECT file_name FROM task_image WHERE id = #{id}")
String findFilenameById(int id);
@Select("SELECT count(*) FROM task_image WHERE file_name = #{filename}")
int countByFilename(String filename);
@Select({
"<script>",
"SELECT file_name FROM task_image",
"WHERE id IN (<foreach collection='ids' item='id' separator=','>#{id}</foreach>)",
"</script>"
})
List<String> findFilenamesByIds(@Param("ids") List<Integer> ids);
@Select("SELECT id, file_name, ST_XMin(bbox) as lon_min, ST_YMin(bbox) as lat_min, ST_XMax(bbox) as lon_max, ST_YMax(bbox) as lat_max " +
"FROM task_image WHERE task_id = #{taskId}")
@Results(
{
@Result(property = "filename", column = "file_name"),
@Result(property = "minLon", column = "lon_min"),
@Result(property = "minLat", column = "lat_min"),
@Result(property = "maxLon", column = "lon_max"),
@Result(property = "maxLat", column = "lat_max")
}
)
List<Image> findByTaskId(@Param("taskId") int taskId);
@Select("SELECT count(*) FROM task_image WHERE task_id = #{taskId}")
int countByTaskId(@Param("taskId") int taskId);
@Select("SELECT id, substring(file_name, position('_' in file_name) + 1) as filename " +
"FROM task_image WHERE task_id = #{taskId} " +
"ORDER BY id " +
"OFFSET (#{page} - 1) * #{count} LIMIT #{count}")
List<Map<String, Object>> findByTaskIdPaginated(@Param("taskId") int taskId, @Param("page") int page, @Param("count") int count);
@Select("INSERT INTO task_image(file_name, task_id, bbox) " +
"VALUES (#{filename}, #{taskId}, ST_MakeEnvelope(#{minLon}, #{minLat}, #{maxLon}, #{maxLat})) RETURNING id")
@Options(flushCache = Options.FlushCachePolicy.TRUE)
int insert(Image image);
@Delete({
"<script>",
"DELETE FROM task_image WHERE id IN (<foreach item='id' collection='ids' separator=','>#{id}</foreach>)",
"</script>"
})
void deleteInIds(@Param("ids") List<Integer> ids);
}

View File

@@ -0,0 +1,20 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.entities.RouteLine;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface RouteLineMapper {
void insert(@Param("databaseName") String databaseName, @Param("routeLine")RouteLine routeLine);
List<RouteLine> findByName(@Param("databaseName") String databaseName, @Param("name")String name);
List<RouteLine> findByNameAndTime(@Param("databaseName") String databaseName, @Param("name")String name,
@Param("beginTime") String beginTime, @Param("stopTime") String stopTime);
}

View File

@@ -0,0 +1,17 @@
package cn.edu.whu.boot.allocation.mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
@Repository
public interface SimpleTaskMapper {
@Update("UPDATE task SET is_allocation_optional = #{optional} WHERE id = #{taskId}")
@Options(flushCache = Options.FlushCachePolicy.TRUE)
void updateTaskAllocationOptional(@Param("taskId") int taskId, @Param("optional") int optional);
@Select("SELECT is_allocation_optional FROM task WHERE id = #{taskId}")
Integer isTaskAllocationOptional(@Param("taskId") int taskId);
}

View File

@@ -0,0 +1,179 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.entities.TaskCellData;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TaskCellDataMapper {
@Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE id = #{id}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
TaskCellData findById(@Param("id") int id);
@Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE task_id = #{taskId}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskCellData> findByTaskId(@Param("taskId") int taskId);
@Select("SELECT id, task_id, table_name, data_id, cell_geohash " +
"FROM task_cell_data " +
"WHERE task_id = #{taskId} AND cell_geohash = #{cellGeohash}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskCellData> findByTaskIdAndCellGeohash(@Param("taskId") int taskId , @Param("cellGeohash") String cellGeohash);
@Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE task_id = #{taskId} AND cell_geohash = #{cellGeohash} and table_name = #{tableName}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskCellData> findByTaskIdAndTableNameAndCellGeohash(@Param("taskId") int taskId , @Param("tableName") String tableName ,
@Param("cellGeohash") String cellGeohash);
@Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE task_id = #{taskId} AND table_name = #{tableName} AND data_id = #{dataId}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
TaskCellData findByTaskIdAndTableNameAndDataId(@Param("taskId") int taskId ,@Param("tableName") String tableName , @Param("dataId") long dataId);
@Select({"<script>",
"SELECT id, task_id, table_name, data_id, cell_geohash",
"FROM task_cell_data",
"WHERE task_id = #{taskId} AND cell_geohash IN",
"<foreach item='geohash' index='index' collection='geohashes'",
"open='(' separator=',' close=')'>",
"#{geohash}",
"</foreach>",
"</script>"})
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskCellData> findByTaskIdAndCellGeohashIn(@Param("taskId") int taskId , @Param("geohashes") List<String> geohashes);
@Select({"<script>",
"SELECT id, task_id, table_name, data_id, cell_geohash",
"FROM task_cell_data",
"WHERE task_id = #{taskId} AND data_id IN",
"<foreach item='data' index='index' collection='dataIds'",
"open='(' separator=',' close=')'>",
"#{data}",
"</foreach>",
"</script>"})
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskCellData> findByTaskIdAndDataIdIn(@Param("taskId") int taskId , @Param("dataIds") List<Integer> dataIds);
@Select("SELECT id, task_id, table_name, data_id, cell_geohash " +
"FROM task_cell_data " +
"WHERE task_id = #{taskId} AND data_id = #{dataId}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
TaskCellData findByTaskIdAndDataId(@Param("taskId") int taskId , @Param("dataId") int dataId);
@Select("INSERT INTO task_cell_data(task_id, table_name, data_id, cell_geohash)" +
" VALUES(#{taskId}, #{tableName}, #{dataId}, #{cellGeohash}) RETURNING id")
int insert(TaskCellData taskCellData);
@Insert({
"<script>",
"INSERT INTO task_cell_data(task_id, table_name, data_id, cell_geohash)",
"VALUES" +
"<foreach item='item' index='item' collection='list' open='' separator=',' close=''>" +
"(" +
"#{item.taskId}, #{item.tableName}, #{item.dataId}, #{item.cellGeohash}",
")" +
"</foreach>",
"</script>"})
void insertForeach(@Param("list") List<TaskCellData> list);
@Select("UPDATE task_cell_data SET task_id = #{taskId}, table_name = #{tableName}, data_id = #{dataId}, cell_geohash = #{cellGeohash} WHERE id = #{id} RETURNING id")
@Options(flushCache = Options.FlushCachePolicy.TRUE)
int update(TaskCellData taskCellData);
@Delete("DELETE FROM task_cell_data WHERE task_id = #{taskId}")
void deleteByTaskId(@Param("taskId") int taskId);
@Delete("DELETE FROM task_cell_data WHERE task_id = #{taskId} AND table_name = #{tableName} AND data_id = #{dataId}")
void deleteByTaskIdAndTableNameAndDataId(@Param("taskId") int taskId, @Param("tableName") String tableName, @Param("dataId") long dataId);
@Select(
"SELECT table_name, data_id, cell_geohash " +
"FROM task_cell_data " +
"WHERE task_id = #{taskId} " +
"AND cell_geohash = (SELECT cell_geohash FROM task_cell_data WHERE data_id = #{dataId})"
)
@Results(
{
@Result(property = "tableName", column = "table_name"),
@Result(property = "dataId", column = "data_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskCellData> findInTheSameTaskAndCell(@Param("taskId") int taskId, @Param("dataId") long dataId);
@Select({
"<script>",
"SELECT cell_geohash FROM task_cell_data ",
"WHERE task_id = #{taskId} AND table_name = #{tableName} AND data_id IN ",
"(<foreach item='dataId' collection='dataIds' separator=','>#{dataId}</foreach>)",
"</script>"
})
List<String> findCellGeohashByTaskIdAndTableNameAndDataId(@Param("taskId") int taskId, @Param("tableName") String tableName, @Param("dataIds") List<Long> dataIds);
@Select({
"<script>",
"SELECT cell_geohash FROM task_cell_data WHERE task_id = #{taskId} AND table_name = #{tableName} " +
"AND data_id IN (<foreach item='dataId' collection='dataIds' separator=','>#{dataId}</foreach>) " +
"AND cell_geohash NOT IN " +
"(SELECT tuc.cell_geohash FROM task_user_cell tuc WHERE tuc.task_id = #{taskId} AND tuc.user_id = #{userId})",
"</script>"
})
List<String> findCellsWhereUserIsAbsent(@Param("taskId") int taskId, @Param("tableName") String table, @Param("userId") Integer reviewerId, @Param("dataIds") List<Long> dataIds);
}

View File

@@ -0,0 +1,52 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.entities.TaskCell;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface TaskCellMapper {
@Select("SELECT * FROM task_cell WHERE task_id = #{taskId}")
@Results(
{
@Result(property = "taskId", column = "task_id")
}
)
List<TaskCell> findByTaskId(@Param("taskId") int taskId);
@Select("SELECT a.geojson FROM task_cell AS a WHERE a.geohash IN " +
"(SELECT DISTINCT b.cell_geohash FROM task_user_cell AS b " +
"WHERE b.task_id = #{taskId} AND b.user_id = #{userId})")
List<String> findGeojsonByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
@Select("SELECT geojson FROM task_cell WHERE task_id = #{taskId} AND geohash = #{geohash}")
String findGeojsonByTaskIdAndGeohash(@Param("taskId") int taskId, @Param("geohash") String geohash);
@Insert({
"<script>",
"INSERT INTO task_cell(task_id, geohash, geojson)",
"VALUES" +
"<foreach item='item' index='item' collection='list' open='' separator=',' close=''>" +
"(" +
"#{item.taskId}, #{item.geohash}, #{item.geojson}",
")" +
"</foreach>",
"</script>"})
void insertForeach(@Param("list") List<TaskCell> list);
@Insert("INSERT INTO task_cell(task_id, geohash, geojson) VALUES(#{taskId}, #{geohash}, #{geojson})")
void insert(TaskCell taskCell);
@Delete("DELETE FROM task_cell WHERE task_id = #{taskId}")
void deleteByTaskId(@Param("taskId") int taskId);
@Select("SELECT min(st_xmin(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as xmin," +
" max(st_xmax(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as xmax, " +
" min(st_ymin(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as ymin, " +
" max(st_ymax(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as ymax " +
" FROM task_cell WHERE task_id = #{taskId}")
Map<String,Object> getCoordinateRange(@Param("taskId") Integer taskId);
}

View File

@@ -0,0 +1,120 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.controllers.dtos.Worker;
import cn.edu.whu.boot.allocation.entities.TaskUserCell;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TaskUserCellMapper {
@Select("SELECT id, task_id, user_id, cell_geohash " +
"FROM task_user_cell " +
"WHERE id = #{id}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
TaskUserCell findById(@Param("id") int id);
@Select("SELECT id, task_id, user_id, cell_geohash " +
"FROM task_user_cell " +
"WHERE task_id = #{taskId} AND user_id = #{userId}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
List<TaskUserCell> findByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
@Select("SELECT tmp.id AS user_id, tmp.real_name, tmp.work_role, tuc.cell_geohash\n" +
"FROM task_user_cell tuc\n" +
" INNER JOIN (SELECT tur.work_role, us.id, us.real_name\n" +
" FROM task_user_role tur\n" +
" INNER JOIN user_staff us ON tur.user_id = us.id\n" +
" WHERE tur.task_id = #{taskId}) tmp ON tuc.user_id = tmp.id\n" +
"WHERE tuc.task_id = #{taskId}")
@Results(
{
@Result(property = "id", column = "user_id"),
@Result(property = "username", column = "real_name"),
@Result(property = "geohash", column = "cell_geohash"),
@Result(property = "role", column = "work_role")
}
)
List<Worker> findCellAndUserByTaskId(@Param("taskId") int taskId);
@Select("SELECT a.user_id, a.cell_geohash, b.username, c.geojson, d.work_role " +
"FROM task_user_cell AS a, user_staff AS b, task_cell AS c, task_user_role as d " +
"WHERE a.task_id = #{taskId} AND a.user_id = #{userId} " +
"AND a.user_id = b.id AND a.task_id = c.task_id AND a.cell_geohash = c.geohash " +
"AND d.task_id = a.task_id AND d.user_id = a.user_id")
@Results(
{
@Result(property = "id", column = "user_id"),
@Result(property = "username", column = "username"),
@Result(property = "geohash", column = "cell_geohash"),
@Result(property = "geojson", column = "geojson"),
@Result(property = "role", column = "work_role")
}
)
List<Worker> findCellAndUserByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
@Select("SELECT id, task_id, user_id, cell_geohash " +
"FROM task_user_cell " +
"WHERE task_id = #{taskId} AND user_id = #{userId} AND cell_geohash = #{geohash}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "cellGeohash", column = "cell_geohash")
}
)
TaskUserCell findByTaskIdAndUserIdAndCellGeohash(@Param("taskId") int taskId, @Param("userId") int userId, @Param("geohash") String geohash);
@Select("SELECT count(id) FROM task_user_cell WHERE task_id = #{taskId} AND user_id = #{userId}")
int countByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
@Select("INSERT INTO task_user_cell(task_id, user_id, cell_geohash)" +
" VALUES(#{taskId}, #{userId}, #{cellGeohash}) " +
"RETURNING id")
int insert(TaskUserCell taskUserCell);
@Insert({
"<script>",
"INSERT INTO task_user_cell(task_id, user_id, cell_geohash)",
"VALUES" +
"<foreach item='item' index='item' collection='list' open='' separator=',' close=''>" +
"(" +
"#{item.taskId}, #{item.userId}, #{item.cellGeohash}",
")" +
"</foreach>",
"</script>"})
void insertForeach(@Param("list") List<TaskUserCell> list);
@Select("WITH rows AS (" +
"UPDATE task_user_cell " +
"SET user_id = #{userId}" +
" WHERE task_id = #{taskId} AND cell_geohash = #{cellGeohash} " +
"RETURNING 1" +
") SELECT count(*) FROM rows")
int updateUserIdByTaskIdAndCellGeohash(@Param("taskId") int taskId, @Param("cellGeohash") String cellGeohash, @Param("userId") int userId);
@Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId}")
void deleteByTaskId(@Param("taskId") int taskId);
@Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId} AND user_id = #{userId}")
void deleteByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
@Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId} AND cell_geohash = #{geohash} AND user_id = #{userId}")
void deleteByTaskIdAndCellGeohashAndUserId(@Param("taskId") int taskId,@Param("geohash") String geohash, @Param("userId") int userId);
@Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId} AND cell_geohash = #{geohash}")
void deleteByTaskIdAndCellGeohash(@Param("taskId") int taskId, @Param("geohash") String geohash);
}

View File

@@ -0,0 +1,87 @@
package cn.edu.whu.boot.allocation.mapper;
import cn.edu.whu.boot.allocation.controllers.dtos.Worker;
import cn.edu.whu.boot.allocation.entities.TaskUserRole;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TaskUserRoleMapper {
@Select("SELECT id, task_id, user_id, work_role FROM task_user_role WHERE id = #{id}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "workRole", column = "work_role")
}
)
TaskUserRole findById(int id);
@Select("SELECT id, task_id, user_id, work_role FROM task_user_role WHERE task_id = #{taskId}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "workRole", column = "work_role")
}
)
List<TaskUserRole> findByTaskId(@Param("taskId") int taskId);
@Select("SELECT id, task_id, user_id, work_role FROM task_user_role WHERE user_id = #{userId}")
@Results(
{
@Result(property = "taskId", column = "task_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "workRole", column = "work_role")
}
)
List<TaskUserRole> findByUserId(@Param("userId") int userId);
@Select("SELECT a.id, a.real_name, b.work_role " +
"FROM user_staff AS a, task_user_role AS b " +
"WHERE b.task_id = #{taskId} AND a.id = b.user_id")
@Results(
{
@Result(property = "id", column = "id"),
@Result(property = "username", column = "real_name"),
@Result(property = "role", column = "work_role")
}
)
List<Worker> findWorkerByTaskId(@Param("taskId") int taskId);
@Select("SELECT work_role FROM task_user_role WHERE task_id = #{taskId} AND user_id = #{userId}")
Integer findWorkRoleByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
@Insert("INSERT INTO task_user_role(task_id, user_id, work_role)" +
" VALUES(#{taskId}, #{userId}, #{workRole})" +
" ON CONFLICT (task_id, user_id) DO NOTHING")
void insert(TaskUserRole taskUserRole);
@Insert({
"<script>",
"INSERT INTO task_user_role(task_id, user_id, work_role)",
"VALUES" +
"<foreach item='item' index='item' collection='list' open='' separator=',' close=''>" +
"(" +
"#{item.taskId}, #{item.userId}, #{item.workRole}",
")" +
"</foreach> " +
"ON CONFLICT (task_id, user_id) DO NOTHING",
"</script>"})
void insertForeach(@Param("list") List<TaskUserRole> list);
@Select("UPDATE task_user_role SET task_id = #{taskId}, user_id = #{userId}, work_role = #{workRole} RETURNING id")
@Options(flushCache = Options.FlushCachePolicy.TRUE)
int update(TaskUserRole taskUserRole);
@Select("SELECT user_id FROM task_user_role WHERE task_id = #{taskId};")
List<Integer> getUserIdByTaskId(@Param("taskId") int taskId);
@Delete("DELETE FROM task_user_role WHERE task_id = #{taskId}")
void deleteByTaskId(@Param("taskId") int taskId);
@Delete("DELETE FROM task_user_role WHERE task_id = #{taskId} AND user_id = #{userId}")
void deleteByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId);
}

View File

@@ -0,0 +1,8 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.entities.Draft;
public interface DraftService {
int insert(String databaseName , Draft draft);
}

View File

@@ -0,0 +1,26 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.entities.Image;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public interface ImageService {
Optional<String> findFilenameById(int id);
int countByFilename(String filename);
List<String> findFilenamesInIds(List<Integer> ids);
List<Image> findByTaskId(int taskId);
int countByTaskId(int taskId);
List<Map<String, Object>> findByTaskIdPaginated(int taskId, int page, int count);
int insert(Image image);
void deleteInIds(List<Integer> ids);
}

View File

@@ -0,0 +1,15 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.entities.RouteLine;
import java.util.List;
public interface RouteLineService {
void insertRouteLine(String databaseName, RouteLine routeLine);
List<RouteLine> findByName(String databaseName, String name);
List<RouteLine> findByNameAndTime(String databaseName, String name, String beginTime, String stopTime);
}

View File

@@ -0,0 +1,37 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.entities.TaskCellData;
import cn.edu.whu.boot.xml.domain.Task;
import cn.edu.whu.boot.xml.xmlreader.bean.Table;
import java.util.List;
import java.util.Optional;
public interface TaskCellDataService {
Optional<TaskCellData> findById(int id);
List<TaskCellData> findByTaskId(int taskId);
List<TaskCellData> findByTaskIdAndGeohash(int taskId , String cellGeohash);
List<TaskCellData> findByTaskIdAndTableNameAndGeohash(int taskId , String tableName, String cellGeohash);
Optional<TaskCellData> findByTaskIdAndTableNameAndDataId(int taskId , String tableName , long dataId);
List<TaskCellData> findByTaskIdAndCellGeohashIn(int taskId , List<String> cellGeohashes);
int insert(TaskCellData taskCellData);
void insertList(List<TaskCellData> taskCellDataList);
void deleteByTaskId(int taskId);
List<TaskCellData> findTaskDataInTheSameCell(int taskId, long dataId);
List<String> findCellGeohashByData(int taskId, String tableName, List<Long> dataIds);
void updateAfterDataCreatedOrUpdated(Task task, Table table, long dataId);
List<String> findCellsWhereUserIsAbsent(int taskId, String table, Integer reviewerId, List<Long> dataIds);
}

View File

@@ -0,0 +1,21 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.entities.TaskCell;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public interface TaskCellService {
List<TaskCell> findByTaskId(int taskId);
List<String> findGeojsonByTaskIdAndUserId(int taskId, int userId);
Optional<String> findGeojsonByTaskIdAndGeohash(int taskId, String geohash);
void insertList(List<TaskCell> list);
void deleteByTaskId(int taskId);
Map<String,Object> getCoordinateRange(Integer taskId);
}

View File

@@ -0,0 +1,92 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.entities.TaskCell;
import cn.edu.whu.boot.allocation.entities.TaskCellData;
import cn.edu.whu.boot.allocation.entities.TaskUserCell;
import cn.edu.whu.boot.allocation.entities.TaskUserRole;
import cn.edu.whu.boot.xml.domain.Task;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public interface TaskInfoService {
/**
* 分配任务时在数据库中更新相关的信息
*
* @param cellToData 网格-数据的对应关系
* @param taskCells 网格的信息
* @param taskUserCell 外业人员-网格的对应关系
* @param taskUserRole 外业人员-工作角色的对应关系
* @param task 任务
* @param assignedData 审核人员-数据的对应关系
*/
boolean updateTaskInfo(List<TaskCellData> cellToData,
List<TaskCell> taskCells,
List<TaskUserCell> taskUserCell,
List<TaskUserRole> taskUserRole,
Task task,
Map<String, Map<Long, Integer>> assignedData);
/**
* 修改数据对应的巡查人员
*
* @param taskId 任务 ID
* @param dataToWorker 数据和外业人员的对应关系
*/
void updateCell2WorkerAndData2Worker(int taskId,
Map<String, Map<Long, Integer>> dataToWorker) throws Exception;
/**
* 交换网格后更新数据库
*/
void updateCell2WorkerAndData2Worker(int taskId,
Map<String, Integer> cellToWorker,
Map<String, Map<Long, Integer>> dataToWorker) throws Exception;
/**
* 从任务中移除外业人员后更新 task_user_cell 和 tasK_user_role
*
* @param taskId 任务 ID
* @param userId 需要移除的外业人员的 ID
* @param isReviewer 是否为审核人员
*/
void updateUser2RoleAndUser2CellAndUser2Data(int taskId, int userId, boolean isReviewer) throws Exception;
/**
* 从网格中删除人员后更新 task_user_cell
* 如果是审核人员,还要更新数据-人员
*
* @param taskId 任务 ID
* @param geohash 网格
* @param userId 采集人员 ID
* @param isInspector 是否为审核人员
*/
boolean updateUser2RoleAndUser2CellAndUser2Data(int taskId, String geohash, int userId, boolean isInspector) throws Exception;
/**
* 删除任务相关的数据
*
* @param taskId 任务 ID
*/
void deleteTaskInfo(int taskId);
/**
* 修改网格内的工作人员后更新数据库
*/
void completeChangingWorkersInCell(int taskId, String geohash, Collection<Integer> userIds, Map<String, Map<Long, Integer>> assignedData) throws Exception;
/**
* 修改任务的外业人员队伍后更新数据库
*/
void completeChangingWorkers(int taskId,
Map<Integer, Integer> appendWorker2role,
Map<Integer, Integer> deleteWorker2role) throws Exception;
/**
* 设置任务是否需要分配
*/
void setTaskAllocationOptional(int taskId, boolean optional);
boolean isTaskAllocationOptional(int taskId);
}

View File

@@ -0,0 +1,37 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.controllers.dtos.Worker;
import cn.edu.whu.boot.allocation.entities.TaskUserCell;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public interface TaskUserCellService {
Optional<TaskUserCell> findById(int id);
List<TaskUserCell> findByTaskIdAndUserId(int taskId, int userId);
List<Worker> findWorkerByTaskId(int taskId);
List<Worker> findWorkerByTaskIdAndUserId(int taskId, int userId);
Optional<TaskUserCell> findByTaskIdAndUserIdAndCellGeohash(int taskId, int userId, String geohash);
int countByTaskIdAndUserId(int taskId, int userId);
int insert(TaskUserCell taskUserCell);
void insertList(List<TaskUserCell> list);
void updateUserIdByTaskIdAndCellGeohash(int taskId, Map<String, Integer> cellToWorker) throws Exception;
void deleteByTaskId(int taskId);
void deleteByTaskIdAndUserId(int taskId, int userId);
void deleteByTaskIdAndCellGeohashAndUserId(int taskId, String geohash, int userId);
void deleteByTaskIdAndCellGeohash(int taskId, String geohash);
}

View File

@@ -0,0 +1,34 @@
package cn.edu.whu.boot.allocation.services;
import cn.edu.whu.boot.allocation.controllers.dtos.Worker;
import cn.edu.whu.boot.allocation.entities.TaskUserRole;
import java.util.List;
import java.util.Optional;
public interface TaskUserRoleService {
TaskUserRole findById(int id);
List<TaskUserRole> findByTaskId(int taskId);
List<TaskUserRole> findByUserId(int userId);
List<Worker> findWorkerByTaskId(int taskId);
Optional<Integer> findWorkRoleByTaskIdAndUserId(int taskId, int userId);
void insertList(List<TaskUserRole> list);
TaskUserRole update(TaskUserRole taskUserRole);
/**
* 在task_user_role表中获取某任务下的所有工作人员的userId
*/
List<Integer> getUserIdByTaskId(int taskId);
void deleteByTaskId(int taskId);
void deleteByTaskIdAndUserId(int taskId, int userId);
}

View File

@@ -0,0 +1,21 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.entities.Draft;
import cn.edu.whu.boot.allocation.mapper.DraftMapper;
import cn.edu.whu.boot.allocation.services.DraftService;
import org.springframework.stereotype.Service;
@Service
public class DraftServiceImpl implements DraftService {
private final DraftMapper draftMapper;
public DraftServiceImpl(DraftMapper draftMapper) {
this.draftMapper = draftMapper;
}
@Override
public int insert(String databaseName, Draft draft) {
return draftMapper.insert(databaseName, draft);
}
}

View File

@@ -0,0 +1,61 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.entities.Image;
import cn.edu.whu.boot.allocation.mapper.ImageMapper;
import cn.edu.whu.boot.allocation.services.ImageService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Service
public class ImageServiceImpl implements ImageService {
private final ImageMapper imageMapper;
public ImageServiceImpl(ImageMapper imageMapper) {
this.imageMapper = imageMapper;
}
@Override
public Optional<String> findFilenameById(int id) {
return Optional.ofNullable(imageMapper.findFilenameById(id));
}
@Override
public int countByFilename(String filename)
{
return imageMapper.countByFilename(filename);
}
@Override
public List<String> findFilenamesInIds(List<Integer> ids) {
return imageMapper.findFilenamesByIds(ids);
}
@Override
public List<Image> findByTaskId(int taskId) {
return imageMapper.findByTaskId(taskId);
}
@Override
public int countByTaskId(int taskId) {
return imageMapper.countByTaskId(taskId);
}
@Override
public List<Map<String, Object>> findByTaskIdPaginated(int taskId, int page, int count) {
return imageMapper.findByTaskIdPaginated(taskId, page, count);
}
@Override
public int insert(Image image) {
return imageMapper.insert(image);
}
@Override
public void deleteInIds(List<Integer> ids) {
imageMapper.deleteInIds(ids);
}
}

View File

@@ -0,0 +1,45 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.entities.RouteLine;
import cn.edu.whu.boot.allocation.mapper.RouteLineMapper;
import cn.edu.whu.boot.allocation.services.RouteLineService;
import cn.edu.whu.boot.common.utils.collection.OtherUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class RouteLineServiceImpl implements RouteLineService {
private final RouteLineMapper routeLineMapper;
public RouteLineServiceImpl(RouteLineMapper routeLineMapper) {
this.routeLineMapper = routeLineMapper;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void insertRouteLine(String databaseName, RouteLine routeLine) {
routeLine.setBegindate(OtherUtil.changeTimeString(routeLine.getBegindate()));
routeLine.setStopdate(OtherUtil.changeTimeString(routeLine.getStopdate()));
routeLine.setPrimaryKeySeq("\'" + databaseName + ".route_line_id_seq" + "\'");
routeLineMapper.insert(databaseName, routeLine);
}
@Override
public List<RouteLine> findByName(String databaseName , String name)
{
return routeLineMapper.findByName(databaseName, name);
}
@Override
public List<RouteLine> findByNameAndTime(String databaseName , String name, String beginTime, String stopTime)
{
return routeLineMapper.findByNameAndTime(databaseName, name, beginTime, stopTime);
}
}

View File

@@ -0,0 +1,165 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.entities.TaskCell;
import cn.edu.whu.boot.allocation.entities.TaskCellData;
import cn.edu.whu.boot.allocation.mapper.TaskCellDataMapper;
import cn.edu.whu.boot.allocation.services.TaskCellDataService;
import cn.edu.whu.boot.allocation.services.TaskCellService;
import cn.edu.whu.boot.common.utils.allocation.ArcGisGeoJsonParser;
import cn.edu.whu.boot.xml.domain.Task;
import cn.edu.whu.boot.xml.xmlreader.bean.Field;
import cn.edu.whu.boot.xml.xmlreader.bean.Table;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Polygon;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class TaskCellDataServiceImpl implements TaskCellDataService {
@Autowired
private TaskCellService taskCellService;
@Autowired
private TaskCellDataMapper taskCellDataMapper;
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Override
public Optional<TaskCellData> findById(int id) {
return Optional.ofNullable(taskCellDataMapper.findById(id));
}
@Override
public List<TaskCellData> findByTaskId(int taskId) {
return taskCellDataMapper.findByTaskId(taskId);
}
@Override
public List<TaskCellData> findByTaskIdAndGeohash(int taskId, String cellGeohash) {
return taskCellDataMapper.findByTaskIdAndCellGeohash(taskId, cellGeohash);
}
@Override
public List<TaskCellData> findByTaskIdAndTableNameAndGeohash(int taskId, String tableName, String cellGeohash) {
return taskCellDataMapper.findByTaskIdAndTableNameAndCellGeohash(taskId, tableName, cellGeohash);
}
@Override
public Optional<TaskCellData> findByTaskIdAndTableNameAndDataId(int taskId, String tableName, long dataId) {
return Optional.ofNullable(taskCellDataMapper.findByTaskIdAndTableNameAndDataId(taskId, tableName, dataId));
}
@Override
public List<TaskCellData> findByTaskIdAndCellGeohashIn(int taskId, List<String> cellGeohashes) {
return taskCellDataMapper.findByTaskIdAndCellGeohashIn(taskId, cellGeohashes);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int insert(TaskCellData taskCellData) {
return taskCellDataMapper.insert(taskCellData);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertList(List<TaskCellData> taskCellDataList) {
if (taskCellDataList == null || taskCellDataList.isEmpty()) {
return;
}
if (taskCellDataList.size() * 4 <= 2000) {
// 参数个数不大于 2000用 MyBatis foreach 插入
taskCellDataMapper.insertForeach(taskCellDataList);
} else {
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
TaskCellDataMapper mapper = session.getMapper(TaskCellDataMapper.class);
taskCellDataList.forEach(mapper::insert);
session.commit();
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskId(int taskId) {
taskCellDataMapper.deleteByTaskId(taskId);
}
@Override
public List<TaskCellData> findTaskDataInTheSameCell(int taskId, long dataId) {
return taskCellDataMapper.findInTheSameTaskAndCell(taskId, dataId);
}
@Override
public List<String> findCellGeohashByData(int taskId, String tableName, List<Long> dataIds) {
return dataIds == null || dataIds.isEmpty() ? Collections.emptyList() : taskCellDataMapper.findCellGeohashByTaskIdAndTableNameAndDataId(taskId, tableName, dataIds);
}
private static final GeometryFactory geometryFactory = new GeometryFactory();
@Override
@Transactional(rollbackFor = Exception.class)
public void updateAfterDataCreatedOrUpdated(Task task, Table table, long dataId) {
if (task.getIsAllocationOptional() == 1) {
return;
}
Optional<Geometry> optional = table
.getFields()
.values()
.stream()
.filter(Field::isGeometry)
.findFirst()
.map(f -> ArcGisGeoJsonParser.toGeometryObject(new String(Base64.getDecoder().decode(f.getValue().toString()))));
if (!optional.isPresent()) {
return;
}
Geometry data = optional.get();
// 获取所有和数据相交的网格
int taskId = task.getId();
List<TaskCell> cells = taskCellService.findByTaskId(taskId);
if (cells.isEmpty()) {
return;
}
String tableName = table.getKey();
List<TaskCellData> taskCellData = cells
.stream()
.map(cell -> {
JSONArray jsonArray = JSON.parseObject(cell.getGeojson()).getJSONObject("geometry").getJSONArray("coordinates").getJSONArray(0);
Coordinate[] coordinates = new Coordinate[jsonArray.size()];
for (int i = 0; i < jsonArray.size(); i++) {
JSONArray coord = jsonArray.getJSONArray(i);
coordinates[i] = new Coordinate(coord.getDouble(0), coord.getDouble(1));
}
Polygon polygon = geometryFactory.createPolygon(coordinates);
polygon.setUserData(cell.getGeohash());
return polygon;
})
.filter(cell -> cell.intersects(data))
.map(cell -> new TaskCellData(taskId, tableName, dataId, (String) cell.getUserData()))
.collect(Collectors.toList());
taskCellDataMapper.deleteByTaskIdAndTableNameAndDataId(taskId, tableName, dataId);
if (!taskCellData.isEmpty()) {
taskCellDataMapper.insertForeach(taskCellData);
}
}
@Override
public List<String> findCellsWhereUserIsAbsent(int taskId, String table, Integer reviewerId, List<Long> dataIds) {
return dataIds == null || dataIds.isEmpty() ? Collections.emptyList() : taskCellDataMapper.findCellsWhereUserIsAbsent(taskId, table, reviewerId, dataIds);
}
}

View File

@@ -0,0 +1,62 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.entities.TaskCell;
import cn.edu.whu.boot.allocation.mapper.TaskCellMapper;
import cn.edu.whu.boot.allocation.services.TaskCellService;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Service
public class TaskCellServiceImpl implements TaskCellService {
private final TaskCellMapper taskCellMapper;
@Autowired
private SqlSessionFactory sqlSessionFactory;
public TaskCellServiceImpl(TaskCellMapper taskCellMapper) {
this.taskCellMapper = taskCellMapper;
}
@Override
public List<TaskCell> findByTaskId(int taskId) {
return taskCellMapper.findByTaskId(taskId);
}
@Override
public List<String> findGeojsonByTaskIdAndUserId(int taskId, int userId) {
return taskCellMapper.findGeojsonByTaskIdAndUserId(taskId, userId);
}
@Override
public Optional<String> findGeojsonByTaskIdAndGeohash(int taskId, String geohash) {
return Optional.ofNullable(taskCellMapper.findGeojsonByTaskIdAndGeohash(taskId, geohash));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertList(List<TaskCell> list) {
if (list != null && !list.isEmpty()) {
taskCellMapper.insertForeach(list);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskId(int taskId) {
taskCellMapper.deleteByTaskId(taskId);
}
@Override
public Map<String, Object> getCoordinateRange(Integer taskId)
{
return taskCellMapper.getCoordinateRange(taskId);
}
}

View File

@@ -0,0 +1,300 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.entities.TaskCell;
import cn.edu.whu.boot.allocation.entities.TaskCellData;
import cn.edu.whu.boot.allocation.entities.TaskUserCell;
import cn.edu.whu.boot.allocation.entities.TaskUserRole;
import cn.edu.whu.boot.allocation.exceptions.InvalidAssignmentStatus;
import cn.edu.whu.boot.allocation.mapper.SimpleTaskMapper;
import cn.edu.whu.boot.allocation.services.*;
import cn.edu.whu.boot.collection.service.IBaseService;
import cn.edu.whu.boot.common.domain.CommonConstant;
import cn.edu.whu.boot.common.service.CacheService;
import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil;
import cn.edu.whu.boot.common.utils.collection.TableOperationUtil;
import cn.edu.whu.boot.xml.domain.RedisKeyType;
import cn.edu.whu.boot.xml.domain.Task;
import cn.edu.whu.boot.xml.service.ITaskService;
import cn.edu.whu.boot.xml.xmlreader.bean.Config;
import cn.edu.whu.boot.xml.xmlreader.bean.Table;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.MessageFormat;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class TaskInfoServiceImpl implements TaskInfoService {
private final Logger log = LoggerFactory.getLogger(TaskInfoServiceImpl.class);
@Autowired
private TaskCellDataService taskCellDataService;
@Autowired
private TaskCellService taskCellService;
@Autowired
private TaskUserCellService taskUserCellService;
@Autowired
private TaskUserRoleService taskUserRoleService;
@Autowired
private IBaseService baseService;
@Autowired
private ITaskService taskService;
@Autowired
private SimpleTaskMapper taskMapper;
@Autowired
private CacheService cacheService;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateTaskInfo(List<TaskCellData> cellToData,
List<TaskCell> taskCells,
List<TaskUserCell> taskUserCell,
List<TaskUserRole> taskUserRole,
Task task,
Map<String, Map<Long, Integer>> assignedData) {
// 将数据-网格的对应关系保存到数据库
taskCellDataService.insertList(cellToData);
// 将网格的信息保存到数据库
taskCellService.insertList(taskCells);
// 将人员-网格的对应关系保存到数据库
taskUserCellService.insertList(taskUserCell);
// 将该任务中给个外业人员的具体角色保存到数据库中
taskUserRoleService.insertList(taskUserRole);
// 将数据-人员的对应关系保存到数据库
if (task == null || assignedData == null || assignedData.isEmpty()) {
return true;
}
String updateReviewerResult = baseService.updateRootTableDataForReviewer(task, assignedData);
if (!updateReviewerResult.equals("succeed")) {
log.error("更新任务{}的数据-人员对应关系时发生异常", task.getId());
return false;
}
// 更新缓存
cacheService.delete(RedisKeyType.TASK + String.valueOf(task.getId()));
cacheService.delete(RedisKeyType.TASK + "all");
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateCell2WorkerAndData2Worker(int taskId,
Map<String, Map<Long, Integer>> tbToDataAndWorker) throws Exception {
// 如果巡查人员之前在某个网格中没有任务,那么需要更新 task_user_cell
List<TaskUserCell> taskUserCells = getNewTaskUserCells(taskId, tbToDataAndWorker);
if (!taskUserCells.isEmpty()) {
taskUserCellService.insertList(taskUserCells);
}
// 更新数据-人员的对应关系
String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), tbToDataAndWorker);
if (!updateReviewerResult.equals("succeed")) {
throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId));
}
if (!taskUserCells.isEmpty()) {
cacheService.delete(RedisKeyType.CELL.toString() + taskId);
}
}
private List<TaskUserCell> getNewTaskUserCells(int taskId, Map<String, Map<Long, Integer>> tbToDataAndWorker) throws InvalidAssignmentStatus {
List<TaskUserCell> newTaskUserCells = new ArrayList<>(); // 需要往 task_user_cell 中插入的记录
Set<Integer> validatedNewReviewers = new HashSet<>(); // 已经通过身份检查的新的巡查人员
for (Map.Entry<String, Map<Long, Integer>> e1 : tbToDataAndWorker.entrySet()) {
Map<Integer, List<Long>> reviewerToData = new HashMap<>(); // 每个巡查人员对应的数据
String tableName = e1.getKey();
for (Map.Entry<Long, Integer> e2 : e1.getValue().entrySet()) {
long dataId = e2.getKey();
int reviewerId = e2.getValue();
if (validatedNewReviewers.add(reviewerId)) {
// 检查该用户的身份是否合法
Optional<Integer> optionalRole = taskUserRoleService.findWorkRoleByTaskIdAndUserId(taskId, reviewerId);
if (!optionalRole.isPresent()) {
throw new InvalidAssignmentStatus(String.format("人员 %d 不在 %d 号任务中", reviewerId, taskId));
}
if (optionalRole.get().equals(0)) {
throw new InvalidAssignmentStatus(String.format("人员 %d 是采集人员,不能审核数据", reviewerId));
}
}
reviewerToData.computeIfAbsent(reviewerId, k -> new ArrayList<>()).add(dataId);
}
for (Map.Entry<Integer, List<Long>> e : reviewerToData.entrySet()) {
List<Long> dataIds = e.getValue();
Integer reviewerId = e.getKey();
List<String> geohash = taskCellDataService.findCellsWhereUserIsAbsent(taskId, tableName, reviewerId, dataIds);
if (geohash != null) {
geohash.forEach(h -> newTaskUserCells.add(new TaskUserCell(taskId, reviewerId, h)));
}
}
}
return newTaskUserCells;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateCell2WorkerAndData2Worker(int taskId,
Map<String, Integer> cellToWorker,
Map<String, Map<Long, Integer>> dataToWorker) throws Exception {
// 更新表 task_user_cell
taskUserCellService.updateUserIdByTaskIdAndCellGeohash(taskId, cellToWorker);
// 更新数据-人员的对应关系
String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), dataToWorker);
if (!updateReviewerResult.equals("succeed")) {
throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId));
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateUser2RoleAndUser2CellAndUser2Data(int taskId, int userId, boolean isReviewer) throws Exception {
// 更新 task_user_role
taskUserRoleService.deleteByTaskIdAndUserId(taskId, userId);
// 更新 task_user_cell
taskUserCellService.deleteByTaskIdAndUserId(taskId, userId);
// TODO: 更新人员-数据的对应关系
if (!isReviewer) {
return;
}
Task task = taskService.getTaskById(taskId);
String databaseName = task.getDatabaseName();
Map<String, Table> tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables();
String formatUpdateSql = "UPDATE {0} SET reviewer = -1 where {1} IN (SELECT {1} from {0} WHERE reviewer = {2});";
for (Map.Entry<String, Table> tableEntry : tables.entrySet()) {
String updateResult = baseService.updateSqlString(
MessageFormat.format(formatUpdateSql, PostgreSqlUtil.buildTableNameString(databaseName, tableEntry.getKey(), false, false),
PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(tableEntry.getValue())), userId));
if (updateResult.equals(CommonConstant.FAILED)) {
throw new Exception("失败");
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateUser2RoleAndUser2CellAndUser2Data(int taskId, String geohash, int userId, boolean isReviewer) throws Exception {
boolean free = false;
// 从 task_user_cell 中删除
taskUserCellService.deleteByTaskIdAndCellGeohashAndUserId(taskId, geohash, userId);
// if (taskUserCellService.countByTaskIdAndUserId(taskId, userId) == 0) {
// // 从 task_user_role 中删除
// taskUserRoleService.deleteByTaskIdAndUserId(taskId, userId);
// free = true;
// }
// TODO: 如果是审核人员,更新人员-数据的对应关系
if (isReviewer) {
Map<String, Map<Long, Integer>> updateData = new HashMap<>();
taskCellDataService
.findByTaskIdAndGeohash(taskId, geohash)
.stream()
.collect(Collectors.groupingBy(TaskCellData::getTableName))
.forEach((table, list) -> {
Map<Long, Integer> dataToWorker = list
.stream()
.map(TaskCellData::getDataId)
.map(dataId -> new AbstractMap.SimpleEntry<>(dataId, -1))
.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));
updateData.put(table, dataToWorker);
});
String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), updateData);
if (!updateReviewerResult.equals("succeed")) {
throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId));
}
}
return free;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteTaskInfo(int taskId) {
taskCellDataService.deleteByTaskId(taskId);
taskCellService.deleteByTaskId(taskId);
taskUserCellService.deleteByTaskId(taskId);
taskUserRoleService.deleteByTaskId(taskId);
cacheService.delete(RedisKeyType.CELL.toString() + taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void completeChangingWorkersInCell(int taskId, String geohash, Collection<Integer> userIds, Map<String, Map<Long, Integer>> assignedData) throws Exception {
List<TaskUserCell> taskUserCells = userIds
.stream()
.map(userId -> {
TaskUserCell tuc = new TaskUserCell();
tuc.setUserId(userId);
tuc.setCellGeohash(geohash);
tuc.setTaskId(taskId);
return tuc;
})
.collect(Collectors.toList());
taskUserCellService.deleteByTaskIdAndCellGeohash(taskId, geohash);
taskUserCellService.insertList(taskUserCells);
if (assignedData != null && !assignedData.isEmpty()) {
String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), assignedData);
if (!updateReviewerResult.equals("succeed")) {
throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId));
}
}
// 使网格相关的缓存失效
cacheService.delete(RedisKeyType.CELL.toString() + taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void completeChangingWorkers(int taskId, Map<Integer, Integer> appendWorker2role, Map<Integer, Integer> deleteWorker2role) throws Exception {
// 注意要先删后增,这样就可以修改已有工作人员的工作角色
// 删除工作人员
if (deleteWorker2role != null && !deleteWorker2role.isEmpty()) {
for (Map.Entry<Integer, Integer> e : deleteWorker2role.entrySet()) {
updateUser2RoleAndUser2CellAndUser2Data(taskId, e.getKey(), e.getValue().equals(1));
}
cacheService.delete(RedisKeyType.CELL.toString() + taskId);
}
// 添加工作人员
if (appendWorker2role != null && !appendWorker2role.isEmpty()) {
List<TaskUserRole> userRoles = appendWorker2role
.entrySet()
.stream()
.map(e -> new TaskUserRole(taskId, e.getKey(), e.getValue()))
.collect(Collectors.toList());
taskUserRoleService.insertList(userRoles);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void setTaskAllocationOptional(int taskId, boolean optional) {
taskMapper.updateTaskAllocationOptional(taskId, optional ? 1 : 0);
// 如果不需要分配,把原先的分配结果清空
if (optional) {
deleteTaskInfo(taskId);
}
// 更新缓存
cacheService.delete(RedisKeyType.TASK + String.valueOf(taskId));
cacheService.delete(RedisKeyType.TASK + "hasCreate");
cacheService.delete(RedisKeyType.TASK + "all");
}
@Override
public boolean isTaskAllocationOptional(int taskId) {
Integer result = taskMapper.isTaskAllocationOptional(taskId);
return result != null && (result == 1);
}
}

View File

@@ -0,0 +1,129 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.controllers.dtos.Worker;
import cn.edu.whu.boot.allocation.entities.TaskUserCell;
import cn.edu.whu.boot.allocation.mapper.TaskUserCellMapper;
import cn.edu.whu.boot.allocation.services.TaskUserCellService;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Service
public class TaskUserCellServiceImpl implements TaskUserCellService {
private final TaskUserCellMapper taskUserCellMapper;
private final SqlSessionFactory sqlSessionFactory;
public TaskUserCellServiceImpl(TaskUserCellMapper taskUserCellMapper, SqlSessionFactory sqlSessionFactory) {
this.taskUserCellMapper = taskUserCellMapper;
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public Optional<TaskUserCell> findById(int id) {
return Optional.ofNullable(taskUserCellMapper.findById(id));
}
@Override
public List<TaskUserCell> findByTaskIdAndUserId(int taskId, int userId) {
return taskUserCellMapper.findByTaskIdAndUserId(taskId, userId);
}
@Override
public List<Worker> findWorkerByTaskId(int taskId) {
return taskUserCellMapper.findCellAndUserByTaskId(taskId);
}
@Override
public List<Worker> findWorkerByTaskIdAndUserId(int taskId, int userId) {
return taskUserCellMapper.findCellAndUserByTaskIdAndUserId(taskId, userId);
}
@Override
public Optional<TaskUserCell> findByTaskIdAndUserIdAndCellGeohash(int taskId, int userId, String geohash) {
return Optional.ofNullable(taskUserCellMapper.findByTaskIdAndUserIdAndCellGeohash(taskId, userId, geohash));
}
@Override
public int countByTaskIdAndUserId(int taskId, int userId) {
return taskUserCellMapper.countByTaskIdAndUserId(taskId, userId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int insert(TaskUserCell taskUserCell) {
return taskUserCellMapper.insert(taskUserCell);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertList(List<TaskUserCell> list) {
if (list == null || list.isEmpty()) {
return;
}
if (list.size() * 3 <= 2000) {
taskUserCellMapper.insertForeach(list);
} else {
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
TaskUserCellMapper mapper = session.getMapper(TaskUserCellMapper.class);
list.forEach(mapper::insert);
session.commit();
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateUserIdByTaskIdAndCellGeohash(int taskId, Map<String, Integer> cellToWorker) throws Exception {
if (cellToWorker == null || cellToWorker.isEmpty()) {
return;
}
for (Map.Entry<String, Integer> entry : cellToWorker.entrySet()) {
String geohash = entry.getKey();
Integer userId = entry.getValue();
int affectedRow = taskUserCellMapper.updateUserIdByTaskIdAndCellGeohash(taskId, geohash, userId);
if (affectedRow == 0) {
throw new Exception(
String.format(
"修改失败,不存在 %d 号任务或是该任务中不存在编号为 %s 的网格",
taskId,
geohash
)
);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskId(int taskId) {
taskUserCellMapper.deleteByTaskId(taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskIdAndUserId(int taskId, int userId) {
taskUserCellMapper.deleteByTaskIdAndUserId(taskId, userId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskIdAndCellGeohashAndUserId(int taskId, String geohash, int userId) {
taskUserCellMapper.deleteByTaskIdAndCellGeohashAndUserId(taskId, geohash, userId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskIdAndCellGeohash(int taskId, String geohash) {
taskUserCellMapper.deleteByTaskIdAndCellGeohash(taskId, geohash);
}
}

View File

@@ -0,0 +1,84 @@
package cn.edu.whu.boot.allocation.services.impl;
import cn.edu.whu.boot.allocation.controllers.dtos.Worker;
import cn.edu.whu.boot.allocation.entities.TaskUserRole;
import cn.edu.whu.boot.allocation.mapper.TaskUserRoleMapper;
import cn.edu.whu.boot.allocation.services.TaskUserRoleService;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Service
public class TaskUserRoleImpl implements TaskUserRoleService {
private final TaskUserRoleMapper taskUserRoleMapper;
private final SqlSessionFactory sqlSessionFactory;
@Autowired
public TaskUserRoleImpl(TaskUserRoleMapper taskUserRoleMapper, SqlSessionFactory sqlSessionFactory) {
this.taskUserRoleMapper = taskUserRoleMapper;
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public TaskUserRole findById(int id) {
return taskUserRoleMapper.findById(id);
}
@Override
public List<TaskUserRole> findByTaskId(int taskId) {
return taskUserRoleMapper.findByTaskId(taskId);
}
@Override
public List<TaskUserRole> findByUserId(int userId) {
return taskUserRoleMapper.findByUserId(userId);
}
@Override
public List<Worker> findWorkerByTaskId(int taskId) {
return taskUserRoleMapper.findWorkerByTaskId(taskId);
}
@Override
public Optional<Integer> findWorkRoleByTaskIdAndUserId(int taskId, int userId) {
return Optional.ofNullable(taskUserRoleMapper.findWorkRoleByTaskIdAndUserId(taskId, userId));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertList(List<TaskUserRole> list) {
if (list != null && !list.isEmpty()) {
taskUserRoleMapper.insertForeach(list);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public TaskUserRole update(TaskUserRole taskUserRole) {
int id = taskUserRoleMapper.update(taskUserRole);
return taskUserRoleMapper.findById(id);
}
@Override
public List<Integer> getUserIdByTaskId(int taskId) {
return taskUserRoleMapper.getUserIdByTaskId(taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskId(int taskId) {
taskUserRoleMapper.deleteByTaskId(taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByTaskIdAndUserId(int taskId, int userId) {
taskUserRoleMapper.deleteByTaskIdAndUserId(taskId, userId);
}
}

View File

@@ -0,0 +1,32 @@
package cn.edu.whu.boot.apkversion.controller;
import cn.edu.whu.boot.apkversion.service.ApkVersionService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("apkversion")
public class ApkVersionController {
@Autowired
ApkVersionService versionService;
@RequestMapping(value="latest",produces="text/html;charset=UTF-8")
@ResponseBody
public String getLatestVersionInfo(){
String latestVersion=versionService.getLatestVersion();
String downUrl=versionService.getApkPath(latestVersion);
String description=versionService.getDescriptionByVersion(latestVersion);
JSONObject jsonVersion=new JSONObject();
jsonVersion.put("version",latestVersion);
jsonVersion.put("downUrl",downUrl);
jsonVersion.put("description",description);
return JSON.toJSONString(jsonVersion);
}
}

View File

@@ -0,0 +1,12 @@
package cn.edu.whu.boot.apkversion.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface ApkVersionMapper {
String getLatestVersion();
String getApkPathByVersion(@Param("versionCode") String versionCode);
String getDescriptionByVersion(@Param("versionCode") String versionCode);
}

View File

@@ -0,0 +1,38 @@
package cn.edu.whu.boot.apkversion.service;
import cn.edu.whu.boot.apkversion.mapper.ApkVersionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ApkVersionService {
@Autowired
public ApkVersionMapper apkVersionMapper;
public String getLatestVersion() {
String lastversion=apkVersionMapper.getLatestVersion();
if(lastversion!=null && !lastversion.equals("")){
return lastversion;
}
return "0.1";
}
public String getDescriptionByVersion(String version) {
String lastversion="无说明信息!";
String res=apkVersionMapper.getDescriptionByVersion(version);
if(res!=null&&!res.equals("")){
lastversion=res;
}
return lastversion;
}
public String getApkPath(String version) {
String apkPath=apkVersionMapper.getApkPathByVersion(version);
if (apkPath!=null&& !apkPath.equals("")){
return apkPath;
}else {
return "该版本不存在";
}
}
}

View File

@@ -0,0 +1,438 @@
package cn.edu.whu.boot.collection.controller;
import cn.edu.whu.boot.allocation.services.TaskCellService;
import cn.edu.whu.boot.allocation.services.TaskUserRoleService;
import cn.edu.whu.boot.collection.dto.CompositeKey;
import cn.edu.whu.boot.collection.service.IBaseService;
import cn.edu.whu.boot.common.domain.CommonConstant;
import cn.edu.whu.boot.common.domain.ResultMessage;
import cn.edu.whu.boot.common.domain.SqlStringConstant;
import cn.edu.whu.boot.common.utils.collection.OtherUtil;
import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil;
import cn.edu.whu.boot.common.utils.collection.TableOperationUtil;
import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil;
import cn.edu.whu.boot.common.utils.xml.GenerateSqlUtil;
import cn.edu.whu.boot.user.entities.User;
import cn.edu.whu.boot.user.services.UserService;
import cn.edu.whu.boot.xml.domain.Task;
import cn.edu.whu.boot.xml.service.ITaskService;
import cn.edu.whu.boot.xml.xmlreader.bean.Config;
import cn.edu.whu.boot.xml.xmlreader.bean.Table;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.text.MessageFormat;
import java.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 这个类里面放的东西很杂,写的不规范!!! 具体每个方法的作用看方法的注释
*/
@RestController
@RequestMapping("base")
public class BaseController{
private static final Logger logger = (Logger) LoggerFactory.getLogger(BaseController.class);
private final ITaskService taskService;
private final IBaseService baseService;
private final UserService userService;
private final TaskUserRoleService taskUserRoleService;
private final TaskCellService taskCellService;
@Autowired
public BaseController(ITaskService taskService, IBaseService baseService, UserService userService,
TaskUserRoleService taskUserRoleService, TaskCellService taskCellService){
this.taskService = taskService;
this.baseService = baseService;
this.userService = userService;
this.taskUserRoleService = taskUserRoleService;
this.taskCellService = taskCellService;
}
/**
* 接受移动端传来的数据和多媒体文件,并将数据保存在数据库中,多媒体文件保存在本地!
*
* @param detail 按指定格式封装的 JsonString
* @param file 多媒体压缩包,注意多媒体文件也可以上传
*/
@RequestMapping(value = "insertAndRecheckData", produces = "text/html;charset=UTF-8")
public String insertAndRecheckData(String detail, MultipartFile file) throws Exception {
try {
JSONObject jsonObject = JSON.parseObject(detail);
JSONObject tableJsonObject = jsonObject.getJSONObject("table");
// 预处理JSON中的boolean值
preprocessBooleanValues(tableJsonObject);
Table table = JSON.parseObject(tableJsonObject.toJSONString(), Table.class);
// Table table = JSON.toJavaObject(tableJsonObject, Table.class);
Integer taskId = jsonObject.getInteger("taskId");
// 判断当前任务是否存在
Task task = taskService.getTaskById(taskId);
if (task == null) {
return ResultMessage.failed("当前任务已删除!").toString();
}
// 判断该用户是否在对应的任务中
int userId = jsonObject.getIntValue("userId");
if(!OtherUtil.isUserInTask(task, userId, taskUserRoleService)){
return ResultMessage.failed("您不在该任务中!").toString();
}
table = TableOperationUtil.changeJsonObjectToField(table);
JSONArray multimediaItemJsonArray =
(JSONArray) TableOperationUtil.getFieldValue(table, TableOperationUtil.getCameraFieldName(table));
// polygonIdFromAndroid 为移动端传入的数据主键polygonId 是返回给移动端的数据主键
String primaryKey = TableOperationUtil.getPrimaryKey(table);
Object polygonIdStringFromAndroid = TableOperationUtil.getFieldValue(table, primaryKey);
Long polygonIdFromAndroid = null;
if(polygonIdStringFromAndroid != null){
polygonIdFromAndroid = Long.parseLong(polygonIdStringFromAndroid.toString());
}
Long polygonId;
CompositeKey compositeKey = new CompositeKey();
String trueTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(),
false, false);
// 情况1 polygonIdFromAndroid == null新采集的数据
if(polygonIdFromAndroid == null){
polygonId = baseService.insertData(task, table, userId, multimediaItemJsonArray, file);
compositeKey.setPolygonId(polygonId);
compositeKey.setVersion(baseService.getVersionByLongId(trueTableName,
PostgreSqlUtil.transformString(primaryKey),
polygonId));
}
// 情况2 polygonIdFromAndroid != null ,说明不是新采集的数据,之前采集过一次!
// 说明这条数据为复核数据(数据上传错了,重新上传也归为复核)
else{
Integer versionCodeInTable = baseService.getVersionByLongId(trueTableName,
PostgreSqlUtil.transformString(primaryKey),
polygonIdFromAndroid);
if(versionCodeInTable == null){
return ResultMessage.failed("数据库中无对应数据!").toString();
}
// versionCode 为复核上传的记录版本versionCodeInTable 为根表中记录版本
int version = (int) TableOperationUtil.getFieldValue(table, CommonConstant.FIX_FIELD_VERSION);
if(versionCodeInTable > version){
return ResultMessage.failed(8888, "版本号过低").toString();
}
// 上传版本号 >= 根表中记录版本,进行更新根表中数据版本(根表中数据更新,像多媒体表和关联表的数据先删除再插入)
// 在上述操作之前必须将旧版本数据放在历史数据库中
polygonIdFromAndroid = baseService.updateRecheckData(task, table, userId,
multimediaItemJsonArray, polygonIdFromAndroid, file);
compositeKey.setPolygonId(polygonIdFromAndroid);
compositeKey.setVersion(baseService.getVersionByLongId(trueTableName,
PostgreSqlUtil.transformString(primaryKey),
polygonIdFromAndroid));
}
return ResultMessage.success(compositeKey).toString();
} catch (Exception e) {
e.printStackTrace();
logger.error("数据处理失败: {}", e.getMessage());
return ResultMessage.failed("数据格式错误: " + e.getMessage()).toString();
}
}
/**
* 预处理JSON中的boolean值将表达式转换为实际的boolean值
*/
public void preprocessBooleanValues(Map<String, Object> data) {
if (data == null) {
return;
}
for (Map.Entry<String, Object> entry : data.entrySet()) {
Object value = entry.getValue();
if (value instanceof Map) {
preprocessBooleanValues((Map<String, Object>) value);
} else if (value instanceof String) {
String strValue = (String) value;
try {
// 处理特殊表达式情况
if (strValue.contains("length==")) {
// 简单处理长度检查表达式
boolean isEmpty = strValue.contains("length==0");
entry.setValue(isEmpty);
logger.info("Converted expression '{}' to {}", strValue, isEmpty);
}
// 处理标准布尔值
else if ("true".equalsIgnoreCase(strValue)) {
entry.setValue(true);
} else if ("false".equalsIgnoreCase(strValue)) {
entry.setValue(false);
}
} catch (Exception e) {
logger.warn("Failed to parse value '{}': {}", strValue, e.getMessage());
// 保持原始值不变
}
}
}
}
/**
* 将某个根表下某数据回退到某个历史版本
*
* @param taskId 任务id
* @param tableName 表名
* @param polygonId 数据主键id
* @param version 版本号
*/
@RequestMapping(value = "rollBackDataForVersion", produces = "text/html;charset=UTF-8")
public String rollBackDataForVersion(Integer taskId, String tableName, Long polygonId,
Integer version) throws Exception{
Task task = taskService.getTaskById(taskId);
Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class);
Map<String, Table> tablesMap = config.getTables();
Table table = tablesMap.get(tableName);
String primaryKey = TableOperationUtil.getPrimaryKey(table);
String selectSql =
GenerateSqlUtil.genSqlByPolygonIdAndVersionId(task.getDatabaseName(),
tableName + CommonConstant.HISTORY_SUFFIX,
primaryKey, polygonId, version);
// 获取根表数据中主键字段值为polygonIdversion 字段为 versionId 的记录,然后进行回滚更新
List<Map<String, Object>> rootTableDataList = baseService.selectData(selectSql);
ResultMessage resultMessage = OtherUtil.checkDataListGetByPolygonId(rootTableDataList);
if(!resultMessage.isSuccess()){
return resultMessage.toString();
}
String updateSqlForRootTable = GenerateSqlUtil.generateUpdateSqlByData(rootTableDataList.get(0),
task.getDatabaseName(), tableName,
primaryKey, polygonId, task.getConfig());
String result = baseService.rollBackDataForVersion(task, table, updateSqlForRootTable, polygonId, version);
if(result.equals(CommonConstant.SUCCEED)){
return ResultMessage.success(null).toString();
}
else{
return ResultMessage.failed(null).toString();
}
}
/**
* 指定某个数据审核通过,或者审核未通过! 如果审核未通过需要提供原因
* @param taskId 任务 id
* @param tableName 表名
* @param polygonId 数据主键
* @param pass 审核是否通过
* @param reason 审核未通过原因
*/
@RequestMapping(value = "setDataStatus", produces = "text/html;charset=UTF-8")
public String setDataStatus(Integer taskId, String tableName, Long polygonId, boolean pass, String reason){
Task task = taskService.getTaskById(taskId);
Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class);
Map<String, Table> tablesMap = config.getTables();
Table table = tablesMap.get(tableName);
String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false);
int status;
if(pass){
status = 2;
reason = null;
}
else{
status = -1;
}
baseService.updateTableStatus(tableNameInDb, PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)),
polygonId, status, reason);
return ResultMessage.success(null).toString();
}
/**
* 根据某任务的统计时间,进行每天的数据统计,并返回给前端! 该接口也就是网页端的“异常监管”!
* 需要将异常范围的上下边界两个参数值提供出来
* @param taskId 任务 id
* @param tableName 表名, 注意如果 tableName 是 "" ,表明需要统计所有的根表
* @param lowLimit 下边界
* @param highLimit 上边界
*/
@RequestMapping(value = "getWarningForUser", produces = "text/html;charset=UTF-8")
public String getCountForUserEveryday(Integer taskId, String tableName, double lowLimit, double highLimit){
List<User> workers = taskService.getWorkersByTask(taskId);
if (workers.isEmpty()) {
return new ResultMessage<>(true, "任务下无外业人员").toString();
}
Set<String> tableNameSet;
List<Map<String, Object>> unusualData = new ArrayList<>();
// yearMonthDayList 表示采集数据的年月日,对任务中每个根表进行统计
List<String> yearMonthDayList = new ArrayList<>();
// 不区分巡查员和采集员,放在一起计算工作量!
Task task = taskService.getTaskById(taskId);
Long allDataCount = 0L;
if("mmoo".equals(tableName)){
tableNameSet = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables().keySet();
}
else{
tableNameSet = new HashSet<>();
tableNameSet.add(tableName);
}
for(String rootTableName : tableNameSet){
String rootTableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), rootTableName, false, false);
allDataCount += baseService.getHasCollectAndPatrolDataCount(rootTableNameInDb);
String selectYearMonthDaySql = MessageFormat.format("select DISTINCT(to_char(update_time,{1})) as collect_date from {0}" +
"where status = 1 or status = 2 " +
"ORDER BY collect_date",
rootTableNameInDb, "\'yyyy-MM-dd\'");
List<Map<String, Object>> yearMonthDayResult = baseService.selectData(selectYearMonthDaySql);
if(yearMonthDayResult != null && yearMonthDayResult.size() != 0){
for(Map<String, Object> yearMonthDay : yearMonthDayResult){
if(!yearMonthDayList.contains(yearMonthDay.get("collect_date").toString())){
yearMonthDayList.add(yearMonthDay.get("collect_date").toString());
}
}
}
}
yearMonthDayList.sort(Comparator.naturalOrder());
// 判断 yearMonthDayList 是否有当天的日期,若有将它排除,以及 yearMonthDayList 为空就返回
if(yearMonthDayList.size() == 0){
return new ResultMessage<>(true, "任务下无数据").toString();
}
// 从数据中获取的平均工作量
int avgCollectionNum = (int)(allDataCount / workers.size() / yearMonthDayList.size()),
lowLimitNum = (int)(avgCollectionNum * lowLimit),
highLimitNum = (int)(avgCollectionNum * highLimit);
// 获取任务中的数据
for(User worker : workers){
Map<String, Object> tempMap = new HashMap<>();
Optional<User> userOptional = userService.findById(worker.getId());
// 获取该外业人员异常日期及该日期下对应的工作量
Map<String, Long> dataCountForDayMap = new HashMap<>();
for(String rootTableName : tableNameSet){
String rootTableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), rootTableName, false, false);
List<Map<String, Object>> dataCountAndTimeList = baseService.getDataCountAndTimeByUser(rootTableNameInDb, worker.getId());
for(Map<String, Object> dataCountAndTimeMap : dataCountAndTimeList){
String time = dataCountAndTimeMap.get("updateTime").toString();
Long countValue = Long.valueOf(dataCountAndTimeMap.get("dataCount").toString());
if(!dataCountForDayMap.containsKey(time)){
dataCountForDayMap.put(time, countValue);
}
else{
Long dataCountAdd = dataCountForDayMap.get(time) + countValue;
dataCountForDayMap.remove(time);
dataCountForDayMap.put(time, dataCountAdd);
}
}
}
List<Map<String, Object>> unusualDayList = new ArrayList<>();
for(String yearMonthDay : yearMonthDayList){
if(!dataCountForDayMap.containsKey(yearMonthDay)){
Map<String, Object> unusualDayMap = new HashMap<>();
unusualDayMap.put("day", yearMonthDay);
unusualDayMap.put("num", 0);
unusualDayList.add(unusualDayMap);
}
else if(dataCountForDayMap.get(yearMonthDay) < lowLimitNum
|| dataCountForDayMap.get(yearMonthDay) > highLimitNum){
Map<String, Object> unusualDayMap = new HashMap<>();
unusualDayMap.put("day", yearMonthDay);
unusualDayMap.put("num", dataCountForDayMap.get(yearMonthDay));
unusualDayList.add(unusualDayMap);
}
}
if(unusualDayList.size() != 0){
tempMap.put("unusualDay", unusualDayList);
tempMap.put("userName", userOptional.get().getUsername());
unusualData.add(tempMap);
}
}
Map<String, Object> result = new HashMap<>();
result.put("unusualData", unusualData);
result.put("averageNum", avgCollectionNum);
result.put("lowLimitNum", lowLimitNum);
result.put("highLimitNum", highLimitNum);
return ResultMessage.success(result).toString();
}
/**
* 根据前端传入的任务 taskId 及经纬度范围进行数据抽稀,只返回某范围的数据个数
* accuracy、longitudeMin、latitudeMin、longitudeMax、latitudeMax
* 缩放精度、 最小经度 、 最小纬度 、 最大经度 、 最大纬度
*/
@RequestMapping(value = "getCountByGeoHash", produces = "text/html;charset=UTF-8")
public String getCountByGeoHash(Integer taskId, String tableName, Integer accuracy, Double longitudeMin,
Double latitudeMin, Double longitudeMax, Double latitudeMax){
Task task = taskService.getTaskById(taskId);
Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName);
// 获取几何字段名
String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table);
// 如果没有几何字段,直接返回空
if (geometryFieldName == null) {
return ResultMessage.success(null).toString();
}
String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false);
String selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_GEOHASH,
tableNameInDb,
PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)),
accuracy, longitudeMin, latitudeMin, longitudeMax, latitudeMax, "");
List<Map<String, Object>> dataList = baseService.selectData(selectSql);
if(dataList != null && dataList.size() != 0){
List<Map<String, Object>> result = OtherUtil.genFeatureCountList(dataList);
return ResultMessage.success(result).toString();
}
else{
return ResultMessage.success(null).toString();
}
}
/**
* 获取热力图相关的数据
* @param taskId 任务 id
* @param tableName 表名
*/
@RequestMapping(value = "getHeatData", produces = "text/html;charset=UTF-8")
public String getHeatData(Integer taskId, String tableName){
Map<String, Object> coordinateRangeMap = taskCellService.getCoordinateRange(taskId);
if(coordinateRangeMap != null && coordinateRangeMap.size() != 0){
Task task = taskService.getTaskById(taskId);
Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName);
String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false);
String selectSql = MessageFormat.format(SqlStringConstant.SELECT_CENTROID_SQL_BY_GEOHASH,
tableNameInDb,
PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), 7,
Double.valueOf(coordinateRangeMap.get("xmin").toString()),
Double.valueOf(coordinateRangeMap.get("ymin").toString()),
Double.valueOf(coordinateRangeMap.get("xmax").toString()),
Double.valueOf(coordinateRangeMap.get("ymax").toString()));
List<Map<String, Object>> dataList = baseService.selectData(selectSql);
if(dataList != null && dataList.size() != 0){
List<Map<String, Object>> result = OtherUtil.genFeatureCountList(dataList);
return ResultMessage.success(result).toString();
}
}
return ResultMessage.success("null").toString();
}
/**
* 根据前端传入的任务 taskIdtableName 及中心点,获取据该中心点小于 100m 的数据
*/
@RequestMapping(value = "getDataByDistance", produces = "text/html;charset=UTF-8")
public String getDataByDistance(Integer taskId, String tableName, Double longitude, Double latitude){
Task task = taskService.getTaskById(taskId);
Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName);
String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false);
String pointGeoJson = "\'{" + MessageFormat.format(SqlStringConstant.POINT_GEOGSON, longitude, latitude) + "}\'";
String selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_DISTANCE, tableNameInDb,
PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), pointGeoJson);
List<Map<String, Object>> dataList = baseService.selectData(selectSql);
String primaryKey = TableOperationUtil.getPrimaryKey(table);
if(dataList != null && dataList.size() != 0){
List<Long> result = new ArrayList<>();
dataList.forEach(data -> result.add(Long.valueOf(data.get(primaryKey).toString())));
return ResultMessage.success(result).toString();
}
else{
return ResultMessage.success(null).toString();
}
}
}

View File

@@ -0,0 +1,18 @@
package cn.edu.whu.boot.collection.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* Created by AJQK on 2018/5/31.
*/
@RequestMapping("/")
@Controller
public class DefaultController {
@RequestMapping
public ModelAndView homepage(){
return new ModelAndView("redirect:index.html");
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,457 @@
package cn.edu.whu.boot.collection.controller;
import cn.edu.whu.boot.collection.service.ImportService;
import cn.edu.whu.boot.common.domain.CommonConstant;
import cn.edu.whu.boot.common.domain.ResultMessage;
import cn.edu.whu.boot.common.utils.collection.OtherUtil;
import cn.edu.whu.boot.common.utils.collection.TableOperationUtil;
import cn.edu.whu.boot.xml.domain.Task;
import cn.edu.whu.boot.xml.service.ITaskService;
import cn.edu.whu.boot.xml.xmlreader.bean.Config;
import cn.edu.whu.boot.xml.xmlreader.bean.Field;
import cn.edu.whu.boot.xml.xmlreader.bean.Table;
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.type.AttributeDescriptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;
/**
* 上传数据的相关接口!!!
*/
@RestController
@RequestMapping("import")
public class ImportController{
private final ITaskService taskService;
private final ImportService importService;
@Autowired
public ImportController(ITaskService taskService, ImportService importService){
this.taskService = taskService;
this.importService = importService;
}
/**
* 获取任务下的根表信息
* @param taskId 任务 id
*/
@RequestMapping(value = "getRootTablesName", produces = "text/html;charset=UTF-8")
public String getRootTablesName(Integer taskId){
Task task = taskService.getTaskById(taskId);
if(task.getHasCreateTables() == 0){
return ResultMessage.success(null).toString();
}
Map<String, Table> tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables();
return ResultMessage.success(genTableNameList(tables)).toString();
}
/**
* 获取任务下的所有表信息
* @param taskId 任务 id
*/
@RequestMapping(value = "getTablesName", produces = "text/html;charset=UTF-8")
public String getAllTablesName(Integer taskId){
Task task = taskService.getTaskById(taskId);
if(task.getHasCreateTables() == 0){
return ResultMessage.success(null).toString();
}
Map<String, Table> tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables();
return ResultMessage.success(genTableNameList(tables)).toString();
}
/**
* 基于传入的 Map<String, Table> tables 将其按照某个规则转换成 List<Map<String, String>>
*/
private List<Map<String, String>> genTableNameList(Map<String, Table> tables){
List<Map<String, String>> result = new ArrayList<>();
if(MapUtils.isNotEmpty(tables)){
tables.forEach((tableName, table) -> {
Map<String, String> tempMap = new HashMap<>();
tempMap.put("tableName", tableName);
tempMap.put("tableChineseName", table.getName());
result.add(tempMap);
});
return result;
}
else{
return null;
}
}
/**
* 获取任务下的表字段信息,得把关联表排除掉!!!
* @param taskId 任务 id
* @param tableName 表名
*/
@RequestMapping(value = "getTableFieldsName", produces = "text/html;charset=UTF-8")
public String getTableFieldsName(Integer taskId, String tableName){
Task task = taskService.getTaskById(taskId);
Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName);
List<String> fieldNameList = new ArrayList<>();
Map<String, Field> fields = table.getFields();
fields.forEach((fieldName, field) -> {
if((StringUtils.isBlank(field.getType()) || !CommonConstant.CAMERA.equals(field.getType()))
&& !CommonConstant.FIX_FIELD_SET.contains(fieldName)
&& StringUtils.isBlank(field.getAssociate())
&& StringUtils.isBlank(field.getCollection())){
fieldNameList.add(fieldName);
}
});
return ResultMessage.success(fieldNameList).toString();
}
/**
* 获取源任务和目标任务间,表的映射关系
* @param srcTaskId 源任务 id
* @param destTaskId 目标任务 id
*/
@RequestMapping(value = "getTaskTableMapping", produces = "text/html;charset=UTF-8")
public String getTaskTableMapping(Integer srcTaskId, Integer destTaskId){
Task srcTask = taskService.getTaskById(srcTaskId);
Task destTask = taskService.getTaskById(destTaskId);
Map<String, Table> srcRootTables = JSON.toJavaObject(JSON.parseObject(srcTask.getConfig()), Config.class).getRootTables();
Map<String, Table> destRootTables = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables();
Set<String> destRootTablesNameSet = destRootTables.keySet();
List<Map<String, String>> result = new ArrayList<>();
srcRootTables.forEach((rootTableName, rootTable) -> {
if(destRootTablesNameSet.contains(rootTableName)){
Map<String, String> tempMap = new HashMap<>();
tempMap.put("srcTable", rootTableName);
tempMap.put("destTable", rootTableName);
result.add(tempMap);
}
else{
Map<String, String> tempMap = new HashMap<>();
tempMap.put("srcTable", rootTableName);
tempMap.put("destTable", "");
result.add(tempMap);
}
});
return ResultMessage.success(result).toString();
}
/**
* 获取源任务和目标任务间,源表和目标表的字段映射关系
* @param srcTaskId 源任务 id
* @param destTaskId 目标任务 id
* @param srcTableName 源表名
* @param destTableName 目标表名
*/
@RequestMapping(value = "getTaskTableFieldMapping", produces = "text/html;charset=UTF-8")
public String getTaskTableFieldMapping(Integer srcTaskId, Integer destTaskId, String srcTableName, String destTableName){
Task srcTask = taskService.getTaskById(srcTaskId);
Task destTask = taskService.getTaskById(destTaskId);
Table srcRootTable = JSON.toJavaObject(JSON.parseObject(srcTask.getConfig()), Config.class).getRootTables().get(srcTableName);
Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName);
Map<String, Field> srcRootTableFields = srcRootTable.getFields();
Map<String, Field> destRootTableFields = destRootTable.getFields();
Set<String> destRootTableFieldNameSet = destRootTableFields.keySet();
List<Map<String, String>> result = new ArrayList<>();
String srcCameraField = TableOperationUtil.getCameraFieldName(srcRootTable);
srcRootTableFields.forEach((rootTableFieldName, rootTableField) -> {
if(!CommonConstant.FIX_FIELD_SET.contains(rootTableFieldName)
&& !rootTableFieldName.equals(srcCameraField)){
addFieldNameToList(result, destRootTableFieldNameSet, rootTableFieldName);
}
});
return ResultMessage.success(result).toString();
}
/**
* 根据网页端制定好的字段映射信息进行数据迁移
* @param srcTaskId 源任务 id
* @param destTaskId 目标任务 id
* @param srcTableName 源表名
* @param destTableName 目标表名
* @param isSelective 是否抽查
* @param selectDataNum 抽查数目,注意这是个字符串,如果字符串中带有“%”,说明是按照比例进行抽查!!!
* 注意 % 只能在最后
* @param whereClause 按照 where 语句抽查
* @param fieldMapping 字段映射关系
*/
@RequestMapping(value = "taskTableDataMigration", produces = "text/html;charset=UTF-8")
public String taskTableDataMigration(Integer srcTaskId, Integer destTaskId, String srcTableName,
String destTableName, boolean isSelective,
@RequestParam(required = false) String selectDataNum,
@RequestParam(required = false) String whereClause,
String fieldMapping) throws IOException{
Task srcTask = taskService.getTaskById(srcTaskId);
Task destTask = taskService.getTaskById(destTaskId);
if(isSelective){
// 检查 selectDataNum 是否符合要求
if(selectDataNum.contains("%")){
if(selectDataNum.indexOf("%") != selectDataNum.length() - 1){
return new ResultMessage<>(true, "抽查数量不符合要求", 400).toString();
}
else{
return importService.taskTableDataInsert(srcTask, destTask, srcTableName, destTableName, 2,
Integer.parseInt(selectDataNum.substring(0, selectDataNum.length() - 1)), whereClause,
fieldMapping).toString();
}
}
else{
if(Integer.parseInt(selectDataNum) <= 0 || Integer.parseInt(selectDataNum) > 9999){
return new ResultMessage<>(true, "抽查数量不符合要求", 400).toString();
}
else{
return importService.taskTableDataInsert(srcTask, destTask, srcTableName, destTableName, 1,
Integer.parseInt(selectDataNum), whereClause, fieldMapping).toString();
}
}
}
else{
return importService.taskTableDataInsert(srcTask, destTask, srcTableName, destTableName, 0,
0, null, fieldMapping).toString();
}
}
/**
* 获取.xlsx 或.xls文件与目标表的字段映射关系
* @param destTaskId 目标任务 id
* @param destTableName 目标表名
* @param file .xlsx 或.xls文件
*/
@RequestMapping(value = "getFileAndFieldMapping", produces = "text/html;charset=UTF-8")
public String getFileAndFieldMapping(Integer destTaskId, String destTableName,
@RequestParam(name = "file") MultipartFile file) throws IOException{
Task destTask = taskService.getTaskById(destTaskId);
Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName);
Map<String, Field> destRootTableFields = destRootTable.getFields();
Set<String> destRootTableFieldNameSet = destRootTableFields.keySet();
String fileName = file.getOriginalFilename();
List<Map<String, String>> result = new ArrayList<>();
if(fileName.endsWith(".xls") || fileName.endsWith(".xlsx")){
Workbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
Row firstRow = sheet.getRow(sheet.getFirstRowNum());
for(int i = 0; i < firstRow.getLastCellNum(); i++){
String cellValue = firstRow.getCell(i).toString();
if(!cellValue.toLowerCase().equals(CommonConstant.FILE_PATH)){
addFieldNameToList(result, destRootTableFieldNameSet, cellValue);
}
}
return ResultMessage.success(result).toString();
}
else{
return new ResultMessage<>(true, "文件格式不支持", 400).toString();
}
}
/**
* 将 .xlsx 或 .xls 文件中数据插入数据库中
* @param destTaskId 目标任务 id
* @param destTableName 目标表名
* @param file .xlsx 或.xls文件
* @param fieldMapping 字段映射关系
*/
@RequestMapping(value = "fileDataMigration", produces = "text/html;charset=UTF-8")
public String fileDataMigration(Integer destTaskId, String destTableName,
@RequestParam(name = "file") MultipartFile file, String fieldMapping) throws IOException{
Task destTask = taskService.getTaskById(destTaskId);
String fileName = file.getOriginalFilename();
if(fileName.endsWith(".xls") || fileName.endsWith(".xlsx")){
Workbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
importService.fileDataInsert(destTask, destTableName, sheet, fieldMapping);
return ResultMessage.success(null).toString();
}
else{
return new ResultMessage<>(true, "文件格式不支持", 400).toString();
}
}
/**
* 获取 Shapefile 文件与目标表的字段映射关系!
* .shp存储地理数据的坐标信息。
* .shx存储地理数据的位置索引记录每个地理数据在 shp 文件中的位置,能够快速定位数据。
* .dbf存储地理数据的属性信息以 dBase IV 的数据表格式存储。
*
* @param destTaskId 目标任务 id
* @param destTableName 目标表
* @param shp shp文件
* @param shx shx 文件
* @param dbf dbf 文件
*/
@RequestMapping(value = "getShpAndFieldMapping", produces = "text/html;charset=UTF-8")
public String getShpAndFieldMapping(Integer destTaskId, String destTableName,
@RequestParam(name = "shp") MultipartFile shp,
@RequestParam(name = "shx") MultipartFile shx,
@RequestParam(name = "dbf") MultipartFile dbf) throws IOException{
if(shp.getOriginalFilename().endsWith(".shp")
&& shx.getOriginalFilename().endsWith(".shx")
&& dbf.getOriginalFilename().endsWith(".dbf")){
String tempDirPath = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis() + "/";
File tempDir = new File(tempDirPath);
tempDir.mkdirs();
File shpFile = new File(tempDirPath + "temp.shp");
shp.transferTo(shpFile);
File shxFile = new File(tempDirPath + "temp.shx");
shx.transferTo(shxFile);
File dbfFile = new File(tempDirPath + "temp.dbf");
dbf.transferTo(dbfFile);
ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
ShapefileDataStore dataStore = (ShapefileDataStore) factory.createDataStore(shpFile.toURI().toURL());
List<Map<String, String>> result = new ArrayList<>();
Task destTask = taskService.getTaskById(destTaskId);
Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName);
Map<String, Field> destRootTableFields = destRootTable.getFields();
Set<String> destRootTableFieldNameSet = destRootTableFields.keySet();
try{
if(dataStore != null){
// 确定 ShapeFile 编码
String shapeFileCoding = OtherUtil.getShpFileCodingByDbf(dbfFile);
if(shapeFileCoding == null){
throw new RuntimeException(".dbf文件出错请检查该文件!");
}
dataStore.setCharset(Charset.forName(shapeFileCoding));
List<AttributeDescriptor> attrList = dataStore.getFeatureSource().getSchema().getAttributeDescriptors();
for(AttributeDescriptor attr : attrList){
if(!attr.getLocalName().toLowerCase().equals(CommonConstant.FILE_PATH)){
addFieldNameToList(result, destRootTableFieldNameSet, attr.getLocalName());
}
}
}
} catch(Exception e){
e.printStackTrace();
} finally{
if(dataStore != null){
dataStore.dispose();
}
// 将临时文件夹删除
if(tempDir.exists()){
FileUtils.deleteDirectory(tempDir);
}
}
return ResultMessage.success(result).toString();
}
else{
return new ResultMessage<>(true, "文件格式不支持", 400).toString();
}
}
/**
* 将 Shapefile 文件中数据插入数据库中!
* @param destTaskId 目标任务 id
* @param destTableName 目标表
* @param fieldMapping 字段映射关系
* @param shp shp文件
* @param shx shx 文件
* @param dbf dbf 文件
*/
@RequestMapping(value = "shpDataMigration", produces = "text/html;charset=UTF-8")
public String shpDataMigration(Integer destTaskId, String destTableName,String fieldMapping,
@RequestParam(name = "shp") MultipartFile shp,
@RequestParam(name = "shx") MultipartFile shx,
@RequestParam(name = "dbf") MultipartFile dbf) throws IOException{
if(shp.getOriginalFilename().endsWith(".shp")
&& shx.getOriginalFilename().endsWith(".shx")
&& dbf.getOriginalFilename().endsWith(".dbf")){
String tempDirPath = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis() + "/";
File tempDir = new File(tempDirPath);
tempDir.mkdirs();
File shpFile = new File(tempDirPath + "temp.shp");
shp.transferTo(shpFile);
File shxFile = new File(tempDirPath + "temp.shx");
shx.transferTo(shxFile);
File dbfFile = new File(tempDirPath + "temp.dbf");
dbf.transferTo(dbfFile);
//通过store获取featureCollection
FileDataStore store = FileDataStoreFinder.getDataStore(shpFile);
// 确定 ShapeFile 编码
String shapeFileCoding = OtherUtil.getShpFileCodingByDbf(dbfFile);
if(shapeFileCoding == null){
throw new RuntimeException(".dbf文件出错请检查该文件!");
}
((ShapefileDataStore) store).setCharset(Charset.forName(shapeFileCoding));
SimpleFeatureSource featureSource = store.getFeatureSource();
SimpleFeatureCollection simpleFeatureCollection = featureSource.getFeatures();
SimpleFeatureIterator itertor = simpleFeatureCollection.features();
Task destTask = taskService.getTaskById(destTaskId);
try{
importService.shpDataInsert(destTask, destTableName, itertor, fieldMapping,
getMediaFilePathNameFromShp(shpFile));
}
catch(Exception e){
e.printStackTrace();
return ResultMessage.failed(e.getMessage()).toString();
}
finally{
// 将 SimpleFeatureIterator 和ShapefileDataStore关闭否则后面删除文件夹会提示shp被占用
itertor.close();
store.dispose();
// 将临时文件夹删除
if(tempDir.exists()){
FileUtils.deleteDirectory(tempDir);
}
}
return ResultMessage.success(null).toString();
}
else{
return new ResultMessage<>(true, "文件格式不支持", 400).toString();
}
}
/**
* 根据源字段与目标字段生成 List<Map<String,String>>
*/
private void addFieldNameToList(List<Map<String, String>> result, Set<String> nameSet, String name){
if(nameSet.contains(name)){
Map<String, String> tempMap = new HashMap<>();
tempMap.put("srcTableField", name);
tempMap.put("destTableField", name);
result.add(tempMap);
}
else{
Map<String, String> tempMap = new HashMap<>();
tempMap.put("srcTableField", name);
tempMap.put("destTableField", "");
result.add(tempMap);
}
}
/**
* 从 shp 中获取 filePath 字段名(如果存在的话)
*/
private String getMediaFilePathNameFromShp(File shpFile) throws IOException{
ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
ShapefileDataStore dataStore = (ShapefileDataStore) factory.createDataStore(shpFile.toURI().toURL());
if(dataStore != null){
List<AttributeDescriptor> attrList = dataStore.getFeatureSource().getSchema().getAttributeDescriptors();
for(AttributeDescriptor attr : attrList){
if(attr.getLocalName().toLowerCase().equals(CommonConstant.FILE_PATH)){
return attr.getLocalName();
}
}
}
return null;
}
}

View File

@@ -0,0 +1,173 @@
package cn.edu.whu.boot.collection.domain;
public class ExportMediaRecord {
private long mediaID;//多媒体ID
private long ID;//多媒体对应的父表ID
private float azimuth;//方向角
private int satellites;//卫星数
private double longitude;//经度
private double latitude;//纬度
private double altitude;//海拔
private float accuracy;//精度
private float cameraAngle;//摄像头方向角
private float cameraPitch;//摄像头俯仰角
private float cameraRoll;//摄像头俯仰角
private String method;//定位方式
private String time;//拍摄时间
private float focalLength;//焦距
private int type;//多媒体类型
private String mediaPath;
private int version;
public long getMediaID() {
return mediaID;
}
public void setMediaID(long mediaID) {
this.mediaID = mediaID;
}
public long getID() {
return ID;
}
public void setID(long ID) {
this.ID = ID;
}
public float getAzimuth() {
return azimuth;
}
public void setAzimuth(float azimuth) {
this.azimuth = azimuth;
}
public int getSatellites() {
return satellites;
}
public void setSatellites(int satellites) {
this.satellites = satellites;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public double getAltitude() {
return altitude;
}
public void setAltitude(double altitude) {
this.altitude = altitude;
}
public float getAccuracy() {
return accuracy;
}
public void setAccuracy(float accuracy) {
this.accuracy = accuracy;
}
public float getCameraAngle() {
return cameraAngle;
}
public void setCameraAngle(float cameraAngle) {
this.cameraAngle = cameraAngle;
}
public float getCameraPitch() {
return cameraPitch;
}
public void setCameraPitch(float cameraPitch) {
this.cameraPitch = cameraPitch;
}
public float getCameraRoll() {
return cameraRoll;
}
public void setCameraRoll(float cameraRoll) {
this.cameraRoll = cameraRoll;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public float getFocalLength() {
return focalLength;
}
public void setFocalLength(float focalLength) {
this.focalLength = focalLength;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getMediaPath() {
return mediaPath;
}
public void setMediaPath(String mediaPath) {
this.mediaPath = mediaPath;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}

View File

@@ -0,0 +1,31 @@
package cn.edu.whu.boot.collection.domain;
public class ExportUserRecord {
private Integer id;
private String name;
public ExportUserRecord() {
}
public ExportUserRecord(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@@ -0,0 +1,225 @@
package cn.edu.whu.boot.collection.domain;
import java.io.Serializable;
/**
* Description
* AuthorCXJ
* Date 2019-04-27 12:29
* Remark
*/
public class MultimediaItem implements Serializable{
private static final long serialVersionUID = 6456781405975280523L;
private long mediaID;//多媒体ID
private long ID;//多媒体对应的父表ID
private String file;//文件名
private float azimuth;//方向角
private int satellites;//卫星数
private double longitude;//经度
private double latitude;//纬度
private double altitude;//海拔
private float accuracy;//精度
private float cameraAngle;//摄像头方向角
private float cameraPitch;//摄像头俯仰角
private float cameraRoll;//摄像头俯仰角
private String method;//定位方式
private String time;//拍摄时间
private float focalLength;//焦距
private int type;//多媒体类型
private String mediaPath;
private String mediaTableName;
private int version;
public long getMediaID()
{
return mediaID;
}
public void setMediaID(long mediaID)
{
this.mediaID = mediaID;
}
public long getID()
{
return ID;
}
public void setID(long ID)
{
this.ID = ID;
}
public String getFile()
{
return file;
}
public void setFile(String file)
{
this.file = file;
}
public float getAzimuth()
{
return azimuth;
}
public void setAzimuth(float azimuth)
{
this.azimuth = azimuth;
}
public int getSatellites()
{
return satellites;
}
public void setSatellites(int satellites)
{
this.satellites = satellites;
}
public double getLongitude()
{
return longitude;
}
public void setLongitude(double longitude)
{
this.longitude = longitude;
}
public double getLatitude()
{
return latitude;
}
public void setLatitude(double latitude)
{
this.latitude = latitude;
}
public double getAltitude()
{
return altitude;
}
public void setAltitude(double altitude)
{
this.altitude = altitude;
}
public float getAccuracy()
{
return accuracy;
}
public void setAccuracy(float accuracy)
{
this.accuracy = accuracy;
}
public float getCameraAngle()
{
return cameraAngle;
}
public void setCameraAngle(float cameraAngle)
{
this.cameraAngle = cameraAngle;
}
public float getCameraPitch()
{
return cameraPitch;
}
public void setCameraPitch(float cameraPitch)
{
this.cameraPitch = cameraPitch;
}
public float getCameraRoll()
{
return cameraRoll;
}
public void setCameraRoll(float cameraRoll)
{
this.cameraRoll = cameraRoll;
}
public String getMethod()
{
return method;
}
public void setMethod(String method)
{
this.method = method;
}
public String getTime()
{
return time;
}
public void setTime(String time)
{
this.time = time;
}
public float getFocalLength()
{
return focalLength;
}
public void setFocalLength(float focalLength)
{
this.focalLength = focalLength;
}
public int getType()
{
return type;
}
public void setType(int type)
{
this.type = type;
}
public String getMediaPath()
{
return mediaPath;
}
public void setMediaPath(String mediaPath)
{
this.mediaPath = mediaPath;
}
public String getMediaTableName()
{
return mediaTableName;
}
public void setMediaTableName(String mediaTableName)
{
this.mediaTableName = mediaTableName;
}
public int getVersion()
{
return version;
}
public void setVersion(int version)
{
this.version = version;
}
}

View File

@@ -0,0 +1,89 @@
package cn.edu.whu.boot.collection.domain;
import java.io.Serializable;
/**
* 对应Postgresql 数据库public模式的task_select_id表记录已经抽查的数据id
*/
public class TaskSelectId implements Serializable {
private static final long serialVersionUID = -5478907386502727663L;
private Long id;
private Integer srcTaskId;
private String srcTableName;
private Integer selectOrder;
private String selectId;
private Integer destTaskId;
private String destTableName;
public Long getId ()
{
return id;
}
public void setId (Long id)
{
this.id = id;
}
public Integer getSrcTaskId ()
{
return srcTaskId;
}
public void setSrcTaskId (Integer srcTaskId)
{
this.srcTaskId = srcTaskId;
}
public String getSrcTableName ()
{
return srcTableName;
}
public void setSrcTableName (String srcTableName)
{
this.srcTableName = srcTableName;
}
public Integer getDestTaskId ()
{
return destTaskId;
}
public void setDestTaskId (Integer destTaskId)
{
this.destTaskId = destTaskId;
}
public String getDestTableName ()
{
return destTableName;
}
public void setDestTableName (String destTableName)
{
this.destTableName = destTableName;
}
public Integer getSelectOrder ()
{
return selectOrder;
}
public void setSelectOrder (Integer selectOrder)
{
this.selectOrder = selectOrder;
}
public String getSelectId ()
{
return selectId;
}
public void setSelectId (String selectId)
{
this.selectId = selectId;
}
}

View File

@@ -0,0 +1,44 @@
package cn.edu.whu.boot.collection.dto;
import com.alibaba.fastjson.JSON;
import java.io.Serializable;
/**
* 联合主键类,主要是方便返回数据给移动端
*/
public class CompositeKey implements Serializable{
private static final long serialVersionUID = 6604820802345592864L;
/**
* 数据的主键
*/
private Long polygonId;
/**
* 数据的版本
*/
private int version;
public Long getPolygonId(){
return polygonId;
}
public void setPolygonId(Long polygonId){
this.polygonId = polygonId;
}
public int getVersion(){
return version;
}
public void setVersion(int version){
this.version = version;
}
@Override
public String toString(){
return JSON.toJSONString(this);
}
}

View File

@@ -0,0 +1,47 @@
package cn.edu.whu.boot.collection.dto;
import java.io.Serializable;
/**
* 定义一个 Feature 类,主要是方便返回数据给决策管理前端
*/
public class Feature implements Serializable{
private static final long serialVersionUID = 6787141434245062521L;
private String type;
private GeometryType geometry;
private Object properties;
public String getType()
{
return type;
}
public void setType(String type)
{
this.type = type;
}
public GeometryType getGeometry()
{
return geometry;
}
public void setGeometry(GeometryType geometry)
{
this.geometry = geometry;
}
public Object getProperties()
{
return properties;
}
public void setProperties(Object properties)
{
this.properties = properties;
}
}

View File

@@ -0,0 +1,36 @@
package cn.edu.whu.boot.collection.dto;
import java.io.Serializable;
/**
* 定义一个 GeometryType 类型,与 Feature 类使用用于标记不同 geometry 类型
*/
public class GeometryType implements Serializable {
private static final long serialVersionUID = 6477009511765851104L;
private String type;
private Object coordinates;
public String getType()
{
return type;
}
public void setType(String type)
{
this.type = type;
}
public Object getCoordinates()
{
return coordinates;
}
public void setCoordinates(Object coordinates)
{
this.coordinates = coordinates;
}
}

View File

@@ -0,0 +1,44 @@
package cn.edu.whu.boot.collection.dto;
/**
* 封装sqlString的类因为不涉及具体的JavaBean通过该类获取插入记录的自增长id号
*/
public class SqlEnity {
private Long id;
private String sql;
private String primaryKeySeq;
public SqlEnity()
{}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getSql()
{
return sql;
}
public void setSql(String sql)
{
this.sql = sql;
}
public String getPrimaryKeySeq()
{
return primaryKeySeq;
}
public void setPrimaryKeySeq(String primaryKeySeq)
{
this.primaryKeySeq = primaryKeySeq;
}
}

View File

@@ -0,0 +1,149 @@
package cn.edu.whu.boot.collection.dto;
/**
* Controller 层的日志封装类
*/
public class WebLog {
/**
* 操作描述
*/
private String description;
/**
* 操作用户
*/
private String username;
/**
* 操作时间
*/
private Long startTime;
/**
* 消耗时间
*/
private Integer spendTime;
/**
* 根路径
*/
private String basePath;
/**
* URI
*/
private String uri;
/**
* URL
*/
private String url;
/**
* 请求类型
*/
private String method;
/**
* IP地址
*/
private String ip;
/**
* 请求参数
*/
private Object parameter;
/**
* 请求返回的结果
*/
private Object result;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Long getStartTime() {
return startTime;
}
public void setStartTime(Long startTime) {
this.startTime = startTime;
}
public Integer getSpendTime() {
return spendTime;
}
public void setSpendTime(Integer spendTime) {
this.spendTime = spendTime;
}
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Object getParameter() {
return parameter;
}
public void setParameter(Object parameter) {
this.parameter = parameter;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}

View File

@@ -0,0 +1,65 @@
package cn.edu.whu.boot.collection.mapper;
import cn.edu.whu.boot.collection.dto.SqlEnity;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
* 插入数据字段不固定,所以定义一个基础 Mapper 接口
*/
@Repository
public interface BaseMapper {
Integer insertSql(@Param("insertSql") String insertSql);
Integer insertSqlEnity(@Param("sqlEnity") SqlEnity sqlEnity);
Integer getVersionByPolygonId(@Param("tableName") String tableName , @Param("primaryKeyName") String primaryKeyName ,
@Param("primaryKeyValue") Long primaryKeyValue);
List<Map<String,Object>> selectData(@Param("selectSql") String selectSql);
Integer getUserWorkRole(@Param("taskId") Integer taskId , @Param("userId") Integer userId);
List<Map<String,Object>> getNotPassDataId(@Param("tableNameInDb") String tableNameInDb ,
@Param("primaryKey") String primaryKey , @Param("userId") Integer userId);
Long getStatisticDataNum(@Param("tableNameInDb") String tableNameInDb, @Param("geometryName")String geometryName,
@Param("geoJson")String geoJson);
Long getDataCount(@Param("tableNameInDb") String tableNameInDb);
Long getHasCollectAndPatrolDataCount(@Param("tableNameInDb") String tableNameInDb);
List<Map<String,Object>> getDataCountAndTimeByUser(@Param("tableNameInDb") String tableNameInDb,
@Param("userId") Integer userId);
List<Map<String,Object>> getAllFuzzySearchData(@Param("tableNameInDb") String tableNameInDb,
@Param("fieldNameInDB") String fieldNameInDB,
@Param("searchKey") String searchKey);
Page<Map<String,Object>> getAllFuzzySearchDataCenterPoint(@Param("tableNameInDb") String tableNameInDb,
@Param("fieldNameInDB") String fieldNameInDB,
@Param("geometryFieldNameInDB") String geometryFieldNameInDB,
@Param("searchKey") String searchKey);
List<Map<String,Object>> randomSelectDataIdNotInList(@Param("tableNameInDb") String tableNameInDb,
@Param("primaryKey") String primaryKey,
@Param("selectIdList") List selectIdList,
@Param("selectDataNum") Integer selectDataNum,
@Param("whereClause") String whereClause);
List<Integer> getIdsByReviewer(@Param("tableNameInDb")String tableNameInDb, @Param("reviewerId")int reviewerId,
@Param("primaryKey") String primaryKey);
Integer getReviewerByDataId(@Param("tableNameInDb")String tableNameInDb, @Param("primaryKey") String primaryKey,
@Param("dataId")int dataId);
/**
* 查询指定表的所有字段名
* @param tableName 表名
* @return 字段名列表
*/
List<String> selectSingleColumn(@Param("databaseName") String databaseName,
@Param("tableName") String tableName);
}

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