Browse Source

init

master
지대한 1 year ago
commit
0a212301a4
  1. 37
      .gitignore
  2. BIN
      gradle/wrapper/gradle-wrapper.jar
  3. 7
      gradle/wrapper/gradle-wrapper.properties
  4. 248
      gradlew
  5. 92
      gradlew.bat
  6. 95
      pav-server/build.gradle
  7. BIN
      pav-server/lib/opensky-api-1.3.0.jar
  8. 1
      pav-server/settings.gradle
  9. 19
      pav-server/src/main/java/com/palnet/PavApplication.java
  10. 254
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java
  11. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/model/AcntCrtfyhpRsModel.java
  12. 252
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java
  13. 198
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java
  14. 21
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java
  15. 17
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrGroupModel.java
  16. 17
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java
  17. 48
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java
  18. 13
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRsModel.java
  19. 28
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java
  20. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java
  21. 321
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java
  22. 151
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java
  23. 25
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/filter/JwtAuthenticationEntryPoint.java
  24. 96
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/filter/JwtRequestFilter.java
  25. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtGroupModel.java
  26. 19
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java
  27. 20
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java
  28. 21
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java
  29. 98
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java
  30. 237
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java
  31. 41
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtUserDetailsService.java
  32. 166
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java
  33. 74
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java
  34. 11
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java
  35. 26
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRsModel.java
  36. 35
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java
  37. 112
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java
  38. 47
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryDetailModel.java
  39. 21
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java
  40. 79
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryModel.java
  41. 12
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java
  42. 83
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRsModel.java
  43. 154
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java
  44. 160
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java
  45. 60
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltDetailModel.java
  46. 46
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltHistModel.java
  47. 12
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltRqModel.java
  48. 28
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltStcsModel.java
  49. 227
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java
  50. 311
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java
  51. 62
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java
  52. 23
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java
  53. 31
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java
  54. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java
  55. 30
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java
  56. 428
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java
  57. 400
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  58. 11
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightAprovRq.java
  59. 36
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java
  60. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaBufferModel.java
  61. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java
  62. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java
  63. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java
  64. 23
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java
  65. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanListRq.java
  66. 34
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java
  67. 27
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanPilotModel.java
  68. 25
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java
  69. 18
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightWeatherModel.java
  70. 102
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightMapper.java
  71. 725
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  72. 105
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java
  73. 308
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java
  74. 117
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java
  75. 113
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java
  76. 39
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvModel.java
  77. 22
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java
  78. 38
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinModel.java
  79. 18
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java
  80. 24
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java
  81. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java
  82. 17
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java
  83. 32
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserModel.java
  84. 21
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserRqModel.java
  85. 97
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupAprvService.java
  86. 122
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupJoinService.java
  87. 248
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java
  88. 120
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupUserService.java
  89. 13
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java
  90. 16
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingRs.java
  91. 17
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java
  92. 33
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ControlGpsDataContext.java
  93. 5
      pav-server/src/main/java/com/palnet/biz/api/comn/response/BasicResponse.java
  94. 29
      pav-server/src/main/java/com/palnet/biz/api/comn/response/ErrorResponse.java
  95. 25
      pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java
  96. 299
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  97. 13
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/PingController.java
  98. 57
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java
  99. 21
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java
  100. 8
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnRqModel.java
  101. Some files were not shown because too many files have changed in this diff Show More

37
.gitignore vendored

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

BIN
gradle/wrapper/gradle-wrapper.jar vendored

Binary file not shown.

7
gradle/wrapper/gradle-wrapper.properties vendored

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

248
gradlew vendored

@ -0,0 +1,248 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed 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.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
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
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

92
gradlew.bat vendored

@ -0,0 +1,92 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem 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, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

95
pav-server/build.gradle

@ -0,0 +1,95 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.5.1'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
group = 'com.palnet'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '11'
}
compileJava {
options.compilerArgs += [
'-Amapstruct.unmappedTargetPolicy=IGNORE',
'-Amapstruct.unmappedSourcePolicy=IGNORE'
]
}
repositories {
mavenCentral()
}
dependencies {
// spring
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
// db
runtimeOnly 'mysql:mysql-connector-java'
// log
implementation 'ch.qos.logback:logback-classic'
// aws
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.0.1.RELEASE'
implementation 'org.springframework.cloud:spring-cloud-aws-context:1.2.1.RELEASE'
implementation 'org.springframework.cloud:spring-cloud-aws-autoconfigure:2.0.1.RELEASE'
// lombok, mapstruct
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
implementation 'org.projectlombok:lombok:1.18.28'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
annotationProcessor 'org.projectlombok:lombok:1.18.28'
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
// querydsl - jpa
implementation 'com.querydsl:querydsl-core:5.0.0'
implementation 'com.querydsl:querydsl-jpa:5.0.0'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0'
// other
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'io.netty:netty-all:4.1.9.Final'
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr353'
implementation 'org.apache.httpcomponents:httpclient'
implementation 'org.apache.commons:commons-lang3'
implementation 'commons-httpclient:commons-httpclient:3.1'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'com.esri.geometry:esri-geometry-api:2.2.4'
implementation 'org.locationtech.proj4j:proj4j:1.1.5'
implementation 'org.locationtech.jts:jts-core:1.18.0'
implementation 'org.json:json:20220320'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final"
}
tasks.named('test') {
useJUnitPlatform()
}
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}

BIN
pav-server/lib/opensky-api-1.3.0.jar

Binary file not shown.

1
pav-server/settings.gradle

@ -0,0 +1 @@
rootProject.name = 'pav-server'

19
pav-server/src/main/java/com/palnet/PavApplication.java

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

254
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java

