zhizhi wu 4 years ago
commit
182eb516b6
  1. 33
      .gitignore
  2. 118
      .mvn/wrapper/MavenWrapperDownloader.java
  3. BIN
      .mvn/wrapper/maven-wrapper.jar
  4. 2
      .mvn/wrapper/maven-wrapper.properties
  5. 322
      mvnw
  6. 182
      mvnw.cmd
  7. 85
      pom.xml
  8. 31
      src/main/java/com/ccsens/ptccsens/PtCcsensApplication.java
  9. 29
      src/main/java/com/ccsens/ptccsens/api/DebugController.java
  10. 92
      src/main/java/com/ccsens/ptccsens/api/project/MemberController.java
  11. 39
      src/main/java/com/ccsens/ptccsens/api/project/PluginController.java
  12. 38
      src/main/java/com/ccsens/ptccsens/api/project/PowerController.java
  13. 66
      src/main/java/com/ccsens/ptccsens/api/project/ProjectController.java
  14. 99
      src/main/java/com/ccsens/ptccsens/api/project/RoleController.java
  15. 48
      src/main/java/com/ccsens/ptccsens/api/project/ShareController.java
  16. 129
      src/main/java/com/ccsens/ptccsens/api/project/TaskController.java
  17. 46
      src/main/java/com/ccsens/ptccsens/api/project/UserController.java
  18. 74
      src/main/java/com/ccsens/ptccsens/api/project/WbsController.java
  19. 20
      src/main/java/com/ccsens/ptccsens/bean/dto/RoleDto.java
  20. 29
      src/main/java/com/ccsens/ptccsens/bean/dto/TaskDto.java
  21. 60
      src/main/java/com/ccsens/ptccsens/bean/vo/ProjectVo.java
  22. 22
      src/main/java/com/ccsens/ptccsens/config/BeanConfig.java
  23. 128
      src/main/java/com/ccsens/ptccsens/config/SpringConfig.java
  24. 56
      src/main/java/com/ccsens/ptccsens/config/SwaggerConfigure.java
  25. 159
      src/main/java/com/ccsens/ptccsens/intercept/MybatisInterceptor.java
  26. 12
      src/main/java/com/ccsens/ptccsens/persist/dao/SPluginDao.java
  27. 29
      src/main/java/com/ccsens/ptccsens/persist/dao/SProjectDao.java
  28. 23
      src/main/java/com/ccsens/ptccsens/persist/dao/STaskDao.java
  29. 15
      src/main/java/com/ccsens/ptccsens/persist/dao/SubLabelDao.java
  30. 18
      src/main/java/com/ccsens/ptccsens/service/IImportService.java
  31. 17
      src/main/java/com/ccsens/ptccsens/service/IUserService.java
  32. 896
      src/main/java/com/ccsens/ptccsens/service/ImportService.java
  33. 33
      src/main/java/com/ccsens/ptccsens/service/UserService.java
  34. 42
      src/main/java/com/ccsens/ptccsens/util/BasicsCodeError.java
  35. 50
      src/main/java/com/ccsens/ptccsens/util/BasicsConstant.java
  36. 30
      src/main/resources/application-common.yml
  37. 50
      src/main/resources/application-dev.yml
  38. 40
      src/main/resources/application-prod.yml
  39. 48
      src/main/resources/application-test.yml
  40. 4
      src/main/resources/application.yml
  41. 35
      src/main/resources/druid-dev.yml
  42. 35
      src/main/resources/druid-prod.yml
  43. 33
      src/main/resources/druid-test.yml
  44. 196
      src/main/resources/logback-spring.xml
  45. 25
      src/main/resources/mapper_dao/SPluginDao.xml
  46. 50
      src/main/resources/mapper_dao/SProjectDao.xml
  47. 38
      src/main/resources/mapper_dao/STaskDao.xml
  48. 29
      src/main/resources/mapper_dao/SubLableDao.xml
  49. 90
      src/main/resources/mbg.xml
  50. 62
      src/main/resources/mybatis/mybatis-config.xml

33
.gitignore

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

118
.mvn/wrapper/MavenWrapperDownloader.java

@ -0,0 +1,118 @@
/*
* Copyright 2007-present the original author or 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.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if (mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if (mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}

BIN
.mvn/wrapper/maven-wrapper.jar

Binary file not shown.

2
.mvn/wrapper/maven-wrapper.properties

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

322
mvnw

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

182
mvnw.cmd

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

85
pom.xml

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ccsens</groupId>
<artifactId>ptccsens</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ptccsens</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--cloud 工具类-->
<dependency>
<artifactId>cloudutil</artifactId>
<groupId>com.ccsens</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--公用接口-->
<dependency>
<artifactId>common</artifactId>
<groupId>com.ccsens</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--util 工具类-->
<dependency>
<groupId>com.ccsens</groupId>
<artifactId>util</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--微信工具包-->
<dependency>
<artifactId>wechatutil</artifactId>
<groupId>com.ccsens</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/mbg.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.ccsens.ptccsens.PtCcsensApplication</mainClass>
<!--<skip>true</skip>-->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

31
src/main/java/com/ccsens/ptccsens/PtCcsensApplication.java

@ -0,0 +1,31 @@
package com.ccsens.ptccsens;
import com.ccsens.cloudutil.ribbon.RibbonConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.scheduling.annotation.EnableAsync;
/**
* @author whj
*/
@MapperScan(basePackages = {"com.ccsens.ptccsens.persist.*","com.ccsens.common.persist.*"})
@ServletComponentScan
@EnableAsync
//开启断路器功能
@EnableCircuitBreaker
@EnableFeignClients(basePackages = "com.ccsens.cloudutil.feign")
@SpringBootApplication
@ComponentScan(basePackages = "com.ccsens", excludeFilters = { @ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE, value = RibbonConfiguration.class)})
public class PtCcsensApplication {
public static void main(String[] args) {
SpringApplication.run(PtCcsensApplication.class, args);
}
}

29
src/main/java/com/ccsens/ptccsens/api/DebugController.java