@ -0,0 +1,254 @@
package com.palnet.biz.api.acnt.crtfyhp.controller;
import java.util.HashMap;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.crtfyhp.model.AcntCrtfyhpRsModel;
import com.palnet.biz.api.acnt.crtfyhp.service.AcntCrtfyhpService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/crtfyhp", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
public class AcntCrtfyhpController {
@Autowired
private final AcntCrtfyhpService service;
@Autowired
private PtyCstmrQueryRepository ptyCstmrQueryRepository;
@GetMapping(value = "/register/send")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParam(name = "hnpo",value = "휴대폰번호", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> send(String hpno) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
if(hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
//회원정보에 동일한 휴대폰 번호가 있는지 확인 , 암호화 해서 검색
String encHpno = EncryptUtils.encrypt(hpno);
boolean isHpno = ptyCstmrQueryRepository.findCstmrByHpno(encHpno);
if(isHpno) {
resultMap.put("result" , false);
resultMap.put("code" , -1); // 동일한 휴대폰 번호 존재
}else {
boolean result = service.registerSend(hpno);
resultMap.put("result" , result);
}
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
@GetMapping(value = "/register/confirm")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class),
@ApiImplicitParam(name = "crtfyNo",value = "인증일련번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> confirm(String hpno , String crtfyNo) {
Map<String , Boolean> resultMap = new HashMap<String,Boolean>();
if(hpno == null || crtfyNo == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.registerConfirm(hpno, crtfyNo);
resultMap.put("result" , result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
//아이디 찾기 시 인증번호 발송 로직
@GetMapping(value = "/find/sendForId")
@ApiOperation(value = "아이디 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "memberName", value = "회원 이름", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(memberName == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.certifNum(memberName, hpno);
resultMap.put("result" , result);
if(!result) {
resultMap.put("code", -1); //일치하는 회원 없음
} else {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
//아이디 찾기
@GetMapping(value = "/find/findUserId")
@ApiOperation(value = "회원 아이디 찾기")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "memberName",value = "회원이름", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> findUserId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(memberName == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
String userId = service.findUserId(memberName, hpno);
if(!userId.equals("")) {
resultMap.put("userId", userId);
resultMap.put("code", 0);
} else {
resultMap.put("userId", "");
resultMap.put("code", -1);
}
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
//비밀번호 찾기 시 인증번호 발송 로직
@GetMapping(value = "/find/sendForPw")
@ApiOperation(value = "비밀번호 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForPw(String userId, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(userId == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.certifPw(userId, hpno);
resultMap.put("result", result);
if(!result) {
resultMap.put("code", -1); //일치하는 회원 없음
} else {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
@GetMapping(value = "/find/updatePw")
@ApiOperation(value = "비밀번호 찾기 및 업데이트")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "userID",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class),
@ApiImplicitParam(name = "newPw",value = "새로운 비밀번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> updatePw(String userId, String hpno, String newPw) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(hpno == null || newPw == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.updatePw(userId, hpno, newPw);
resultMap.put("result", result);
if(!result) {
resultMap.put("code", -1);
} else {
resultMap.put("code", 0);
}
} catch(Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
}

9
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/model/AcntCrtfyhpRsModel.java

@ -0,0 +1,9 @@
package com.palnet.biz.api.acnt.crtfyhp.model;
import lombok.Data;
@Data
public class AcntCrtfyhpRsModel {
// private int errCode;
private String userId;
}

252
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java

@ -0,0 +1,252 @@
package com.palnet.biz.api.acnt.crtfyhp.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import com.palnet.biz.api.acnt.crtfyhp.model.AcntCrtfyhpRsModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.acnt.terms.model.AcntTermsRqModel;
import com.palnet.biz.api.acnt.terms.model.AcntTermsRsModel;
import com.palnet.biz.jpa.entity.PtyCrtfyhpBas;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrDtl;
import com.palnet.biz.jpa.entity.PtyTermsAgreeTxn;
import com.palnet.biz.jpa.entity.SuredataEntity;
import com.palnet.biz.jpa.repository.pty.PtyCrtfyhpBasQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyCrtfyhpBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrDtlRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsQueryRepository;
import com.palnet.biz.jpa.repository.pty.SuredataRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.HttpUtils;
@Service
public class AcntCrtfyhpService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Value("${sms.usercode}")
private String USER_CODE;
@Value("${sms.deptcode}")
private String DEPT_CODE;
@Value("${sms.reqname}")
private String REQ_NAME;
@Value("${sms.reqphone}")
private String REQ_PHONE;
@Value("${sms.result}")
private String RESULT;
@Value("${sms.reqtime}")
private String REQ_TIME;
@Value("${sms.kind}")
private String KIND;
@Value("${sms.subject.certify}")
private String SUBJECT_CETIFY;
@Value("${sms.callname.certify}")
private String CALLNAME_CERTIFY;
@Autowired
private PtyCrtfyhpBasQueryRepository query;
@Autowired
private PtyCstmrQueryRepository cstmrQuery;
@Autowired
private PtyCrtfyhpBasRepository ptyCrtfyhpBasRepository;
@Autowired
private PtyCstmrBasRepository ptyCstmrBasRepository;
@Autowired
private SuredataRepository sureDataRepository;
/**
*
* @param rq
* @return
*/
// public boolean certifySend(String hpno) throws Exception {
//
// //인증번호 만들기 ( 6자리)
// String certifyNo = numberGen(6, 2);
//
// //메시지 만들기
// String msg = "인증번호 [" + certifyNo + "] 를 입력해 주세요.";
//
//
// //기존 인증 내역 삭제
// String encHpno = EncryptUtils.encrypt(hpno);
// ptyCrtfyhpBasRepository.prevCrtfyhpYnBlock(hpno);
//
// //인증 테이블 입력
// PtyCrtfyhpBas ptyEntity = new PtyCrtfyhpBas();
// ptyEntity.setHpno(hpno);
// ptyEntity.setCrtfyhpNo(certifyNo);
// ptyEntity.setCrtfyhpYn("N");
// ptyCrtfyhpBasRepository.save(ptyEntity);
//
// return true;
// }
public boolean registerSend(String hpno) throws Exception{
//인증번호 만들기 ( 6자리)
String certifyNo = numberGen(6, 2);
//메시지 만들기
String msg = "인증번호 [" + certifyNo + "] 를 입력해 주세요.";
//기존 인증 내역 삭제
// String encHpno = EncryptUtils.encrypt(hpno);
ptyCrtfyhpBasRepository.prevCrtfyhpYnBlock(hpno);
//인증 테이블 입력
PtyCrtfyhpBas ptyEntity = new PtyCrtfyhpBas();
ptyEntity.setHpno(hpno);
ptyEntity.setCrtfyhpNo(certifyNo);
ptyEntity.setCrtfyhpYn("N");
ptyCrtfyhpBasRepository.save(ptyEntity);
logger.info("certifyNo :: " + certifyNo);
//발송 테이블 입력
SuredataEntity entity = new SuredataEntity();
entity.setCallphone(hpno);
entity.setMsg(msg);
entity.setSubject(SUBJECT_CETIFY);
entity.setCallname(CALLNAME_CERTIFY);
entity.setUsercode(USER_CODE);
entity.setDeptcode(DEPT_CODE);
entity.setReqphone(REQ_PHONE);
entity.setReqname(REQ_NAME);
entity.setReqtime(REQ_TIME);
entity.setResult(RESULT);
entity.setKind(KIND);
SuredataEntity result = sureDataRepository.save(entity);
if(result == null) {
return false;
}
return true;
}
public boolean registerConfirm(String hpno , String crtfyNo ) throws Exception{
hpno = EncryptUtils.encrypt(hpno); //암호화 해서 검색
List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo);
return entity.size() == 0 ? false : true;
}
public static String numberGen(int len, int dupCd){
Random rand = new Random();
String numStr = ""; //난수가 저장될 변수
for(int i = 0; i < len; i++){
//0~9 까지 난수 생성
String ran = Integer.toString(rand.nextInt(10));
if(dupCd == 1){
//중복 허용시 numStr에 append
numStr += ran;
}else if(dupCd == 2){
//중복을 허용하지 않을시 중복된 값이 있는지 검사한다
if(!numStr.contains(ran)){
//중복된 값이 없으면 numStr에 append
numStr += ran;
}else{
//생성된 난수가 중복되면 루틴을 다시 실행한다
i -= 1;
}
}
}
return numStr;
}
public boolean certifNum(String memberName, String hpno) throws Exception{
String name = EncryptUtils.encrypt(memberName);
String phone = EncryptUtils.encrypt(hpno);
boolean certifNum = cstmrQuery.certifNum(name , phone);
if(certifNum) {
registerSend(hpno);
}
return certifNum;
}
public String findUserId(String memberName, String hpno) throws Exception{
String name = EncryptUtils.encrypt(memberName);
String phone = EncryptUtils.encrypt(hpno);
String resultFindId = cstmrQuery.findUserId(name,phone);
return resultFindId;
}
public boolean certifPw(String userId, String hpno) throws Exception{
String phone = EncryptUtils.encrypt(hpno);
PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone);
boolean result = false;
if(certifNum != null) {
registerSend(hpno);
result = true;
}
return result;
}
public boolean updatePw(String userId, String hpno, String newPw) throws Exception{
String phone = EncryptUtils.encrypt(hpno);
PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone);
boolean result = false;
if(certifNum != null) {
String encryptPw = EncryptUtils.sha256Encrypt(newPw);
certifNum.setUserPswd(encryptPw);
certifNum.setPswdUpdtDt(DateUtils.nowDate());
ptyCstmrBasRepository.save(certifNum);
result = true;
}
return result;
}
}

198
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java

@ -0,0 +1,198 @@
package com.palnet.biz.api.acnt.cstmr.controller;
import java.security.Principal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrGroupModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel;
import com.palnet.biz.api.acnt.cstmr.service.AcntCstmrService;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
import com.palnet.biz.api.anls.hstry.service.AnlsHstryService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.api.ctr.cntrl.service.CtrCntrlService;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrDtl;
import com.palnet.biz.sample.entity.SampleEntity;
import com.palnet.biz.sample.service.SampleService;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.model.GPHistoryModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/cstmr", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "회원관리", description = "회원 관련 API")
public class AcntCstmrController {
@Autowired
private final AcntCstmrService service;
@PostMapping(value = "/register")
@ApiOperation(value = "회원 가입")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> register(@RequestBody AcntCstmrRqModel rq) {
AcntCstmrRsModel result;
// log.debug("RQ>>>>>>>>" , rq.toString());
try {
// result = service.list(rq);
result = service.register(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<AcntCstmrRsModel>(result));
}
@GetMapping(value = "/profile/{cstmrSno}")
@ApiOperation(value = "회원 정보")
@Tag(name = "회원관리", description = "회원 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mypage(@PathVariable Integer cstmrSno){
List<AnctCstmerRlModel> result = null;
try {
result = service.list(cstmrSno);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
@PostMapping(value = "/profile/pswdupdate")
@ApiOperation(value = "회원 패스워드 변경")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> passwordupdate(@RequestBody AcntCstmrPwModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
PtyCstmrBas result = service.updatepas(rq);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGONE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
@PostMapping(value = "/profile/pwcheck")
@ApiOperation(value = "회원 기존 패스워드 확인")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> extendpsw(@RequestBody Map<String,String> userPswdMap){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = service.extendpsw(userPswdMap.get("userPswd"));
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGONE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
@PutMapping(value = "/profile/update")
@ApiOperation(value = "회원 정보 변경 (이메일,핸드폰)")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> updateEmail(@RequestBody AcntCstmrEmModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
PtyCstmrDtl result = service.updateEmail(rq);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGONE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
@PostMapping(value = "/profile/delete/{cstmrSno}")
@ApiOperation(value = "회원 탈퇴")
@Tag(name = "회원관리", description = "회원 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> userDelete(@PathVariable Integer cstmrSno){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = service.userDelete(cstmrSno);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
}

21
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.acnt.cstmr.model;
import java.util.Date;
import lombok.Data;
@Data
public class AcntCstmrEmModel {
private String email;
private Date updateDt;
private String updateUserId;
private int cstmrSno;
private String hpno;
}

17
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrGroupModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
@Data
public class AcntCstmrGroupModel {
private Integer cstmrSno;
private String userId;
private String groupId;
private String groupNm;
private String groupAuthCd;
private Integer arcrftSno;
private String idntfNum;
private String createUserId;
}

17
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.acnt.cstmr.model;
import java.util.Date;
import lombok.Data;
@Data
public class AcntCstmrPwModel {
private Date pswdupdtDt;
private String userPswd;
private String newPswd;
private String newPswdConfirm;
}

48
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java

@ -0,0 +1,48 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
@Data
public class AcntCstmrRqModel{
private String cstrmDivCd;
private String cstrmStatusCd;
private String userId;
private String authId;
private String siteCode;
private String memberDivCd;
private String userPswd;
private String ipinDi;
private String ipinCi;
private String joinCrtfyCd;
private String cntryCd;
private String genderCd;
private String memberName;
private String brthdyDate;
private String email;
private String hpno;
private String clncd;
private AnctCstmrTermsModel[] terms;
private String trmnlId;
}

13
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRsModel.java

@ -0,0 +1,13 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
@Data
public class AcntCstmrRsModel{
private int errCode; // 1 : 성공 , -1 : 가입된 ID 존재 , -2 : 동일한 이메일 존재 , -3 동일한 휴대폰번호 존재
private String loginId; // 가입 성공된 ID 전달
}

28
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java

@ -0,0 +1,28 @@
package com.palnet.biz.api.acnt.cstmr.model;
import java.util.Date;
import lombok.Data;
@Data
public class AnctCstmerRlModel {
private String memberName;
private Date brthdyDate;
private String genderCd;
private String cntryCd;
private String email;
private String hpno;
private String userId;
private Date updateDt;
private String updateuserId;
}

9
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java

@ -0,0 +1,9 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
@Data
public class AnctCstmrTermsModel {
private int termsSno;
private String agreeYn;
}

321
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java

@ -0,0 +1,321 @@
package com.palnet.biz.api.acnt.cstmr.service;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel;
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 com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrDtl;
import com.palnet.biz.jpa.entity.PtyCstmrGroup;
import com.palnet.biz.jpa.entity.PtyGroupBas;
import com.palnet.biz.jpa.entity.PtyTermsAgreeTxn;
import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrDtlRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.HttpUtils;
import lombok.extern.log4j.Log4j2;
@Service
@Log4j2
public class AcntCstmrService {
private Logger logger = LoggerFactory.getLogger(getClass());
// @Autowired
// private CtrCntrlBasRepository ctrCntrlBasRepository;
@Autowired
private PtyCstmrQueryRepository query;
@Autowired
private PtyCstmrBasRepository ptyCstmrBasRepository;
@Autowired
private PtyCstmrDtlRepository ptyCstmrDtlRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
@Autowired
private PtyGroupBasRepository ptyGroupBasRepository;
@Autowired
private PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository;
@Autowired
private EntityManagerFactory emf;
@Autowired
private JwtTokenUtil jwtTokenUtil;
/**
*
*
* @param rq
* @return
*/
@Transactional
public AcntCstmrRsModel register(AcntCstmrRqModel rq) throws Exception{
// logger.debug("ddddddd>>>>" + JsonUtils.toJson(rq));
// logger.debug("ddddddd>>>>" + rq.getBrthdyDate());
AcntCstmrRsModel rs = new AcntCstmrRsModel();
boolean isUserIdFind = false;
try {
//사전 체크. 동일한 ID 존재 여부 확인
isUserIdFind = query.findCstmrByUserId(rq.getUserId());
if(isUserIdFind) {
rs.setErrCode(-1);
return rs;
}
rq.setHpno(rq.getHpno().replaceAll("-", ""));
//처리 1. 민감정보 암호화 처리(비밀번호 , 이름 , 휴대폰번호 , 이메일)
rq.setUserPswd(EncryptUtils.sha256Encrypt(rq.getUserPswd()));
// rq.setMemberName(EncryptUtils.encrypt(rq.getMemberName()));
rq.setHpno(EncryptUtils.encrypt(rq.getHpno()));
rq.setEmail(EncryptUtils.encrypt(rq.getEmail()));
rq.setBrthdyDate(rq.getBrthdyDate().replaceAll("-", ""));
//처리 2. 마스터 정보 저장
PtyCstmrBas basEntity = this.savePtyCstmrBas(rq);
if(basEntity == null) {
throw new CustomException(ErrorCode.INTERNAL_SERVER_ERROR);
}
//처리 3. 상세 정보 저장
this.savePtyCstmrDtl(rq ,basEntity );
//처리 4. 약관 동의 정보 저장
if(rq.getTerms() != null && rq.getTerms().length > 0) {
for(AnctCstmrTermsModel agree : rq.getTerms()) {
this.savePtyTermsAgreeTxn(agree , basEntity);
}
}
//성공 파람 담기
if(basEntity != null) {
rs.setErrCode(1);
rs.setLoginId(basEntity.getUserId());
}
}catch(Exception e) {
log.error("IGNORE : {}", e);
rs.setErrCode(-2);
return rs;
}
return rs;
}
public PtyCstmrBas savePtyCstmrBas(AcntCstmrRqModel rq) throws Exception{
PtyCstmrBas basEntity = new PtyCstmrBas();
basEntity.setCstmrDivCd(rq.getCstrmDivCd());
basEntity.setCstmrStatusCd(rq.getCstrmStatusCd());
basEntity.setUserId(rq.getUserId());
basEntity.setAuthId(rq.getAuthId());
basEntity.setSiteCode(rq.getSiteCode());
basEntity.setMemberDivCd(rq.getMemberDivCd());
basEntity.setUserPswd(rq.getUserPswd());
basEntity.setJoinDt(DateUtils.nowDate());
basEntity.setJoinIp(HttpUtils.getRequestIp());
basEntity.setTrmnlId(rq.getTrmnlId());
return ptyCstmrBasRepository.save(basEntity);
}
public PtyCstmrDtl savePtyCstmrDtl(AcntCstmrRqModel rq , PtyCstmrBas basEntity) throws Exception{
PtyCstmrDtl dtlEntity = new PtyCstmrDtl();
dtlEntity.setCstmrSno(basEntity.getCstmrSno());
dtlEntity.setIpinCi(rq.getIpinCi());
dtlEntity.setIpinDi(rq.getIpinDi());
dtlEntity.setJoinCrtfyCd(rq.getJoinCrtfyCd());
dtlEntity.setCntryCd(rq.getCntryCd());
dtlEntity.setGenderCd(rq.getGenderCd());
dtlEntity.setMemberName(rq.getMemberName());
dtlEntity.setBrthdyDate(DateUtils.stringToDate(rq.getBrthdyDate()));
dtlEntity.setEmail(rq.getEmail());
dtlEntity.setHpno(rq.getHpno());
dtlEntity.setClncd(rq.getClncd());
dtlEntity.setUpdateDt(DateUtils.nowDate());
dtlEntity.setUpdateUserId(rq.getUserId());
return ptyCstmrDtlRepository.save(dtlEntity);
}
public PtyTermsAgreeTxn savePtyTermsAgreeTxn(AnctCstmrTermsModel agree , PtyCstmrBas basEntity) throws Exception{
PtyTermsAgreeTxn agreeEntity = new PtyTermsAgreeTxn();
agreeEntity.setCstmrSno(basEntity.getCstmrSno());
agreeEntity.setProcIp(HttpUtils.getRequestIp());
agreeEntity.setTermsSno(agree.getTermsSno());
agreeEntity.setUpdateDt(DateUtils.nowDate());
agreeEntity.setUpdateUserId(basEntity.getUserId());
agreeEntity.setAgreeYn(agree.getAgreeYn());
if(agree.getAgreeYn().equals("Y")) {
agreeEntity.setAgreeDt(DateUtils.nowDate());
}
return ptyTermsAgreeTxnRepository.save(agreeEntity);
}
public List<AnctCstmerRlModel> list(int cstmrSno) {
List<AnctCstmerRlModel> resultList = query.list(cstmrSno);
for(AnctCstmerRlModel model : resultList) {
model.setEmail(EncryptUtils.decrypt(model.getEmail()));
// model.setMemberName(EncryptUtils.decrypt(model.getMemberName()));
model.setHpno(EncryptUtils.decrypt(model.getHpno()));
}
return resultList;
}
public PtyCstmrBas updatepas(AcntCstmrPwModel rq) {
// 1. 토큰 유저 정보 불러오기
Integer userId = jwtTokenUtil.getCstmrSnoByToken();
// 2. DB의 유저정보 조회
PtyCstmrBas userEntity = ptyCstmrBasRepository.findById(userId).orElse(null);
// 5. 새로운 비밀번호 검증
if(!rq.getNewPswd().equals(rq.getNewPswdConfirm())) {
// 5.e 새로운 비밀번호 일치하지 않으면 예외처리
throw new CustomException(ErrorCode.FAIL); //임시...수정필요
}
// 6. 새로운 패스워드 암호화
String encryptNewPwd = EncryptUtils.sha256Encrypt(rq.getNewPswd());
// 7. 유저 정보 저장
userEntity.setUserPswd(encryptNewPwd);
userEntity.setPswdUpdtDt(DateUtils.nowDate());
PtyCstmrBas updateUserEntity = ptyCstmrBasRepository.save(userEntity);
return updateUserEntity;
}
public boolean extendpsw(String userPswd){
boolean result = false;
// 1. 토큰 유저 정보 불러오기
Integer userId = jwtTokenUtil.getCstmrSnoByToken();
// 2. DB의 유저정보 조회
// AcntCstmrRqModel result = query.findpassword(userId);
PtyCstmrBas userEntity = ptyCstmrBasRepository.findById(userId).orElse(null);
// 3. RQ의 유저 패스워드를 암호화 처리
if(userPswd != null && !userPswd.isEmpty()){
userPswd = EncryptUtils.sha256Encrypt(userPswd);
}
// 4. RQ의 암호화한 패스워드와 DB에서 조회한 유저의 패스워드랑 비교
if(!userPswd.equals(userEntity.getUserPswd())) {
log.info("USERPSWD 비밀번호 : {}, DB 비밀번호 : {}", userPswd, userEntity.getUserPswd());
// 4.e 일치하지 않으면 예외처리 (패스워드 불일치)
throw new CustomException(ErrorCode.FAIL); // 임시,, 수정해야함
}
userEntity.setUserPswd(userPswd);
PtyCstmrBas extendsPwd = ptyCstmrBasRepository.save(userEntity);
result=true;
return result;
}
public PtyCstmrDtl updateEmail(AcntCstmrEmModel rq) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
String userId = jwtTokenUtil.getUserIdByToken();
String newEmail = EncryptUtils.encrypt(rq.getEmail());
String newHpno = EncryptUtils.encrypt(rq.getHpno());
PtyCstmrDtl userEntity = ptyCstmrDtlRepository.findById(cstmrSno).orElse(null);
userEntity.setEmail(newEmail);
userEntity.setUpdateDt(DateUtils.nowDate());
userEntity.setUpdateUserId(userId);
userEntity.setHpno(newHpno);
PtyCstmrDtl updateEmailEntity = ptyCstmrDtlRepository.save(userEntity);
return updateEmailEntity;
}
public boolean userDelete(int cstmrSno) {
List<JwtGroupModel> groupInfo = jwtTokenUtil.getGroupAuthByToken();
for(JwtGroupModel group : groupInfo) {
// if(group.getGroupAuthCd().equals("CREATER")) {
if(group.getGroupAuthCd().equals("MASTER")) {
PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId());
if(!(groupEntity == null)) {
groupEntity.setUseYn("N");
ptyGroupBasRepository.save(groupEntity);
}
List<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
if(!(cstmrEntity == null)) {
for(PtyCstmrGroup cstmr : cstmrEntity) {
cstmr.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmr);
}
}
}
List<PtyCstmrGroup> AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno);
if(!(AprvlEntity == null)) {
for(PtyCstmrGroup Aprvl : AprvlEntity) {
Aprvl.setAprvlYn("N");
Aprvl.setAprvlDt(null);
ptyCstmrGroupRepository.save(Aprvl);
}
PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno);
if(!(cstmrEntity == null)) {
cstmrEntity.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmrEntity);
}
}
}
PtyCstmrBas userEntity = ptyCstmrBasRepository.findByUserGroupId(cstmrSno);
userEntity.setCstmrStatusCd("W");
userEntity.setCstmrStatusCngDt(DateUtils.nowDate());
ptyCstmrBasRepository.save(userEntity);
boolean result = true;
return result;
}
}

151
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java

@ -0,0 +1,151 @@
package com.palnet.biz.api.acnt.jwt.controller;
import java.util.HashMap;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRqModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import com.palnet.biz.api.acnt.jwt.service.JwtService;
import com.palnet.biz.api.acnt.jwt.service.JwtUserDetailsService;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@RestController
@RequiredArgsConstructor
@Log4j2
@RequestMapping(value = "/api/acnt/jwt", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
public class JwtAuthenticationController {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private JwtUserDetailsService userDetailsService;
@Autowired
private JwtService service;
@PostMapping(value = "/login")
@ApiOperation(value = "로그인")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
public ResponseEntity<? extends BasicResponse> createAuthenticationToken(@RequestBody JwtRqModel authenticationRequest) throws Exception {
Map<String , Object> resultMap = service.loginProcess(authenticationRequest);
int loginError = (int) resultMap.get("loginError");
if(loginError < 0) {
String errorMessage = (String) resultMap.get("errorMessage");
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(errorMessage, loginError + "")); // 계정 사용하지 못함
}else {
JwtRsModel result = (JwtRsModel) resultMap.get("result");
return ResponseEntity.ok().body(new SuccessResponse<JwtRsModel>(result));
}
}
@GetMapping(value = "/profile/{cstmrSno}")
@ApiOperation(value = "로그인한 회원의 정보")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> proflie(@PathVariable Integer cstmrSno) throws Exception{
JwtProfileRsModel result = service.profile(cstmrSno);
if(result == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}
return ResponseEntity.ok().body(new SuccessResponse<JwtProfileRsModel>(result));
}
@PostMapping(value = "/refresh")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
// public ResponseEntity<? extends BasicResponse> refresh(@RequestParam("cstmrSno") int cstmrSno , @RequestParam("refreshToken") String refreshToken) throws Exception{
public ResponseEntity<? extends BasicResponse> refresh(@RequestBody Map body) throws Exception{
//입력값 검증
if(body.get("cstmrSno") == null || body.get("refreshToken") == null || !(body.get("cstmrSno") instanceof Integer)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
int cstmrSno = (int)body.get("cstmrSno");
String refreshToken = (String)body.get("refreshToken");
JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken);
// JwtRsModel result = null;
if(result ==null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}
return ResponseEntity.ok().body(new SuccessResponse<JwtRsModel>(result));
}
@GetMapping(value = "/logout/{cstmrSno}")
@ApiOperation(value = "로그아웃 한 회원의 정보")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> logout(@PathVariable Integer cstmrSno) throws Exception{
// if(cstmrSno == null || !(body.get("cstmrSno") instanceof Integer)) {
// return ResponseEntity.status(HttpStatus.OK)
// .body(new ErrorResponse(RSErrorCode.ER_PARAM));
// }
// int cstmrSno = (int)body.get("cstmrSno");
PtyCstmrBas bas = service.logoutProcess(cstmrSno);
if(bas == null) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}
return ResponseEntity.ok().body(new SuccessResponse<RSErrorCode>(RSErrorCode.SUCCESS));
}
}

25
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/filter/JwtAuthenticationEntryPoint.java

@ -0,0 +1,25 @@
package com.palnet.biz.api.acnt.jwt.filter;
import java.io.IOException;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
//허가되지 않은 사용자라면, 접근 불가 메세지를 띄워 리소스 정보획득을 못하게 막아줍니다.
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable {
private static final long serialVersionUID = -7858869558953243875L;
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
}

96
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/filter/JwtRequestFilter.java

@ -0,0 +1,96 @@
package com.palnet.biz.api.acnt.jwt.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import com.palnet.biz.api.acnt.jwt.service.JwtUserDetailsService;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import io.jsonwebtoken.ExpiredJwtException;
import lombok.extern.log4j.Log4j2;
//프론트엔드에서 매순간 request를 요청 할 때마다 이 필터를 먼저 거침
@Component
@Log4j2
public class JwtRequestFilter extends OncePerRequestFilter {
@Autowired
private JwtUserDetailsService jwtUserDetailsService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Value("${spring.jwt.prefix}")
private String JWT_PREFIX;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
// logger.info("access request uri :: " + request.getRequestURI());
// logger.info("access remote host :: " + request.getRemoteHost());
final String requestTokenHeader = request.getHeader("Authorization");
String username = null;
String jwtToken = null;
// JWT Token is in the form "Bearer token". Remove Bearer word and get
// only the Token
// log.debug("==============================================================================");
// log.debug(requestTokenHeader);
// log.debug("==============================================================================");
if (requestTokenHeader != null && requestTokenHeader.startsWith(JWT_PREFIX)) {
jwtToken = requestTokenHeader.substring(7);
try {
username = jwtTokenUtil.getUsernameFromToken(jwtToken);
} catch (IllegalArgumentException e) {
log.warn("Unable to get JWT Token");
} catch (ExpiredJwtException e) {
log.warn("JWT Token has expired");
}
} else {
// logger.debug(">>>" + requestTokenHeader);
// logger.warn("JWT Token is Error ");
// logger.warn("Request URI : "+ request.getRequestURI());
}
// log.debug(">>>>>>>>>>" + username);
// Once we get the token validate it.
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username);
// if token is valid configure Spring Security to manually set
// authentication
if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken
.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// After setting the Authentication in the context, we specify
// that the current user is authenticated. So it passes the
// Spring Security Configurations successfully.
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}
chain.doFilter(request, response);
}
}

9
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtGroupModel.java

@ -0,0 +1,9 @@
package com.palnet.biz.api.acnt.jwt.model;
import lombok.Data;
@Data
public class JwtGroupModel {
private String groupId;
private String groupAuthCd;
}

19
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java

@ -0,0 +1,19 @@
package com.palnet.biz.api.acnt.jwt.model;
import lombok.Data;
@Data
public class JwtProfileRsModel {
private int cstmrSno;
private String authId;
private String siteCode;
private String userId;
private String memberName;
private String trmnlId;
}

20
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java

@ -0,0 +1,20 @@
package com.palnet.biz.api.acnt.jwt.model;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class JwtRqModel implements Serializable {
private static final long serialVersionUID = 5926468583005150707L;
private String userId;
private String userPswd;
}

21
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.acnt.jwt.model;
import java.io.Serializable;
import lombok.Data;
@Data
public class JwtRsModel implements Serializable {
private String accessToken ;
private String refreshToken;
private String userId;
private Integer cstmrSno;
private String auth;
}

98
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java

@ -0,0 +1,98 @@
package com.palnet.biz.api.acnt.jwt.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import java.util.*;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JwtUserModel implements UserDetails {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "CSTMR_SNO", unique = true)
private Integer cstmrSno;
@Column(name = "USER_ID", unique = true)
private String userId;
@Column(name = "USER_PSWD")
private String userPswd;
@Column(name = "SITE_CODE")
private String siteCode;
@Column(name = "AUTH_ID")
private String auth;
@Column(name = "CSTMR_STATUS_CD")
private String cstmrStatusCd;
@Transient
private List<JwtGroupModel> group;
// 사용자의 권한을 콜렉션 형태로 반환
// 단, 클래스 자료형은 GrantedAuthority를 구현해야함
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> roles = new HashSet<>();
for (String role : auth.split(",")) {
roles.add(new SimpleGrantedAuthority(role));
}
return roles;
}
// 사용자의 id를 반환 (unique한 값)
@Override
public String getUsername() {
return userId;
}
// 사용자의 password를 반환
@Override
public String getPassword() {
return userPswd;
}
// 계정 만료 여부 반환
@Override
public boolean isAccountNonExpired() {
// 만료되었는지 확인하는 로직
return true; // true -> 만료되지 않았음
}
// 계정 잠금 여부 반환
@Override
public boolean isAccountNonLocked() {
// 계정 잠금되었는지 확인하는 로직
if(cstmrStatusCd.equals("A"))
return true;
else
return false;
// return true; // true -> 잠금되지 않았음
}
// 패스워드의 만료 여부 반환
@Override
public boolean isCredentialsNonExpired() {
// 패스워드가 만료되었는지 확인하는 로직
return true; // true -> 만료되지 않았음
}
// 계정 사용 가능 여부 반환
@Override
public boolean isEnabled() {
// 계정이 사용 가능한지 확인하는 로직
return true; // true -> 사용 가능
}
}

237
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java

@ -0,0 +1,237 @@
package com.palnet.biz.api.acnt.jwt.service;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.acnt.cstmr.service.AcntCstmrService;
import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRqModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.CtrCntrlBas;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrConectHist;
import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrConectHistRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.HttpUtils;
import lombok.extern.log4j.Log4j2;
@Service
@Log4j2
public class JwtService {
@Autowired
private PtyCstmrBasRepository ptyCstmrBasRepository;
@Autowired
private PtyCstmrConectHistRepository ptyCstmrConectHistRepository;
@Autowired
private JwtUserDetailsService userDetailsService;
@Autowired
private PtyCstmrQueryRepository query ;
@Autowired
private JwtTokenUtil jwtTokenUtil;
/**
* 로그인 처리
* @param rq
* @return
*/
public Map<String , Object> loginProcess(JwtRqModel rq) throws Exception{
int loginError = 1; // -100 : 아이디/비밀번호가 없습니다 , -101 : 계정정보를 찾을수 없습니다 , -102 : 비밀번호가 잘못 되었습니다 , -103 : 계정을 사용할수 없습니다.
Map<String , Object> resultMap = new HashMap<String , Object>();
//입력값 검증 처리
if(StringUtils.isEmpty(rq.getUserId()) || StringUtils.isEmpty(rq.getUserPswd())) {
loginError = -100;
}
JwtUserModel userDetails = (JwtUserModel)userDetailsService
.loadUserByUsername(rq.getUserId());
//계정이 없는경우
if(userDetails == null) {
loginError = -101;
}else{
String password = EncryptUtils.sha256Encrypt(rq.getUserPswd());
//비밀번호 검증 처리
if (!userDetails.getPassword().equals(password)) {
loginError = -102;
}
//계정 검증로직
if(!userDetails.isAccountNonLocked() || !userDetails.isAccountNonExpired() || !userDetails.isEnabled() || !userDetails.isCredentialsNonExpired()) {
loginError = -103;
}
}
if(loginError < 0) {
String errorMessage = "";
if(loginError == -100) {
errorMessage = "Please parameter Check";
}else if(loginError == -101) {
errorMessage = "Account not found";
}else if(loginError == -102) {
errorMessage = "Password does not match";
}else if(loginError == -103) {
errorMessage = "Account is unavailable";
}
//실패 이력 저장
//cstmrSno , String loginYn , String errorCode
if(userDetails != null) {
this.historySave(userDetails.getCstmrSno(), "N", loginError+"");
}
resultMap.put("loginError", loginError);
resultMap.put("errorMessage", errorMessage);
return resultMap;
}else {
String accessToken = jwtTokenUtil.generateToken(userDetails);
String refreshToken = jwtTokenUtil.generateRefreshToken(userDetails);
JwtRsModel result = new JwtRsModel();
result.setAccessToken(accessToken);
result.setRefreshToken(refreshToken);
result.setAuth(userDetails.getAuth());
result.setUserId(userDetails.getUserId());
result.setCstmrSno(userDetails.getCstmrSno());
//토큰 저장 처리
log.debug("========= refresh>>>>" + refreshToken);
this.refreshTokenSave(userDetails.getCstmrSno(), refreshToken);
//성공이력 저장
this.historySave(userDetails.getCstmrSno(), "Y", loginError+"");
resultMap.put("loginError", loginError);
resultMap.put("errorMessage", "");
resultMap.put("result", result);
return resultMap;
}
}
public PtyCstmrBas logoutProcess(int cstmrSno) throws Exception{
Optional<PtyCstmrBas> optional = ptyCstmrBasRepository.findById(cstmrSno);
if (optional.isPresent()) {
PtyCstmrBas entity = optional.get();
entity.setRfrshToken("");
return ptyCstmrBasRepository.save(entity);
}else {
return null;
}
}
/**
* 로그인 이력 저장
* @param cstmrSno
* @param loginYn
* @param errorCode
* @return
* @throws Exception
*/
public PtyCstmrConectHist historySave(int cstmrSno , String loginYn , String errorCode) throws Exception{
String conectIp = HttpUtils.getRequestIp();
PtyCstmrConectHist entity = new PtyCstmrConectHist();
entity.setCstmrSno(cstmrSno);
entity.setConectSucesYn(loginYn);
entity.setConectErrorCd(errorCode);
entity.setConectIp(conectIp);
entity.setConectDt(DateUtils.nowDate());
return ptyCstmrConectHistRepository.save(entity);
}
/**
* refresh Token 저장 처리
* @param cstmrSno
* @param refreshToken
* @return
* @throws Exception
*/
public PtyCstmrBas refreshTokenSave(int cstmrSno , String refreshToken) throws Exception{
Optional<PtyCstmrBas> optional = ptyCstmrBasRepository.findById(cstmrSno);
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyCstmrBas entity = optional.get();
entity.setRfrshToken(refreshToken);
return ptyCstmrBasRepository.save(entity);
}
/**
* 프로필 조회
* @param cstmrSno
* @return
* @throws Exception
*/
public JwtProfileRsModel profile(int cstmrSno) throws Exception{
JwtProfileRsModel model = query.findUserProfile(cstmrSno);
// model.setMemberName(EncryptUtils.decrypt(model.getMemberName()));
return model;
}
/**
* token 만료시 refresh 토큰으로 재검색
* @param cstmrSno
* @param refreshToken
* @return
*/
public JwtRsModel findRefreshtoken(int cstmrSno , String refreshToken) {
JwtUserModel userDetails = query.findRefreshtoken(cstmrSno, refreshToken);
if(userDetails == null) {
return null;
}
String accessToken = jwtTokenUtil.generateToken(userDetails);
JwtRsModel result = new JwtRsModel();
result.setAccessToken(accessToken);
result.setRefreshToken(refreshToken);
result.setAuth(userDetails.getAuth());
result.setUserId(userDetails.getUserId());
result.setCstmrSno(userDetails.getCstmrSno());
return result;
}
}

41
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtUserDetailsService.java

@ -0,0 +1,41 @@
package com.palnet.biz.api.acnt.jwt.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.comn.utils.JsonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Service
@RequiredArgsConstructor
@Log4j2
public class JwtUserDetailsService implements UserDetailsService{
@Autowired
private PtyCstmrQueryRepository query ;
@Autowired
private PtyCstmrBasRepository repository;
@Override
public JwtUserModel loadUserByUsername(String username){
JwtUserModel model = query.findUserPassword(username);
// log.debug("jwtUser>>>>" + JsonUtils.toJson(model));
if(model == null) {
return null;
}else {
return model;
}
}
}

166
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java

@ -0,0 +1,166 @@
package com.palnet.biz.api.acnt.jwt.utils;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
@Component
@Log4j2
public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L;
public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; // 5시간
// public static final long JWT_TOKEN_VALIDITY = 10; // 10초
public static final long JWT_REFRESH_TOKEN_VALIDTY = 21* 24 * 60 * 60; //21일
@Value("${spring.jwt.secret}")
private String secret;
@Value("${spring.jwt.prefix}")
private String JWT_PREFIX;
//retrieve username from jwt token
// jwt token으로부터 username을 획득한다.
public String getUsernameFromToken(String token) {
return getClaimFromToken(token, Claims::getSubject);
}
//retrieve expiration date from jwt token
// jwt token으로부터 만료일자를 알려준다.
public Date getExpirationDateFromToken(String token) {
return getClaimFromToken(token, Claims::getExpiration);
}
public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
final Claims claims = getAllClaimsFromToken(token);
return claimsResolver.apply(claims);
}
//for retrieveing any information from token we will need the secret key
private Claims getAllClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}
//check if the token has expired
// 토큰이 만료되었는지 확인한다.
private Boolean isTokenExpired(String token) {
final Date expiration = getExpirationDateFromToken(token);
// log.debug(">>>" + expiration);
return expiration.before(new Date());
}
//generate token for user
// 유저를 위한 토큰을 발급해준다.
public String generateToken(JwtUserModel userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userDetails.getUserId());
claims.put("cstmrSno", userDetails.getCstmrSno());
claims.put("auth", userDetails.getAuth());
claims.put("group", userDetails.getGroup());
return doGenerateToken(claims, userDetails.getUsername());
}
public String generateRefreshToken(JwtUserModel userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userDetails.getUserId());
claims.put("cstmrSno", userDetails.getCstmrSno());
return doGenerateRefreshToken(claims, userDetails.getUsername());
}
//while creating the token -
//1. Define claims of the token, like Issuer, Expiration, Subject, and the ID
//2. Sign the JWT using the HS512 algorithm and secret key.
//3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1)
// compaction of the JWT to a URL-safe string
private String doGenerateToken(Map<String, Object> claims, String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
private String doGenerateRefreshToken(Map<String , Object> claims , String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_REFRESH_TOKEN_VALIDTY * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
//validate token
public Boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
public String getUserIdByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
String userId = getUsernameFromToken(token);
return userId;
}
public Integer getCstmrSnoByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
Integer cstmrSno = payload.get("cstmrSno",Integer.class);
return cstmrSno;
}
public List<JwtGroupModel> getGroupAuthByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
List<LinkedHashMap> groupList = payload.get("group", ArrayList.class);
List<JwtGroupModel> r = new ArrayList<>();
if(groupList!=null) {
for(LinkedHashMap<String, String> map : groupList){
JwtGroupModel model = new JwtGroupModel();
model.setGroupId(map.get("groupId"));
model.setGroupAuthCd(map.get("groupAuthCd"));
r.add(model);
}
}
return r;
}
public String getUserAuthByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
return payload.get("auth", String.class);
}
}

74
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java

@ -0,0 +1,74 @@
package com.palnet.biz.api.acnt.terms.controller;
import java.util.List;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.terms.model.AcntTermsRqModel;
import com.palnet.biz.api.acnt.terms.model.AcntTermsRsModel;
import com.palnet.biz.api.acnt.terms.service.AcntTermsService;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
import com.palnet.biz.api.anls.hstry.service.AnlsHstryService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.api.ctr.cntrl.service.CtrCntrlService;
import com.palnet.biz.sample.entity.SampleEntity;
import com.palnet.biz.sample.service.SampleService;
import com.palnet.comn.model.GPHistoryModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/terms", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "약관 기본", description = "약관 관련 API")
public class AcntTermsController {
@Autowired
private final AcntTermsService service;
@GetMapping(value = "/list")
@Tag(name = "약관 기본", description = "약관 관련 API")
@ApiOperation(value = "약관 기본 정보")
public ResponseEntity<? extends BasicResponse> list(AcntTermsRqModel rq) {
List<AcntTermsRsModel> result = null;
log.debug("RQ>>>>>>>>" , rq.toString());
try {
result = service.list(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
}

11
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java

@ -0,0 +1,11 @@
package com.palnet.biz.api.acnt.terms.model;
import lombok.Data;
@Data
public class AcntTermsRqModel{
private String siteCd;
private String langDivCd;
}

26
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRsModel.java

@ -0,0 +1,26 @@
package com.palnet.biz.api.acnt.terms.model;
import java.util.Date;
import lombok.Data;
@Data
public class AcntTermsRsModel{
private int termsSno ;
private String siteCd;
private Date estbshDate;
private String termsCtgryCd;
private String langDivCd;
private String termsTitleNm;
private String termsCn;
private String simpleCn;
}

35
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java

@ -0,0 +1,35 @@
package com.palnet.biz.api.acnt.terms.service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.acnt.terms.model.AcntTermsRqModel;
import com.palnet.biz.api.acnt.terms.model.AcntTermsRsModel;
import com.palnet.biz.jpa.repository.pty.PtyTermsQueryRepository;
@Service
public class AcntTermsService {
private Logger logger = LoggerFactory.getLogger(getClass());
// @Autowired
// private CtrCntrlBasRepository ctrCntrlBasRepository;
@Autowired
private PtyTermsQueryRepository query;
public List<AcntTermsRsModel> list(AcntTermsRqModel rq){
List<AcntTermsRsModel> resultList = query.list(rq);
return resultList;
}
}

112
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java

@ -0,0 +1,112 @@
package com.palnet.biz.api.anls.hstry.controller;
import java.util.List;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryGroupModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRsModel;
import com.palnet.biz.api.anls.hstry.service.AnlsHstryService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.JsonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/anls/hstry", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
public class AnlsHstryController {
@Autowired
private final AnlsHstryService service;
@GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록 출력")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryGroupModel rq) {
List<AnlsHstryModel> rs = null;
ComnPagingRs<AnlsHstryModel> response;
//입력값 검증
if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
response = service.list(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(response));
}
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 현황 상세")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
AnlsHstryModel result = null;
try {
result = service.detail(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<AnlsHstryModel>(result));
}
@GetMapping(value = "/log/{id}")
@ApiOperation(value = "비행 이력 데이터")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> log(@PathVariable String id) {
List<AnlsHstryDetailModel> result = null;
try {
result = service.hstryList(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
}

47
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryDetailModel.java

@ -0,0 +1,47 @@
package com.palnet.biz.api.anls.hstry.model;
import java.util.Date;
import lombok.Data;
@Data
public class AnlsHstryDetailModel{
private int hstrySno;
private String cntrlId;
private String idntfNum;
private String trmnlId;
private String mssgTypeCd;
private String statusCd;
private Double lat;
private Double lon;
private Double speed;
private String speedType;
private Double heading;
private Double elev;
private String elevType;
private Double mvDstnc;
private Double bttrLvl;
private Double bttrVltg;
private Date trmnlRcvDt;
private Date srvrRcvDt;
}

21
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class AnlsHstryGroupModel extends ComnPagingModel {
private String stDate;
private String endDate;
private String search1;
private String searchType1;
private String groupId;
}

79
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryModel.java

@ -0,0 +1,79 @@
package com.palnet.biz.api.anls.hstry.model;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Id;
import com.palnet.comn.utils.DateUtils;
import io.netty.util.internal.StringUtil;
import lombok.Data;
@Data
public class AnlsHstryModel{
private String cntrlId;
private String idntfNum;
private String statusCd;
private String objectTypeCd;
private Date flghtStDt;
private Date flghtEndDt;
private Date cntrlStDt;
private Date cntrlEndDt;
private Double ttlTime= 0.0;
private String ttlTimeType;
private Double ttlDstnc= 0.0;
private String ttlDstncType;
private Double avrgSpeed = 0.0;
private String avrgSpeedType;
private Double bttrCnsmptn= 0.0;
private String endTypeCd;
private String actnType;
private String area1 = "";
private String area2 = "";
private String area3 = "";
private String zipCd = "";
private String landNm = "";
private String landNum = "";
private String areaType = "";
private String areaNm = "";
private String stArea = "";
private String endArea = "";
private Date createDt;
private Date updateDt;
}

12
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java

@ -0,0 +1,12 @@
package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class AnlsHstryRqModel extends ComnRqModel{
private String cntrlId;
}

83
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRsModel.java

@ -0,0 +1,83 @@
package com.palnet.biz.api.anls.hstry.model;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Id;
import com.palnet.comn.utils.DateUtils;
import io.netty.util.internal.StringUtil;
import lombok.Data;
@Data
public class AnlsHstryRsModel{
private String cntrlId;
private String idntfNum;
private String statusCd;
private String objectTypeCd;
private Date flghtStDt;
private Date flghtEndDt;
private Date cntrlStDt;
private Date cntrlEndDt;
private Double ttlTime= 0.0;
private String ttlTimeType;
private Double ttlDstnc= 0.0;
private String ttlDstncType;
private Double avrgSpeed = 0.0;
private String avrgSpeedType;
private Double bttrCnsmptn= 0.0;
private String endTypeCd;
private String actnType;
private String area1 = "";
private String area2 = "";
private String area3 = "";
private String zipCd = "";
private String landNm = "";
private String landNum = "";
private String areaType = "";
private String areaNm = "";
private String stArea = "";
private String endArea = "";
private String groupId = "";
private int cstmrSno;
private Date createDt;
private Date updateDt;
}

154
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java

@ -0,0 +1,154 @@
package com.palnet.biz.api.anls.hstry.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryGroupModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.jpa.entity.ComIdntfBas;
import com.palnet.biz.jpa.entity.CtrCntrlBas;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository;
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlBasRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlHstryAreaRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
@Service
public class AnlsHstryService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private CtrCntrlBasRepository ctrCntrlBasRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
@Autowired
private ComArcrftBasRepository comArcrftBasRepository;
@Autowired
private ComIdntBasRepository comIdntBasRepository;
@Autowired
private CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository;
@Autowired
private FltPlanBasRepository fltPlanBasRepository;
@Autowired
private FltPlanPilotRepository fltPlanPilotRepository;
@Autowired
private CtrCntrlQueryRepository query;
@Autowired
private JwtTokenUtil jwtTokenUtil;
//비행이력현황 list
public ComnPagingRs<AnlsHstryModel> list(AnlsHstryGroupModel rq){
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
List<JwtGroupModel> groupAuthList = jwtTokenUtil.getGroupAuthByToken();
List<JwtGroupModel> adminAuth = new ArrayList<>();
String groupAuth = null;
String appAuth = jwtTokenUtil.getUserAuthByToken();
PageImpl<AnlsHstryModel>resultList;
ComnPagingRs<AnlsHstryModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) {
for(JwtGroupModel list : groupAuthList) {
if(list.getGroupId().equals(rq.getGroupId())) {
groupAuth = list.getGroupAuthCd();
}
}
}
if("NORMAL".equals(groupAuth)) {
for (JwtGroupModel list : groupAuthList) {
if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) {
adminAuth.add(list);
}
}
List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno);
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno);
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno);
List<FltPlanBas> pilotResult = new ArrayList<>();
for(FltPlanPilot list : pilotList) {
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno());
}
resultList = query.cntrlBasNormalHstryList(rq, pageable, idntfList, basResult, pilotResult);
long total = query.cntrlBasNormalHstryCount(rq, idntfList, basResult, pilotResult);
long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord();
response.setItems(resultList.getContent());
response.setTotal(total);
response.setTotalPage(totalPage);
response.setPage(rq.getPage());
return response;
}
PageImpl<AnlsHstryModel> result = query.listCntrlBasRs(rq, pageable);
long total = query.countCntrlBasRs(rq, cstmrSno);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setTotalPage(totalPage);
response.setPage(rq.getPage());
return response;
}
public AnlsHstryModel detail(String cntrlId) throws Exception{
AnlsHstryModel model = new AnlsHstryModel();
Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
CtrCntrlBas entity = optional.get();
BeanUtils.copyProperties(entity , model);
return model;
}
public List<AnlsHstryDetailModel> hstryList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = query.listCntrlHstryPage(id);
return result;
}
}