@ -0,0 +1,29 @@
package com.ccsens.ptccsens.api;
import com.ccsens.util.JsonResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@Api(tags = "DEBUG" , description = "DebugController | ")
@RestController
@RequestMapping("/debug")
@Slf4j
public class DebugController {
@ApiOperation(value = "/测试",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value="",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
public JsonResponse debug(HttpServletRequest request) throws Exception {
return JsonResponse.newInstance().ok("测试");
}
}

92
src/main/java/com/ccsens/ptccsens/api/project/MemberController.java

@ -0,0 +1,92 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.common.bean.dto.CMemberDto;
import com.ccsens.common.bean.vo.CMemberVo;
import com.ccsens.common.service.MemberService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author
*/
@Api(tags = "角色相关" , description = "DebugController | ")
@RestController
@RequestMapping("/member")
@Slf4j
public class MemberController {
@Resource
private MemberService memberService;
@MustLogin
@ApiOperation(value = "查找项目下的成员", notes = "")
@RequestMapping(value = "/query", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CMemberVo.MemberInfo>> queryByProjectId(@ApiParam @Validated @RequestBody QueryDto<CMemberDto.QueryMemberByProject> params) {
log.info("查找项目下的成员:{}",params);
List<CMemberVo.MemberInfo> memberInfoList = memberService.queryByProject(params.getParam(), params.getUserId());
log.info("项目下的成员列表:{}",memberInfoList);
return JsonResponse.newInstance().ok(memberInfoList);
}
@MustLogin
@ApiOperation(value = "根据id查找成员", notes = "")
@RequestMapping(value = "/getById", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CMemberVo.MemberInfo>> getMemberById(@ApiParam @Validated @RequestBody QueryDto<CMemberDto.GetMember> params) {
log.info("根据id查找成员:{}",params);
CMemberVo.MemberInfo memberInfo = memberService.getMemberById(params.getParam(), params.getUserId());
log.info("根据id查找成员信息:{}",memberInfo);
return JsonResponse.newInstance().ok(memberInfo);
}
@MustLogin
@ApiOperation(value = "添加成员", notes = "")
@RequestMapping(value = "/save", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse saveMember(@ApiParam @Validated @RequestBody QueryDto<CMemberDto.SaveMemberInfo> params) {
log.info("添加成员:{}",params);
memberService.saveMember(params.getParam(), params.getUserId());
log.info("添加成员成功");
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "修改成员信息", notes = "")
@RequestMapping(value = "/update", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateMember(@ApiParam @Validated @RequestBody QueryDto<CMemberDto.UpdateMemberInfo> params) {
log.info("修改成员信息:{}",params);
memberService.updateMember(params.getParam(), params.getUserId());
log.info("修改成员信息成功");
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "删除成员信息", notes = "")
@RequestMapping(value = "/delete", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse delMember(@ApiParam @Validated @RequestBody QueryDto<CMemberDto.GetMember> params) {
log.info("删除成员信息:{}",params);
memberService.deleteMember(params.getParam(), params.getUserId());
log.info("删除成员信息成功");
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "修改成员所属的角色", notes = "")
@RequestMapping(value = "/memberRoles", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateMemberRoles(@ApiParam @Validated @RequestBody QueryDto<CMemberDto.UpdateMemberRoles> params) {
log.info("修改成员所属的角色:{}",params);
memberService.updateMemberRoles(params.getParam(), params.getUserId());
log.info("修改成员所属的角色成功");
return JsonResponse.newInstance().ok();
}
}

39
src/main/java/com/ccsens/ptccsens/api/project/PluginController.java

@ -0,0 +1,39 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.common.bean.dto.CPluginDto;
import com.ccsens.common.service.IPluginService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author
*/
@Api(tags = "插件相关" , description = "DebugController | ")
@RestController
@RequestMapping("/plugin")
@Slf4j
public class PluginController {
@Resource
private IPluginService pluginService;
@MustLogin
@ApiOperation(value = "给任务添加插件", notes = "")
@RequestMapping(value = "/save", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse queryPatientList(@ApiParam @Validated @RequestBody QueryDto<List<CPluginDto.UpdateTaskPlugin>> params) throws Exception{
pluginService.updateTaskPlugin(params.getParam());
return JsonResponse.newInstance().ok();
}
}

38
src/main/java/com/ccsens/ptccsens/api/project/PowerController.java

@ -0,0 +1,38 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.common.bean.dto.CProjectDto;
import com.ccsens.common.service.IPowerService;
import com.ccsens.util.JsonResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
/**
* @author
*/
@Api(tags = "权限相关" , description = "")
@RestController
@RequestMapping("/power")
@Slf4j
public class PowerController {
@Resource
private IPowerService powerService;
@ApiOperation(value = "查询用户在项目中的权限", notes = "")
@RequestMapping(value = "/query", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<Integer> queryPatientList(@ApiParam @Validated @RequestBody CProjectDto.QueryPower params) throws Exception{
Integer power = powerService.queryUserPower(params.getProjectId(), params.getUserId());
return JsonResponse.newInstance().ok(power);
}
}

66
src/main/java/com/ccsens/ptccsens/api/project/ProjectController.java

@ -0,0 +1,66 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.common.bean.dto.CProjectDto;
import com.ccsens.common.bean.vo.CProjectVo;
import com.ccsens.common.service.IProjectService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author
*/
@Api(tags = "项目相关" , description = "DebugController | ")
@RestController
@RequestMapping("/project")
@Slf4j
public class ProjectController {
@Resource
private IProjectService projectService;
@ApiOperation(value = "根据id查询项目信息", notes = "根据id查询项目信息")
@RequestMapping(value = "/findProjectById", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<CProjectVo.ProjectInfo> findProjectById(@ApiParam @Validated @RequestBody QueryDto<CProjectDto.ProjectById> params) throws Exception{
CProjectVo.ProjectInfo projectById = projectService.findProjectById(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(projectById);
}
@ApiOperation(value = "查询子项目", notes = "查询子项目")
@RequestMapping(value = "/findSonProject", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CProjectVo.ProjectInfo>> findSonProject(@ApiParam @Validated @RequestBody QueryDto<CProjectDto.FindSonProject> params) throws Exception{
log.info("查询子项目开始");
List<CProjectVo.ProjectInfo> projectInfoList = projectService.findSonProject(params.getParam(), params.getUserId());
log.info("查询子项目结束{}",projectInfoList);
return JsonResponse.newInstance().ok(projectInfoList);
}
@ApiOperation(value = "删除项目", notes = "删除项目")
@RequestMapping(value = "/deleteProject", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse deleteProject(@ApiParam @Validated @RequestBody QueryDto<CProjectDto.ProjectById> params) throws Exception{
log.info("删除项目开始");
projectService.deleteProjectById(params.getParam(), params.getUserId());
log.info("删除项目结束");
return JsonResponse.newInstance().ok();
}
@RequestMapping(value = "/tallDelProject", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse deleteProject(@ApiParam @Validated @RequestBody CProjectDto.ProjectById params) throws Exception{
log.info("删除项目开始");
projectService.deleteProjectById(params,null);
log.info("删除项目结束");
return JsonResponse.newInstance().ok();
}
}

99
src/main/java/com/ccsens/ptccsens/api/project/RoleController.java

@ -0,0 +1,99 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.common.bean.dto.CRoleDto;
import com.ccsens.common.bean.vo.CRoleVo;
import com.ccsens.common.service.IProRoleService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author
*/
@Api(tags = "角色相关" , description = "DebugController | ")
@RestController
@RequestMapping("/role")
@Slf4j
public class RoleController {
@Resource
private IProRoleService roleService;
@MustLogin
@ApiOperation(value = "根据项目id查找角色", notes = "")
@RequestMapping(value = "/show", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<CRoleVo.QueryRole> queryByProjectId(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.QueryRoleById> params) {
CRoleVo.QueryRole queryRole = roleService.queryShowRole(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(queryRole);
}
@MustLogin
@ApiOperation(value = "修改角色展示", notes = "")
@RequestMapping(value = "/updateShow", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateShow(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.UpdateRoleShow> params) {
roleService.updateShowRole(params.getParam(),params.getUserId());
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "查询角色下的所有成员", notes = "")
@RequestMapping(value = "/queryMemberOfRole", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CRoleVo.MemberOfRoleInfo>> queryMemberOfRole(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.QueryMemberOfRole> params) {
log.info("查询角色下的所有成员开始{}",params);
List<CRoleVo.MemberOfRoleInfo> member = roleService.queryMemberOfRole(params.getParam(),params.getUserId());
log.info("查询角色下的所有成员开始{}",params);
return JsonResponse.newInstance().ok(member);
}
@MustLogin
@ApiOperation(value = "添加角色", notes = "")
@RequestMapping(value = "/save", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse saveRole(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.SaveRole> params) {
log.info("添加角色{}",params);
roleService.saveRole(params.getParam(),params.getUserId());
log.info("添加角色成功");
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "修改角色信息", notes = "")
@RequestMapping(value = "/update", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateRole(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.UpdateRole> params) {
log.info("修改角色信息{}",params);
roleService.updateRole(params.getParam(),params.getUserId());
log.info("修改角色信息成功");
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "删除角色", notes = "")
@RequestMapping(value = "/delete", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse deleteRole(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.QueryMemberOfRole> params) {
log.info("删除角色{}",params);
roleService.delRole(params.getParam(),params.getUserId());
log.info("删除角色成功");
return JsonResponse.newInstance().ok();
}
@MustLogin
@ApiOperation(value = "修改角色下的成员", notes = "")
@RequestMapping(value = "/roleMembers", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateRoleMembers(@ApiParam @Validated @RequestBody QueryDto<CRoleDto.UpdateRoleMembers> params) {
log.info("修改角色下的成员{}",params);
roleService.updateRoleMembers(params.getParam(),params.getUserId());
log.info("修改角色下的成员成功");
return JsonResponse.newInstance().ok();
}
}

48
src/main/java/com/ccsens/ptccsens/api/project/ShareController.java

@ -0,0 +1,48 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.common.bean.dto.CShareDto;
import com.ccsens.common.bean.vo.CShareVo;
import com.ccsens.common.service.IShareService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
/**
* @author AUSU
*/
@Api(tags = "分享相关")
@RestController
@RequestMapping("/share")
@Slf4j
public class ShareController {
@Resource
private IShareService shareService;
@MustLogin
@ApiOperation(value = "创建分享连接", notes = "")
@RequestMapping(value = "/create", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<CShareVo.CreateShareUrl> createShareUrl(@ApiParam @Validated @RequestBody QueryDto<CShareDto.CreateShareUrl> params) {
CShareVo.CreateShareUrl shareUrl = shareService.createShareUrl(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(shareUrl);
}
@MustLogin
@ApiOperation(value = "点击分享连接", notes = "")
@RequestMapping(value = "/click", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<CShareVo.ClickShareInfo> queryByProjectId(@ApiParam @Validated @RequestBody QueryDto<CShareDto.ClickShareUrl> params) {
CShareVo.ClickShareInfo clickShareInfo = shareService.clickShareUrl(params.getParam(), params.getUserId(),params.getUserName(),params.getPhone());
return JsonResponse.newInstance().ok(clickShareInfo);
}
}

129
src/main/java/com/ccsens/ptccsens/api/project/TaskController.java

@ -0,0 +1,129 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.common.bean.dto.CPluginDto;
import com.ccsens.common.bean.dto.CTaskDto;
import com.ccsens.common.bean.vo.CPluginVo;
import com.ccsens.common.bean.vo.CTaskVo;
import com.ccsens.common.service.ITaskService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author
*/
@Api(tags = "任务相关" , description = "DebugController | ")
@RestController
@RequestMapping("/task")
@Slf4j
public class TaskController {
@Resource
private ITaskService taskService;
@MustLogin
@ApiOperation(value = "查找永久日常任务", notes = "")
@RequestMapping(value = "/permanent", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CTaskVo.QueryTask>> queryPermanentGlobalTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.QueryPermanentGlobalTask> params) {
List<CTaskVo.QueryTask> queryTasks = taskService.queryPermanentGlobalTask(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(queryTasks);
}
@MustLogin
@ApiOperation(value = "查找带时间的日常任务", notes = "")
@RequestMapping(value = "/global", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CTaskVo.QueryTask>> queryGlobalTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.QueryGlobalTask> params) {
List<CTaskVo.QueryTask> queryTasks = taskService.queryGlobalTask(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(queryTasks);
}
@MustLogin
@ApiOperation(value = "查找定期任务", notes = "")
@RequestMapping(value = "/regular", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CTaskVo.QueryTask>> queryRegularTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.QueryRegularTask> params) {
List<CTaskVo.QueryTask> queryTasks = taskService.queryRegularTask(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(queryTasks);
}
@MustLogin
@ApiOperation(value = "修改任务状态", notes = "")
@RequestMapping(value = "/type", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateTaskType(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.UpdateTaskType> params) throws Exception {
taskService.updateTaskType(params.getParam(),params.getUserId());
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "查询子任务", notes = "")
@RequestMapping(value = "/findSonTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CTaskVo.SonTaskDetail>> findSonTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.FindSonTask> params) throws Exception {
log.info("查询子任务开始");
List<CTaskVo.SonTaskDetail> sonTask = taskService.findSonTask(params.getParam(), params.getUserId());
log.info("查询子任务开始{}",sonTask);
return JsonResponse.newInstance().ok(sonTask);
}
@ApiOperation(value = "添加任务", notes = "")
@RequestMapping(value = "/save", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CTaskVo.QueryTask>> saveTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.SaveTask> params) throws Exception {
log.info("添加任务开始");
List<CTaskVo.QueryTask> taskList = taskService.saveTask(params.getParam(), params.getUserId());
log.info("添加任务结束{}",taskList);
return JsonResponse.newInstance().ok(taskList);
}
@ApiOperation(value = "查找项目下的任务", notes = "")
@RequestMapping(value = "/queryTaskOfProject", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CTaskVo.TaskOfProject>> queryTaskOfProject(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.QueryTaskOfProject> params) throws Exception {
log.info("查找项目下的任务开始{}",params);
List<CTaskVo.TaskOfProject> taskList = taskService.queryTaskOfProject(params.getParam(), params.getUserId());
log.info("查找项目下的任务结束{}",taskList);
return JsonResponse.newInstance().ok(taskList);
}
@ApiOperation(value = "修改任务信息", notes = "")
@RequestMapping(value = "/update", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.UpdateTask> params) throws Exception {
log.info("修改任务信息开始{}",params);
taskService.updateTaskDetail(params.getParam(), params.getUserId());
log.info("修改任务信息结束");
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "删除任务", notes = "")
@RequestMapping(value = "/delete", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse deleteTask(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.FindSonTask> params) throws Exception {
log.info("删除任务开始{}",params);
taskService.deleteTaskDetail(params.getParam(), params.getUserId());
log.info("删除任务结束");
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "查找任务下的插件列表", notes = "")
@RequestMapping(value = "/queryTaskPlugin", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<CPluginVo.TaskPlugin>> queryTaskPlugin(@ApiParam @Validated @RequestBody QueryDto<CTaskDto.FindSonTask> params) throws Exception {
log.info("查找任务下的插件列表开始{}",params);
List<CPluginVo.TaskPlugin> taskPlugins = taskService.queryPluginByTaskId(params.getParam(), params.getUserId());
log.info("查找任务下的插件列表结束:{}",taskPlugins);
return JsonResponse.newInstance().ok(taskPlugins);
}
@ApiOperation(value = "给任务添加关联插件", notes = "")
@RequestMapping(value = "/saveTaskPlugin", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse saveTaskPlugin(@ApiParam @Validated @RequestBody QueryDto<CPluginDto.SaveTaskPlugin> params) throws Exception {
log.info("给任务添加关联插件{}",params);
taskService.saveTaskPlugin(params.getParam(), params.getUserId());
log.info("给任务添加关联插件结束");
return JsonResponse.newInstance().ok();
}
}

46
src/main/java/com/ccsens/ptccsens/api/project/UserController.java

@ -0,0 +1,46 @@
package com.ccsens.ptccsens.api.project;
import com.ccsens.common.bean.dto.CMemberDto;
import com.ccsens.ptccsens.service.IUserService;
import com.ccsens.util.JsonResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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.RestController;
import javax.annotation.Resource;
@Api(tags = "DEBUG" , description = "DebugController | ")
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Resource
private IUserService userService;
@ApiOperation(value = "根据手机号更新成员的userId",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value="/memberWithPhone",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"})
public JsonResponse memberWithPhone(@ApiParam @Validated @RequestBody CMemberDto.PhoneAndUserId params) throws Exception {
log.info("根据手机号更新成员userId");
userService.memberWithPhone(params);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "合并用户后修改userId",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value="/mergeUser",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"})
public JsonResponse mergeUser(@ApiParam @Validated @RequestBody CMemberDto.MergeUser params) throws Exception {
log.info("合并用户后修改userId");
userService.mergeUser(params);
return JsonResponse.newInstance().ok();
}
}

74
src/main/java/com/ccsens/ptccsens/api/project/WbsController.java

@ -0,0 +1,74 @@
package com.ccsens.ptccsens.api.project;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.ptccsens.util.BasicsConstant;
import com.ccsens.ptccsens.util.BasicsCodeError;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.ptccsens.bean.vo.ProjectVo;
import com.ccsens.ptccsens.service.IImportService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.WebConstant;
import com.ccsens.util.bean.dto.QueryDto;
import com.ccsens.util.exception.BaseException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.util.Date;
/**
* @author
*/
@Api(tags = "导入wbs" , description = "DebugController | ")
@RestController
@RequestMapping("/wbs")
@Slf4j
public class WbsController {
@Resource
private IImportService importService;
@MustLogin
@ApiOperation(value = "导入WBS",notes = "文件大小不能超过20M,支持后缀:.xls|.xlsx")
@ApiImplicitParams({
// @ApiImplicitParam(name = "file", value = "WBS表", required = true, paramType = "form",dataType = "__file")
})
@RequestMapping(value = "", method = RequestMethod.POST)
public JsonResponse<ProjectVo.ProjectInfo> importWbs(QueryDto<MultipartFile> params, Long projectId) throws Exception {
MultipartFile f = params.getParam();
String ext = FileUtil.extName(f.getOriginalFilename());
if(StrUtil.isEmpty(ext) || !BasicsConstant.WbsExcel.WBS_FILE_FORMAT.contains(ext)){
throw new BaseException(BasicsCodeError.FILE_FORMAT_ERROR);
}
//文件路径
String dir = WebConstant.UPLOAD_PROJECT_WBS + File.separator;
String extraPath = DateUtil.format(new Date(), "yyyyMMdd");
String path = extraPath + File.separator + IdUtil.simpleUUID() + "." + ext;
//转成file
File file = new File(dir + extraPath);
if (!file.exists()) {
file.mkdirs();
}
String fullPath = dir + File.separator + path;
FileUtil.writeFromStream(f.getInputStream(), fullPath);
//导入数据库
ProjectVo.ProjectInfo projectInfo = importService.importWbs(fullPath,params.getUserId(),projectId);
return JsonResponse.newInstance().ok(projectInfo);
}
}

20
src/main/java/com/ccsens/ptccsens/bean/dto/RoleDto.java

@ -0,0 +1,20 @@
package com.ccsens.ptccsens.bean.dto;
import lombok.Data;
@Data
public class RoleDto {
@Data
public static class WbsMember{
//成员id
private Long id;
//userId
private Long userId;
public WbsMember(Long id, Long userId) {
this.id = id;
this.userId = userId;
}
}
}

29
src/main/java/com/ccsens/ptccsens/bean/dto/TaskDto.java

@ -0,0 +1,29 @@
package com.ccsens.ptccsens.bean.dto;
import lombok.Data;
/**
* @author
*/
@Data
public class TaskDto {
/**
* 导入wbs--插件关联表id
*/
@Data
public static class TaskPluginId{
private Long taskPluginId1;
private Long taskPluginId2;
private Long taskPluginId3;
public TaskPluginId(Long id1, Long id2,Long id3) {
this.taskPluginId1 = id1;
this.taskPluginId2 = id2;
this.taskPluginId3 = id3;
}
public TaskPluginId() {
}
}
}

60
src/main/java/com/ccsens/ptccsens/bean/vo/ProjectVo.java

@ -0,0 +1,60 @@
package com.ccsens.ptccsens.bean.vo;
import cn.hutool.core.util.ObjectUtil;
import com.ccsens.util.WebConstant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author AUSU
*/
@Data
public class ProjectVo {
@Data
@ApiModel("项目信息defaultProject")
public static class ProjectInfo{
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("项目名")
private String name;
@ApiModelProperty("开始时间")
private Long startTime;
@ApiModelProperty("结束时间")
private Long endTime;
@ApiModelProperty("项目完成状态(0-未开始,1-进行中,2-暂停,3-已完成)")
private byte status;
@ApiModelProperty("访问路径)")
private String url;
public Byte getStatus() {
long current = System.currentTimeMillis();
if(ObjectUtil.isNull(getStartTime()) || ObjectUtil.isNull(getEndTime())) {
return null;
}
if(getStartTime() > current){
this.status = (byte) WebConstant.EVENT_PROCESS.Pending.value;
}else if(getEndTime() < current){
this.status = (byte) WebConstant.EVENT_PROCESS.Expired.value;
}else{
this.status = (byte) WebConstant.EVENT_PROCESS.Processing.value;
}
return this.status;
}
}
@Data
public static class SysProject{
@ApiModelProperty("项目id")
private Long id;
@ApiModelProperty("项目名称")
private String name;
@ApiModelProperty("开始时间")
private Long beginTime;
@ApiModelProperty("结束时间")
private Long endTime;
@ApiModelProperty("导入类型(0-第一次导入,1-修改WBS)")
private Byte importType = 0;;
}
}

22
src/main/java/com/ccsens/ptccsens/config/BeanConfig.java

@ -0,0 +1,22 @@
package com.ccsens.ptccsens.config;
import com.ccsens.ptccsens.intercept.MybatisInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @description:
* @author: wuHuiJuan
* @create: 2019/12/03 18:01
*/
@Configuration
public class BeanConfig {
/**
* 注册拦截器
*/
@Bean
public MybatisInterceptor mybatisInterceptor() {
MybatisInterceptor interceptor = new MybatisInterceptor();
return interceptor;
}
}

128
src/main/java/com/ccsens/ptccsens/config/SpringConfig.java

@ -0,0 +1,128 @@
package com.ccsens.ptccsens.config;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.ccsens.util.config.DruidProps;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.*;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;
@Configuration
public class SpringConfig implements WebMvcConfigurer {
@Resource
private DruidProps druidPropsUtil;
@Value("${spring.snowflake.workerId}")
private String workerId;
@Value("${spring.snowflake.datacenterId}")
private String datacenterId;
/**
* 配置Converter
* @return
*/
@Bean
public HttpMessageConverter<String> responseStringConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
}
@Bean
public HttpMessageConverter<Object> responseJsonConverter(){
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
List<MediaType> mediaTypeList = new ArrayList<>();
mediaTypeList.add(MediaType.TEXT_HTML);
mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
converter.setSupportedMediaTypes(mediaTypeList);
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
converter.setObjectMapper(objectMapper);
return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(responseStringConverter());
converters.add(responseJsonConverter());
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// .allowedMethods("*") // 允许提交请求的方法,*表示全部允许
.allowedOrigins("*") // #允许向该服务器提交请求的URI,*表示全部允许
.allowCredentials(true) // 允许cookies跨域
.allowedHeaders("*") // #允许访问的头信息,*表示全部
.maxAge(18000L); // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
}
/**
* 配置静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:///home/cloud/ccbasics/uploads/");
}
/**
* 配置拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
/**
* 配置数据源单数据源
*/
@Bean
public DataSource dataSource(){
return druidPropsUtil.createDruidDataSource();
}
@Bean
public Snowflake snowflake(){
return IdUtil.createSnowflake(Long.valueOf(workerId),Long.valueOf(datacenterId));
}
}

56
src/main/java/com/ccsens/ptccsens/config/SwaggerConfigure.java

@ -0,0 +1,56 @@
package com.ccsens.ptccsens.config;
import com.ccsens.util.WebConstant;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
@ConditionalOnExpression("${swagger.enable}")
//public class SwaggerConfigure extends WebMvcConfigurationSupport {
public class SwaggerConfigure /*implements WebMvcConfigurer*/ {
@Bean
public Docket customDocket() {
//
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors
.basePackage("com.ccsens.ccbasics.api"))
.build()
.globalOperationParameters(setHeaderToken());
}
private ApiInfo apiInfo() {
return new ApiInfo("Swagger Tall-game",//大标题 title
"This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.",//小标题
"1.0.0",//版本
"http://swagger.io/terms/",//termsOfServiceUrl
"zhangsan",//作者
"Apache 2.0",//链接显示文字
"http://www.apache.org/licenses/LICENSE-2.0.html"//网站链接
);
}
private List<Parameter> setHeaderToken() {
ParameterBuilder tokenPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<>();
tokenPar.name(WebConstant.HEADER_KEY_TOKEN).description("token")
.defaultValue(WebConstant.HEADER_KEY_TOKEN_PREFIX)
.modelRef(new ModelRef("string")).parameterType("header").required(false).build();
pars.add(tokenPar.build());
return pars;
}
}

159
src/main/java/com/ccsens/ptccsens/intercept/MybatisInterceptor.java

@ -0,0 +1,159 @@
package com.ccsens.ptccsens.intercept;
import cn.hutool.core.collection.CollectionUtil;
import com.ccsens.util.WebConstant;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* @description:
* @author: wuHuiJuan
* @create: 2019/12/11 10:58
*/
@Intercepts({
@Signature(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
)
})
public class MybatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
String selectByExample = "selectByExample";
String countByExample = "countByExample";
String countByExample2 = "selectByExample_COUNT";
String selectByPrimaryKey = "selectByPrimaryKey";
Object[] args = invocation.getArgs();
MappedStatement statement = (MappedStatement) args[0];
if (statement.getId().endsWith(selectByExample)
|| statement.getId().endsWith(countByExample)
|| statement.getId().endsWith(countByExample2)) {
//XXXExample
Object example = args[1];
addCondition(statement, example);
} else if (statement.getId().endsWith(selectByPrimaryKey)) {
BoundSql boundSql = statement.getBoundSql(args[1]);
String sql = boundSql.getSql() + " and rec_status = 0";
MappedStatement newStatement = newMappedStatement(statement, new BoundSqlSqlSource(boundSql));
MetaObject msObject = MetaObject.forObject(newStatement, new DefaultObjectFactory(), new DefaultObjectWrapperFactory(),new DefaultReflectorFactory());
msObject.setValue("sqlSource.boundSql.sql", sql);
args[0] = newStatement;
}
return invocation.proceed();
}
private void addCondition(MappedStatement statement, Object example) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
if (example instanceof Map) {
example = ((Map) example).get("_ORIGINAL_PARAMETER_OBJECT");
}
Method method = example.getClass().getMethod("getOredCriteria", null);
//获取到条件数组,第一个是Criteria
List list = (List) method.invoke(example);
if (CollectionUtil.isEmpty(list)) {
Class clazz = ((ResultMap) statement.getResultMaps().get(0)).getType();
String exampleName = clazz.getName() + "Example";
Object paramExample = Class.forName(exampleName).newInstance();
Method createCriteria = paramExample.getClass().getMethod("createCriteria");
Object criteria = createCriteria.invoke(paramExample);
Method andIsDelEqualTo = criteria.getClass().getMethod("andRecStatusEqualTo", Byte.class);
andIsDelEqualTo.invoke(criteria, WebConstant.REC_STATUS.Normal.value);
list.add(criteria);
} else {
Object criteria = list.get(0);
Method getCriteria = criteria.getClass().getMethod("getCriteria");
List params = (List) getCriteria.invoke(criteria);
boolean hasDel = false;
for (Object param : params) {
Method getCondition = param.getClass().getMethod("getCondition");
Object condition = getCondition.invoke(param);
if ("rec_status =".equals(condition)) {
hasDel = true;
}
}
if (!hasDel) {
Method andIsDelEqualTo = criteria.getClass().getMethod("andRecStatusEqualTo", Byte.class);
andIsDelEqualTo.invoke(criteria, WebConstant.REC_STATUS.Normal.value);
}
}
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
private MappedStatement newMappedStatement(MappedStatement ms, SqlSource newSqlSource) {
MappedStatement.Builder builder =
new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());
builder.resource(ms.getResource());
builder.fetchSize(ms.getFetchSize());
builder.statementType(ms.getStatementType());
builder.keyGenerator(ms.getKeyGenerator());
if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) {
StringBuilder keyProperties = new StringBuilder();
for (String keyProperty : ms.getKeyProperties()) {
keyProperties.append(keyProperty).append(",");
}
keyProperties.delete(keyProperties.length() - 1, keyProperties.length());
builder.keyProperty(keyProperties.toString());
}
builder.timeout(ms.getTimeout());
builder.parameterMap(ms.getParameterMap());
builder.resultMaps(ms.getResultMaps());
builder.resultSetType(ms.getResultSetType());
builder.cache(ms.getCache());
builder.flushCacheRequired(ms.isFlushCacheRequired());
builder.useCache(ms.isUseCache());
return builder.build();
}
// 定义一个内部辅助类,作用是包装sq
class BoundSqlSqlSource implements SqlSource {
private BoundSql boundSql;
public BoundSqlSqlSource(BoundSql boundSql) {
this.boundSql = boundSql;
}
@Override
public BoundSql getBoundSql(Object parameterObject) {
return boundSql;
}
}
}

12
src/main/java/com/ccsens/ptccsens/persist/dao/SPluginDao.java

@ -0,0 +1,12 @@
package com.ccsens.ptccsens.persist.dao;
import org.apache.ibatis.annotations.Param;
/**
* @author
*/
public interface SPluginDao {
Long getPluginIdByName(@Param("pluginName") String pluginName);
void updateParamById(@Param("param")String param,@Param("taskPluginId")Long taskPluginId);
}

29
src/main/java/com/ccsens/ptccsens/persist/dao/SProjectDao.java

@ -0,0 +1,29 @@
package com.ccsens.ptccsens.persist.dao;
import com.ccsens.ptccsens.bean.vo.ProjectVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author
*/
@Repository
public interface SProjectDao {
List<ProjectVo.SysProject> queryByCreator(@Param("userId") Long userId);
/**
* 根据项目id查询项目
* @param projectId 项目id
* @return 项目信息
*/
ProjectVo.SysProject selectById(@Param("projectId") Long projectId);
/**
* 逻辑删除项目
* @param projectId 项目id
*/
void updateStatusById(@Param("projectId") Long projectId);
}

23
src/main/java/com/ccsens/ptccsens/persist/dao/STaskDao.java

@ -0,0 +1,23 @@
package com.ccsens.ptccsens.persist.dao;
import com.ccsens.common.bean.po.ProTaskSub;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author
*/
public interface STaskDao {
void insertSelectiveList(@Param("proTaskSubList") List<ProTaskSub> proTaskSubList);
/**
* 根据任务名和项目id查找当前时间下的任务的分解id
* @param taskName 任务名
* @param projectId 项目id
* @param now 当前时间
* @return 返回任务分解id
*/
Long getNowTask(@Param("taskName") String taskName, @Param("projectId") Long projectId, @Param("now") long now);
}

15
src/main/java/com/ccsens/ptccsens/persist/dao/SubLabelDao.java

@ -0,0 +1,15 @@
package com.ccsens.ptccsens.persist.dao;
import com.ccsens.common.persist.dao.LabelDao;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @author
*/
@Repository
public interface SubLabelDao extends LabelDao {
Long getLabelByName(@Param("type") int type, @Param("sysRole") String sysRole);
Long getLabelByTypeAndLevel(@Param("type") int type, @Param("level") int level);
}

18
src/main/java/com/ccsens/ptccsens/service/IImportService.java

@ -0,0 +1,18 @@
package com.ccsens.ptccsens.service;
import com.ccsens.ptccsens.bean.vo.ProjectVo;
/**
* @author
*/
public interface IImportService {
/**
* 读取excel
* @param path 路径
* @param userId userId
* @throws Exception 异常
*/
ProjectVo.ProjectInfo importWbs(String path, Long userId, Long projectId) throws Exception;
}

17
src/main/java/com/ccsens/ptccsens/service/IUserService.java

@ -0,0 +1,17 @@
package com.ccsens.ptccsens.service;
import com.ccsens.common.bean.dto.CMemberDto;
public interface IUserService {
/**
* 根据手机号修改成员的userId
* @param params 手机号和userId
*/
void memberWithPhone(CMemberDto.PhoneAndUserId params);
/**
* 合并用户后修改userId
* @param params 新旧userId
*/
void mergeUser(CMemberDto.MergeUser params);
}

896
src/main/java/com/ccsens/ptccsens/service/ImportService.java

@ -0,0 +1,896 @@
package com.ccsens.ptccsens.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.ptccsens.util.BasicsCodeError;
import com.ccsens.cloudutil.bean.tall.dto.ProjectDto;
import com.ccsens.cloudutil.feign.Tall3FeignClient;
import com.ccsens.common.bean.po.*;
import com.ccsens.common.persist.dao.*;
import com.ccsens.common.persist.mapper.ProMemberStakeholderMapper;
import com.ccsens.ptccsens.bean.dto.RoleDto;
import com.ccsens.ptccsens.bean.dto.TaskDto;
import com.ccsens.ptccsens.bean.vo.ProjectVo;
import com.ccsens.ptccsens.persist.dao.SPluginDao;
import com.ccsens.ptccsens.persist.dao.SProjectDao;
import com.ccsens.ptccsens.persist.dao.STaskDao;
import com.ccsens.ptccsens.persist.dao.SubLabelDao;
import com.ccsens.ptccsens.util.BasicsConstant;
import com.ccsens.util.ExcelUtil;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.PropUtil;
import com.ccsens.util.StringUtil;
import com.ccsens.util.cron.CronConstant;
import com.ccsens.util.cron.NatureToDate;
import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author
*/
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class ImportService implements IImportService {
@Resource
private Snowflake snowflake;
@Resource
private ProTaskDetailDao taskDetailDao;
@Resource
private ProTaskSubDao taskSubDao;
@Resource
private ProTaskVersionDao taskVersionMapper;
@Resource
private SubLabelDao subLabelDao;
@Resource
private LabelDao labelDao;
@Resource
private ProRoleDao roleDao;
@Resource
private ProMemberDao memberDao;
@Resource
private ProRoleMemberDao roleMemberDao;
@Resource
private ProMemberStakeholderMapper memberStakeholderMapper;
@Resource
private ProRoleRepulsionDao repulsionDao;
@Resource
private LabelBusinessDao labelBusinessDao;
@Resource
private ProParentTaskDao parentTaskMapper;
@Resource
private ProRoleTaskDao roleTaskMapper;
@Resource
private UserDao userDao;
@Resource
private SProjectDao projectDao;
@Resource
private STaskDao sTaskDao;
@Resource
private SPluginDao sTaskPluginDao;
@Resource
private ProTaskPluginDao proTaskPluginDao;
@Resource
private Tall3FeignClient tall3FeignClient;
/**
* 读取wbs文件
* @param path 路径
* @param userId userId
* @throws Exception 异常
*/
@Override
public ProjectVo.ProjectInfo importWbs(String path, Long userId,Long projectId) throws Exception {
ProjectVo.ProjectInfo projectInfo = new ProjectVo.ProjectInfo();
//获取excel文件
InputStream is = new FileInputStream(path);
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
//角色
Map<String, Long> roleMap = new HashMap<>();
//成员
Map<String, RoleDto.WbsMember> memberMap = new HashMap<>();
//任务
Map<String, Object> taskMap = new HashMap<>();
//读取文件
readExcel(xssfWorkbook, userId, roleMap, memberMap, taskMap,projectId,projectInfo);
//读取插件配置表
readPluginConfig(xssfWorkbook,taskMap);
return projectInfo;
}
/**
* 读取插件配置表
*/
private void readPluginConfig(XSSFWorkbook wb, Map<String, Object> taskMap) {
//获取插件配置表Sheet
XSSFSheet wbsSheet = wb.getSheet(BasicsConstant.WbsExcel.WBS_PLUGIN_CONFIG);
if (ObjectUtil.isNotNull(wbsSheet)) {
for (int i = 0; i <= wbsSheet.getLastRowNum(); i++) {
//获取行
XSSFRow row = wbsSheet.getRow(i);
if (row == null) {
continue;
}
//序号
String sequence = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(0)));
//任务名
String taskName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(1)));
if(StrUtil.isEmpty(taskName)){
continue;
}
//插件1
String pluginParam1 = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(2)));
//插件2
String pluginParam2 = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(3)));
//插件3
String pluginParam3 = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(4)));
Object o = taskMap.get(sequence + "_" + taskName);
if(ObjectUtil.isNull(o)){
continue;
}
TaskDto.TaskPluginId taskPlugin = (TaskDto.TaskPluginId) o;
if(StrUtil.isNotEmpty(pluginParam1)){
//修改插件表的param
sTaskPluginDao.updateParamById(pluginParam1,taskPlugin.getTaskPluginId1());
}
if(StrUtil.isNotEmpty(pluginParam2)){
//修改插件表的param
sTaskPluginDao.updateParamById(pluginParam2,taskPlugin.getTaskPluginId2());
}
if(StrUtil.isNotEmpty(pluginParam3)){
//修改插件表的param
sTaskPluginDao.updateParamById(pluginParam3,taskPlugin.getTaskPluginId3());
}
}
}
}
/**
* 读取每个sheet
*/
private void readExcel(XSSFWorkbook wb, Long userId, Map<String, Long> roleMap, Map<String, RoleDto.WbsMember> memberMap, Map<String, Object> taskMap,Long projectId,ProjectVo.ProjectInfo projectInfo) {
//获取wbsSheet
XSSFSheet wbsSheet = wb.getSheet(BasicsConstant.WbsExcel.WBS_SHEET);
if (ObjectUtil.isNull(wbsSheet)) {
throw new BaseException(BasicsCodeError.NOT_WBS_SHEET);
}
//获取项目成员表
XSSFSheet memberSheet = wb.getSheet(BasicsConstant.WbsExcel.MEMBER_SHEET);
if (ObjectUtil.isNull(memberSheet)) {
throw new BaseException(BasicsCodeError.NOT_MEMBER_SHEET);
}
//读取项目信息和任务分解信息的开始结束行
int projectStart = 0;
int taskStart = 0;
for (int i = 0; i <= wbsSheet.getLastRowNum(); i++) {
//获取行
XSSFRow xssfRow = wbsSheet.getRow(i);
if (xssfRow == null) {
continue;
}
//获取第一列
XSSFCell xssfCell = xssfRow.getCell(0);
if (xssfCell == null) {
continue;
}
String s = ExcelUtil.getCellValue(xssfCell);
//获取项目开始行
if (s.indexOf(BasicsConstant.WbsExcel.PROJECT_INFO_TITLE) == 0) {
projectStart = i + 1;
}
//获取任务开始行
if (s.indexOf(BasicsConstant.WbsExcel.TASK_INFO_TITLE) == 0) {
taskStart = i + 1;
}
}
if (projectStart == 0) {
throw new BaseException(BasicsCodeError.WSB_NOT_PROJECT_HEADER);
}
if (taskStart == 0) {
throw new BaseException(BasicsCodeError.WSB_NOT_TASK_HEADER);
}
//添加项目
ProjectVo.SysProject project = readProject(wbsSheet, projectStart, userId,projectId);
if(ObjectUtil.isNull(project)){
throw new BaseException(BasicsCodeError.WSB_NOT_PROJECT_HEADER);
}
//读取成员表
readMemberSheet(memberSheet,project,roleMap,memberMap);
//添加任务
readTask(wbsSheet,taskStart,project,roleMap,taskMap);
//获取用户列表
Set<Long> userIdSet = new HashSet<>();
userIdSet.add(userId);
//处理创建人的权限问题(添加创建人角色)
//查找创建者标签id
Long roleLabelId = labelDao.getLabelByTypeAndLevel(5, 5);
//添加创建者角色
ProRole role = new ProRole();
role.setId(snowflake.nextId());
role.setName("创建者");
role.setProjectId(project.getId());
role.setLabelId(roleLabelId);
roleDao.insertSelective(role);
//查找创建者在项目下的成员信息
Long memberId = null;
if(CollectionUtil.isNotEmpty(memberMap)){
for(RoleDto.WbsMember member : memberMap.values()){
if(ObjectUtil.isNotNull(member.getUserId())){
if(member.getUserId().equals(userId)){
memberId = member.getId();
}
userIdSet.add(member.getUserId());
}
}
}
//如果当前用户不是项目成员,则添加为成员
if(ObjectUtil.isNull(memberId)){
//添加成员至数据库
ProMember proMember = new ProMember();
proMember.setId(snowflake.nextId());
proMember.setProjectId(projectId);
proMember.setUserId(userId);
memberDao.insertSelective(proMember);
memberId = proMember.getId();
}
//添加当前用户未创建者
//添加角色成员关联信息
ProRoleMember roleMember = new ProRoleMember();
roleMember.setId(snowflake.nextId());
roleMember.setRoleId(role.getId());
roleMember.setMemberId(memberId);
roleMemberDao.insertSelective(roleMember);
//TODO 在tall客户端添加项目和用户的关联信息
ProjectDto.SaveProjectDto saveProjectDto = new ProjectDto.SaveProjectDto();
saveProjectDto.setId(project.getId());
saveProjectDto.setName(project.getName());
saveProjectDto.setStartTime(project.getBeginTime());
saveProjectDto.setEndTime(project.getEndTime());
saveProjectDto.setUrl(PropUtil.domain);
saveProjectDto.setUserIdList(userIdSet);
JsonResponse jsonResponse = tall3FeignClient.saveProjectList(saveProjectDto);
if (null == jsonResponse){
throw new BaseException(BasicsCodeError.FEIGN_ERROR);
}
//获取项目信息
BeanUtil.copyProperties(saveProjectDto,projectInfo);
}
/**
* 读取项目信息
*/
private ProjectVo.SysProject readProject(XSSFSheet wbsSheet, int projectStart, Long userId,Long projectId) {
ProjectVo.SysProject project = new ProjectVo.SysProject();
// TODO 查询是否项目是否存在
if (ObjectUtil.isNotNull(projectId)) {
project = projectDao.selectById(projectId);
if (ObjectUtil.isNotNull(project)) {
project.setId(projectId);
project.setImportType((byte)1);
//删除之前的项目详情
projectDao.updateStatusById(projectId);
//删除之前的项目分解
ProTaskSubExample taskSubExample = new ProTaskSubExample();
taskSubExample.createCriteria().andTaskDetailIdEqualTo(projectId);
ProTaskSub taskSub = new ProTaskSub();
taskSub.setRecStatus((byte)2);
taskSubDao.updateByExampleSelective(taskSub,taskSubExample);
//删除之前的版本信息
ProTaskVersion taskVersion = new ProTaskVersion();
taskVersion.setRecStatus((byte)2);
ProTaskVersionExample taskVersionExample = new ProTaskVersionExample();
taskVersionExample.createCriteria().andTaskDetailIdEqualTo(projectId);
taskVersionMapper.updateByExampleSelective(taskVersion,taskVersionExample);
//删除项目标签相关的
LabelBusiness labelBusiness = new LabelBusiness();
labelBusiness.setRecStatus((byte)2);
LabelBusinessExample labelBusinessExample = new LabelBusinessExample();
labelBusinessExample.createCriteria().andBusinessIdEqualTo(projectId);
labelBusinessDao.updateByExampleSelective(labelBusiness,labelBusinessExample);
}
}
//获取项目信息的那一行
XSSFRow row = wbsSheet.getRow(projectStart + 1);
if (ObjectUtil.isNull(row)) {
throw new BaseException(BasicsCodeError.WSB_NOT_PROJECT_HEADER);
}
//项目名
String projectName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(0)));
//详情
String description = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(1)));
//项目时间
String address = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(2)));
//开始时间
String beginTime = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(3)));
//结束时间
String endTime = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(4)));
//版本
String version = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(5)));
if (StrUtil.isEmpty(projectName)) {
throw new BaseException(BasicsCodeError.WBS_NOT_PROJECT_NAME.addMsg(wbsSheet.getSheetName(),projectStart+1));
}
//项目名不能重复(当前用户创建的项目内名字不能重复)
//根据userId查找已创建的项目
List<ProjectVo.SysProject> sysProjectList = projectDao.queryByCreator(userId);
if(CollectionUtil.isNotEmpty(sysProjectList)){
sysProjectList.forEach(p -> {
if(projectName.equalsIgnoreCase(p.getName())){
//如果名称重复则提示错误信息
throw new BaseException(BasicsCodeError.PROJECT_NAME_REPEAT.addMsg(wbsSheet.getSheetName(),projectStart+1,projectName));
}
});
}
//判断时间是否正确
String begin = ExcelUtil.getCellValue(row.getCell(3));
String end = ExcelUtil.getCellValue(row.getCell(4));
if (StrUtil.isEmpty(begin) || StrUtil.isEmpty(end)) {
throw new BaseException(BasicsCodeError.WBS_NOT_PROJECT_TIME.addMsg(wbsSheet.getSheetName(),projectStart+1));
}
long bTime;
long eTime;
try {
bTime = Long.parseLong(beginTime);
eTime = Long.parseLong(endTime);
} catch (Exception e) {
//日期格式错误
throw new BaseException(BasicsCodeError.WBS_PROJECT_TIME_ERROR.addMsg(wbsSheet.getSheetName(),projectStart+1));
}
//添加项目信息(任务详情)
ProTaskDetail taskDetail = new ProTaskDetail();
if (0 == project.getImportType()) {
taskDetail.setId(snowflake.nextId());
}
if (1 == project.getImportType()) {
taskDetail.setId(projectId);
}
taskDetail.setName(projectName);
taskDetail.setDescription(description);
if (0 == project.getImportType()){
taskDetailDao.insertSelective(taskDetail);
}
if (1 == project.getImportType()){
taskDetailDao.updateByPrimaryKeySelective(taskDetail);
}
project.setId(taskDetail.getId());
project.setName(projectName);
//添加(任务分解)
ProTaskSub taskSub = new ProTaskSub();
taskSub.setId(snowflake.nextId());
taskSub.setTaskDetailId(taskDetail.getId());
taskSub.setPlanStartTime(bTime);
taskSub.setPlanEndTime(eTime);
taskSub.setPlanDuration(eTime - bTime);
taskSubDao.insertSelective(taskSub);
project.setBeginTime(bTime);
project.setEndTime(eTime);
//添加版本信息
ProTaskVersion taskVersion = new ProTaskVersion();
taskVersion.setId(snowflake.nextId());
taskVersion.setTaskDetailId(taskDetail.getId());
taskVersion.setTaskVersionInfo(version);
taskVersion.setAddress(address);
taskVersionMapper.insertSelective(taskVersion);
//查找项目标签
Long labelId = labelDao.getLabelByTypeAndLevel(1, 0);
//添加任务标签关联信息
saveLabelTask(taskDetail.getId(), labelId);
return project;
}
/**
* 添加任务标签关联
*/
private void saveLabelTask(Long taskDetailId,Long labelId) {
//添加标签
LabelBusiness labelBusiness = new LabelBusiness();
labelBusiness.setId(snowflake.nextId());
labelBusiness.setBusinessType((byte) 0);
labelBusiness.setBusinessId(taskDetailId);
labelBusiness.setLabelId(labelId);
labelBusinessDao.insertSelective(labelBusiness);
}
/**
* 读取项目成员表
*/
private void readMemberSheet(XSSFSheet memberSheet,ProjectVo.SysProject project, Map<String, Long> roleMap, Map<String, RoleDto.WbsMember> memberMap) {
//系统角色id
Long sysRoleId = null;
//项目角色id
Long roleId = null;
//如果是修改WBS,先进行删除
if (1 == project.getImportType()){
//删除角色和成员
List<Long> roleIdList = roleDao.queryRoleListOfProject(project.getId());
ProRole role = new ProRole();
role.setRecStatus((byte)2);
ProRoleExample roleExample = new ProRoleExample();
roleExample.createCriteria().andIdIn(roleIdList);
roleDao.updateByExampleSelective(role,roleExample);
List<Long> memberIdList = memberDao.queryMembersOfProject(project.getId());
ProMember member = new ProMember();
member.setRecStatus((byte)2);
ProMemberExample memberExample = new ProMemberExample();
memberExample.createCriteria().andIdIn(memberIdList);
memberDao.updateByExampleSelective(member,memberExample);
//删除奖惩干系人
ProMemberStakeholder memberStakeholder = new ProMemberStakeholder();
memberStakeholder.setRecStatus((byte)2);
ProMemberStakeholderExample memberStakeholderExample = new ProMemberStakeholderExample();
memberStakeholderExample.createCriteria().andMemeberIdIn(memberIdList);
memberStakeholderMapper.updateByExampleSelective(memberStakeholder,memberStakeholderExample);
//删除对谁不可见
ProRoleRepulsion roleRepulsion = new ProRoleRepulsion();
roleRepulsion.setRecStatus((byte)2);
ProRoleRepulsionExample roleRepulsionExample = new ProRoleRepulsionExample();
roleRepulsionExample.createCriteria().andRoleIdIn(roleIdList);
repulsionDao.updateByExampleSelective(roleRepulsion,roleRepulsionExample);
//删除角色成员关联
ProRoleMember roleMember = new ProRoleMember();
roleMember.setRecStatus((byte)2);
ProRoleMemberExample roleMemberExample = new ProRoleMemberExample();
roleMemberExample.createCriteria().andRoleIdIn(roleIdList);
roleMemberDao.updateByExampleSelective(roleMember,roleMemberExample);
}
for (int i = 2; i <= memberSheet.getLastRowNum(); i++) {
//获取当前行
XSSFRow row = memberSheet.getRow(i);
if(ObjectUtil.isNull(row)){ continue; }
//系统角色名
String sysRole = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(1)));
if(StrUtil.isEmpty(sysRole) && ObjectUtil.isNull(sysRoleId)){
continue;
}
//验证系统角色(查询标签)
if(StrUtil.isNotEmpty(sysRole) && !"/".equalsIgnoreCase(sysRole)){
Long labelId = subLabelDao.getLabelByName(5,sysRole);
if(ObjectUtil.isNull(labelId)){
throw new BaseException(BasicsCodeError.WBS_NOT_FIRST_ROLE.addMsg(memberSheet.getSheetName(),i+1,sysRole));
}
sysRoleId = labelId;
}
//项目角色
String roleName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(2)));
if((StrUtil.isEmpty(roleName) || "/".equalsIgnoreCase(roleName)) && ObjectUtil.isNull(roleId)){ continue; }
//成员
String memberName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(3)));
//角色手机号
String memberPhone = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(4)));
if((StrUtil.isNotEmpty(memberName) && !"/".equalsIgnoreCase(memberName)) && (StrUtil.isEmpty(memberPhone) || !memberPhone.matches(BasicsConstant.PHONE_REGEX))){
throw new BaseException(BasicsCodeError.WBS_PHONE_ERROR.addMsg(memberSheet.getSheetName(),i+1,memberPhone));
}
//奖惩干系人
String stakeholderName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(5)));
//干系人电话
String stakeholderPhone = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(6)));
if((StrUtil.isNotEmpty(stakeholderName) && !"/".equalsIgnoreCase(stakeholderName)) && (StrUtil.isEmpty(stakeholderPhone) || !stakeholderPhone.matches(BasicsConstant.PHONE_REGEX))){
throw new BaseException(BasicsCodeError.WBS_PHONE_ERROR.addMsg(memberSheet.getSheetName(),i+1,stakeholderName));
}
//添加角色
if(StrUtil.isNotEmpty(roleName) && !"/".equalsIgnoreCase(roleName)){
ProRole role = new ProRole();
role.setId(snowflake.nextId());
role.setName(roleName);
role.setProjectId(project.getId());
role.setLabelId(sysRoleId);
roleDao.insertSelective(role);
roleId = role.getId();
roleMap.put(roleName,role.getId());
}
//添加成员
if(StrUtil.isNotEmpty(memberName) && !"/".equalsIgnoreCase(roleName)){
//如果成员名和手机号重复当做一个人来处理
RoleDto.WbsMember wbsMembers = memberMap.get(memberName + "_" + memberPhone);
Long memberId = null;
if(ObjectUtil.isNotNull(wbsMembers)){
memberId = wbsMembers.getId();
}
if(ObjectUtil.isNull(memberId)){
//根据成员手机号查找userId 成员关联userId
Long userId = userDao.getUserIdByPhone(memberPhone);
//添加成员至数据库
ProMember proMember = new ProMember();
proMember.setId(snowflake.nextId());
proMember.setName(memberName);
proMember.setPhone(memberPhone);
proMember.setProjectId(project.getId());
proMember.setUserId(userId);
memberDao.insertSelective(proMember);
RoleDto.WbsMember member = new RoleDto.WbsMember(proMember.getId(),userId);
memberMap.put(memberName+"_"+memberPhone,member);
memberId = proMember.getId();
}
//添加角色成员关联信息
ProRoleMember roleMember = new ProRoleMember();
roleMember.setId(snowflake.nextId());
roleMember.setRoleId(roleId);
roleMember.setMemberId(memberId);
roleMemberDao.insertSelective(roleMember);
//添加奖惩干系人
if(StrUtil.isNotEmpty(stakeholderName) && !"/".equalsIgnoreCase(roleName)){
//根据干系人手机号查找userId 奖惩干系人关联userId
Long userId = userDao.getUserIdByPhone(memberPhone);
ProMemberStakeholder memberStakeholder = new ProMemberStakeholder();
memberStakeholder.setId(snowflake.nextId());
memberStakeholder.setMemeberId(memberId);
memberStakeholder.setStakeholderName(stakeholderName);
memberStakeholder.setStakeholderPhone(stakeholderPhone);
memberStakeholder.setUserId(userId);
memberStakeholderMapper.insertSelective(memberStakeholder);
}
}
}
//添加对谁不可见
roleRepulsion(memberSheet, roleMap);
}
/**
* 处理对谁不可见
*/
private void roleRepulsion(XSSFSheet memberSheet, Map<String, Long> roleMap) {
//角色排斥表需要的角色id
Long roleIdRepulsion = null;
for (int i = 2; i <= memberSheet.getLastRowNum(); i++) {
//获取当前行
XSSFRow row = memberSheet.getRow(i);
if(ObjectUtil.isNull(row)){ continue; }
//项目角色
String roleName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(2)));
if(StrUtil.isNotEmpty(roleName)){
roleIdRepulsion = roleMap.get(roleName);
}
if(ObjectUtil.isNull(roleIdRepulsion)){
continue;
}
//对谁不可见
String repulsion = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(7)));
if(StrUtil.isEmpty(repulsion)){
continue;
}
//分解对谁不可见
String[] split = repulsion.split(BasicsConstant.STRING_REGEX);
for (String repulsionName : split) {
Long repulsionId = roleMap.get(repulsionName);
if (ObjectUtil.isNull(repulsionId)) {
throw new BaseException(BasicsCodeError.WBS_NOT_FIND_ROLE.addMsg(memberSheet.getSheetName(),i+1,repulsionName));
}
//添加数据
ProRoleRepulsion roleRepulsion = new ProRoleRepulsion();
roleRepulsion.setId(snowflake.nextId());
roleRepulsion.setRoleId(roleIdRepulsion);
roleRepulsion.setRepulsionRoleId(repulsionId);
repulsionDao.insertSelective(roleRepulsion);
}
}
}
/**
* 读取任务信息
*/
private void readTask(XSSFSheet wbsSheet, int taskStart, ProjectVo.SysProject project, Map<String, Long> roleMap, Map<String, Object> taskMap) {
//一级任务id
Long firstTaskId = null;
Long taskStartTime = project.getBeginTime();
//如果是修改WBS需要先删除
if (1 == project.getImportType()) {
List<Long> allTaskId = parentTaskMapper.queryAllTaskIdByProjectId(project.getId());
//删除所有的任务详情
ProTaskDetail taskDetail = new ProTaskDetail();
taskDetail.setRecStatus((byte)2);
ProTaskDetailExample taskDetailExample = new ProTaskDetailExample();
taskDetailExample.createCriteria().andIdIn(allTaskId);
taskDetailDao.updateByExampleSelective(taskDetail,taskDetailExample);
//删除所有的分解任务
ProTaskSub taskSub = new ProTaskSub();
taskSub.setRecStatus((byte)2);
ProTaskSubExample taskSubExample = new ProTaskSubExample();
taskSubExample.createCriteria().andTaskDetailIdIn(allTaskId);
taskSubDao.updateByExampleSelective(taskSub,taskSubExample);
//删除所有的任务标签
LabelBusiness labelBusiness = new LabelBusiness();
labelBusiness.setRecStatus((byte)2);
LabelBusinessExample labelBusinessExample = new LabelBusinessExample();
labelBusinessExample.createCriteria().andBusinessIdIn(allTaskId);
labelBusinessDao.updateByExampleSelective(labelBusiness,labelBusinessExample);
//删除任务角色关联表
ProRoleTask roleTask = new ProRoleTask();
roleTask.setRecStatus((byte)2);
ProRoleTaskExample roleTaskExample = new ProRoleTaskExample();
roleTaskExample.createCriteria().andTaskIdIn(allTaskId);
roleTaskMapper.updateByExampleSelective(roleTask,roleTaskExample);
//删除任务插件关联信息
ProTaskPlugin taskPlugin = new ProTaskPlugin();
taskPlugin.setRecStatus((byte)2);
ProTaskPluginExample taskPluginExample = new ProTaskPluginExample();
taskPluginExample.createCriteria().andTaskDetailIdIn(allTaskId);
proTaskPluginDao.updateByExampleSelective(taskPlugin,taskPluginExample);
//删除任务关系表
allTaskId.add(project.getId());
ProParentTask parentTask = new ProParentTask();
parentTask.setRecStatus((byte)2);
ProParentTaskExample parentTaskExample = new ProParentTaskExample();
parentTaskExample.createCriteria().andTaskDetailIdIn(allTaskId);
parentTaskMapper.updateByExampleSelective(parentTask,parentTaskExample);
}
for (int i = taskStart + 1; i <= wbsSheet.getLastRowNum(); i++) {
//获取当前行
XSSFRow row = wbsSheet.getRow(i);
if(ObjectUtil.isNull(row)){ continue; }
//序号
String sequence = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(0)));
//一级任务名
String firstTaskName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(1)));
if(StrUtil.isEmpty(firstTaskName) && ObjectUtil.isNull(firstTaskId)){
continue;
}
if(StrUtil.isNotEmpty(firstTaskName)){
//添加一级任务
firstTaskId = saveFirstTask(project, firstTaskName);
}
//二级任务名
String taskName = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(2)));
if(StrUtil.isEmpty(taskName)){
continue;
}
//任务描述
String description = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(3)));
//重要性标签
String vitalLabel = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(7)));
//负责人
String executorRole = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(8)));
//开始时间
String beginTime = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(4)));
//结束时间
String endTime = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(5)));
//时长
String duration = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(6)));
//插件
String plugin1 = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(12)));
String plugin2 = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(13)));
String plugin3 = StringUtil.replaceStrSpace(ExcelUtil.getCellValue(row.getCell(14)));
if(StrUtil.isNotEmpty(taskName)){
//添加二级任务信息(任务详情)
ProTaskDetail taskDetail = new ProTaskDetail();
taskDetail.setId(snowflake.nextId());
taskDetail.setName(taskName);
taskDetail.setDescription(description);
taskDetailDao.insertSelective(taskDetail);
//任务关联信息(关联一级任务)
ProParentTask parentTask = new ProParentTask();
parentTask.setId(snowflake.nextId());
parentTask.setTaskDetailId(taskDetail.getId());
parentTask.setParentTaskDetailId(firstTaskId);
parentTaskMapper.insertSelective(parentTask);
//查找重要性标签
Long labelId = subLabelDao.getLabelByName(2,vitalLabel);
if(ObjectUtil.isNull(labelId)){
throw new BaseException(BasicsCodeError.TASK_VITAL_LABEL_ERROR.addMsg(wbsSheet.getSheetName(),i+1,vitalLabel));
}
LabelBusiness labelBusiness = new LabelBusiness();
labelBusiness.setId(snowflake.nextId());
labelBusiness.setBusinessType((byte) 0);
labelBusiness.setBusinessId(taskDetail.getId());
labelBusiness.setLabelId(labelId);
labelBusinessDao.insertSelective(labelBusiness);
//任务和角色关联
if(StrUtil.isEmpty(executorRole)){
throw new BaseException(BasicsCodeError.WBS_NOT_FIND_ROLE.addMsg(wbsSheet.getSheetName(),i+1,executorRole));
}
String[] split = executorRole.split(BasicsConstant.STRING_REGEX);
for (String repulsionName : split) {
Long executorRoleId = roleMap.get(repulsionName);
if(ObjectUtil.isNull(executorRoleId)){
throw new BaseException(BasicsCodeError.WBS_NOT_FIND_ROLE.addMsg(wbsSheet.getSheetName(),i+1,repulsionName));
}
ProRoleTask roleTask = new ProRoleTask();
roleTask.setId(snowflake.nextId());
roleTask.setRoleId(executorRoleId);
roleTask.setTaskId(taskDetail.getId());
roleTaskMapper.insertSelective(roleTask);
}
//处理时间、添加任务分解、添加任务标签
taskStartTime = taskSaveTime(taskStartTime, project, beginTime, endTime, duration, taskDetail.getId(),wbsSheet,i+1);
//添加时间颗粒度标签并关联
Long timeLabel = labelDao.getLabelByTypeAndLevel(0, 4);
saveLabelTask(taskDetail.getId(),timeLabel);
//插件
Long taskPlugin1 = plugin(plugin1,taskDetail.getId(),1,wbsSheet,i+1);
Long taskPlugin2 = plugin(plugin2,taskDetail.getId(),2,wbsSheet,i+1);
Long taskPlugin3 = plugin(plugin3,taskDetail.getId(),3,wbsSheet,i+1);
TaskDto.TaskPluginId taskPlugin = new TaskDto.TaskPluginId(taskPlugin1,taskPlugin2,taskPlugin3);
taskMap.put(sequence + "_" + taskName, taskPlugin);
}
//TODO 检查人
//TODO 及时奖惩
//TODO 交付物
//TODO 添加默认插件
}
}
private Long plugin(String plugin,Long taskId,int row,XSSFSheet wbsSheet,int errorRow) {
Long taskPlugin = null;
if(StrUtil.isNotEmpty(plugin)){
//根据插件名称查找插件id
Long pluginId = sTaskPluginDao.getPluginIdByName(plugin);
if(ObjectUtil.isNull(pluginId)){
throw new BaseException(BasicsCodeError.PLUGIN_NAME_ERROR.addMsg(wbsSheet.getSheetName(),errorRow,plugin));
}
//添加插件
ProTaskPlugin proTaskPlugin = new ProTaskPlugin();
proTaskPlugin.setId(snowflake.nextId());
proTaskPlugin.setTaskDetailId(taskId);
proTaskPlugin.setPluginId(pluginId);
proTaskPlugin.setPlginRow(row);
proTaskPlugin.setPlginCol(1);
proTaskPlugin.setRowspan(1);
proTaskPlugin.setColspan(1);
proTaskPluginDao.insertSelective(proTaskPlugin);
taskPlugin = proTaskPlugin.getId();
}
return taskPlugin;
}
private Long taskSaveTime(Long taskStartTime,ProjectVo.SysProject project, String beginTime, String endTime, String duration, Long taskDetailId,XSSFSheet wbsSheet,int row) {
if(StrUtil.isEmpty(beginTime) || "日常".equalsIgnoreCase(beginTime)){
if(StrUtil.isEmpty(beginTime) && StrUtil.isNotEmpty(duration)){
//获取时长内的字符串
String str = "[0-9]";
Pattern pStr = Pattern.compile(str);
Matcher mStr = pStr.matcher(duration);
String trimStr = mStr.replaceAll("").trim();
Long aLong = BasicsConstant.WBS_DURATION.get(trimStr);
if(ObjectUtil.isNull(aLong)){
throw new BaseException(BasicsCodeError.WBS_PROJECT_TIME_ERROR.addMsg(wbsSheet.getSheetName(),row));
}
//获取字符串内的数字
String num = "[^0-9]";
Pattern pNum = Pattern.compile(num);
Matcher mNum = pNum.matcher(duration);
String trimNum = mNum.replaceAll("").trim();
//计算时长
Long durationTime = Long.parseLong(trimNum) * aLong;
//添加任务分解
ProTaskSub taskSub = new ProTaskSub();
taskSub.setId(snowflake.nextId());
taskSub.setTaskDetailId(taskDetailId);
taskSub.setPlanDuration(durationTime);
taskSub.setPlanStartTime(taskStartTime);
taskStartTime += durationTime;
taskSub.setPlanEndTime(taskStartTime);
taskSubDao.insertSelective(taskSub);
//查找定期任务标签并关联任务
Long taskLabel = labelDao.getLabelByTypeAndLevel(1, 3);
saveLabelTask(taskDetailId,taskLabel);
}else {
//添加任务分解
ProTaskSub taskSub = new ProTaskSub();
taskSub.setId(snowflake.nextId());
taskSub.setTaskDetailId(taskDetailId);
taskSubDao.insertSelective(taskSub);
//查找日常任务标签并关联信息
Long label = labelDao.getLabelByTypeAndLevel(1, 2);
saveLabelTask(taskDetailId,label);
}
}else {
Long bTime;
Long eTime;
try {
bTime = Long.parseLong(beginTime);
eTime = StrUtil.isEmpty(endTime) ? project.getEndTime() : Long.parseLong(endTime);
//添加任务分解
ProTaskSub taskSub = new ProTaskSub();
taskSub.setId(snowflake.nextId());
taskSub.setTaskDetailId(taskDetailId);
taskSub.setPlanEndTime(eTime);
taskSub.setPlanStartTime(bTime);
taskSub.setPlanDuration(eTime - bTime);
taskSubDao.insertSelective(taskSub);
//查找定期任务标签并关联任务
Long taskLabel = labelDao.getLabelByTypeAndLevel(1, 3);
saveLabelTask(taskDetailId,taskLabel);
// //添加时间颗粒度标签并关联
// Long timeLabel = subLabelDao.getLabelByTypeAndLevel(0, 4);
// saveLabelTask(taskDetailId,timeLabel);
}catch (Exception e){
Date startDate = new Date(project.getBeginTime());
Date endDate = new Date(project.getEndTime());
try {
List<CronConstant.TaskDate> taskDateList =
NatureToDate.generateDates(beginTime, startDate, endDate);
if (CollectionUtil.isEmpty(taskDateList)) {
return taskStartTime;
}
List<ProTaskSub> proTaskSubList = new ArrayList<>();
for (CronConstant.TaskDate taskDate : taskDateList) {
ProTaskSub proTaskSub = new ProTaskSub();
proTaskSub.setId(snowflake.nextId());
proTaskSub.setTaskDetailId(taskDetailId);
proTaskSub.setPlanStartTime(taskDate.getStartDate().getTime());
proTaskSub.setPlanEndTime(taskDate.getEndDate().getTime());
proTaskSub.setPlanDuration(proTaskSub.getPlanEndTime() - proTaskSub.getPlanStartTime());
proTaskSubList.add(proTaskSub);
}
if(CollectionUtil.isNotEmpty(proTaskSubList)){
sTaskDao.insertSelectiveList(proTaskSubList);
}
//查找定期任务标签并关联任务
Long taskLabel = labelDao.getLabelByTypeAndLevel(1, 3);
saveLabelTask(taskDetailId,taskLabel);
}catch (Exception e1){
throw new BaseException(String.valueOf(e1));
// throw new BaseException(SportsCodeError.WBS_PROJECT_TIME_ERROR);
}
}
}
return taskStartTime;
}
/**
* 添加一级任务
*/
private Long saveFirstTask(ProjectVo.SysProject project, String firstTaskName) {
//TODO 一级任务负责人是项目经理
Long firstTaskId;
ProTaskDetail taskDetail = new ProTaskDetail();
taskDetail.setId(snowflake.nextId());
taskDetail.setName(firstTaskName);
taskDetailDao.insertSelective(taskDetail);
firstTaskId = taskDetail.getId();
//添加任务分解
ProTaskSub taskSub = new ProTaskSub();
taskSub.setId(snowflake.nextId());
taskSub.setTaskDetailId(taskDetail.getId());
taskSub.setPlanStartTime(project.getBeginTime());
taskSub.setPlanEndTime(project.getEndTime());
taskSub.setPlanDuration(project.getEndTime() - project.getBeginTime());
taskSubDao.insertSelective(taskSub);
//任务关联信息(关联项目)
ProParentTask parentTask = new ProParentTask();
parentTask.setId(snowflake.nextId());
parentTask.setTaskDetailId(taskDetail.getId());
parentTask.setParentTaskDetailId(project.getId());
parentTaskMapper.insertSelective(parentTask);
//查找一级任务标签
Long labelId = labelDao.getLabelByTypeAndLevel(1, 1);
//添加任务标签关联信息
saveLabelTask(taskDetail.getId(), labelId);
return firstTaskId;
}
}

33
src/main/java/com/ccsens/ptccsens/service/UserService.java

@ -0,0 +1,33 @@
package com.ccsens.ptccsens.service;
import com.ccsens.common.bean.dto.CMemberDto;
import com.ccsens.common.service.IMemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class UserService implements IUserService{
@Resource
private IMemberService memberService;
@Override
public void memberWithPhone(CMemberDto.PhoneAndUserId params) {
memberService.relevancePhone(params);
}
@Override
public void mergeUser(CMemberDto.MergeUser params) {
//最小项目关联的userId
memberService.mergeUser(params);
//TODO 其他业务
}
}

42
src/main/java/com/ccsens/ptccsens/util/BasicsCodeError.java

@ -0,0 +1,42 @@
package com.ccsens.ptccsens.util;
import com.ccsens.util.CodeError;
/**
* @author
*/
public class BasicsCodeError extends CodeError {
public static final Code NOT_WBS_SHEET = new Code(501,"找不到wbs表",true);
public static final Code NOT_MEMBER_SHEET = new Code(502,"找不到项目成员表",true);
public static final Code WSB_NOT_PROJECT_HEADER = new Code(503,"读取项目信息异常",true);
public static final Code WSB_NOT_TASK_HEADER = new Code(504,"读取任务分解异常",true);
public static final Code WBS_PROJECT_TIME_ERROR = new Code(505,"时间格式异常", true);
public static final Code WBS_PHONE_ERROR = new Code(506,"手机号格式错误", true);
public static final Code WBS_NOT_FIRST_ROLE = new Code(507,"系统角色名称错误", true);
public static final Code WBS_NOT_FIND_ROLE = new Code(508,"未找到对应的角色", true);
public static final Code FILE_FORMAT_ERROR = new Code(509,"不支持的格式类型", true);
public static final Code WBS_NOT_PROJECT_TIME = new Code(510,"项目时间不能为空", true);
public static final Code TASK_VITAL_LABEL_ERROR = new Code(511,"任务标签异常", true);
public static final Code WBS_NOT_PROJECT_NAME = new Code(512,"项目名称不能为空", true);
public static final Code PROJECT_NAME_REPEAT = new Code(513,"项目名称重复", true);
public static final Code PLUGIN_NAME_ERROR = new Code(514,"请填写正确的插件名称", true);
public static final Code FEIGN_ERROR = new Code(515,"导入项目失败", true);
public static final Code NOT_ORGANIZATION = new Code(516,"您不属于任何体育机构,请联系运维人员", true);
public static final Code NO_POWER = new Code(517,"权限不足", true);
public static final Code NOT_TRAINING_PLAN = new Code(518,"未找到培训计划", true);
public static final Code TRAINING_NOT_CHECK = new Code(519,"培训计划未审核通过", true);
public static final Code NOT_TRAINING_TEACHER = new Code(520,"未找到对应的委派通知", true);
public static final Code TRAINING_TEACHER_NOT_MINE = new Code(521,"您不是被委托人,无法接受", true);
public static final Code NOT_PLAYER = new Code(522,"未找到对应的运动员信息", true);
public static final Code NOT_PLAYER_APPLY = new Code(523,"未找到报名信息信息", true);
public static final Code ID_CODE_ERROR = new Code(524,"请输入正确的身份证", true);
public static final Code NOT_FILE = new Code(525,"找不到文件", true);
}