160
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java

@ -0,0 +1,160 @@
package com.palnet.biz.api.anls.smlt.controller;
import java.util.List;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
import com.palnet.biz.api.anls.smlt.model.AnlsSmltDetailModel;
import com.palnet.biz.api.anls.smlt.model.AnlsSmltStcsModel;
import com.palnet.biz.api.anls.smlt.service.AnlsSmltService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.JsonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/anls/smlt", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
public class AnlsSmltController {
@Autowired
private final AnlsSmltService service;
/**
* 비행 현황 목록
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryRqModel rq) {
ComnPagingRs<AnlsHstryModel> result = null;
log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq));
log.debug("Param" + rq.getStDate() + "::" + rq.getEndDate());
//입력값 검증
if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.list(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 비행 이력 데이터 조회
* @param rq
* @return
*/
@GetMapping(value = "/hist/{id}")
@ApiOperation(value = "비행 이력 데이터 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> histList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = null;
try {
// result = service.list(rq);
result = service.histList(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 통계 데이터 조회
* @param rq
* @return
*/
@GetMapping(value = "/stcs/{id}")
@ApiOperation(value = "통계 데이터 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> stcsList(@PathVariable String id) {
List<AnlsSmltStcsModel> result = null;
try {
result = service.stcsList(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 비행 상세정보 조회
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 상세정보 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
AnlsSmltDetailModel result = null;
try {
result = service.detail(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<AnlsSmltDetailModel>(result));
}
}

60
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltDetailModel.java

@ -0,0 +1,60 @@
package com.palnet.biz.api.anls.smlt.model;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Id;
import com.palnet.comn.utils.DateUtils;
import io.netty.util.internal.StringUtil;
import lombok.Data;
@Data
public class AnlsSmltDetailModel{
private String cntrlId;
private String idntfNum;
private Date flghtStDt;
private Date flghtEndDt;
private Date cntrlStDt;
private Date cntrlEndDt;
private Double ttlTime= 0.0;
private String ttlTimeType;
private Double ttlDstnc= 0.0;
private String ttlDstncType;
private Double avrgSpeed = 0.0;
private String avrgSpeedType;
private Double bttrCnsmptn= 0.0;
private String stArea = "";
private String endArea = "";
private String arcrftTypeCd = "";
private String prdctNum = "";
private String arcrftModelNm = "";
private String imageUrl = "";
}

46
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltHistModel.java

@ -0,0 +1,46 @@
package com.palnet.biz.api.anls.smlt.model;
import java.util.Date;
import lombok.Data;
@Data
public class AnlsSmltHistModel{
private int hstrySno;
private String cntrlId;
private String trmnlId;
private String mssgTypeCd;
private String statusCd;
private double lat;
private double lon;
private double speed;
private String speedType;
private double heading;
private double elev;
private String elevType;
private double mvDstnc;
private String mvDstncType;
private double bttrLvl;
private double bttrVltg;
private Date trmnlRcvDt;
private Date srvrRcvDt;
}

12
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltRqModel.java

@ -0,0 +1,12 @@
package com.palnet.biz.api.anls.smlt.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class AnlsSmltRqModel extends ComnRqModel{
}

28
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/model/AnlsSmltStcsModel.java

@ -0,0 +1,28 @@
package com.palnet.biz.api.anls.smlt.model;
import lombok.Data;
@Data
public class AnlsSmltStcsModel{
private String dateCd;
private String timeCd;
private Double avrgSpeed;
private String speedType;
private Double avrgElev;
private String elevType;
private Double avrgMvDstnc;
private String mvDstncType;
private Double minBttrLvl;
private Double maxBttrLvl;
}

227
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java

@ -0,0 +1,227 @@
package com.palnet.biz.api.anls.smlt.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRsModel;
import com.palnet.biz.api.anls.smlt.model.AnlsSmltDetailModel;
import com.palnet.biz.api.anls.smlt.model.AnlsSmltStcsModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.ComIdntfBas;
import com.palnet.biz.jpa.entity.CtrCntrlHstryArea;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlBasRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.NumberUtils;
@Service
public class AnlsSmltService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private CtrCntrlBasRepository ctrCntrlBasRepository;
@Autowired
private CtrCntrlQueryRepository query;
@Autowired
private ComIdntBasRepository comIdntBasRepository;
@Autowired
private FltPlanBasRepository fltPlanBasRepository;
@Autowired
private FltPlanPilotRepository fltPlanPilotRepository;
@Autowired
private JwtTokenUtil jwtTokenUtil;
/**
* 비행 현황 목록
* @param rq
* @return
*/
public ComnPagingRs<AnlsHstryModel> list(AnlsHstryRqModel rq){
String appAuth = jwtTokenUtil.getUserAuthByToken();
List<JwtGroupModel> groupAuth = jwtTokenUtil.getGroupAuthByToken();
List<JwtGroupModel> adminAuth = new ArrayList<>();
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
ComnPagingRs<AnlsHstryModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
PageImpl<AnlsHstryModel> result;
List<AnlsHstryModel>resultList = new ArrayList<>();
if("SUPER".equals(appAuth)||"ADMIN".equals(appAuth)) {// App 권한이 수퍼 / 어드민일 경우 목록 전부 표출
long total = resultList.size();
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
result = query.listCntrlBas(rq, pageable);
response.setItems(result.getContent());
response.setTotal(total);
response.setTotalPage(totalPage);
response.setPage(rq.getPage());
return response;
}
if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) {
for (JwtGroupModel list : groupAuth) {
if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) {
adminAuth.add(list);
}
}
}
List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno);
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno);
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno);
List<FltPlanBas> pilotResult = new ArrayList<>();
for(FltPlanPilot list : pilotList) {
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno());
}
result = query.cntrlBasNormalSmltList(rq, pageable, adminAuth, idntfList, basResult, pilotResult); // App 권한은 user이지만 group 권한이 LEADER / MASTER인 그룹이 있는 경우 해당 비행 이력 목록 표출
// group 권한이 Normal인 경우 본인이 작성한 비행계획서의 이력 / 본인이 조종사인 기체 이력/ 본인이 등록한 기체 이력 표출
long total = query.cntrlBasNormalSmltCount(rq, adminAuth, idntfList, basResult, pilotResult);
long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setTotalPage(totalPage);
response.setPage(rq.getPage());
return response;
}
/**
*
* @param rq비행 이력 데이터 조회
* @return
*/
public List<AnlsHstryDetailModel> histList(String id){
List<AnlsHstryDetailModel> resultList = query.listCntrlHstry(id);
//정렬 순서 뒤집기 처리
Collections.reverse(resultList);
return resultList;
}
/**
* 통계 데이터 조회
* @param rq
* @return
*/
public List<AnlsSmltStcsModel> stcsList(String id){
List<AnlsSmltStcsModel> result = query.anlsSmltStcs(id);
//통계 데이터 가공 처리
//소수점 자리 1자리로 컷트
for(AnlsSmltStcsModel model : result) {
model.setAvrgElev(NumberUtils.formatZero2(model.getAvrgElev()));
model.setAvrgMvDstnc(NumberUtils.formatZero2(model.getAvrgMvDstnc()));
model.setAvrgSpeed(NumberUtils.formatZero2(model.getAvrgSpeed()));
}
return result;
}
/**
* 비행 상세정보 조회
* @param cntrlId
* @return
* @throws Exception
*/
public AnlsSmltDetailModel detail(String cntrlId) throws Exception{
AnlsSmltDetailModel result = new AnlsSmltDetailModel();
result = query.anlsSmltDetail(cntrlId);
// Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
//
// if (!optional.isPresent()) {
// throw new CustomException(ErrorCode.DATA_NOTFIND);
// }
//
// CtrCntrlBas entity = optional.get();
//
// BeanUtils.copyProperties(entity , result);
List<CtrCntrlHstryArea> areaList = query.detailArea(cntrlId);
for(CtrCntrlHstryArea area : areaList) {
if(area != null) {
String areaNm = "";
if(!StringUtils.isEmpty(area.getArea1())) {
areaNm = areaNm + " " + area.getArea1();
}
if(!StringUtils.isEmpty(area.getArea2())) {
areaNm = areaNm + " " + area.getArea2();
}
if(!StringUtils.isEmpty(area.getArea3())) {
areaNm = areaNm + " " + area.getArea3();
}
if(!StringUtils.isEmpty(area.getLandNm())) {
areaNm = areaNm + " " + area.getLandNm();
}
if(!StringUtils.isEmpty(area.getLandNum())) {
areaNm = areaNm + " " + area.getLandNum();
}
if(area.getActnType().equals("01")) {
result.setStArea(areaNm);
}else if(area.getActnType().equals("99")) {
result.setEndArea(areaNm);
}
}
}
return result;
}
}

311
pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java