50
src/main/java/com/ccsens/ptccsens/util/BasicsConstant.java

@ -0,0 +1,50 @@
package com.ccsens.ptccsens.util;
import java.util.HashMap;
import java.util.Map;
/**
* @author
*/
public class BasicsConstant {
/**图片类型*/
public static final String FILE_TYPE_IMG = "bmp,jpg,jpeg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp";
/**文档类型*/
public static final String FILE_TYPE_DOCUMENT = "doc, dot, wps, wpt, docx, dotx, docm, dotm, xls, xlt, et, xlsx, xltx, csv, xlsm, xltm, ppt,pptx,pptm,ppsx,ppsm,pps,potx,potm,dpt,dps, pdf";
/**验证手机正则*/
public static final String PHONE_REGEX = "^[1]([3-9])[0-9]{9}$";
/**字符串分隔符*/
public static final String STRING_REGEX = ",|,|;|;|、|/";
/**wbs相关*/
public static final class WbsExcel {
/**wbsSheet*/
public static final String WBS_SHEET = "WBS";
/**项目成员Sheet*/
public static final String MEMBER_SHEET = "项目成员表";
/**项目信息头*/
public static final String PROJECT_INFO_TITLE = "项目信息";
/**任务信息头*/
public static final String TASK_INFO_TITLE = "项目任务分解";
/**excel文件格式验证*/
public static final String WBS_FILE_FORMAT = "xls,xlsx";
/**插件配置表*/
public static final String WBS_PLUGIN_CONFIG = "插件配置表";
}
/**wbs表时长对应关系表*/
public static final Map<String,Long> WBS_DURATION = new HashMap<>();
static {
WBS_DURATION.put("s",1000L);
WBS_DURATION.put("min",60 * 1000L);
WBS_DURATION.put("h",60 * 60 * 1000L);
WBS_DURATION.put("d",24 * 60 * 60 * 1000L);
WBS_DURATION.put("w",7 * 24 * 60 * 60 * 1000L);
WBS_DURATION.put("m",30 * 24 * 60 * 60 * 1000L);
WBS_DURATION.put("y",365 * 24 * 60 * 60 * 1000L);
}
}

30
src/main/resources/application-common.yml

@ -0,0 +1,30 @@
logging:
level:
com:
favorites: DEBUG
org:
hibernate: ERROR
springframework:
web: DEBUG
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath*:mapper_*/*.xml
# type-aliases-package: com.ccsens.mtpro.bean
#server:
# tomcat:
# uri-encoding: UTF-8
spring:
http:
encoding:
charset: UTF-8
enabled: true
force: true
log-request-details: true
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
snowflake:
datacenterId: 2
workerId: 2

50
src/main/resources/application-dev.yml

@ -0,0 +1,50 @@
server:
port: 7210
servlet:
context-path:
spring:
application:
name: ccbasics
datasource:
type: com.alibaba.druid.pool.DruidDataSource
# rabbitmq:
# host: 192.168.0.99
# password: 111111
# port: 5672
# username: admin
rabbitmq:
host: dd.tall.wiki
password: 111111
port: 5672
username: admin
redis:
database: 0
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1ms
min-idle: 0
password: ''
port: 6379
timeout: 1000ms
swagger:
enable: true
mybatisCache:
database: 1
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1
min-idle: 0
password: ''
port: 6379
timeout: 1000
file:
path: /home/cloud/ccbasics/uploads/
domain: https://test.tall.wiki/gateway/ccbasics
imgDomain: https://test.tall.wiki/gateway/ccbasics/uploads/

40
src/main/resources/application-prod.yml

@ -0,0 +1,40 @@
server:
port: 7210
servlet:
context-path:
spring:
application:
name: ccbasics
datasource:
type: com.alibaba.druid.pool.DruidDataSource
rabbitmq:
host: 121.36.3.207
password: 111111
port: 5672
username: admin
redis:
database: 0
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1ms
min-idle: 0
password: ''
# password: 'areowqr!@43ef'
port: 6379
timeout: 1000ms
swagger:
enable: true
eureka:
instance:
ip-address: 121.36.106.168
gatewayUrl: https://www.tall.wiki/gateway/
notGatewayUrl: https://www.tall.wiki/
apiUrl: https://www.tall.wiki/
file:
path: /home/cloud/ccbasics/uploads/
domain: https://www.tall.wiki/gateway/ccbasics
imgDomain: https://www.tall.wiki/gateway/ccbasics/uploads/

48
src/main/resources/application-test.yml

@ -0,0 +1,48 @@
server:
port: 7210
servlet:
context-path:
spring:
application:
name: ccbasics
datasource:
type: com.alibaba.druid.pool.DruidDataSource
rabbitmq:
host: dd.tall.wiki
password: 111111
port: 5672
username: admin
redis:
database: 0
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1ms
min-idle: 0
password: ''
port: 6379
timeout: 1000ms
swagger:
enable: true
mybatisCache:
database: 1
host: 127.0.0.1
jedis:
pool:
max-active: 200
max-idle: 10
max-wait: -1
min-idle: 0
password: ''
port: 6379
timeout: 1000
eureka:
instance:
ip-address: 127.0.0.1
file:
path: /home/cloud/ccbasics/uploads/
domain: https://test.tall.wiki/gateway/ccbasics
imgDomain: https://test.tall.wiki/gateway/ccbasics/uploads/

4
src/main/resources/application.yml

@ -0,0 +1,4 @@
spring:
profiles:
active: dev
include: common, util-dev

35
src/main/resources/druid-dev.yml

@ -0,0 +1,35 @@
spring:
datasource:
druid:
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
driverClassName: com.mysql.cj.jdbc.Driver
dynamicUrl: jdbc:mysql://localhost:3306/${schema}
filterExclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filterName: druidFilter
filterProfileEnable: true
filterUrlPattern: /*
filters: stat,wall
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 5
# password: 37080c1f223685592316b02dad8816c019290a476e54ebb638f9aa3ba8b6bdb9
password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473
poolPreparedStatements: true
servletLogSlowSql: true
servletLoginPassword: 111111
servletLoginUsername: druid
servletName: druidServlet
servletResetEnable: true
servletUrlMapping: /druid/*
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://49.233.89.188:3306/pt_ccsens?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true
username: root
validationQuery: SELECT 1 FROM DUAL
# env: CCSENS_GAME
env: CCSENS_TALL

35
src/main/resources/druid-prod.yml

@ -0,0 +1,35 @@
spring:
datasource:
druid:
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
driverClassName: com.mysql.cj.jdbc.Driver
dynamicUrl: jdbc:mysql://localhost:3306/${schema}
filterExclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filterName: druidFilter
filterProfileEnable: true
filterUrlPattern: /*
filters: stat,wall
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 5
# password:
password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473
poolPreparedStatements: true
servletLogSlowSql: true
servletLoginPassword: 111111
servletLoginUsername: druid
servletName: druidServlet
servletResetEnable: true
servletUrlMapping: /druid/*
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
# url: jdbc:mysql://127.0.0.1/defaultwbs?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true
url: jdbc:mysql://www.tall.wiki/pt_ccsens?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true
username: root
validationQuery: SELECT 1 FROM DUAL
env: CCSENS_TALL

33
src/main/resources/druid-test.yml

@ -0,0 +1,33 @@
spring:
datasource:
druid:
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
driverClassName: com.mysql.cj.jdbc.Driver
dynamicUrl: jdbc:mysql://localhost:3306/${schema}
filterExclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filterName: druidFilter
filterProfileEnable: true
filterUrlPattern: /*
filters: stat,wall
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 5
password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473
poolPreparedStatements: true
servletLogSlowSql: true
servletLoginPassword: 111111
servletLoginUsername: druid
servletName: druidServlet
servletResetEnable: true
servletUrlMapping: /druid/*
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://test.tall.wiki/pt_ccsens?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true
username: root
validationQuery: SELECT 1 FROM DUAL
env: CCSENS_TALL

196
src/main/resources/logback-spring.xml

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="/home/cloud/ccbasics/log/" />
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
以及指定<appender><logger>仅有一个name属性,
一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
-->
<!--<logger name="org.springframework.web" level="info"/>-->
<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
<!--
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-->
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<!--开发环境:打印控制台-->
<springProfile name="dev">
<logger name="com.ccsens.ptpro.persist.*" level="debug"/>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!--生产环境:输出到文件-->
<!--<springProfile name="pro">-->
<!--<root level="info">-->
<!--<appender-ref ref="CONSOLE" />-->
<!--<appender-ref ref="DEBUG_FILE" />-->
<!--<appender-ref ref="INFO_FILE" />-->
<!--<appender-ref ref="ERROR_FILE" />-->
<!--<appender-ref ref="WARN_FILE" />-->
<!--</root>-->
<!--</springProfile>-->
</configuration>

25
src/main/resources/mapper_dao/SPluginDao.xml

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.ptccsens.persist.dao.SPluginDao">
<select id="getPluginIdByName" resultType="java.lang.Long">
SELECT
id
FROM
`plugin`.t_pro_plugin
WHERE
`name` = #{pluginName}
and rec_status = 0
limit 1
</select>
<update id="updateParamById">
update
t_pro_task_plugin
set
param = #{param}
where
id = #{taskPluginId}
and rec_status = 0
</update>
</mapper>

50
src/main/resources/mapper_dao/SProjectDao.xml

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.ptccsens.persist.dao.SProjectDao">
<update id="updateStatusById">
UPDATE t_pro_task_detail
SET rec_status = 2
WHERE
id = #{projectId}
</update>
<select id="queryByCreator" resultType="com.ccsens.ptccsens.bean.vo.ProjectVo$SysProject">
SELECT
t.id,
t.`name`
FROM
t_pro_member m,
t_pro_role_member rm,
t_pro_role r,
t_label l,
t_pro_task_detail t
WHERE
m.id = rm.member_id
and r.id = rm.role_id
and r.label_id = l.id
and l.`level` = 5
and r.project_id = t.id
and m.user_id = #{userId}
and m.rec_status = 0
and rm.rec_status = 0
and r.rec_status = 0
and t.rec_status = 0
and l.rec_status = 0
</select>
<select id="selectById" resultType="com.ccsens.ptccsens.bean.vo.ProjectVo$SysProject">
SELECT
d.id,
d.`name`,
s.plan_start_time AS beginTime,
s.plan_end_time AS endTime
FROM
t_pro_task_detail AS d
LEFT JOIN t_pro_task_sub AS s ON d.id = s.task_detail_id
WHERE
d.rec_status = 0
AND s.rec_status = 0
AND d.id = #{projectId}
</select>
</mapper>

38
src/main/resources/mapper_dao/STaskDao.xml

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.ptccsens.persist.dao.STaskDao">
<insert id="insertSelectiveList">
INSERT INTO t_pro_task_sub
(
id,
task_detail_id,
plan_start_time,
plan_end_time,
plan_duration
)
VALUES
<foreach collection="proTaskSubList" item="item" separator=",">
(#{item.id},#{item.taskDetailId},#{item.planStartTime},#{item.planEndTime},#{item.planDuration})
</foreach>
</insert>
<select id="getNowTask" resultType="java.lang.Long">
SELECT
s.id
FROM
t_pro_task_detail d
LEFT JOIN t_pro_parent_task p on d.id = p.task_detail_id
LEFT JOIN (SELECT * FROM t_pro_parent_task WHERE parent_task_detail_id = #{projectId}) p1 on p.parent_task_detail_id = p1.task_detail_id
LEFT JOIN
t_pro_task_sub s on d.id = s.task_detail_id and s.rec_status = 0
WHERE
`name` = #{taskName}
and s.plan_start_time &lt;= #{now}
and s.plan_end_time &gt;= #{now}
and d.rec_status = 0
and p.rec_status = 0
and p1.rec_status = 0
limit 1
</select>
</mapper>

29
src/main/resources/mapper_dao/SubLableDao.xml

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.ptccsens.persist.dao.SubLabelDao">
<select id="getLabelByName" resultType="java.lang.Long">
SELECT
l.id
FROM
t_label l
LEFT JOIN t_label_type lt on l.label_type_id = lt.id
WHERE
lt.label_type = #{type}
and
l.description = #{sysRole}
limit 1
</select>
<select id="getLabelByTypeAndLevel" resultType="java.lang.Long">
SELECT
l.id
FROM
t_label l
LEFT JOIN t_label_type lt on l.label_type_id = lt.id
WHERE
lt.label_type = #{type}
and
l.level = #{level}
limit 1
</select>
</mapper>

90
src/main/resources/mbg.xml

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySQL" targetRuntime="MyBatis3">
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- 自定义的序列化 类文件 插件 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<!-- 重新生成xml文件,而不是追加 -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://49.233.89.188:3306/pt_ccsens?useUnicode=true&amp;characterEncoding=UTF-8&amp;tinyInt1isBit=false"
userId="root"
password="po3OynBO[M3579p6L7)o">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="true" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.ccsens.ptccsens.bean.po"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper_raw"
targetProject=".\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.ccsens.ptccsens.persist.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- <table tableName="t_constant" domainObjectName="Constant"></table>-->
<!-- <table tableName="t_label" domainObjectName="Label"></table>-->
<!-- <table tableName="t_label_business" domainObjectName="LabelBusiness"></table>-->
<!-- <table tableName="t_label_type" domainObjectName="LabelType"></table>-->
<!-- <table tableName="t_pro_member" domainObjectName="ProMember"></table>-->
<!-- <table tableName="t_pro_parent_task" domainObjectName="ProParentTask"></table>-->
<!-- <table tableName="t_pro_role" domainObjectName="ProRole"></table>-->
<!-- <table tableName="t_pro_role_member" domainObjectName="ProRoleMember"></table>-->
<!-- <table tableName="t_pro_role_repulsion" domainObjectName="ProRoleRepulsion"></table>-->
<!-- <table tableName="t_pro_role_show" domainObjectName="ProRoleShow"></table>-->
<!-- <table tableName="t_pro_role_task" domainObjectName="ProRoleTask"></table>-->
<!-- <table tableName="t_pro_task_detail" domainObjectName="ProTaskDetail"></table>-->
<!-- <table tableName="t_pro_task_flow" domainObjectName="ProTaskFlow"></table>-->
<!-- <table tableName="t_pro_task_notify" domainObjectName="ProTaskNotify"></table>-->
<!-- <table tableName="t_pro_task_panel_info" domainObjectName="ProTaskPanelInfo"></table>-->
<!-- <table tableName="t_pro_task_plugin" domainObjectName="ProTaskPlugin"></table>-->
<!-- <table tableName="t_pro_task_process" domainObjectName="ProTaskProcess"></table>-->
<!-- <table tableName="t_pro_task_share" domainObjectName="ProTaskShare"></table>-->
<!-- <table tableName="t_pro_task_status_record" domainObjectName="ProTaskStatusRecord"></table>-->
<!-- <table tableName="t_pro_task_sub" domainObjectName="ProTaskSub"></table>-->
<!-- <table tableName="t_pro_task_version" domainObjectName="ProTaskVersion"></table>-->
<!-- <table tableName="t_pro_member_stakeholder" domainObjectName="ProMemberStakeholder"></table>-->
<table tableName="t_pro_deliver" domainObjectName="ProDeliver"></table>
<table tableName="t_pro_deliver_checker" domainObjectName="ProDeliverChecker"></table>
<table tableName="t_pro_clocking_in" domainObjectName="ProClockingIn"></table>
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>

62
src/main/resources/mybatis/mybatis-config.xml

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 打印SQL语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
<typeAlias alias="String" type="java.lang.String" />
</typeAliases>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="false"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="false"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="false"/>
<property name="supportMethodsArguments" value="false"/>
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
</configuration>
Loading…
Cancel
Save