@ -0,0 +1,311 @@
package com.palnet.biz.api.bas.dron.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.dron.model.BasDronModel;
import com.palnet.biz.api.bas.dron.model.BasDronRqModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfRqModel;
import com.palnet.biz.api.bas.dron.service.BasDronService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/dron", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public class BasDronController {
@Autowired
private final BasDronService service;
/**
* 목록 조회
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "드론 목록 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasDronRqModel rq) {
ComnPagingRs<BasDronModel> result = null;
//입력값 검증
if(StringUtils.isEmpty(rq.getGroupId())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.list(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 식별정보 조회
* @param rq
* @return
*/
@GetMapping(value = "/idntf/list/{id}")
@ApiOperation(value = "식별정보 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mylist(@PathVariable Integer id) {
List<BasIdntfModel> result = null;
//입력값 검증
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.listIdntf(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 상세 조회
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "드론 상세 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable Integer id) {
BasDronModel result = null;
try {
//입력값 검증
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
result = service.detail(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<BasDronModel>(result));
}
/**
* 생성
* @return
*/
@PostMapping(value = "/create")
@ApiOperation(value = "드론정보 생성")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasDronModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.create(rq);
resultMap.put("result", result);
}catch(CustomException e2) {
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 생성
* @return
*/
@PostMapping(value = "/idntf/create")
@ApiOperation(value = "식별장치 생성")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> createIdntf(@RequestBody BasIdntfRqModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
// boolean result = service.create(rq);
boolean result = service.createIdntf(rq);
resultMap.put("result", result);
}catch(CustomException e2) {
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 수정
* @return
*/
@PutMapping(value = "/update")
@ApiOperation(value = "드론정보 수정")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasDronModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.update(rq);
resultMap.put("result", result);
}
catch(CustomException e2) {
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 삭제
* @param id
* @return
*/
@DeleteMapping(value = "/delete/{id}")
@ApiOperation(value = "드론정보 삭제")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> delete(@PathVariable Integer id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
//입력값 검증
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
boolean result = service.delete(id);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 식별장치 삭제
* @param id
* @return
*/
@DeleteMapping(value = "/idntf/delete/{id}")
@ApiOperation(value = "식별장치 삭제")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "식별번호", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> deleteIdntf(@PathVariable String id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
//입력값 검증
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
boolean result = service.deleteIdntf(id);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
}

62
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java

@ -0,0 +1,62 @@
package com.palnet.biz.api.bas.dron.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasDronModel {
private String groupNm;
private String groupId;
private int arcrftSno;
private double arcrftHght;
private double arcrftLngth;
private String arcrftModelNm;
private String arcrftTypeCd;
private double arcrftWdth;
private double arcrftWght;
private String cameraYn;
private Date createDt;
private String createUserId;
private String insrncYn;
private String prdctCmpnNm;
private Date prdctDate;
private String prdctNum;
private double takeoffWght;
private Date updateDt;
private String updateUserId;
private String imageUrl;
private String wghtTypeCd;
//식별 번호 정보
private String idntfNum;
private String newIdntfNum; //변경된 식별 정보
private String idntfTypeCd;
private String ownerNm;
}

23
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java

@ -0,0 +1,23 @@
package com.palnet.biz.api.bas.dron.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasDronRqModel extends ComnPagingModel {
private String groupId;
private String arcrftModelNm;
private String arcrftTypeCd;
private String idntfNum;
private String ownerNm;
}

31
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java

@ -0,0 +1,31 @@
package com.palnet.biz.api.bas.dron.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasIdntfModel {
//식별 번호 정보
private String id;
private String idntfNum;
private String isSave;
private int arcrftSno;
private String idntfTypeCd;
private String ownerNm;
private String hpno;
private Date updateDt;
private Date createDt;
private int cstmrSno;
private String groupId;
}

14
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java

@ -0,0 +1,14 @@
package com.palnet.biz.api.bas.dron.model;
import java.util.List;
import lombok.Data;
@Data
public class BasIdntfRqModel {
private List<BasIdntfModel> data;
private int arcrftSno;
}

30
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java

@ -0,0 +1,30 @@
package com.palnet.biz.api.bas.dron.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasOwnerModel {
private int ownerSno;
private int arcrftSno;
private String ownerNm;
private String hpno;
private String telno;
private String useYn;
private Date createDt;
private String createUserId;
private Date updateDt;
private String updateUserId;
}

428
pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java

@ -0,0 +1,428 @@
package com.palnet.biz.api.bas.dron.service;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRsModel;
import com.palnet.biz.api.bas.dron.model.BasDronModel;
import com.palnet.biz.api.bas.dron.model.BasDronRqModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfRqModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.ComArcrftBas;
import com.palnet.biz.jpa.entity.ComIdntfBas;
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository;
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.EncryptUtils;
import lombok.extern.log4j.Log4j2;
@Service
@Log4j2
public class BasDronService {
@Autowired
private PtyDronQueryRepository query;
@Autowired
private ComArcrftBasRepository comArcrftBasRepository;
@Autowired
private ComIdntBasRepository comIdntBasRepository;
@Autowired
private JwtTokenUtil jwtTokenUtil;
/**
* 드론 목록
* @param rq
* @return
*/
public ComnPagingRs<BasDronModel> list(BasDronRqModel rq){
ComnPagingRs<BasDronModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
PageImpl<BasDronModel> result = query.list(rq, pageable);
long total = query.listCount(rq);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setPage(rq.getPage());
response.setTotalPage(totalPage);
return response;
}
/**
* 식별장치 목록
* @param arcrftSno
* @return
*/
public List<BasIdntfModel> listIdntf(int arcrftSno){
List<BasIdntfModel> resultList = query.idntfList(arcrftSno);
for(BasIdntfModel model : resultList){
if(model.getHpno() != null && !model.getHpno().isEmpty()){
model.setHpno(EncryptUtils.decrypt(model.getHpno()));
}
}
return resultList;
}
/**
* 상세 조회
* @param cntrlId
* @return
* @throws Exception
*/
public BasDronModel detail(int arcrftSno) throws Exception{
BasDronModel model = query.detail(arcrftSno);
if (model == null ) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
return model;
}
/**
* 생성
* @param
* @return
* @throws Exception
*/
@Transactional
public boolean create(BasDronModel rq) throws Exception{
// 사전 체크 , 동일한 ID 존재 여부 확인
if(!query.isNotPrdctNum(rq.getPrdctNum() , 0)) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
// 민감정보 암호화 처리
// if(!StringUtils.isEmpty(rq.getHpno())) {
// rq.setHpno(EncryptUtils.encrypt(rq.getHpno()));
// }
// if(!StringUtils.isEmpty(rq.getOwnerNm())) {
// rq.setOwnerNm(EncryptUtils.encrypt(rq.getOwnerNm()));
// }
// if(!StringUtils.isEmpty(rq.getTelno())) {
// rq.setTelno(EncryptUtils.encrypt(rq.getTelno()));
// }
//1. 드론 기본 정보 등록
ComArcrftBas comArcrftBas = this.insertComArcrftBas(rq);
if(comArcrftBas == null) {
throw new CustomException(ErrorCode.DB_ERROR);
}
log.debug("===========================>" + comArcrftBas.getArcrftSno());
rq.setArcrftSno(comArcrftBas.getArcrftSno()); // KEY 넣기
//2. 드론 운영자 정보 등록
// ComArcrftOwner comArcrftOwner = this.insertComArcrftOwner(rq);
// if(comArcrftOwner == null) {
// throw new CustomException(ErrorCode.DB_ERROR);
// }
// //3. 드론 식별 정보 등록
// ComIdntfBas comIdntfBas = this.insertComIdntfBas(rq);
// if(comIdntfBas == null) {
// throw new CustomException(ErrorCode.DB_ERROR);
// }
//4. 드론 그룹에 연결 등록
// PtyGroupArcrft ptyGroupArcrft = this.insertPtyGroupArcrft(rq);
// if(ptyGroupArcrft == null) {
// throw new CustomException(ErrorCode.DB_ERROR);
// }
return true;
}
/**
* 식밸장치 생성
* @param
* @return
* @throws Exception
*/
@Transactional
public boolean createIdntf(BasIdntfRqModel rq) throws Exception{
if( rq == null && rq.getData().size() == 0)
throw new CustomException(ErrorCode.DATA_NOTFIND);
for(BasIdntfModel model : rq.getData() ) {
Optional<ComIdntfBas> optional = comIdntBasRepository.findById(model.getIdntfNum());
String hpno = EncryptUtils.encrypt(model.getHpno());
if (optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
int cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
ComIdntfBas entity = new ComIdntfBas();
BeanUtils.copyProperties(model , entity);
entity.setHpno(hpno);
entity.setArcrftSno(rq.getArcrftSno());
entity.setCreateDt(DateUtils.nowDate());
entity.setUpdateDt(DateUtils.nowDate());
entity.setCstmrSno(cstmrSno);
log.debug(entity.toString());
if( comIdntBasRepository.save(entity) == null ) return false;
}
return true;
}
public boolean deleteIdntf(String idntfNum) {
Optional<ComIdntfBas> optional = comIdntBasRepository.findById(idntfNum);
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
ComIdntfBas entity = optional.get();
comIdntBasRepository.delete(entity);
return true;
}
public ComArcrftBas insertComArcrftBas(BasDronModel model) throws Exception{
ComArcrftBas basEntity = new ComArcrftBas();
BeanUtils.copyProperties(model , basEntity);
basEntity.setCreateDt(DateUtils.nowDate());
basEntity.setUpdateDt(DateUtils.nowDate());
basEntity.setUseYn("Y");
log.debug(basEntity.toString());
return comArcrftBasRepository.save(basEntity);
}
public ComIdntfBas insertComIdntfBas(BasDronModel model) throws Exception{
ComIdntfBas entity = new ComIdntfBas();
BeanUtils.copyProperties(model , entity);
entity.setCreateDt(DateUtils.nowDate());
entity.setUpdateDt(DateUtils.nowDate());
log.debug(entity.toString());
return comIdntBasRepository.save(entity);
}
// public PtyGroupArcrft insertPtyGroupArcrft(BasDronModel model) throws Exception{
// PtyGroupArcrft entity = new PtyGroupArcrft();
// BeanUtils.copyProperties(model , entity);
// entity.setCreateDt(DateUtils.nowDate());
// entity.setUpdateDt(DateUtils.nowDate());
// entity.setUseYn("Y");
// log.debug(entity.toString());
//
// return ptyGroupArcrftRepository.save(entity);
//
// }
/**
* 수정
* @param
* @return
* @throws Exception
*/
@Transactional
public boolean update(BasDronModel rq) throws Exception{
// 사전 체크 , 동일한 ID 존재 여부 확인
if(!query.isNotPrdctNum(rq.getPrdctNum() , rq.getArcrftSno())) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
//1. 기체 정보 수정
ComArcrftBas comArcrftBas = this.updateComArcrftBas(rq);
if(comArcrftBas == null) {
throw new CustomException(ErrorCode.DB_ERROR);
}
//2-1. 식별장치 수정 필요 여부 체크 newIdnfnum -> idnftNum 비교후 다르면
// if(!rq.getNewIdntfNum().equals(rq.getIdntfNum())) {
// //2-2 식별번호 중복 체크
// if(!query.isNotIdntNum(rq.getNewIdntfNum())) {
// throw new CustomException(ErrorCode.DATA_DUPLICATE);
// }
//
// //2-3식별정보 수정
// ComIdntfBas comIdntfBas = this.updateComIdntfBas(rq);
//
// if(comIdntfBas == null) {
// throw new CustomException(ErrorCode.DB_ERROR);
// }
// }
//민감 정보 암호화 처리
// 민감정보 암호화 처리
// if(!StringUtils.isEmpty(rq.getHpno())) {
// rq.setHpno(EncryptUtils.encrypt(rq.getHpno()));
// }
// if(!StringUtils.isEmpty(rq.getOwnerNm())) {
// rq.setOwnerNm(EncryptUtils.encrypt(rq.getOwnerNm()));
// }
// if(!StringUtils.isEmpty(rq.getTelno())) {
// rq.setTelno(EncryptUtils.encrypt(rq.getTelno()));
// }
//3. 운영자 정보 수정
// ComArcrftOwner comArcrftOwner = this.updateComArcrftOwner(rq);
// if(comArcrftOwner == null) {
// throw new CustomException(ErrorCode.DB_ERROR);
// }
return true;
}
public ComArcrftBas updateComArcrftBas(BasDronModel model) throws Exception{
Optional<ComArcrftBas> optional = comArcrftBasRepository.findById(model.getArcrftSno());
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
ComArcrftBas entity = optional.get();
entity.setArcrftHght(model.getArcrftHght());
entity.setArcrftLngth(model.getArcrftLngth());
entity.setArcrftModelNm(model.getArcrftModelNm());
entity.setArcrftTypeCd(model.getArcrftTypeCd());
entity.setArcrftWdth(model.getArcrftWdth());
entity.setArcrftWght(model.getArcrftWght());
entity.setCameraYn(model.getCameraYn());
entity.setImageUrl(model.getImageUrl());
entity.setInsrncYn(model.getInsrncYn());
entity.setPrdctCmpnNm(model.getPrdctCmpnNm());
entity.setPrdctDate(model.getPrdctDate());
entity.setPrdctNum(model.getPrdctNum());
entity.setTakeoffWght(model.getTakeoffWght());
entity.setUpdateUserId(model.getUpdateUserId());
entity.setUpdateDt(DateUtils.nowDate());
return comArcrftBasRepository.save(entity);
}
// public ComArcrftOwner updateComArcrftOwner(BasDronModel model) throws Exception{
//
//
// Optional<ComArcrftOwner> optional = comArcrftOwnerRepository.findById(model.getOwnerSno());
// if (!optional.isPresent()) {
// throw new CustomException(ErrorCode.DATA_NOTFIND);
// }
//
// ComArcrftOwner entity = optional.get();
// entity.setUpdateDt(DateUtils.nowDate());
// entity.setUpdateUserId(model.getUpdateUserId());
//// entity.setOwnerNm(model.getOwnerNm());
//// entity.setHpno(model.getHpno());
// entity.setTelno(model.getTelno());
//
// log.debug(entity.toString());
//
// return comArcrftOwnerRepository.save(entity);
//
// }
public ComIdntfBas updateComIdntfBas(BasDronModel model) throws Exception{
Optional<ComIdntfBas> optional = comIdntBasRepository.findById(model.getIdntfNum());
if (optional.isPresent()) {
ComIdntfBas entity = optional.get();
comIdntBasRepository.delete(entity);
}
model.setIdntfNum(model.getNewIdntfNum());
return this.insertComIdntfBas(model);
}
/**
* 삭제
* @param
* @return
* @throws Exception
*/
@Transactional
public boolean delete(int arcrftSno) throws Exception{
try {
//1. 기체 정보 사용여부 N 으로 체크
Optional<ComArcrftBas> optional = comArcrftBasRepository.findById(arcrftSno);
if (optional.isPresent()) {
ComArcrftBas comArcrftBas = optional.get();
comArcrftBas.setUseYn("N");
comArcrftBasRepository.save(comArcrftBas);
}
//2. 식별 정보 삭제 처리
comIdntBasRepository.deleteByArcrftSno(arcrftSno);
//3. 기체 소유자정보 사용여부 N 처리
// comArcrftOwnerRepository.deleteByArcrftSno(arcrftSno);
//4. 그룹기체 정보 사용여부 N 처리
// ptyGroupArcrftRepository.deleteByArcrftSno(arcrftSno);
return true;
}catch(Exception e) {
log.error("IGNORE : {}", e);
throw new CustomException(ErrorCode.DB_ERROR);
}
}
}

400
pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java

@ -0,0 +1,400 @@
package com.palnet.biz.api.bas.flight.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.proj4j.CRSFactory;
import org.locationtech.proj4j.CoordinateReferenceSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel;
import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs;
import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel;
import com.palnet.biz.api.bas.flight.service.BasFlightService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping(value = "/api/bas/flight", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public class BasFlightController {
private final BasFlightService basFlightService;
private final Environment env;
private final CtrTrnsLctnService ctrTrnsLctnService;
private final AreaUtils utils;
@Autowired
public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils) {
this.basFlightService = basFlightService;
this.env = env;
this.ctrTrnsLctnService = ctrTrnsLctnService;
this.utils = AreaUtils;
}
@GetMapping("/area")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<Object> findAirSpace() throws IOException, ParseException {
// 1. file read
Resource resource = new ClassPathResource("air/airgeo.json");
InputStream jsonInputStream = resource.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(jsonInputStream, "UTF-8");
BufferedReader reader = new BufferedReader(inputStreamReader);
// 2. json parsing
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
// 3. body return
String type = (String) jsonObject.get("type");
Object airArea = jsonObject;
List<Object> features = (List<Object>) jsonObject.get("features");
log.info("type is name : {}", type);
log.info("features size : {}", features.size());
return ResponseEntity.ok().body(airArea);
}
// 비행계획서 조회
@GetMapping(value = "/plan/list")
@ApiOperation(value = "비행계획서 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findPlanList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> result = null;
// System.out.println(rq);
try {
result = basFlightService.listPlan(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 상세 조회
@GetMapping(value = "/plan/detail/{planSno}")
@ApiOperation(value = "비행계획서 상세 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno",value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detailPlan(@PathVariable("planSno") Integer planSno) {
BasFlightPlanModel result = null;
try {
result = basFlightService.detailPlan(planSno);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 등록
@PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
log.info(">>> rq : {}", rq);
boolean result = basFlightService.createPlan(rq);
resultMap.put("result", result);
log.info(">>> resultMap : " , resultMap);
} catch (CustomException e) {
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 비행계획서 수정
@PutMapping(value = "/plan/update")
@ApiOperation(value = "비행계획서 수정")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updatePlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = basFlightService.updatePlan(rq);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 비행계획서 삭제
@DeleteMapping(value = "/plan/delete/{planSno}")
@ApiOperation(value = "비행계획서 삭제")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno",value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> deletePlan(@PathVariable("planSno") Integer planSno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = basFlightService.deletePlan(planSno);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 그룹 조종사 조회
@GetMapping(value = "/plan/pilot/{groupId}")
@ApiOperation(value = "그룹의 조종사 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findPilot(@PathVariable("groupId") String groupId) {
List<BasFlightPlanPilotModel> result = null;
try {
result = basFlightService.listPilotByGroup(groupId);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 그룹 기체 조회
@GetMapping(value = "/plan/arcrft/{groupId}")
@ApiOperation(value = "그룹의 기체 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findArcrft(@PathVariable("groupId") String groupId) {
List<BasFlightPlanArcrftModel> result = null;
try {
result = basFlightService.listArcrftByGroup(groupId);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행 구역 버퍼 존 생성
@PostMapping("/plan/area/buffer")
@ApiOperation(value = "비행 구역 버퍼 존 생성")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findBuffer(@RequestBody List<BasFlightPlanAreaModel> rq) {
List<BasFlightPlanAreaModel> rs = null;
try {
rs = basFlightService.getBuffer(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
@GetMapping("/plan/api/weather")
@ApiOperation(value = "비행계획서 날씨")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq){
JSONObject jsonObject = null;
try {
jsonObject = basFlightService.getWeather(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject));
}
// 비행계획서 리스트(승인)
@GetMapping(value = "/aprv/list")
@ApiOperation(value = "비행계획서 리스트(승인)")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findAprvList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> result = null;
try {
result = basFlightService.aprvList(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 승인/미승인
@PutMapping(value = "/aprv/proc")
@ApiOperation(value = "비행 계획서 승인/미승인")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updateAprvProc(@RequestBody BasFlightAprovRq rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
int result = basFlightService.aprovePlan(rq);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
@PostMapping("/airspace/contains")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> checkAirspaceContains(@RequestBody List<BasFlightPlanAreaModel> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = basFlightService.checkAirspaceContains(rq);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
//지역 검색
@GetMapping("/plan/area/search")
@ApiOperation(value = "지역 검색")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> searchArea(String query) throws ParseException {
String text = null;
try {
text = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패", e);
}
String apiURL = env.getProperty("api.naver.search-url") + "?query=" + text + "&display=5";
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", env.getProperty("api.naver.client-id"));
requestHeaders.put("X-Naver-Client-Secret", env.getProperty("api.naver.client-secret-key"));
String responseBody = basFlightService.searchArea(apiURL, requestHeaders);
JSONParser parser = new JSONParser();
Object obj = parser.parse(responseBody);
return ResponseEntity.ok().body(new SuccessResponse<>(obj));
}
@GetMapping("/schedule")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findSchedule(@RequestParam("searchDate") String searchDate) {
List<BasFlightScheduleRs> response;
try {
response = basFlightService.findSchecdule(searchDate);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(response));
}
//test
@GetMapping("/test")
public void createCircleTest(@RequestParam double getX, @RequestParam double getY, @RequestParam double buffer) {
Coordinate circleCoord = new Coordinate(getY, getX);
List<Coordinate> coordList = utils.createCircle(circleCoord, buffer);
for(Coordinate a : coordList) {
System.out.println("["+a.getX() + ", " + a.getY()+"],");
}
}
}

11
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightAprovRq.java

@ -0,0 +1,11 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.List;
@Data
public class BasFlightAprovRq {
private List<Integer> planSnoList;
private String aprvlYn;
}

36
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java

@ -0,0 +1,36 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
@Data
public class BasFlightPlanArcrftModel {
private Integer planArcrftSno;
private Integer planSno;
private Integer arcrftSno;
private String idntfNum;
private String groupNm;
private String prdctNum;
private String arcrftTypeCd;
private String arcrftModelNm;
private String prdctCmpnNm;
private Date prdctDate;
private double arcrftLngth;
private double arcrftWdth;
private double arcrftHght;
private double arcrftWght;
private String wghtTypeCd;
private String imageUrl;
private double takeoffWght;
private String useYn;
private String cameraYn;
private String insrncYn;
private String ownerNm;
private String createUserId;
private Date createDt;
private String updateUserId;
private Date updateDt;
private String docState = "R";
private String idntfTypeCd;
}

15
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaBufferModel.java

@ -0,0 +1,15 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.List;
@Data
public class BasFlightPlanAreaBufferModel {
private Integer bufferZone; // 반경
private List<BasFlightPlanAreaCoordModel> coordList; // 기초 좌표
private List<BasFlightPlanAreaCoordModel> bufferCoordList; // 버퍼 좌표
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
@Data
public class BasFlightPlanAreaCoordModel {
private Integer planAreaCoordSno;
private Integer planAreaSno;
private double lat;
private double lon;
private String createUserId;
private Date createDt;
private String docState = "R";
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.flight.model;
import java.util.List;
import org.locationtech.jts.geom.Coordinate;
import lombok.Data;
@Data
public class BasFlightPlanAreaCoordQueryList {
private Integer planAreaCoordSno;
private Integer planAreaSno;
private List<Coordinate> queryCoordList;
}

14
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java

@ -0,0 +1,14 @@
package com.palnet.biz.api.bas.flight.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasFlightPlanAreaCoordRq {
private Integer planAreaSno;
private Integer bufferZone;
private String areaType;
private String idntfNum;
private Integer cnt;
}

23
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java

@ -0,0 +1,23 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class BasFlightPlanAreaModel {
private Integer planAreaSno;
private Integer planSno;
private String areaType;
private String fltMethod;
private Integer bufferZone;
private String fltElev;
private String createUserId;
private Date createDt;
private String updateUserId;
private Date updateDt;
private String docState = "R";
private List<BasFlightPlanAreaCoordModel> coordList;
private List<BasFlightPlanAreaCoordModel> bufferCoordList;
}

20
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanListRq.java

@ -0,0 +1,20 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasFlightPlanListRq extends ComnPagingModel {
private String groupId;
private Integer cstmrSno;
private Date schFltStDt;
private Date schFltEndDt;
private String aprvlYn;
}

34
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java

@ -0,0 +1,34 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class BasFlightPlanModel {
private Integer planSno;
private String groupId;
private Integer cstmrSno;
private String idntfNum;
private String memberName;
private String email;
private String hpno;
private String clncd;
private String addr;
private String addrDtlCn;
private String zip;
private Date schFltStDt;
private Date schFltEndDt;
private String fltPurpose;
private String aprvlYn;
private String delYn;
private String createUserId;
private Date createDt;
private String updateUserId;
private Date updateDt;
private String docState = "R";
private List<BasFlightPlanAreaModel> areaList;
private List<BasFlightPlanPilotModel> pilotList;
private List<BasFlightPlanArcrftModel> arcrftList;
}

27
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanPilotModel.java

@ -0,0 +1,27 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
@Data
public class BasFlightPlanPilotModel {
private Integer planPilotSno;
private Integer planSno;
private Integer cstmrSno;
private String groupNm;
private String memberName;
private String email;
private String hpno;
private String clncd;
private String addr;
private String addrDtlCn;
private String zip;
private String qlfcNo;
private String carrer;
private String createUserId;
private Date createDt;
private String updateUserId;
private Date updateDt;
private String docState = "R";
}

25
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java

@ -0,0 +1,25 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.util.Date;
@Data
public class BasFlightScheduleRs {
private String groupId;
private String groupNm;
private String ownerNm;
private String idntfNum;
private String startAddress;
private String endAddress;
private Date schFltStDt;
private Date schFltEndDt;
private String cntrlId;
private Date cntrlStDt;
private Date cntrlEndDt;
// BEFORE (B) : 비행 전, FLYING (F) : 비행 중, SUCCESS (S) : 비행 완료
private String statusCd;
}

18
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightWeatherModel.java

@ -0,0 +1,18 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
@Data
public class BasFlightWeatherModel {
private String serviceKey;
private String numOfRows;
private String pageNo;
private String dataType;
private String base_date;
private String base_time;
private String nx;
private String ny;
private double nx2;
private double ny2;
}

102
pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightMapper.java

@ -0,0 +1,102 @@
package com.palnet.biz.api.bas.flight.service;
import com.palnet.biz.api.bas.flight.model.*;
import com.palnet.biz.jpa.entity.*;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface BasFlightMapper {
BasFlightMapper mapper = Mappers.getMapper(BasFlightMapper.class);
// to entity
@Named("toPlanEntity")
FltPlanBas modelToEntity(BasFlightPlanModel model);
@Named("toAreaEntity")
FltPlanArea modelToEntity(BasFlightPlanAreaModel model);
@Named("toCoordEntity")
FltPlanAreaCoord modelToEntity(BasFlightPlanAreaCoordModel model);
@Named("toPilotEntity")
FltPlanPilot modelToEntity(BasFlightPlanPilotModel model);
@Named("toArcrftEntity")
FltPlanArcrft modelToEntity(BasFlightPlanArcrftModel model);
// to entity merge
@Named("toPlanEntityForMergeModel")
void updateEntityByModel(@MappingTarget FltPlanBas entity, BasFlightPlanModel model);
@Named("toAreaEntityForMergeModel")
void updateEntityByModel(@MappingTarget FltPlanArea entity, BasFlightPlanAreaModel model);
@Named("toCoordEntityForMergeModel")
void updateEntityByModel(@MappingTarget FltPlanAreaCoord entity, BasFlightPlanAreaCoordModel model);
@Named("toPilotEntityForMergeModel")
void updateEntityByModel(@MappingTarget FltPlanPilot entity, BasFlightPlanPilotModel model);
@Named("toArcrftEntityForMergeModel")
void updateEntityByModel(@MappingTarget FltPlanArcrft entity, BasFlightPlanArcrftModel model);
// to model
@Named("toPlanModel")
BasFlightPlanModel entityToModel(FltPlanBas entity);
@Named("toAreaModel")
BasFlightPlanAreaModel entityToModel(FltPlanArea entity);
@Named("toCoordModel")
BasFlightPlanAreaCoordModel entityToModel(FltPlanAreaCoord entity);
@Named("toPilotModel")
BasFlightPlanPilotModel entityToModel(FltPlanPilot entity);
@Named("toArcrftModel")
BasFlightPlanArcrftModel entityToModel(FltPlanArcrft entity);
@Named("comArcrftBasToArcrftModel")
BasFlightPlanArcrftModel entityToModel(ComArcrftBas entity);
// to entity - list
@Named("toPlanEntity")
List<FltPlanBas> modelToEntityPlanList(List<BasFlightPlanModel> model);
@Named("toAreaEntity")
List<FltPlanArea> modelToEntityAreaList(List<BasFlightPlanAreaModel> model);
@Named("toCoordEntity")
List<FltPlanAreaCoord> modelToEntityCoordList(List<BasFlightPlanAreaCoordModel> model);
@Named("toPilotEntity")
List<FltPlanPilot> modelToEntityPilotList(List<BasFlightPlanPilotModel> model);
@Named("toArcrftEntity")
List<FltPlanArcrft> modelToEntityArcrftList(List<BasFlightPlanArcrftModel> model);
// to model - list
@Named("toPlanModel")
List<BasFlightPlanModel> entityToModelPlanList(List<FltPlanBas> entity);
@Named("toAreaModel")
List<BasFlightPlanAreaModel> entityToModeArealList(List<FltPlanArea> entity);
@Named("toCoordModel")
List<BasFlightPlanAreaCoordModel> entityToModelCoordList(List<FltPlanAreaCoord> entity);
@Named("toPilotModel")
List<BasFlightPlanPilotModel> entityToModelPilotList(List<FltPlanPilot> entity);
@Named("toArcrftModel")
List<BasFlightPlanArcrftModel> entityToModelArcrftList(List<FltPlanArcrft> entity);
@Named("comArcrftBasToArcrftModel")
List<BasFlightPlanArcrftModel> comArcrftEntityToModelArcrftList(List<ComArcrftBas> entity);
}

725
pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java

@ -0,0 +1,725 @@
package com.palnet.biz.api.bas.flight.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel;
import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs;
import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.FltPlanArcrft;
import com.palnet.biz.jpa.entity.FltPlanArea;
import com.palnet.biz.jpa.entity.FltPlanAreaCoord;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.EncryptUtils;
import lombok.extern.log4j.Log4j2;
@Log4j2
@Service
@Transactional(readOnly = true)
public class BasFlightService {
@Autowired
private CtrTrnsLctnService ctrTrnsLctnService;
private final FltPlanBasRepository fltPlanBasRepository;
private final FltPlanArcrftRepository fltPlanArcrftRepository;
private final FltPlanAreaRepository fltPlanAreaRepository;
private final FltPlanAreaCoordRepository fltPlanAreaCoordRepository;
private final FltPlanPilotRepository fltPlanPilotRepository;
private final FltPlanQueryRepository fltPlanQueryRepository;
private final PtyGroupQueryRepository ptyPlanQueryRepository;
private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils;
public BasFlightService(FltPlanBasRepository fltPlanBasRepository,
FltPlanArcrftRepository fltPlanArcrftRepository,
FltPlanAreaRepository fltPlanAreaRepository,
FltPlanAreaCoordRepository fltPlanAreaCoordRepository,
FltPlanPilotRepository fltPlanPilotRepository,
FltPlanQueryRepository fltPlanQueryRepository,
PtyGroupQueryRepository ptyPlanQueryRepository,
JwtTokenUtil jwtTokenUtil,
AreaUtils areaUtils) {
this.fltPlanBasRepository = fltPlanBasRepository;
this.fltPlanArcrftRepository = fltPlanArcrftRepository;
this.fltPlanAreaRepository = fltPlanAreaRepository;
this.fltPlanAreaCoordRepository = fltPlanAreaCoordRepository;
this.fltPlanPilotRepository = fltPlanPilotRepository;
this.fltPlanQueryRepository = fltPlanQueryRepository;
this.ptyPlanQueryRepository = ptyPlanQueryRepository;
this.jwtTokenUtil = jwtTokenUtil;
this.areaUtils = areaUtils;
}
// 비행계획서 조회
public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) {
List<BasGroupJoinModel> groupList = ptyPlanQueryRepository.joinList(rq.getCstmrSno());
String userAccount = null;
String masterAccount = null;
String appAuth = jwtTokenUtil.getUserAuthByToken();
ComnPagingRs<BasFlightPlanModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
if(groupList.size() > 0) {
for (BasGroupJoinModel list : groupList) {
if (list.getGroupId().equals(rq.getGroupId())) {
userAccount = list.getGroupAuthCd();
}
}
}
if (appAuth.equals("SUPER") || appAuth.equals("ADMIN")) {
masterAccount = "ADMIN";
} else if (userAccount.equals("MASTER") || userAccount.equals("LEADER")) {
masterAccount = "ADMIN";
} else {
masterAccount = "NORMAL";
}
PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.listPlan(rq, masterAccount, pageable);
long total = fltPlanQueryRepository.listPlanCount(rq, masterAccount);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setPage(rq.getPage());
response.setTotalPage(totalPage);
return response;
}
// 비행계획서 상세 조회
public BasFlightPlanModel detailPlan(Integer planSno) {
BasFlightPlanModel rs = new BasFlightPlanModel();
// 비행계획서
FltPlanBas planEntity = fltPlanBasRepository.findByPlanSnoAndDelYnNot(planSno, "Y").orElse(null);
if(planEntity != null){
rs = BasFlightMapper.mapper.entityToModel(planEntity);
// 버퍼영역
List<FltPlanArea> areaEntityList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(planSno);
if (areaEntityList != null && !areaEntityList.isEmpty()) {
List<BasFlightPlanAreaModel> area = new ArrayList<>();
for (FltPlanArea areaEntity : areaEntityList) {
BasFlightPlanAreaModel areaModel = BasFlightMapper.mapper.entityToModel(areaEntity);
List<FltPlanAreaCoord> coordEntityList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(areaEntity.getPlanAreaSno());
if (coordEntityList != null && !coordEntityList.isEmpty()) {
areaModel.setCoordList(BasFlightMapper.mapper.entityToModelCoordList(coordEntityList));
// Line인 경우 BufferList 생성
if("LINE".equals(areaEntity.getAreaType())) {
List<Coordinate> convertCoordinates = areaUtils.convertCoordinates(areaModel.getCoordList());
List<Coordinate> bufferList = areaUtils.buffer(convertCoordinates, areaModel.getBufferZone());
List<BasFlightPlanAreaCoordModel> bufferCoordList = areaUtils.convertModel(bufferList);
areaModel.setBufferCoordList(bufferCoordList);
}
}
area.add(areaModel);
}
rs.setAreaList(area);
}
// 조종사
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSnoOrderByPlanPilotSnoAsc(planSno);
if (pilotList != null && !pilotList.isEmpty()) {
rs.setPilotList(BasFlightMapper.mapper.entityToModelPilotList(pilotList));
}
// 기체
List<FltPlanArcrft> arcrft = fltPlanArcrftRepository.findByPlanSnoOrderByPlanArcrftSnoAsc(planSno);
if (arcrft != null && !arcrft.isEmpty()) {
rs.setArcrftList(BasFlightMapper.mapper.entityToModelArcrftList(arcrft));
}
}
return rs;
}
public void planValid(BasFlightPlanModel rq) {
boolean isEqualsFltElev = false;
List<BasFlightPlanAreaModel> rqAreaList = rq.getAreaList();
String rqFltElev = rqAreaList.get(0).getFltElev();
List<BasFlightPlanModel> effectivePlanList = fltPlanQueryRepository.CoordCheck(rq);
List<BasFlightPlanAreaModel> effectivePlanArea = new ArrayList<>();
for(BasFlightPlanModel plan : effectivePlanList) {
effectivePlanArea.addAll(plan.getAreaList());
}
for(BasFlightPlanAreaModel area : effectivePlanArea) {
if(rqFltElev.equals(area.getFltElev())) isEqualsFltElev = true;
}
List<BasFlightPlanAreaCoordRq> effectivePlanCount = fltPlanQueryRepository.CoordCount(rq);
for(BasFlightPlanModel i : effectivePlanList) {
if(rq.getPlanSno().equals(i.getPlanSno()))return;
}
if(effectivePlanList != null && !effectivePlanList.isEmpty()) {
for(BasFlightPlanModel plan : effectivePlanList) {
// 1. 구역 조회
List<FltPlanArea> areaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(plan.getPlanSno());
// 2. 좌표 조회 -> 영역 포함 여부 확인
for(FltPlanArea area : areaList) {
List<FltPlanAreaCoord> coordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(area.getPlanAreaSno());
if(coordList != null && !coordList.isEmpty()) {
List<BasFlightPlanAreaCoordModel> coordListMapping = BasFlightMapper.mapper.entityToModelCoordList(coordList);
// 2-1 영역 좌표 -> jts model로 mapping
List<Coordinate> effectiveCoordList = areaUtils.convertCoordinates(coordListMapping);
List<Coordinate> effectiveCoordBufferList = new ArrayList<>();
// Query에서 조회한 좌표로 버퍼좌표 생성
if("LINE".equals(area.getAreaType())){
List<Coordinate> trans = areaUtils.transform(effectiveCoordList, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, area.getBufferZone());
effectiveCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
}
if("POLYGON".equals(area.getAreaType())) {
effectiveCoordBufferList.addAll(effectiveCoordList);
}
if("CIRCLE".equals(area.getAreaType())) {
effectiveCoordBufferList = areaUtils.createCircle(effectiveCoordList.get(0), area.getBufferZone());
}
// 유효한 비행구역 검증하기.
for(BasFlightPlanAreaModel rqArea : rq.getAreaList()) {
boolean overlapCheck = false;
boolean overlapCheck2 = false;
boolean containCheck = false;
boolean containCheck2 = false;
List<Coordinate> rqCoord = new ArrayList<>();
List<Coordinate> rqCoordBufferList = new ArrayList<>();
//rq로 들어온 좌표로 버퍼좌표 생성
for(BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) {
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat());
rqCoord.add(coords);
}
if("LINE".equals(rqArea.getAreaType())){
List<Coordinate> trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, rqArea.getBufferZone());
rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
}else if( "POLYGON".equals(rqArea.getAreaType())) {
rqCoordBufferList.addAll(rqCoord);
}else if("CIRCLE".equals(rqArea.getAreaType())) {
rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), rqArea.getBufferZone());
}
//검증
overlapCheck = areaUtils.overlaps(rqCoordBufferList, effectiveCoordBufferList);
overlapCheck2 = areaUtils.overlaps(effectiveCoordBufferList, rqCoordBufferList);
if((overlapCheck || overlapCheck2) && isEqualsFltElev) {
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
}
for(Coordinate coord : effectiveCoordBufferList) {
containCheck = areaUtils.contains(rqCoordBufferList, coord);
if(containCheck && isEqualsFltElev) {
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
}
}
for(Coordinate coord : rqCoordBufferList) {
containCheck2 = areaUtils.contains(effectiveCoordBufferList , coord);
if(containCheck2 && isEqualsFltElev) {
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
}
}
}
}
}
// 3. 중복 기체 확인
for(BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) {
for(BasFlightPlanArcrftModel rqArcrft : rq.getArcrftList()) {
if(rqArcrft.getIdntfNum().equals(idntfNum.getIdntfNum())) {
throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE);
}
}
}
}
}
}
// 비행계획서 등록
@Transactional
public boolean createPlan(BasFlightPlanModel rq) {
// 비행계획서 유효성 검사.
this.planValid(rq);
// 비행계획서
String userId = jwtTokenUtil.getUserIdByToken();
FltPlanBas basEntity = BasFlightMapper.mapper.modelToEntity(rq);
basEntity.setDelYn("N");
basEntity.setAprvlYn("N");
basEntity.setCreateUserId(userId);
basEntity.setUpdateUserId(userId);
FltPlanBas rBasEntity = fltPlanBasRepository.save(basEntity);
Integer planSno = rBasEntity.getPlanSno();
// 비행구역
List<BasFlightPlanAreaModel> areaModelList = rq.getAreaList();
if (areaModelList != null && !areaModelList.isEmpty()) {
for (BasFlightPlanAreaModel areaModel : areaModelList) {
FltPlanArea areaEntity = BasFlightMapper.mapper.modelToEntity(areaModel);
areaEntity.setPlanSno(planSno);
areaEntity.setCreateUserId(userId);
areaEntity.setUpdateUserId(userId);
FltPlanArea rAreaEntity = fltPlanAreaRepository.save(areaEntity);
Integer planAreaSno = rAreaEntity.getPlanAreaSno();
List<BasFlightPlanAreaCoordModel> coordModelList = areaModel.getCoordList();
if (coordModelList != null && !coordModelList.isEmpty()) {
for (BasFlightPlanAreaCoordModel coordModel : coordModelList) {
FltPlanAreaCoord coordEntity = BasFlightMapper.mapper.modelToEntity(coordModel);
coordEntity.setPlanAreaSno(planAreaSno);
coordEntity.setCreateUserId(userId);
fltPlanAreaCoordRepository.save(coordEntity);
}
}
}
}
// 조종사
List<BasFlightPlanPilotModel> pilotModelList = rq.getPilotList();
if (pilotModelList != null && !pilotModelList.isEmpty()) {
for (BasFlightPlanPilotModel pilotModel : pilotModelList) {
FltPlanPilot pilotEntity = BasFlightMapper.mapper.modelToEntity(pilotModel);
pilotEntity.setPlanSno(planSno);
pilotEntity.setCreateUserId(userId);
pilotEntity.setUpdateUserId(userId);
fltPlanPilotRepository.save(pilotEntity);
}
}
// 기체
List<BasFlightPlanArcrftModel> arcrftModelList = rq.getArcrftList();
if (arcrftModelList != null && !arcrftModelList.isEmpty()) {
for (BasFlightPlanArcrftModel arcrftModel : arcrftModelList) {
FltPlanArcrft arcrftEntity = BasFlightMapper.mapper.modelToEntity(arcrftModel);
arcrftEntity.setPlanSno(planSno);
arcrftEntity.setCreateUserId(userId);
arcrftEntity.setUpdateUserId(userId);
fltPlanArcrftRepository.save(arcrftEntity);
}
}
return true;
}
// 비행계획서 수정
@Transactional
public boolean updatePlan(BasFlightPlanModel rq) {
// 비행계획서 유효성 검사.
this.planValid(rq);
if (rq != null && rq.getPlanSno() != null) {
String userId = jwtTokenUtil.getUserIdByToken();
Integer planSno = rq.getPlanSno();
// 비행계획서
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow();
BasFlightMapper.mapper.updateEntityByModel(planEntity, rq);
planEntity.setUpdateUserId(userId);
fltPlanBasRepository.save(planEntity);
// 비행구역
List<BasFlightPlanAreaModel> areaModelList = rq.getAreaList();
if (areaModelList != null && !areaModelList.isEmpty()) {
List<FltPlanArea> areaEntityList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(planSno);
for (BasFlightPlanAreaModel areaModel : areaModelList) {
//FltPlanArea areaEntity = fltPlanAreaRepository.findById(areaModel.getPlanAreaSno()).orElse(null);
FltPlanArea areaEntity = areaEntityList.stream().filter(fltPlanArea -> fltPlanArea.getPlanAreaSno().equals(areaModel.getPlanAreaSno())).findFirst().orElse(null);
if (areaEntity == null) {
areaEntity = BasFlightMapper.mapper.modelToEntity(areaModel);
areaEntity.setCreateUserId(userId);
} else {
BasFlightMapper.mapper.updateEntityByModel(areaEntity, areaModel);
}
areaEntity.setUpdateUserId(userId);
fltPlanAreaRepository.save(areaEntity);
List<BasFlightPlanAreaCoordModel> coordsModelList = areaModel.getCoordList();
if (coordsModelList != null && !coordsModelList.isEmpty()) {
Integer areaSno = areaModel.getPlanAreaSno();
List<FltPlanAreaCoord> coordEntityList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(areaSno);
for (BasFlightPlanAreaCoordModel coordModel : coordsModelList) {
FltPlanAreaCoord coordEntity = coordEntityList.stream().filter(fltPlanAreaCoord -> fltPlanAreaCoord.getPlanAreaCoordSno().equals(coordModel.getPlanAreaCoordSno())).findFirst().orElse(null);
if (coordEntity == null) {
coordEntity = BasFlightMapper.mapper.modelToEntity(coordModel);
coordEntity.setCreateUserId(userId);
} else {
BasFlightMapper.mapper.updateEntityByModel(coordEntity, coordModel);
}
fltPlanAreaCoordRepository.save(coordEntity);
}
List<FltPlanAreaCoord> deleteCoordEntity = coordEntityList.stream().filter(fltPlanAreaCoord -> {
for (BasFlightPlanAreaCoordModel coordModel : coordsModelList) {
if (coordModel.getPlanAreaCoordSno() == fltPlanAreaCoord.getPlanAreaCoordSno())
return false;
}
return true;
}).collect(Collectors.toList());
fltPlanAreaCoordRepository.deleteAll(deleteCoordEntity);
}
}
List<FltPlanArea> deleteAreaEntity = areaEntityList.stream().filter(fltPlanArea -> {
for (BasFlightPlanAreaModel areaModel : areaModelList) {
if (areaModel.getPlanAreaSno() == fltPlanArea.getPlanAreaSno())
return false;
}
return true;
}).collect(Collectors.toList());
fltPlanAreaRepository.deleteAll(deleteAreaEntity);
}
// 조종사
List<BasFlightPlanPilotModel> pilotModelList = rq.getPilotList();
if(pilotModelList != null && !pilotModelList.isEmpty()){
List<FltPlanPilot> pilotEntityList = fltPlanPilotRepository.findByPlanSnoOrderByPlanPilotSnoAsc(planSno);
for(BasFlightPlanPilotModel pilotModel : pilotModelList){
FltPlanPilot pilotEntity = pilotEntityList.stream().filter(fltPlanPilot -> fltPlanPilot.getPlanPilotSno().equals(pilotModel.getPlanPilotSno())).findFirst().orElse(null);
if(pilotEntity == null){
pilotEntity = BasFlightMapper.mapper.modelToEntity(pilotModel);
pilotEntity.setUpdateUserId(userId);
pilotEntity.setCreateUserId(userId);
}else {
BasFlightMapper.mapper.updateEntityByModel(pilotEntity, pilotModel);
}
fltPlanPilotRepository.save(pilotEntity);
}
List<FltPlanPilot> deletePilotEntity = pilotEntityList.stream().filter(fltPlanPilot -> {
for (BasFlightPlanPilotModel pilotModel : pilotModelList) {
if (pilotModel.getPlanPilotSno() == fltPlanPilot.getPlanPilotSno())
return false;
}
return true;
}).collect(Collectors.toList());
fltPlanPilotRepository.deleteAll(deletePilotEntity);
}
// 기체
List<BasFlightPlanArcrftModel> arcrftModelList = rq.getArcrftList();
if(arcrftModelList != null && !arcrftModelList.isEmpty()){
List<FltPlanArcrft> arcrftEntityList = fltPlanArcrftRepository.findByPlanSnoOrderByPlanArcrftSnoAsc(planSno);
for(BasFlightPlanArcrftModel arcrftModel : arcrftModelList){
FltPlanArcrft arcrftEntity = arcrftEntityList.stream().filter(fltPlanArcrft -> fltPlanArcrft.getPlanArcrftSno().equals(arcrftModel.getPlanArcrftSno())).findFirst().orElse(null);
if(arcrftEntity == null){
arcrftEntity = BasFlightMapper.mapper.modelToEntity(arcrftModel);
arcrftEntity.setUpdateUserId(userId);
arcrftEntity.setCreateUserId(userId);
}else {
BasFlightMapper.mapper.updateEntityByModel(arcrftEntity, arcrftModel);
}
fltPlanArcrftRepository.save(arcrftEntity);
}
List<FltPlanArcrft> deleteArcrftEntity = arcrftEntityList.stream().filter(fltPlanArcrft -> {
for (BasFlightPlanArcrftModel arcrftModel : arcrftModelList) {
if (arcrftModel.getPlanArcrftSno() == fltPlanArcrft.getPlanArcrftSno())
return false;
}
return true;
}).collect(Collectors.toList());
fltPlanArcrftRepository.deleteAll(deleteArcrftEntity);
}
}
return true;
}
// 비행계획서 삭제
@Transactional
public boolean deletePlan(Integer planSno) {
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow();
planEntity.setDelYn("Y");
fltPlanBasRepository.save(planEntity);
return true;
}
// 그룹 조종사 조회
public List<BasFlightPlanPilotModel> listPilotByGroup(String groupId) {
List<BasFlightPlanPilotModel> pilotList = fltPlanQueryRepository.listPilot(groupId);
/* 개인정보 복호화 처리 */
for(BasFlightPlanPilotModel model : pilotList) {
if(!StringUtils.isEmpty(model.getHpno())) {
model.setHpno(EncryptUtils.decrypt(model.getHpno()));
}
if(!StringUtils.isEmpty(model.getMemberName())) {
// model.setMemberName(EncryptUtils.decrypt(model.getMemberName()));
}
if(!StringUtils.isEmpty(model.getEmail())) {
model.setEmail(EncryptUtils.decrypt(model.getEmail()));
}
}
return pilotList;
}
// 그룹 기체 조회
public List<BasFlightPlanArcrftModel> listArcrftByGroup(String groupId) {
List<BasFlightPlanArcrftModel> arcrftModels = fltPlanQueryRepository.listArcrft(groupId);
// List<ComArcrftBas> arcrftEntityList = comArcrftBasRepository.findByGroupIdOrderByArcrftSnoAsc(groupId);
// List<BasFlightPlanArcrftModel> arcrftModelList = BasFlightMapper.mapper.comArcrftEntityToModelArcrftList(arcrftEntityList);
return arcrftModels;
}
// 비행 구역 buffer zone
public List<BasFlightPlanAreaModel> getBuffer(List<BasFlightPlanAreaModel> rq) {
for(BasFlightPlanAreaModel area : rq) {
if("LINE".equals(area.getAreaType())) {
List<Coordinate> convertCoordinates = areaUtils.convertCoordinates(area.getCoordList()); // 객체 타입 변환
List<Coordinate> transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(transCoordList, area.getBufferZone()); // buffer 영역 생성
List<Coordinate> transBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
List<BasFlightPlanAreaCoordModel> bufferCoordList = areaUtils.convertModel(transBufferList);
area.setBufferCoordList(bufferCoordList);
}
}
return rq;
}
// 비행계획서 리스트(승인)
public ComnPagingRs<BasFlightPlanModel> aprvList(BasFlightPlanListRq rq) {
String appAuth = jwtTokenUtil.getUserAuthByToken();
ComnPagingRs<BasFlightPlanModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
List<JwtGroupModel> groupAuthList = jwtTokenUtil.getGroupAuthByToken();
List<String> groupIdList = new ArrayList<>();
String userAccount = null;
String masterAccount = null;
if(groupAuthList.size() > 0) {
for (JwtGroupModel list : groupAuthList) {
if (list.getGroupId().equals(rq.getGroupId())) {
userAccount = list.getGroupAuthCd();
}
}
}
if (appAuth.equals("SUPER") || appAuth.equals("ADMIN")) {
masterAccount = "ADMIN";
} else if (userAccount.equals("MASTER") || userAccount.equals("LEADER")) {
masterAccount = "ADMIN";
} else {
masterAccount = "NORMAL";
}
PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.aprvList(rq, masterAccount, pageable);
long total = fltPlanQueryRepository.aprvCount(rq, masterAccount);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setPage(rq.getPage());
response.setTotalPage(totalPage);
return response;
}
// 비행계획서 승인/미승인
@Transactional
public int aprovePlan(BasFlightAprovRq rq) {
int cnt = fltPlanBasRepository.updateAprvlYnByPlanSnoIn(rq.getPlanSnoList(), rq.getAprvlYn());
return cnt;
}
public boolean checkAirspaceContains(List<BasFlightPlanAreaModel> rq) {
boolean result = false;
for(BasFlightPlanAreaModel area : rq) {
List<Coordinate> coordinates = areaUtils.convertCoordinates(area.getCoordList());
if("LINE".equals(area.getAreaType())) {
List<Coordinate> transCoordList = areaUtils.transform(coordinates, "EPSG:4326", "EPSG:5181");
List<Coordinate> buffer = areaUtils.buffer(transCoordList, area.getBufferZone());
List<Coordinate> transBufferList = areaUtils.transform(buffer, "EPSG:5181", "EPSG:4326");
result = areaUtils.overlaps(transBufferList);
}
if("POLYGON".equals(area.getAreaType())) {
result = areaUtils.overlaps(coordinates);
}
if("CIRCLE".equals(area.getAreaType())) {
List<Coordinate> circle = areaUtils.createCircle(coordinates.get(0), area.getBufferZone());
result = areaUtils.overlaps(circle);
}
}
return result;
}
//지역 검색
public String searchArea(String apiUrl, Map<String, String> requestHeaders) {
HttpURLConnection con = connect(apiUrl);
try {
con.setRequestMethod("GET");
for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
int responseCode = con.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK) {
return readBody(con.getInputStream());
} else {
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}
public HttpURLConnection connect(String apiUrl) {
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}
public String readBody(InputStream body) {
InputStreamReader streamReader = new InputStreamReader(body);
try(BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
}
}
public List<BasFlightScheduleRs> findSchecdule(String searchDate) {
List<BasFlightScheduleRs> schedule = fltPlanQueryRepository.findSchedule(searchDate);
return schedule;
}
public JSONObject getWeather(BasFlightWeatherModel rq) throws IOException, ParseException {
StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst");
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=r6RMUsk3Vtama7D6uq7MiWV9dTC9MwfIIr4%2F45y0uVNw6BaYbgpKmL%2BLUDFVTfIYUmEe4K%2FaniEjdV9mg5t82Q%3D%3D");
urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode(rq.getPageNo(),"UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode(rq.getNumOfRows(), "UTF-8")); /*한 페이지 결과 수*/
urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/
urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(rq.getBase_date(), "UTF-8")); /*'21년 6월 28일 발표*/
urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(rq.getBase_time(), "UTF-8")); /*06시 발표(정시단위) */
urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(rq.getNx(), "UTF-8")); /*예보지점의 X 좌표값*/
urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(rq.getNy(), "UTF-8")); /*예보지점의 Y 좌표값*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
log.info("Response code: " + conn.getResponseCode());
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(),rq.getNy2());
log.info("weatherResult >>>> : {}", weatherResult);
String str = sb.toString();
JSONParser parser = new JSONParser();
JSONObject jsonObject = (JSONObject) parser.parse(str);
if(weatherResult != null) {
jsonObject.put("area1",weatherResult.getArea1());
jsonObject.put("area2",weatherResult.getArea2());
jsonObject.put("area3",weatherResult.getArea3());
jsonObject.put("landNm",weatherResult.getLandNm());
jsonObject.put("landNum",weatherResult.getLandNum());
}
rd.close();
conn.disconnect();
log.info(sb.toString());
return jsonObject;
}
}

105
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java

@ -0,0 +1,105 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupAprvModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvRqModel;
import com.palnet.biz.api.bas.group.service.BasGroupAprvService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/aprv", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public class BasGroupAprvController {
@Autowired
private final BasGroupAprvService service;
/**
* 승인요청 조회
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "승인요청 조회")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasGroupAprvRqModel rq) {
ComnPagingRs<BasGroupAprvModel> result = null;
// log.debug(">>>>" + rq.toString());
if(StringUtils.isEmpty(rq.getCstmrSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.mylist(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 승인처리 / 승인취소 처리
* @return
*/
@PutMapping(value = "/update")
@ApiOperation(value = "승인처리 / 승인취소 처리")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.update(rq);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
}

308
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java

@ -0,0 +1,308 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupModel;
import com.palnet.biz.api.bas.group.model.BasGroupRqModel;
import com.palnet.biz.api.bas.group.service.BasGroupService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public class BasGroupController {
@Autowired
private final BasGroupService service;
@GetMapping(value = "/createid")
@ApiOperation(value = "그룹코드 생성")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> createid() {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
String result = service.createid();
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 나의 그룹 목록 조회
* @param rq
* @return
*/
@GetMapping(value = "/mylist")
@ApiOperation(value = "나의 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mylist(Integer cstmrSno) {
List<BasGroupModel> result = null;
log.debug("Param : " + cstmrSno);
//입력값 검증
if(StringUtils.isEmpty(cstmrSno)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.mylist(cstmrSno);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 나의 그룹 - 참여 그룹 목록 조회
* @param rq
* @return
*/
@GetMapping(value = "/joinlist")
@ApiOperation(value = "나의 그룹 - 참여 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> joinList(Integer cstmrSno) {
List<BasGroupJoinModel> result = null;
//입력값 검증
if(StringUtils.isEmpty(cstmrSno)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.joinList(cstmrSno);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 그룹 목록 조회
* @param rq
* @return
*/
@GetMapping(value = "/grouplist")
@ApiOperation(value = "그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> grouplist(Integer cstmrSno) {
List<BasGroupJoinModel> result = null;
//입력값 검증
if(StringUtils.isEmpty(cstmrSno)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.groupList(cstmrSno);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 전체 그룹 목록 조회
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "전체 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasGroupRqModel rq) {
List<BasGroupModel> result = null;
try {
result = service.list(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 그룹 상세 조회
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "그룹 상세 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
BasGroupModel result = null;
try {
result = service.detail(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<BasGroupModel>(result));
}
/**
* 그룹 생성
* @return
* @throws Exception
*/
@PostMapping(value = "/create")
@ApiOperation(value = "그룹 생성")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupModel rq) throws Exception {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.create(rq);
resultMap.put("result", result);
} catch (CustomException e) {
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 그룹 수정
* @return
* @throws Exception
*/
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 수정")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupModel rq) throws Exception {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.update(rq);
resultMap.put("result", result);
// } catch (Exception e) {
// log.error("IGNORE : {}", e);
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(new ErrorResponse("Server Error", "-1"));
//
// }
} catch (CustomException e) {
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 그룹 삭제
* @param id
* @return
*/
@DeleteMapping(value = "/delete/{id}")
@ApiOperation(value = "그룹 삭제")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> delete(@PathVariable String id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.delete(id);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
}

117
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java

@ -0,0 +1,117 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinRqModel;
import com.palnet.biz.api.bas.group.service.BasGroupJoinService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/join", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public class BasGroupJoinController {
@Autowired
private final BasGroupJoinService service;
@GetMapping(value = "/list")
@ApiOperation(value = "참여한 그룹 목록 조회")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasGroupJoinRqModel rq) {
List<BasGroupJoinModel> result = null;
if(StringUtils.isEmpty(rq.getCstmrSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.joinFullList(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
@PostMapping(value = "/create")
@ApiOperation(value = "그룹 가입 요청")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupJoinModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.create(rq);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 가입 승인/미승인")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupJoinModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.update(rq);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
}

113
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java

@ -0,0 +1,113 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupUserListModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserModel;
import com.palnet.biz.api.bas.group.service.BasGroupUserService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/user", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public class BasGroupUserController {
@Autowired
private final BasGroupUserService service;
@GetMapping(value = "/list")
@ApiOperation(value = "그룹 사용자 조회")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasGroupUserListModel rq) {
ComnPagingRs<BasGroupUserModel> result = null;
if(StringUtils.isEmpty(rq.getCstmrSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.list(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 사용자 권한 수정")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.update(rq);
resultMap.put("result", result);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
@PutMapping(value = "/delegate")
@ApiOperation(value = "MASTER 권한 위임")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserModel> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = service.delegate(rq);
resultMap.put("result", result);
} catch (CustomException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse(e.getMessage(), e.getErrorCode()));
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
}

39
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvModel.java

@ -0,0 +1,39 @@
package com.palnet.biz.api.bas.group.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasGroupAprvModel {
private Integer cstmrGroupSno;
private String groupId;
private String groupNm;
private String groupTypeCd;
private Integer cstmrSno;
private String aprvlYn;
private String joinYn;
private String memberName;
private String userId;
private Date aprvlDt;
private Date joinDt;
private String groupAuthCd;
private String aprvlUserId;
private String trmnlId;
}

22
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java

@ -0,0 +1,22 @@
package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasGroupAprvRqModel extends ComnRqModel {
private String groupNm;
private String memberName;
private String aprvYn;
private Integer cstmrSno;
private String groupId;
}

38
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinModel.java

@ -0,0 +1,38 @@
package com.palnet.biz.api.bas.group.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasGroupJoinModel {
private Integer cstmrGroupSno;
private String groupId;
private String groupNm;
private String groupTypeCd;
private Integer cstmrSno;
private String aprvlYn = "N";
private String joinYn = "N";
private Date joinDt;
private Date aprvlDt;
private String groupAuthCd;
private Date createDt;
private Date updateDt;
private String myGroupAuthCd;
private String trmnlId;
}

18
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java

@ -0,0 +1,18 @@
package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasGroupJoinRqModel extends ComnRqModel{
private String groupNm;
private String groupId;
private Integer cstmrSno;
}

24
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java

@ -0,0 +1,24 @@
package com.palnet.biz.api.bas.group.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasGroupModel {
private String groupId;
private String groupNm;
private String groupTypeCd;
private int cstmrSno;
private Date createDt;
private Date updateDt;
private String trmnlId;
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasGroupRqModel extends ComnRqModel{
private String groupNm;
private String groupId;
}

17
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasGroupUserListModel extends ComnPagingModel{
private String memberName;
private String groupId;
private int cstmrSno;
}

32
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserModel.java

@ -0,0 +1,32 @@
package com.palnet.biz.api.bas.group.model;
import java.util.Date;
import lombok.Data;
@Data
public class BasGroupUserModel {
private Integer cstmrGroupSno;
private String groupId;
private String groupNm;
private String groupTypeCd;
private Integer cstmrSno;
private String memberName;
private String userId;
private Date aprvlDt;
private Date joinDt;
private String joinYn;
private String groupAuthCd;
}

21
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserRqModel.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BasGroupUserRqModel extends ComnRqModel{
private String groupNm;
private String memberName;
private String groupAuthCd;
private Integer cstmrSno;
}

97
pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupAprvService.java

@ -0,0 +1,97 @@
package com.palnet.biz.api.bas.group.service;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.bas.group.model.BasGroupAprvModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvRqModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.PtyCstmrGroup;
import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
@Service
public class BasGroupAprvService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PtyGroupQueryRepository query;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
/**
* 승인요청 조회
* @param rq
* @return
*/
public ComnPagingRs<BasGroupAprvModel> mylist(BasGroupAprvRqModel rq){
ComnPagingRs<BasGroupAprvModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
PageImpl<BasGroupAprvModel> result = query.aprvList(rq, pageable);
long total = query.aprvCount(rq, pageable);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setPage(rq.getPage());
response.setTotalPage(totalPage);
return response;
}
/**
* Y : 가입 , N : 탈퇴 , B : 블럭처리 , A: 가입신청 , C : 가입신청 취소
* 승인처리 / 승인취소 처리
* @param
* @return
* @throws Exception
*/
public boolean update(BasGroupAprvModel rq) throws Exception{
Optional<PtyCstmrGroup> optional = ptyCstmrGroupRepository.findById(rq.getCstmrGroupSno());
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyCstmrGroup entity = optional.get();
if(rq.getAprvlYn().equals("Y")){
entity.setAprvlDt(DateUtils.nowDate());
entity.setAprvlUserId(rq.getAprvlUserId());
entity.setGroupAuthCd(rq.getGroupAuthCd());
entity.setTrmnlId(rq.getTrmnlId());
} else {
entity.setGroupAuthCd("");
entity.setTrmnlId("");
}
entity.setAprvlYn(rq.getAprvlYn());
if(ptyCstmrGroupRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
return true;
}
}

122
pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupJoinService.java

@ -0,0 +1,122 @@
package com.palnet.biz.api.bas.group.service;
import java.util.List;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinRqModel;
import com.palnet.biz.api.bas.group.model.BasGroupModel;
import com.palnet.biz.jpa.entity.PtyCstmrGroup;
import com.palnet.biz.jpa.entity.PtyGroupBas;
import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
@Service
public class BasGroupJoinService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PtyGroupQueryRepository query;
@Autowired
private PtyGroupBasRepository ptyGroupBasRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
/**
* 참여할 목록 조회
* @param rq
* @return
*/
public List<BasGroupJoinModel> joinFullList(BasGroupJoinRqModel rq){
List<BasGroupJoinModel> resultList = query.joinFullList(rq);
return resultList;
}
/**
* 가입요청 처리
* @param
* @return
* @throws Exception
*/
public boolean create(BasGroupJoinModel rq) throws Exception{
boolean isNotJoin = query.isNotJoin(rq.getCstmrSno(), rq.getGroupId());
if(!isNotJoin) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
boolean isReJoin = query.isReJoin(rq.getCstmrSno(), rq.getGroupId());
//참여 정보 입력 하기
if(!isReJoin) {
PtyCstmrGroup entity2 = new PtyCstmrGroup();
entity2.setGroupId(rq.getGroupId());
entity2.setGroupAuthCd(rq.getGroupAuthCd()); //생성한 사람은 최고 권한 부여 (MASTER , LEADER, NORMAL) 로 구분 하여 사용
entity2.setCstmrSno(rq.getCstmrSno());
entity2.setJoinYn("Y");
entity2.setJoinDt(DateUtils.nowDate());
entity2.setAprvlYn("N");
if(ptyCstmrGroupRepository.save(entity2) == null)
throw new CustomException(ErrorCode.FAIL);
}else {
PtyCstmrGroup entity = ptyCstmrGroupRepository.findRejoinUser(rq.getGroupId(), rq.getCstmrSno());
entity.setJoinYn("Y");
entity.setJoinDt(DateUtils.nowDate());
ptyCstmrGroupRepository.updateWithdrwDt(rq.getGroupId(), rq.getCstmrSno());
if(ptyCstmrGroupRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
}
return true;
}
/**
* Y : 가입 , N : 탈퇴 , B : 블럭처리 , A: 가입신청 , C : 가입신청 취소
* 가입취소 / 탈퇴 처리
* @param
* @return
* @throws Exception
*/
public boolean update(BasGroupJoinModel rq) throws Exception{
Optional<PtyCstmrGroup> optional = ptyCstmrGroupRepository.findById(rq.getCstmrGroupSno());
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyCstmrGroup entity = optional.get();
if(rq.getJoinYn().equals("N")) {
entity.setAprvlYn("N");
entity.setAprvlUserId("");
entity.setGroupAuthCd("");
entity.setWthdrwDt(DateUtils.nowDate());
}
entity.setJoinYn(rq.getJoinYn());
if(ptyCstmrGroupRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
return true;
}
}

248
pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java

@ -0,0 +1,248 @@
package com.palnet.biz.api.bas.group.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupModel;
import com.palnet.biz.api.bas.group.model.BasGroupRqModel;
import com.palnet.biz.jpa.entity.PtyCstmrGroup;
import com.palnet.biz.jpa.entity.PtyGroupBas;
import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
@Service
public class BasGroupService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PtyGroupQueryRepository query;
@Autowired
private PtyGroupBasRepository ptyGroupBasRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
@Autowired
private JwtTokenUtil jwtTokenUtil;
public String createid() {
String groupId = "";
while(true) {
groupId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase().substring(0, 6);
Optional<PtyGroupBas> optional = ptyGroupBasRepository.findById(groupId);
if(!optional.isPresent()) {
break;
}
}
return groupId;
}
/**
* 나의 그룹 목록
* @param cstmrSno
* @return
*/
public List<BasGroupModel> mylist(int cstmrSno){
List<BasGroupModel> resultList = query.mylist(cstmrSno);
return resultList;
}
/**
* 그룹 목록
* @param cstmrSno
* @return
*/
public List<BasGroupJoinModel> groupList(int cstmrSno){
String appAuth = jwtTokenUtil.getUserAuthByToken();
List<BasGroupJoinModel> resultList = new ArrayList<>();
if("SUPER".equals(appAuth)||"ADMIN".equals(appAuth)) {
resultList = query.groupAdminList(cstmrSno);
} else {
resultList = query.groupUserList(cstmrSno);
}
return resultList;
}
/**
* 나의 그룹 - 참여 그룹 목록
* @param cstmrSno
* @return
*/
public List<BasGroupJoinModel> joinList(int cstmrSno){
List<BasGroupJoinModel> resultList = query.joinList(cstmrSno);
return resultList;
}
/**
* 전체 그룹 목록
* @param rq
* @return
*/
public List<BasGroupModel> list(BasGroupRqModel rq){
List<BasGroupModel> resultList = query.list(rq);
return resultList;
}
/**
* 그룹 상세 조회
* @param groupId
* @return
* @throws Exception
*/
public BasGroupModel detail(String groupId) throws Exception{
BasGroupModel model = new BasGroupModel();
Optional<PtyGroupBas> optional = ptyGroupBasRepository.findById(groupId);
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyGroupBas entity = optional.get();
BeanUtils.copyProperties(entity , model);
return model;
}
/**
* 그룹 생성
* @param rq
* @return
* @throws Exception
*/
public boolean create(BasGroupModel rq) throws Exception{
Optional<PtyGroupBas> optional = ptyGroupBasRepository.findById(rq.getGroupId());
List<PtyGroupBas> groupNm = ptyGroupBasRepository.findByGroupNm(rq.getGroupNm());
for(PtyGroupBas name : groupNm) {
if(rq.getGroupNm().equals(name.getGroupNm())) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
}
if (optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
PtyGroupBas entity = new PtyGroupBas();
BeanUtils.copyProperties(rq , entity);
entity.setUpdateDt(DateUtils.nowDate());
entity.setUseYn("Y");
entity.setCreateDt(DateUtils.nowDate());
entity.setTrmnlId(rq.getTrmnlId());
//참여 정보 입력 하기
PtyCstmrGroup entity2 = new PtyCstmrGroup();
entity2.setGroupId(rq.getGroupId());
// entity2.setGroupAuthCd("CREATER"); //생성한 사람은 최고 권한 부여 (CREATER , ADMIN , USER) 로 구분 하여 사용
entity2.setGroupAuthCd("MASTER"); //생성한 사람은 최고 권한 부여 (MASTER , LEADER, NORMAL) 로 구분 하여 사용
entity2.setAprvlYn("Y"); //자동 승인 처리 함
entity2.setAprvlDt(DateUtils.nowDate());
entity2.setCstmrSno(rq.getCstmrSno());
entity2.setJoinYn("Y");
entity2.setJoinDt(DateUtils.nowDate());
entity2.setTrmnlId(rq.getTrmnlId());
if( ptyGroupBasRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
if(ptyCstmrGroupRepository.save(entity2) == null)
throw new CustomException(ErrorCode.FAIL);
return true;
}
/**
* 그룹 수정
* @param rq
* @return
* @throws Exception
*/
public boolean update(BasGroupModel rq) throws Exception{
Optional<PtyGroupBas> optional = ptyGroupBasRepository.findById(rq.getGroupId());
List<PtyGroupBas> groupNm = ptyGroupBasRepository.findByGroupNm(rq.getGroupNm());
for(PtyGroupBas name : groupNm) {
if(rq.getGroupNm().equals(name.getGroupNm())) {
throw new CustomException(ErrorCode.DATA_DUPLICATE);
}
}
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyGroupBas entity = optional.get();
entity.setGroupNm(rq.getGroupNm());
entity.setGroupTypeCd(rq.getGroupTypeCd());
entity.setUpdateDt(DateUtils.nowDate());
if(ptyGroupBasRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
return true;
}
/**
* 그룹 삭제
* @param groupId
* @return
* @throws Exception
*/
public boolean delete(String groupId) throws Exception{
Optional<PtyGroupBas> optional = ptyGroupBasRepository.findById(groupId);
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyGroupBas entity = optional.get();
entity.setUseYn("N");
entity.setUpdateDt(DateUtils.nowDate());
if(ptyGroupBasRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
return true;
}
}

120
pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupUserService.java

@ -0,0 +1,120 @@
package com.palnet.biz.api.bas.group.service;
import java.util.List;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRsModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserListModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.PtyCstmrGroup;
import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
@Service
public class BasGroupUserService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PtyGroupQueryRepository query;
@Autowired
private PtyGroupBasRepository ptyGroupBasRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
/**
* 그룹 사용자 조회
* @param rq
* @return
*/
public ComnPagingRs<BasGroupUserModel> list(BasGroupUserListModel rq){
ComnPagingRs<BasGroupUserModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
PageImpl<BasGroupUserModel> result = query.userList(rq, pageable);
long total = query.userCount(rq, pageable);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
response.setItems(result.getContent());
response.setTotal(total);
response.setPage(rq.getPage());
response.setTotalPage(totalPage);
return response;
}
/**
* 그룹사용자 권한수정 / 블럭 처리
* @param
* @return
* @throws Exception
*/
public boolean update(BasGroupUserModel rq) throws Exception{
Optional<PtyCstmrGroup> optional = ptyCstmrGroupRepository.findById(rq.getCstmrGroupSno());
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyCstmrGroup entity = optional.get();
entity.setGroupAuthCd(rq.getGroupAuthCd());
entity.setJoinYn(rq.getJoinYn());
if(ptyCstmrGroupRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
return true;
}
public boolean delegate(List<BasGroupUserModel> rq) throws Exception{
for(BasGroupUserModel model : rq) {
BasGroupUserModel userInfo = new BasGroupUserModel();
userInfo.setCstmrGroupSno(model.getCstmrGroupSno());
userInfo.setGroupAuthCd(model.getGroupAuthCd());
userInfo.setJoinYn(model.getJoinYn());
Optional<PtyCstmrGroup> optional = ptyCstmrGroupRepository.findById(userInfo.getCstmrGroupSno());
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
PtyCstmrGroup entity = optional.get();
entity.setGroupAuthCd(model.getGroupAuthCd());
entity.setJoinYn(model.getJoinYn());
if(ptyCstmrGroupRepository.save(entity) == null)
throw new CustomException(ErrorCode.FAIL);
}
return true;
}
}

13
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java

@ -0,0 +1,13 @@
package com.palnet.biz.api.comn.model;
import lombok.Data;
@Data
public class ComnPagingModel {
private int record = 10; // 데이터 표출 수
private int page = 0; // 현재 페이지
private int stIdx = 0; // 시작 위치
private int endIdx = 0; // 끝 위치
}

16
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingRs.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.comn.model;
import lombok.Data;
import java.util.List;
@Data
public class ComnPagingRs<T> {
private long total; // 전체 리스트 수
private long totalPage; // 전체 페이지 수
private long page; // 현재 페이지
private List<T> items; // 현재 페이지 데이터
}

17
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.comn.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class ComnRqModel extends ComnPagingModel {
private String stDate;
private String endDate;
private String search1;
private String searchType1;
}

33
pav-server/src/main/java/com/palnet/biz/api/comn/model/ControlGpsDataContext.java

@ -0,0 +1,33 @@
package com.palnet.biz.api.comn.model;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class ControlGpsDataContext {
private Map<String, String> idntfKey;
public ControlGpsDataContext() {
this.idntfKey = new ConcurrentHashMap<>();
}
public void putIdntfKey(String key, String value) {
idntfKey.put(key, value);
}
public void removeIdntfKey(String key) {
idntfKey.remove(key);
}
public String getIndtfKey(String key) {
return idntfKey.get(key);
}
public Map<String, String> getAllKeys() {
return idntfKey;
}
}

5
pav-server/src/main/java/com/palnet/biz/api/comn/response/BasicResponse.java

@ -0,0 +1,5 @@
package com.palnet.biz.api.comn.response;
public abstract class BasicResponse {
}

29
pav-server/src/main/java/com/palnet/biz/api/comn/response/ErrorResponse.java

@ -0,0 +1,29 @@
package com.palnet.biz.api.comn.response;
import com.palnet.comn.code.RSErrorCode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class ErrorResponse extends BasicResponse{
private String errorMessage;
private String errorCode;
public ErrorResponse(String errorMessage) {
this.errorMessage = errorMessage;
this.errorCode = "404";
}
public ErrorResponse(RSErrorCode code) {
this.errorMessage = code.message();
this.errorCode = code.code();
}
public ErrorResponse(String errorMessage, String errorCode) {
this.errorMessage = errorMessage;
this.errorCode = errorCode;
}
}

25
pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java

@ -0,0 +1,25 @@
package com.palnet.biz.api.comn.response;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class SuccessResponse<T> extends BasicResponse {
private int count;
private T data;
public SuccessResponse(T data) {
this.data = data;
if(data instanceof List) {
this.count = ((List<?>)data).size();
} else {
this.count = 1;
}
}
}

299
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java

@ -0,0 +1,299 @@
package com.palnet.biz.api.ctr.cntrl.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.*;
import com.palnet.biz.api.ctr.cntrl.model.*;
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.api.ctr.cntrl.service.CtrCntrlService;
import com.palnet.comn.model.GPHistoryModel;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RestController
@RequestMapping(value = "/api/ctr/cntrl", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public class CtrCntrlController {
private final CtrCntrlService service;
public CtrCntrlController(CtrCntrlService service) {
this.service = service;
}
/**
* TODO 드론 관제 이력 목록 (Socket 분리 )
*
* @param id - 관제 ID
* @return
*/
@GetMapping(value = "/history/{id}")
@ApiOperation(value = "TODO 드론 관제 이력 목록 (Socket 분리 전)")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> historyList(@PathVariable String id) {
List<GPHistoryModel> result = null;
try {
result = service.getListHistory(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* TODO 드론 관제 상세 정보
*
* @param id - 관제 ID
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "TODO 드론 관제 상세 정보")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
CtrCntrlDtlModel result = null;
try {
result = service.getDetail(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<CtrCntrlDtlModel>(result));
}
/**
* TODO 드론 관제 '실시간' 이력 목록
*
* @param id - 관제 ID
* @return
*/
@GetMapping(value = "/history/list/{id}")
@ApiOperation(value = "TODO 드론 관제 '실시간' 이력 목록")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> history(@PathVariable String id) {
List<GPHistoryModel> history;
try {
history = service.getHistory(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(history));
}
@GetMapping("/api/weather")
@ApiOperation(value = "드론 관제 날씨")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(CtrCntrlWeatherModel rq) throws IOException, ParseException {
JSONObject jsonObject = null;
try {
jsonObject = service.getWeather(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject));
}
/**
* TODO 비행 관제 사용자 권한 정보
*
* @param cstmrSno
* @return
*/
@GetMapping("/group")
@ApiOperation(value = "TODO 비행 관제 사용자 권한 정보")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> findGroupAuthInfo(int cstmrSno) {
List<CtrCntrlGroupArcrftModel> list;
try {
list = service.getGroupAuthInfo();
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(list));
}
/**
* TODO 비행 관제 사용자 비행 계획서 정보
*
* @param idntfNum
* @return
*/
@GetMapping("/flight_plan/{idntfNum}")
@ApiOperation(value = "TODO 비행 관제 사용자 비행 계획서 정보")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findFlightPlan(@PathVariable("idntfNum") String idntfNum) {
List<BasFlightPlanModel> list;
try {
list = service.getFlightPlan(idntfNum);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(list));
}
/**
* TODO 드론 운행 시작 알람 목록
*
* @param id - 관제 ID
* @return
*/
@GetMapping(value = "/warn/detail/{id}")
@ApiOperation(value = "TODO 드론 운행 시작 후 알람 목록")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> warnDetail(@PathVariable String id){
List<CtrCntrlWarnLogModel> warnLog;
try {
warnLog = service.getWarnLog(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(warnLog));
}
/**
* TODO 기체 최신 비정상 로그 비정상 로그 전체 개수
*
* @param id
* @return
*/
@PostMapping(value = "/arcrft/warn/list")
@ApiOperation(value = "TODO 기체 별 최신 비정상 로그 및 비정상 로그 전체 개수")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> arcrftWarnList(@RequestBody CtrCntrlArcrftWarnRqModel rq){
// public ResponseEntity<? extends BasicResponse> arcrftWarnList(@RequestParam("id") String id){
List<CtrCntrlArcrftWarnModel> arcrftWarnList;
Map<String, CtrCntrlArcrftWarnModel> result = new HashMap<>();
try {
arcrftWarnList = service.getArcrftWarnList(rq.getCntrlId());
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(arcrftWarnList));
}
/**
* TODO 비행 관제 구역 비정상 상황 체크
*
* @param rq
* @return
*/
@PostMapping("/contains")
@ApiOperation(value = "TODO 비행 관제 구역 비정상 상황 체크")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> checkPlanContains(@RequestBody CtrCntrlPlanContainsRq rq) {
CtrCntrlPlanContainsRs rs;
try {
rs = service.checkPlanContains(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse(rs));
}
/**
* TODO 실시간 Control ID 발급
*
* @param id
* @return
*/
@GetMapping("/id/{id}")
@ApiOperation(value = "TODO 실시간 Control ID 발급")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> getId(@PathVariable String id) {
Map<String, String> result;
try {
result = service.getId(id);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse(result));
}
/**
* TODO 비행 관제 기체의 비정상 상황 확인
*
* @param id
* @param lat
* @param lon
* @return
*/
@GetMapping("/warn/{id}/{lat}/{lon}")
@ApiOperation(value = "TODO 비행 관제 기체의 비정상 상황 확인")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> checkWarring(@PathVariable String id,
@PathVariable Double lat,
@PathVariable Double lon) {
Map<String, String> result;
try {
result = service.checkWarring(id, lat, lon);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse(result));
}
}

13
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/PingController.java

@ -0,0 +1,13 @@
package com.palnet.biz.api.ctr.cntrl.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PingController {
@GetMapping("/ping")
public String ping(){
return "SUCCESS";
}
}

57
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java

@ -0,0 +1,57 @@
package com.palnet.biz.api.ctr.cntrl.controller;
import com.palnet.biz.api.ctr.cntrl.service.SocketReceiverService;
import com.palnet.comn.model.GPModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* packageName : com.palnet.biz.api.ctr.cntrl.controller
* fileName : SocketReciverController
* author : dhji
* date : 2023-08-29(029)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-08-29(029) dhji 최초 생성
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/server")
public class SocketReceiverController {
private final SocketReceiverService socketReceiverService;
@PostMapping("/receiver")
public ResponseEntity<?> receiver(@RequestBody GPModel model) {
System.out.println("socket message : " + model);
socketReceiverService.insert(model);
return ResponseEntity.ok().build();
}
@PostMapping("/receiver/async")
public Callable<String> asyncReceiver(@RequestBody GPModel model) {
return () -> {
log.info("websocket message : {}", model);
socketReceiverService.insert(model);
return "OK";
};
}
@PostMapping("/receiver/all")
public ResponseEntity<?> receiver(@RequestBody Map<String, List<GPModel>> models) {
// System.out.println("socket message : " + models);
socketReceiverService.insertAll(models);
return ResponseEntity.ok().build();
}
}

21
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
import java.util.Date;
@Data
public class CtrCntrlArcrftWarnModel {
private String cntrlId;
private String warnType;
private String idntfNum;
private Date occurDt;
private Date createDt;
private String createUserId;
private Integer warnCount;
private boolean controlWarnCd = false;
}

8
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnRqModel.java

@ -0,0 +1,8 @@
package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
@Data
public class CtrCntrlArcrftWarnRqModel {
private String cntrlId;
}

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

Loading…
Cancel
Save