pruple_boy 1 month ago
commit
d1b5edb877
30 changed files with 9489 additions and 0 deletions
  1. 33 0
      .gitignore
  2. BIN
      .mvn/wrapper/maven-wrapper.jar
  3. 2 0
      .mvn/wrapper/maven-wrapper.properties
  4. 316 0
      mvnw
  5. 188 0
      mvnw.cmd
  6. 143 0
      pom.xml
  7. 23 0
      src/main/java/com/tyson/TysonapiApplication.java
  8. 21 0
      src/main/java/com/tyson/configuration/CorsConfig.java
  9. 43 0
      src/main/java/com/tyson/configuration/RestTemplateBase.java
  10. 22 0
      src/main/java/com/tyson/configuration/RestTemplateConfiguration.java
  11. 51 0
      src/main/java/com/tyson/configuration/Swagger2Config.java
  12. 24 0
      src/main/java/com/tyson/configuration/TomcatConfig.java
  13. 88 0
      src/main/java/com/tyson/consts/dingConst.java
  14. 2692 0
      src/main/java/com/tyson/controller/AsyncController.java
  15. 123 0
      src/main/java/com/tyson/controller/ReadExcel.java
  16. 2908 0
      src/main/java/com/tyson/controller/YiDaController.java
  17. 46 0
      src/main/java/com/tyson/controller/timeController.java
  18. 782 0
      src/main/java/com/tyson/util/CusutUtil.java
  19. 245 0
      src/main/java/com/tyson/util/FileUtil.java
  20. 161 0
      src/main/java/com/tyson/util/HttpUtil.java
  21. 57 0
      src/main/java/com/tyson/util/OkHttpUtil.java
  22. 163 0
      src/main/java/com/tyson/util/SFutil.java
  23. 745 0
      src/main/java/com/tyson/util/dingUtil.java
  24. 84 0
      src/main/java/com/tyson/util/sendEmail.java
  25. 23 0
      src/main/java/com/tyson/vo/DeductionVo.java
  26. 25 0
      src/main/resources/application.yml
  27. 23 0
      src/main/resources/log4j.properties
  28. 33 0
      src/main/resources/logback.xml
  29. 420 0
      src/test/java/com/tyson/tysonapi/TysonapiApplicationTests.java
  30. 5 0
      src/test/java/com/tyson/tysonapi/test.java

+ 33 - 0
.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/

BIN
.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

+ 316 - 0
mvnw

@@ -0,0 +1,316 @@
+#!/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 /usr/local/etc/mavenrc ] ; then
+    . /usr/local/etc/mavenrc
+  fi
+
+  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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \
+  $MAVEN_DEBUG_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" \
+  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 188 - 0
mvnw.cmd

@@ -0,0 +1,188 @@
+@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+
+FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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%
+
+cmd /C exit /B %ERROR_CODE%

+ 143 - 0
pom.xml

@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.2</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.Tyson</groupId>
+    <artifactId>tysonapi</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>tysonapi</name>
+    <description>Demo project for Spring Boot</description>
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.3.25</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.json/json -->
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20220320</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>javax.mail-api</artifactId>
+            <version>1.6.0</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.6.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-logging</artifactId>
+            <version>2.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.23</version>
+        </dependency>
+
+        <!--swagger-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <!--swagger ui-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <!--swagger-bootstrap-ui-->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.9.2</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 23 - 0
src/main/java/com/tyson/TysonapiApplication.java

@@ -0,0 +1,23 @@
+package com.tyson;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScans;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@SpringBootApplication
+@ComponentScans({@ComponentScan("com.tyson.util"),@ComponentScan("com.tyson.consts")})
+@EnableAsync
+@EnableScheduling
+public class TysonapiApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TysonapiApplication.class, args);
+        System.out.println("--------------启动成功--------------");
+
+    }
+
+}

+ 21 - 0
src/main/java/com/tyson/configuration/CorsConfig.java

@@ -0,0 +1,21 @@
+package com.tyson.configuration;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+// 请求跨域
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+
+    static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE","PATCH" };
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问。
+                .allowedOrigins("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
+                .allowCredentials(false) // 是否支持跨域用户凭证
+                .allowedMethods(ORIGINS) // 当前站点支持的跨域请求类型是什么
+                .maxAge(3600); // 超时时长设置为1小时。 时间单位是秒。
+    }
+
+}

+ 43 - 0
src/main/java/com/tyson/configuration/RestTemplateBase.java

@@ -0,0 +1,43 @@
+package com.tyson.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class RestTemplateBase {
+    @Bean
+    public RestTemplate registerTemplate() {
+        RestTemplate restTemplate = new RestTemplate(getFactory());
+        //这个地方需要配置消息转换器,不然收到消息后转换会出现异常
+        restTemplate.setMessageConverters(getConverts());
+        return restTemplate;
+    }
+
+    private SimpleClientHttpRequestFactory getFactory() {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setConnectTimeout(100*100000);
+        factory.setReadTimeout(100*100000);
+        return factory;
+    }
+
+    private List<HttpMessageConverter<?>> getConverts() {
+        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
+        // String转换器
+        StringHttpMessageConverter stringConvert = new StringHttpMessageConverter();
+        List<MediaType> stringMediaTypes = new ArrayList<MediaType>() {{
+            //添加响应数据格式,不匹配会报401
+            add(MediaType.ALL);
+        }};
+        stringConvert.setSupportedMediaTypes(stringMediaTypes);
+        messageConverters.add(stringConvert);
+        return messageConverters;
+    }
+}

+ 22 - 0
src/main/java/com/tyson/configuration/RestTemplateConfiguration.java

@@ -0,0 +1,22 @@
+package com.tyson.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+
+public class RestTemplateConfiguration {
+
+    public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
+        SimpleClientHttpRequestFactory clientHttpRequestFactory
+                = new SimpleClientHttpRequestFactory();
+        clientHttpRequestFactory.setConnectTimeout(10 * 1000);
+        clientHttpRequestFactory.setReadTimeout(10 * 1000);
+        return new RestTemplate(clientHttpRequestFactory);
+    }
+}

+ 51 - 0
src/main/java/com/tyson/configuration/Swagger2Config.java

@@ -0,0 +1,51 @@
+package com.tyson.configuration;
+
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @ClassName SwaggerConfig
+ * @Description
+ * @Author MZ
+ * @Date 2023/12/26 22:36
+ */
+@EnableSwagger2
+@Configuration
+public class Swagger2Config {
+
+    @Value("${swagger.enable}")
+    private boolean swaggerEnable;
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .enable(swaggerEnable)
+                .apiInfo(apiInfo())
+                .select()
+                //.apis(RequestHandlerSelectors.basePackage("com.cdwm.mrp.controller")) 指定扫描包
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any())
+                //只显示api路径下的页面
+                //.paths(Predicates.and(PathSelectors.regex("/api/.*")))
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("tysonAPI文档")
+                .description("tysonAPI文档")
+                .version("1.0.0")
+                .version("1.0")
+                .termsOfServiceUrl("") //文档生成的主页地址
+                .build();
+    }
+}

+ 24 - 0
src/main/java/com/tyson/configuration/TomcatConfig.java

@@ -0,0 +1,24 @@
+package com.tyson.configuration;
+
+import org.apache.catalina.connector.Connector;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author: zw
+ * @create: 2019-06-27 11:19
+ **/
+@Configuration
+public class TomcatConfig {
+
+    @Bean
+    public TomcatServletWebServerFactory webServerFactory() {
+        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
+        factory.addConnectorCustomizers((Connector connector) -> {
+            connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
+            connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
+        });
+        return factory;
+    }
+}

+ 88 - 0
src/main/java/com/tyson/consts/dingConst.java

@@ -0,0 +1,88 @@
+package com.tyson.consts;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * Decription:
+ *
+ * @author hzk
+ * @ClassName dingConst
+ * @Date 2022/3/29 14:12
+ */
+@Component
+@ConfigurationProperties(prefix = "ding")
+public class dingConst {
+    private String agentId;
+    private String appKey;
+    private String appSecret;
+    private String appType;
+    private String systemToken;
+    private String userId;
+    private String url;
+    private String hanxingUrl;
+
+    public String getHanxingUrl() {
+        return hanxingUrl;
+    }
+
+    public void setHanxingUrl(String hanxingUrl) {
+        this.hanxingUrl = hanxingUrl;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getAppType() {
+        return appType;
+    }
+
+    public void setAppType(String appType) {
+        this.appType = appType;
+    }
+
+    public String getSystemToken() {
+        return systemToken;
+    }
+
+    public void setSystemToken(String systemToken) {
+        this.systemToken = systemToken;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
+
+    public String getAppKey() {
+        return appKey;
+    }
+
+    public void setAppKey(String appKey) {
+        this.appKey = appKey;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public void setAppSecret(String appSecret) {
+        this.appSecret = appSecret;
+    }
+}

File diff suppressed because it is too large
+ 2692 - 0
src/main/java/com/tyson/controller/AsyncController.java


+ 123 - 0
src/main/java/com/tyson/controller/ReadExcel.java

@@ -0,0 +1,123 @@
+package com.tyson.controller;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+
+import com.tyson.util.dingUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RestController;
+
+@Component
+public class ReadExcel {
+
+    @Autowired
+    private dingUtil dingUtil;
+
+    public void readExcel(String path) {
+        try {
+            //创建工作簿对象
+            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(path));
+            //读取第i个工作表
+            XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
+            //获取最后一行的num,即总行数。此处从0开始
+            int maxRow = sheet.getLastRowNum();
+            System.out.println(maxRow);
+            HashMap<String, String> map = new HashMap<>();
+            for (int row = 0; row <= maxRow; row++) {
+                sheet.getRow(row).getCell(0).setCellType(CellType.STRING);
+                String key = sheet.getRow(row).getCell(0).getStringCellValue();
+                String value = sheet.getRow(row).getCell(1).getStringCellValue();
+                map.put(key, value);
+            }
+            JSONArray objects = new JSONArray();
+
+            for (String key : map.keySet()) {
+                String value = map.get(key);
+
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("textField_l75terja", value);
+                jsonObject.put("textField_l75terjb", key);
+                JSONArray jsonArray = new JSONArray();
+                try {
+                    jsonArray = new JSONArray(dingUtil.yiDaSearch("FORM-EX866CB143A3WF6PAR7O94M7SE7I2FMKET57L5", jsonObject));
+                } catch (Exception ex) {
+
+                }
+                try {
+                    if (jsonArray.length() > 0) {
+                        String formInstanceId = jsonArray.getJSONObject(0).getString("formInstanceId");
+                        dingUtil.UpdateYiDa(formInstanceId, jsonObject);
+                    } else {
+                        dingUtil.saveYiDa("FORM-EX866CB143A3WF6PAR7O94M7SE7I2FMKET57L5", jsonObject, "01021447385039757257");
+                    }
+                } catch (Exception ex) {
+                    objects.put(jsonObject);
+                    continue;
+                }
+            }
+            while (true) {
+                JSONArray objects2 = new JSONArray();
+                for (int i = 0; i < objects.length(); i++) {
+                    JSONObject jsonObject = objects.getJSONObject(i);
+                    JSONArray jsonArray = new JSONArray();
+                    try {
+                        jsonArray = new JSONArray(dingUtil.yiDaSearch("FORM-EX866CB143A3WF6PAR7O94M7SE7I2FMKET57L5", jsonObject));
+                    } catch (Exception ex) {
+
+                    }
+                    try {
+                        if (jsonArray.length() > 0) {
+                            String formInstanceId = jsonArray.getJSONObject(0).getString("formInstanceId");
+                            dingUtil.UpdateYiDa(formInstanceId, jsonObject);
+                        } else {
+                            dingUtil.saveYiDa("FORM-EX866CB143A3WF6PAR7O94M7SE7I2FMKET57L5", jsonObject, "01021447385039757257");
+                        }
+                    } catch (Exception ex) {
+                        objects2.put(jsonObject);
+                        continue;
+                    }
+                }
+                objects = new JSONArray();
+                for (int i = 0; i < objects2.length(); i++) {
+                    JSONObject jsonObject = objects2.getJSONObject(i);
+                    JSONArray jsonArray = new JSONArray();
+                    try {
+                        jsonArray = new JSONArray(dingUtil.yiDaSearch("FORM-EX866CB143A3WF6PAR7O94M7SE7I2FMKET57L5", jsonObject));
+                    } catch (Exception ex) {
+
+                    }
+                    try {
+                        if (jsonArray.length() > 0) {
+                            String formInstanceId = jsonArray.getJSONObject(0).getString("formInstanceId");
+                            dingUtil.UpdateYiDa(formInstanceId, jsonObject);
+                        } else {
+                            dingUtil.saveYiDa("FORM-EX866CB143A3WF6PAR7O94M7SE7I2FMKET57L5", jsonObject, "01021447385039757257");
+                        }
+                    } catch (Exception ex) {
+                        objects.put(jsonObject);
+                        continue;
+                    }
+                }
+                if(objects.length() == 0){
+                    break;
+                }
+            }
+            System.out.println("成功");
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+
+    }
+
+}
+

File diff suppressed because it is too large
+ 2908 - 0
src/main/java/com/tyson/controller/YiDaController.java


+ 46 - 0
src/main/java/com/tyson/controller/timeController.java

@@ -0,0 +1,46 @@
+package com.tyson.controller;
+
+import com.tyson.consts.dingConst;
+import com.tyson.util.CusutUtil;
+import com.tyson.util.dingUtil;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Decription:
+ *
+ * @author hzk
+ * @ClassName YiDaController
+ * @Date 2022/8/3 11:41
+ */
+@RestController
+@RequestMapping("/time")
+public class timeController {
+
+    @Autowired
+    private dingUtil dingUtil;
+
+    @Autowired
+    private YiDaController yiDaController;
+
+    @Scheduled(fixedDelayString = "1800000") //上一次执行完毕时间点之后半小时再执行
+    public void test() {
+        try {
+            System.out.println("验真定时器2023-0725"+CusutUtil.getNowDate());
+            yiDaController.test("异常");
+            yiDaController.test("失败");
+
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+    }
+
+
+}

+ 782 - 0
src/main/java/com/tyson/util/CusutUtil.java

@@ -0,0 +1,782 @@
+package com.tyson.util;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Decription:
+ * 通用方法
+ *
+ * @author hzk
+ * @Date 2021/10/21 17:45
+ */
+public class CusutUtil {
+
+
+    //当前时间加几天返回
+    public static String SetTimeAddDay(int day) {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DAY_OF_MONTH, day);
+        return sf.format(c.getTime());
+    }
+
+    //当前时间加几月返回
+    public static String SetTimeAddMonth(int Month) {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, Month);
+        return sf.format(c.getTime());
+    }
+
+    //月份加任意
+    public static String monthAddFrist(String date, int month) {
+
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Calendar ct = Calendar.getInstance();
+            ct.setTime(df.parse(date));
+            ct.add(Calendar.MONTH, month);
+            return df.format(ct.getTime());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    //时间转时间戳(yyyy年MM月dd日) 毫秒级
+    public static long dateTOtimeshap(String date) {
+        String date_str = date +  " 00:00:00";
+        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
+        try {
+
+            Date time = df.parse(date_str);
+            long timestamp = time.getTime();
+            return timestamp;
+        } catch (Exception e) {
+            try {
+                Date  time = df.parse(date);
+                long timestamp = time.getTime();
+                return timestamp;
+            } catch (ParseException parseException) {
+                parseException.printStackTrace();
+            }
+
+        }
+        return 0;
+    }
+
+    //时间转时间戳(yyyyMMdd) 毫秒级
+    public static long dateTOtimeshapYYMMDD(String date) {
+        date += " 00:00:00";
+        DateFormat df = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
+        try {
+
+            Date time = df.parse(date);
+            long timestamp = time.getTime();
+            return timestamp;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    //时间转格式(yyyy/MM/dd/)
+    public static String dateTOxieg(String date) {
+        return date.replace("年", "").replace("月", "").replace("日", "");
+    }
+
+    //天数加任意
+    public static String DayAddFrist(String date, int day) {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Calendar ct = Calendar.getInstance();
+            ct.setTime(df.parse(date));
+            ct.add(Calendar.DAY_OF_MONTH, day);
+            return df.format(ct.getTime());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    //根据云枢url获取refId
+    public static String ByUrlGetRefId(String url) {
+        String refId = url.substring(url.indexOf("?") + 7, url.indexOf("&"));
+        return refId;
+    }
+
+    //String to html
+    public static String strToHtml(String s) {
+        if (s == null || s.equals("")) return "";
+        s = s.replaceAll("&amp;", "&");
+        s = s.replaceAll("&lt;", "<");
+        s = s.replaceAll("&gt;", ">");
+        s = s.replaceAll("  ", "&nbsp;");
+        return s;
+    }
+
+    //从头开始删除字符的方法
+    public static String TruncateHeadString(String origin, int count) {
+        if (origin == null || origin.length() < count) {
+            return null;
+        }
+        char[] arr = origin.toCharArray();
+        char[] ret = new char[arr.length - count];
+        for (int i = 0; i < ret.length; i++) {
+            ret[i] = arr[i + count];
+        }
+
+        return String.copyValueOf(ret);
+    }
+
+    //从尾部开始删除字符的方法
+    public static String TruncateTailString(String origin, int count) {
+        if (origin == null || origin.length() < count) {
+            return null;
+        }
+        char[] arr = origin.toCharArray();
+        char[] ret = new char[arr.length - count + 1];
+        for (int i = 0; i < ret.length; i++) {
+            ret[i] = arr[i];
+        }
+
+        return String.copyValueOf(ret);
+    }
+
+    /**
+     * 获取现在时间
+     *
+     * @return 返回时间类型 yyyy-MM-dd HH:mm:ss
+     */
+    public static String getNowDate() {
+        Date currentTime = new Date();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String dateString = formatter.format(currentTime);
+        return dateString;
+    }
+
+    /**
+     * @param string
+     * @return 转换之后的内容
+     * @Title: unicodeDecode
+     * @Description: unicode解码 将Unicode的编码转换为中文
+     */
+    public static String unicodeDecode(String string) {
+        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
+        Matcher matcher = pattern.matcher(string);
+        char ch;
+        while (matcher.find()) {
+            ch = (char) Integer.parseInt(matcher.group(2), 16);
+            string = string.replace(matcher.group(1), ch + "");
+        }
+        return string;
+    }
+
+
+    /**
+     * 获取现在时间 -格式
+     *
+     * @return 返回时间类型 yyyyMMdd
+     */
+    public static String getNowDate(String gs) {
+        Date currentTime = new Date();
+        SimpleDateFormat formatter = new SimpleDateFormat(gs);
+        String dateString = formatter.format(currentTime);
+        return dateString;
+    }
+
+    //时间戳转时间 yyyyMMdd
+    public static String getFormatDate(long times) {
+        Date date = new Date(times);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
+        String dateString = formatter.format(date);
+        return dateString;
+    }
+
+    //时间戳转时间 yyyyMMdd
+    public static String getFormatDateYY(long times) {
+        Date date = new Date(times);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
+        String dateString = formatter.format(date);
+        return dateString;
+    }
+
+    //时间戳转时间 yyyyMM
+    public static String getFormatDateMM(long times) {
+        Date date = new Date(times);
+        SimpleDateFormat formatter = new SimpleDateFormat("MM");
+        String dateString = formatter.format(date);
+        return dateString;
+    }
+
+    /**
+     * 获取现在时间 -带时区
+     *
+     * @return 返回时间类型 yyyy-MM-dd'T'HH:mm:ssXXX
+     */
+    public static String getNowDate_TIMEZONE() {
+        Date currentTime = new Date();
+
+        Calendar cal = Calendar.getInstance(); // creates calendar
+
+        cal.setTime(currentTime); // sets calendar time/date
+
+        cal.add(Calendar.HOUR_OF_DAY, 2); // adds one hour
+
+        currentTime = cal.getTime();//
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+        String dateString = formatter.format(currentTime);
+        return dateString;
+    }
+/**
+  * @Description : 时间格式转为yyyy-MM-dd
+  * @Author : Lizzy
+  * @Param :
+  * @return : String
+  * @Date : 2024/7/29 19:11
+  */
+    public static String getDate(long times) {
+        Date date = new Date(times);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(date);
+        return dateString;
+    }
+
+
+    //获取jayy数组
+    public static JSONArray getJayy(String s) {
+        JSONObject jObj = new JSONObject(s);
+        JSONArray content = new JSONArray();
+        if (jObj.has("data")) {
+            JSONObject jdata = new JSONObject(jObj.get("data").toString());
+            content = new JSONArray(jdata.get("content").toString());
+        }
+        return content;
+    }
+
+    //月份加1
+    public static String monthAddFrist(String date) {
+
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Calendar ct = Calendar.getInstance();
+            ct.setTime(df.parse(date));
+            ct.add(Calendar.MONTH, +1);
+            return df.format(ct.getTime());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    //返回成功格式
+    public static String SuccessReturnJsonString(int code, String data, String... types) {
+        for (String type : types) {
+            if (type.toLowerCase().contains("str")) data = "\"" + data + "\"";
+        }
+        return "{\"code\":" + code + ",\"message\":\"\",\"response\":" + data + ",\"success\":true}";
+    }
+
+
+    public static Object jsonByHas(JSONObject jo, String key) {
+        if (jo.has(key)) {
+            return jo.get(key);
+        }
+        return null;
+    }
+
+    //返回失败格式
+    public static String ErrorReturnJsonString(int code, String message, String... types) {
+        if (types.length == 0) {
+            message = "\"" + message + "\"";
+        }
+        return "{\"code\":" + code + ",\"message\":" + message + ",\"response\":null,\"success\":false}";
+    }
+
+    //返回json中需要的参
+    public static String getJsonValue(JSONObject iter, String jpath) {
+        String[] json_vals = jpath.split("\\.");
+        for (int i = 0; i < json_vals.length; i++) {
+            if (i + 1 >= json_vals.length)
+                return iter.has(json_vals[i]) ? iter.get(json_vals[i]).toString() : "";
+
+            iter = new JSONObject(iter.get(json_vals[i]).toString());
+        }
+
+        return "";
+    }
+
+
+    //计算两个时间相差的秒数
+    public static long getTime(String startTime, String endTime) {
+        try {
+            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            long eTime = df.parse(endTime).getTime();
+            long sTime = df.parse(startTime).getTime();
+            long diff = (eTime - sTime) / 1000;
+            return diff;
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return 0;
+    }
+
+
+    /**
+     * 生成32位随机数
+     *
+     * @return
+     */
+    public static String random32() {
+        Random rand = new Random();
+        StringBuffer sb = new StringBuffer();
+        for (int i = 1; i <= 32; i++) {
+            int randNum = rand.nextInt(9) + 1;
+            String num = randNum + "";
+            sb = sb.append(num);
+        }
+        String random = String.valueOf(sb);
+        return random;
+    }
+
+    //转义字符供getJsonValue使用
+    private static String tpath = "data.%s.";
+
+    public static String getJpath(String Name) {
+        return getJpath("", Name);
+    }
+
+    public static String getJpath(String Name, String params) {
+        return String.format(tpath, params) + Name;
+    }
+
+    //获取前端发送的json字符串
+    public static String getPostString(HttpServletRequest request) {
+        String s = "";
+
+        InputStream in = null;
+
+        BufferedInputStream bin = null;
+
+        try {
+            in = request.getInputStream();
+
+            bin = new BufferedInputStream(in);
+
+            int len = 0;
+
+            byte[] b = new byte[1024];
+
+            while ((len = bin.read(b)) != -1) {
+                s += new String(b, 0, len);
+
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+
+        } finally {
+            try {
+                bin.close();
+
+            } catch (IOException e) {
+                e.printStackTrace();
+
+            }
+
+            try {
+                in.close();
+
+            } catch (IOException e) {
+                e.printStackTrace();
+
+            }
+            return s;
+        }
+    }
+
+    //Authorization
+    public static HttpEntity<String> JsonToHttpEntity(JSONObject json, String... Authorization) {
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        if (Authorization.length > 0) {
+            headers.add("Authorization", Authorization[0]);
+        }
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        HttpEntity<String> formEntity = new HttpEntity<String>(json.toString(), headers);
+        return formEntity;
+    }
+
+
+    public static HttpEntity<String> HttpEntity_headers(JSONObject json, HashMap<String, String> map) {
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        if (map.size() > 0) {
+            for (Map.Entry entry : map.entrySet()) {
+                headers.add(entry.getKey().toString(), entry.getValue().toString());
+            }
+        }
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        HttpEntity<String> formEntity = new HttpEntity<String>(json.toString(), headers);
+        return formEntity;
+    }
+    //加密方法
+
+    /**
+     * 传入文本内容,返回 SHA-256 串
+     *
+     * @param strText
+     * @return
+     */
+    public static String SHA256(final String strText) {
+        return SHA(strText, "SHA-256");
+    }
+
+    /**
+     * 传入文本内容,返回 SHA-512 串
+     *
+     * @param strText
+     * @return
+     */
+    public static String SHA512(final String strText) {
+        return SHA(strText, "SHA-512");
+    }
+
+    /**
+     * 字符串 SHA 加密
+     *
+     * @param strType
+     * @return
+     */
+    private static String SHA(final String strText, final String strType) {
+        // 返回值
+        String strResult = null;
+
+        // 是否是有效字符串
+        if (strText != null && strText.length() > 0) {
+            try {
+                // SHA 加密开始
+                // 创建加密对象 并傳入加密類型
+                MessageDigest messageDigest = MessageDigest.getInstance(strType);
+                // 传入要加密的字符串
+                messageDigest.update(strText.getBytes());
+                // 得到 byte 類型结果
+                byte byteBuffer[] = messageDigest.digest();
+
+                // 將 byte 轉換爲 string
+                StringBuffer strHexString = new StringBuffer();
+                // 遍歷 byte buffer
+                for (int i = 0; i < byteBuffer.length; i++) {
+                    String hex = Integer.toHexString(0xff & byteBuffer[i]);
+                    if (hex.length() == 1) {
+                        strHexString.append('0');
+                    }
+                    strHexString.append(hex);
+                }
+                // 得到返回結果
+                strResult = strHexString.toString();
+            } catch (NoSuchAlgorithmException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return strResult;
+    }
+
+    //用户密码加密封装
+    public static String hash_password(String password) {
+        return SHA256(SHA512(password));
+    }
+
+    public static String md5(String body) {
+        String md5 = "";
+        try {
+            md5 = DigestUtils.md5DigestAsHex(body.getBytes());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return md5;
+    }
+
+    /**
+     * 去除前后指定字符
+     *
+     * @param args   目标字符串
+     * @param beTrim 要删除的指定字符
+     * @return 删除之后的字符串
+     * 调用示例:System.out.println(trim("$$abc $","$"));
+     */
+    public static String trim(String args, char beTrim) {
+        int st = 0;
+        int len = args.length();
+        char[] val = args.toCharArray();
+        char sbeTrim = beTrim;
+        while ((st < len) && (val[st] <= sbeTrim)) {
+            st++;
+        }
+        while ((st < len) && (val[len - 1] <= sbeTrim)) {
+            len--;
+        }
+        return ((st > 0) || (len < args.length())) ? args.substring(st, len) : args;
+    }
+
+    /**
+     * MultipartFile 转 File
+     *
+     * @param file
+     * @throws Exception
+     */
+    public static File multipartFileToFile(MultipartFile file) throws Exception {
+
+        File toFile = null;
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            toFile = new File(new Date().getTime() + "-" + UUID.randomUUID() + "." + file.getOriginalFilename().split("\\.")[1]);
+            inputStreamToFile(ins, toFile);
+            ins.close();
+        }
+        return toFile;
+    }
+
+    //获取流文件
+    private static void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 删除本地临时文件
+     *
+     * @param file
+     */
+    public static void delteTempFile(File file) {
+        if (file != null) {
+            File del = new File(file.toURI());
+            del.delete();
+        }
+    }
+
+
+    /**
+     * 根据经纬度查询
+     *
+     * @param log
+     * @param lat
+     * @return
+     */
+    public static String getAdd(String log, String lat) {
+        //lat 小  log  大
+        //参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
+        String urlString = "http://api.map.baidu.com/geocoder/v2/?ak=0EXAjYp9hii1DrK3Tuda8efu9vivslcX&callback=renderReverse&location=" + lat + "," + log + "&output=json&pois=1";
+        String res = "";
+        try {
+            URL url = new URL(urlString);
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setDoOutput(true);
+            conn.setRequestMethod("POST");
+            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                res += line + "\n";
+            }
+            in.close();
+        } catch (Exception e) {
+            System.out.println("error in wapaction,and e is " + e.getMessage());
+        }
+        System.out.println(res);
+        return res;
+    }
+
+
+    public static void main(String[] args) {
+        /*  System.out.println(getAdd(119.0478515625+"",31.5785354265+""));*/
+        //System.out.println(addressResolution("河南省仙桃市"));
+        double b = (double) 560 / 100;
+        System.out.println(b);
+        String add = CusutUtil.getAdd("119.0478515625", "31.5785354265");
+        System.out.println(add);
+    }
+
+    /**
+     * 根据url 拉取文件
+     *
+     * @param url
+     * @return
+     * @throws Exception
+     */
+    public static File getFile(String url) throws Exception {
+        File file = null;
+        try {
+            HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
+            httpUrl.connect();
+            file = CusutUtil.inputStreamToFile(httpUrl.getInputStream(), "url.png");
+            httpUrl.disconnect();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return file;
+    }
+
+    /**
+     * 工具类
+     * inputStream 转 File
+     */
+    public static File inputStreamToFile(InputStream ins, String name) throws Exception {
+        File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
+        if (file.exists()) {
+            return file;
+        }
+        OutputStream os = new FileOutputStream(file);
+        int bytesRead;
+        int len = 8192;
+        byte[] buffer = new byte[len];
+        while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
+            os.write(buffer, 0, bytesRead);
+        }
+        os.close();
+        ins.close();
+        return file;
+    }
+
+
+    public static String isJson(String str) {
+        String result = "false";
+        if (str != null) {
+            str = str.trim();
+            if (str.startsWith("{") && str.endsWith("}")) {
+                result = "json";
+            } else if (str.startsWith("[") && str.endsWith("]")) {
+                result = "jarray";
+            }
+        }
+        return result;
+    }
+
+    public static String jsonTOxml(JSONObject jo) {
+        Iterator iterator = jo.keys();
+        String xmlStr = "<xml>";
+        while (iterator.hasNext()) {
+            String key = (String) iterator.next();
+            String val = jo.get(key).toString();
+            xmlStr += "\n<" + key + ">" + val + "</" + key + ">";
+        }
+        return xmlStr + "\n</xml>";
+    }
+
+    /**
+     * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成参数串<br>
+     * 实现步骤: <br>
+     *
+     * @param paraMap    要排序的Map对象
+     * @param urlEncode  是否需要URLENCODE
+     * @param keyToLower 是否需要将Key转换为全小写
+     *                   true:key转化成小写,false:不转化
+     * @return
+     */
+    public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) {
+        String buff = "";
+        Map<String, String> tmpMap = paraMap;
+        try {
+            List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
+            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+            Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
+
+                @Override
+                public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
+                    return (o1.getKey()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造返回字符串键值对的格式
+            StringBuilder buf = new StringBuilder();
+            for (Map.Entry<String, String> item : infoIds) {
+                if (item.getKey() != "") {
+                    String key = item.getKey();
+                    String val = item.getValue();
+                    if (urlEncode) {
+                        val = URLEncoder.encode(val, "utf-8");
+                    }
+                    if (keyToLower) {
+                        buf.append(key.toLowerCase() + "=" + val);
+                    } else {
+                        buf.append(key + "=" + val);
+                    }
+                    buf.append("&");
+                }
+
+            }
+            buff = buf.toString();
+            if (buff.isEmpty() == false) {
+                buff = buff.substring(0, buff.length() - 1);
+            }
+        } catch (Exception e) {
+            return null;
+        }
+        return buff;
+    }
+
+    public static String getRandomString(int length) {
+
+        //1. 定义一个字符串(A-Z,a-z,0-9)即62个数字字母;
+
+        String str = "zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
+
+        //2. 由Random生成随机数
+
+        Random random = new Random();
+
+        StringBuffer sb = new StringBuffer();
+
+        //3. 长度为几就循环几次
+
+        for (int i = 0; i < length; ++i) {
+
+            //从62个的数字或字母中选择
+
+            int number = random.nextInt(62);
+
+            //将产生的数字通过length次承载到sb中
+
+            sb.append(str.charAt(number));
+
+        }
+        //将承载的字符转换成字符串
+        return sb.toString();
+    }
+
+}

+ 245 - 0
src/main/java/com/tyson/util/FileUtil.java

@@ -0,0 +1,245 @@
+package com.tyson.util;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributeView;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Date;
+
+/**
+ * 文件工具类
+ *
+ * @author 云诺
+ * @Description:
+ * @date 2021/1/11 5:34
+ * @Version
+ */
+public class FileUtil {
+
+    public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
+
+    /**
+     * 输出指定文件的byte数组
+     *
+     * @param filePath 文件路径
+     * @param os 输出流
+     * @return
+     */
+    public static void writeBytes(String filePath, OutputStream os) throws IOException
+    {
+        FileInputStream fis = null;
+        try
+        {
+            File file = new File(filePath);
+            if (!file.exists())
+            {
+                throw new FileNotFoundException(filePath);
+            }
+            fis = new FileInputStream(file);
+            byte[] b = new byte[1024];
+            int length;
+            while ((length = fis.read(b)) > 0)
+            {
+                os.write(b, 0, length);
+            }
+        }
+        catch (IOException e)
+        {
+            throw e;
+        }
+        finally
+        {
+            if (os != null)
+            {
+                try
+                {
+                    os.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+            if (fis != null)
+            {
+                try
+                {
+                    fis.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param filePath 文件
+     * @return
+     */
+    public static boolean deleteFile(String filePath)
+    {
+        boolean flag = false;
+        File file = new File(filePath);
+        // 路径为文件且不为空则进行删除
+        if (file.isFile() && file.exists())
+        {
+            file.delete();
+            flag = true;
+        }
+        return flag;
+    }
+
+    /**
+     * 文件名称验证
+     *
+     * @param filename 文件名称
+     * @return true 正常 false 非法
+     */
+    public static boolean isValidFilename(String filename)
+    {
+        return filename.matches(FILENAME_PATTERN);
+    }
+
+    /**
+     * 检查文件是否可下载
+     *
+     * @param resource 需要下载的文件
+     * @return true 正常 false 非法
+     */
+    public static boolean checkAllowDownload(String resource)
+    {
+        // 禁止目录上跳级别
+        if (resource.contains(".."))
+        {
+            return false;
+        }
+
+
+        // 不在允许下载的文件规则
+        return false;
+    }
+
+    /**
+     * 下载文件名重新编码
+     *
+     * @param request 请求对象
+     * @param fileName 文件名
+     * @return 编码后的文件名
+     */
+    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
+    {
+        final String agent = request.getHeader("USER-AGENT");
+        String filename = fileName;
+        if (agent.contains("MSIE"))
+        {
+            // IE浏览器
+            filename = URLEncoder.encode(filename, "utf-8");
+            filename = filename.replace("+", " ");
+        }
+        else if (agent.contains("Firefox"))
+        {
+            // 火狐浏览器
+            filename = new String(fileName.getBytes(), "ISO8859-1");
+        }
+        else if (agent.contains("Chrome"))
+        {
+            // google浏览器
+            filename = URLEncoder.encode(filename, "utf-8");
+            filename = filename.replace("+", " ");
+        }
+        else
+        {
+            // 其它浏览器
+            filename = URLEncoder.encode(filename, "utf-8");
+            filename = filename.replace("+", " ");
+        }
+        return filename;
+    }
+
+    /**
+     * 下载文件名重新编码
+     *
+     * @param response 响应对象
+     * @param realFileName 真实文件名
+     * @return
+     */
+    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
+    {
+        String percentEncodedFileName = percentEncode(realFileName);
+
+        StringBuilder contentDispositionValue = new StringBuilder();
+        contentDispositionValue.append("attachment; filename=")
+                .append(percentEncodedFileName)
+                .append(";")
+                .append("filename*=")
+                .append("utf-8''")
+                .append(percentEncodedFileName);
+
+        response.setHeader("Content-disposition", contentDispositionValue.toString());
+    }
+
+    /**
+     * 百分号编码工具方法
+     *
+     * @param s 需要百分号编码的字符串
+     * @return 百分号编码后的字符串
+     */
+    public static String percentEncode(String s) throws UnsupportedEncodingException
+    {
+        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
+        return encode.replaceAll("\\+", "%20");
+    }
+
+    /**
+     * 输出指定文件的byte数组
+     *
+     * @param fis 文件输入流
+     * @param os       输出流
+     * @return
+     * @Title: writeBytes
+     * @Description:
+     * @author 云诺
+     */
+    public static void writeBytes(InputStream fis, OutputStream os) throws IOException {
+
+        try {
+            if (fis == null) {
+                throw new FileNotFoundException();
+            }
+            byte[] b = new byte[1024];
+            int length;
+            while ((length = fis.read(b)) > 0) {
+                os.write(b, 0, length);
+            }
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+            if (fis != null) {
+                try {
+                    fis.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+}
+

+ 161 - 0
src/main/java/com/tyson/util/HttpUtil.java

@@ -0,0 +1,161 @@
+package com.tyson.util;
+
+import com.alibaba.fastjson.JSON;
+import com.sun.net.ssl.HttpsURLConnection;
+import com.tyson.configuration.RestTemplateBase;
+import lombok.SneakyThrows;
+import netscape.javascript.JSObject;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import javax.net.ssl.HostnameVerifier;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Map;
+
+/**
+ * Decription:
+ *
+ * @author hzk
+ * @ClassName HttpUtil
+ * @Date 2022/8/3 17:04
+ */
+public class HttpUtil {
+
+    @Qualifier("permissionRestTemplate")
+    @Autowired
+    private RestTemplate restTemplate;
+
+    public static  String get(String url){
+        RestTemplate restTemplate = new RestTemplateBase().registerTemplate();
+        ResponseEntity<String> stringResponseEntity = restTemplate.getForEntity(url, String.class);
+        return stringResponseEntity.getBody();
+    }
+
+    public static String post(String url,String AcceptType,String body,Map<String,String> headersMap){
+        HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
+        RestTemplate restTemplate = new RestTemplateBase().registerTemplate();
+
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+
+        if(AcceptType == null || AcceptType.equals("")){
+            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        }else{
+            headers.add("Accept", AcceptType);
+        }
+        if(headersMap != null) {
+            for (String key : headersMap.keySet()) {
+                headers.add(key, headersMap.get(key));
+            }
+        }
+        //指定格式
+        HttpEntity<String> formEntity = new HttpEntity<String>(body, headers);
+        ResponseEntity<String> stringResponseEntity = null;
+        stringResponseEntity = restTemplate.postForEntity(url, formEntity, String.class);
+        return stringResponseEntity.getBody();
+    }
+
+
+
+    public static void downloadUsingStream(String urlStr, String file) throws IOException{
+
+        URL url = new URL(urlStr);
+
+        BufferedInputStream bis = new BufferedInputStream(url.openStream());
+
+        FileOutputStream fis = new FileOutputStream(file);
+
+        byte[] buffer = new byte[1024];
+
+        int count=0;
+
+        while((count = bis.read(buffer,0,1024)) != -1)
+
+        {
+
+            fis.write(buffer, 0, count);
+
+        }
+
+        fis.close();
+
+        bis.close();
+
+    }
+
+    public static void downloadUsingNIO(String urlStr, String file) throws IOException {
+
+        URL url = new URL(urlStr);
+
+        ReadableByteChannel rbc = Channels.newChannel(url.openStream());
+
+        FileOutputStream fos = new FileOutputStream(file);
+
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+
+        fos.close();
+
+        rbc.close();
+
+    }
+
+
+    public static String doPostFile2(String url, MultiValueMap<String, Object> param, File file) {
+        ResponseEntity<String> stringResponseEntity = null;
+        try {
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("Accept",MediaType.APPLICATION_JSON.toString());
+            headers.setContentType(MediaType.parseMediaType("multipart/form-data;charset=UTF-8"));
+
+            FileSystemResource resource = new FileSystemResource(file);
+            param.add("img",resource);
+
+            HttpEntity<MultiValueMap<String,Object>> formEntity = new HttpEntity<>(param,headers);
+            stringResponseEntity = new RestTemplate().postForEntity(url, formEntity, String.class);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return stringResponseEntity.getBody();
+    }
+
+
+    // ppExt: 基于 OkHttp 库实现, https带ip请求兼容性, 忽略证书校验 OkHttpUtil 类 [ 使用 HttpUtil 报异常 ]
+    @SneakyThrows
+    public static  String okRequest(String url,String data) {
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .sslSocketFactory(OkHttpUtil.getIgnoreInitedSslContext().getSocketFactory(), OkHttpUtil.IGNORE_SSL_TRUST_MANAGER_X509)
+                .hostnameVerifier(OkHttpUtil.getIgnoreSslHostnameVerifier())
+                .build();
+        okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(data));
+        Request request = new Request.Builder()
+                .url(url)
+                .method("POST", body)
+                .build();
+
+        Response response = client.newCall(request).execute();
+        String rsp = response.body().string();
+        return rsp;
+    }
+
+}

+ 57 - 0
src/main/java/com/tyson/util/OkHttpUtil.java

@@ -0,0 +1,57 @@
+package com.tyson.util;
+
+import javax.net.ssl.*;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+
+/**
+ * @author Vania
+ */
+public class OkHttpUtil {
+    /**
+     * X509TrustManager instance which ignored SSL certification
+     */
+    public static final X509TrustManager IGNORE_SSL_TRUST_MANAGER_X509 = new X509TrustManager() {
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType) {
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType) {
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return new X509Certificate[]{};
+        }
+    };
+
+    /**
+     * Get initialized SSLContext instance which ignored SSL certification
+     *
+     * @return
+     * @throws NoSuchAlgorithmException
+     * @throws KeyManagementException
+     */
+    public static SSLContext getIgnoreInitedSslContext() throws NoSuchAlgorithmException, KeyManagementException {
+        SSLContext sslContext = SSLContext.getInstance("SSL");
+        sslContext.init(null, new TrustManager[]{IGNORE_SSL_TRUST_MANAGER_X509}, new SecureRandom());
+        return sslContext;
+    }
+
+    /**
+     * Get HostnameVerifier which ignored SSL certification
+     *
+     * @return
+     */
+    public static HostnameVerifier getIgnoreSslHostnameVerifier() {
+        return new HostnameVerifier() {
+            @Override
+            public boolean verify(String arg0, SSLSession arg1) {
+                return true;
+            }
+        };
+    }
+}

+ 163 - 0
src/main/java/com/tyson/util/SFutil.java

@@ -0,0 +1,163 @@
+package com.tyson.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.tomcat.util.http.fileupload.FileUtils;
+import org.json.JSONObject;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.spec.AlgorithmParameterSpec;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+public class SFutil {
+
+    public static byte[] ivBytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+            0x00, 0x00, 0x00};
+    //解密密钥
+    private final static String SECRET = "bb4805929c01405d";
+
+    public static void main(String[] args) throws Exception {
+        String responseMsg = "{\n" +
+                "    \"companyLogo\": \"SF\",\n" +
+                "    \"content\": \"njdEklz2DvgAnu6GNrtzrxZrta+jg6Z9DptuedRafk2aJ8Lbo6FH7c8Z4ZcS8I7MTV1Q02GaBacX\\nOrT" +
+                "IfNesEsrVE1POLzPUXfnRznmVbXcPz0mknRfU1qtMSJBtBJdT3loY6Fnd30oatPmNaMey7G2x\\nO4Sh3V4EbeCt3GrBwEMQk/qwBA" +
+                "IhS56B4rquN2lX3fvJENJt/boklc1pz0JybTHgyvp1yTRIyqkR\\nMjfcfrTks1OF/WJ5Iuy/dYGe8HFooHyYS+5y+agVJWjIXleOZ" +
+                "gXUwm/WcLGTxsjJgiVdGDQhPsJU\\nwU86HOqapeJbGSFDw0Nzxzqu53rXVeqYxJ+UdsUGSiTL7+0kStTWmtknxoj/1XpeueUkytbN" +
+                "jgP9\\nickUKA6V/k/+PkVKoWbyKO4K7CGtljrAvOIwnWPwTsygnFRTsiEG7w+QzAQuMqIFwkSBSjKesv7d\\nLkizTOENT18CkcNi" +
+                "tSZJ2fOv0liqdU0gfGpFK3hxlKf5fr4Q5YKl0UfZdr3YEQl0QqW+pViRjezI\\ndS7Fyk4984DHab4L+se6HTUf1v+OTzQ47cnKPc" +
+                "SNpYjRRB8HSeI+xLgAI7k+oUU/1xgWXZlMO2Jh\\nMG96iRI92cXHjH0W67CvFYYA5oSct/wClQZBj02h5VCtslx160swgOMZj" +
+                "eGqgK4SekhZdCs0qdSm\\nmNHQue4dfQt0EtnWJ3rDyEw6+66UAsYftEYdVAWKt92yl2ATctelJvN060wwQutxx2EPjOLx0whx\\n" +
+                "i8rfktmzh3bUyf/VLCUPjBl1jiHIFCreAa8XA+rOo/6HcyWHKMwSpY7P54nDY7Ds4U7c0NOqoMtF\\ns+R9u81jQnAKsylj4iDm" +
+                "eMoMi63cBJ6pfsh3ztU2qa260NWiEa0pzS9P0QEjCmjBpWAHAW70gx7L\\n/uGAu+ln/Uf27cbE2c61stnRBLDfMohQ9wvrLSF8xHx" +
+                "nV9h5noCXkAd4U/EtqhSaGRWdAIEZ6Dxk\\nucyMxtpz13v9M6eZ9PMgJKNIyHUVe38QF1XNw8SpvuBVUj41QMA0cJWS6NwSKUVBEf" +
+                "y7Zmiv7z/7\\nbEIwGv9Z/zUt1TFzhxn1VXJLCwYLAYDOaPYpj8qhHCaTs59dfFBIvj6k3rUeqS3c4dGzCUJQNbW0\\nCtqBWClPz" +
+                "AW29C4/2w+f9s0V1Mx3HaJKROEy1UyfdtiAUTL3XF6u5aki7ZKKf4iRvuC5tooNkA1M\\ng222fEqxpwAFfGQS98yHL0unes39XGo/" +
+                "17ke8CB1aI2f4m6+NW3fe+ciSZe5zEvz/84U4M8IDW/s\\nR3OImJNWoLF5sadfnf5xSYV8zzz2MRn+/4bN0tjJkIIBvBEiVf7cxFD" +
+                "F1tLR3rXE1SiMQDso110A\\nn1PsLjwcl6uMqYkcso8cLOuk5ysfim2MRs1CYsqMPqKu6XT2w5dwKYY+9hKtTW4lxBbBsqgvPp/t\\n" +
+                "qn50WZu7bYVPsxErXYTN1sHi17bp8bsl/qjAieZkiqw4TyxJF30El7Lb+BqD8opqSHeUlaxm68/s\\nQ8fh3xpfWxDLxa1j0Vt+a" +
+                "w18dadX3burYtjqPZo3L5Ny+Ph94dl0h4eeOceFPz1jqBwA8G/o3FPR\\n3zKCWnXgjy7Xqcspdu0v0lBSQHF5KVqwifnSDJZQDRZ" +
+                "A2qB9+Mgx1IgMMqaZwY+Kmfqyw5D7CVLk\\nilN/ecMPA3Ng5TLd8UvzUbr46Vxaun7JkwyfE3VgRC63DaLUeq08qVApggUSVgjK" +
+                "vz9IwpaNW3yL\\nb/01vjOVWRUVzUoj4of0A7VBERPOxHhDSFNjhj/GRbPInlR4mT7m5tUQoGQblhAByACKMvl0Omgr\\nASRACmav" +
+                "UcaxWrw05bn+8wdqtLvZuB8d+1wmhULgSUaQNH1jGz04UUsZhN3FWtEVFnO5TlHShFco\\nbhQK38J9Cblb+Lt4sgjSMcjX66VPpa" +
+                "PYxpQIVtiWTxfnWdkbJcFRKby5MBPVnL9qOL5npM/qmCcO\\nQUQkpK7iL9upbASLRZ9Oeu4GAiKg2H9AxJHC/gZ27LDQq7+REXnq" +
+                "zUAeZ/O3HDMXOA3amupgLCiC\\noZr6lUoAm3HbcOgP7KvduuqgOuzy5YfpHnG4IkQ/l0gVtT/5/DOVMTZAc3ORmeaVKoskdKzgri" +
+                "Zi\\nVFCBqUbH7DZdCTvMReGW3ykXFopMyYbclorXlVQICxcZEhdQ9XIfm3w2Qr48AYjuNReX7mP4IebB\\nudaM8vs3UZSpQd2gF" +
+                "V+Gl2GullPhCgXV+m0Ntpxu5pR3bwWCsEYpnN2nG7QXdtE+j7OgYoHK/geZ\\nAdfVCcrPCY265NmBzU8jH1haJCQdr7jlxrgKdtp" +
+                "DroKTJGh7CuuTq4oWe5fhyGlVBtF8dYByjGSD\\nNUhDzjrJLy0qhT4C6Q74TWe6Pr/LHDZyOhNsvXBl0BBamH96Ndn1QO0GMP8JO" +
+                "stzQFaRbXQ9uC1m\\nhsJkx0KqYQ1bC0dhLcfHCohcniP4OY/kF+dz1rGRrwkaiP96xpSpKzfbitUCrQ66ZdoBHwJYZuXn\\njpvqQ" +
+                "HDwWuFgARUvJ79ig+end1vv7k6DqqmsB1ZxC12hsv/oN/E8HtdT7zi9WcAeCAq6A5iKxdM4\\naKhrVDo7qgWNZYxVPn6q5XnZLDz" +
+                "OgnUu8TXGr8DD/Jk+HfnoOODMOIvHcozxsyReb/npTekxmYqF\\nC/NE5pXNmDdCsVFojO33l4PIrpfiK1TcGMwZeSF4upKX0id42" +
+                "SNnK2BPGKBFEmUsIXu7vWXHpxBd\\n8lIVmPNZ0vb/eXP2Fcom3v39ALVdMY93jgQI1BsuFh7U4N8YBKWbfAgrtFj/anujArNJcSg" +
+                "biWUr\\n1CFJjmAanPPuXaWHfU/3fIqQCFDt/8X8S0Xbzvt4dBe0LqRC7ObFIqLa2esaXcJ34bNgs3MgvdpV\\n6duebo7PNjX6ra0" +
+                "LHYbDUrSo3XO9NMBprWbToa+uKoDHgzsAVT0zffJTJSU6bG5zytta22mMKAOG\\nFmxwuU1z11/cltUMAxYd4nljt3tGBLhGRrWmvY" +
+                "dlQGRnqdMyhChvaFpkZB68rrvOTT9HQ08Pf2UT\\nz+A0dpXwZLpfwV7PzFHZRN4czA4LeUIqQVh3byfU0r/ReC26UEL4KUBU0hm6Y" +
+                "mDvuRM72QOWM7HD\\nNyMywtWUbOIdoslcKqa97FTu+bgXo4VS9c+gyQLY1SizSlPvxePewaoqMjzYT6TTsSZW0dAiOMdf\\nSUehT" +
+                "wNPvRs/NZBGPBXHKLTWZtiHE4WCCV9ghYXdzXxyL3N2BSYa2AM16wGQsDb201nmRsDWPFD8\\ngW9ZBuEMIB80XqdmYeWNHA+tWtH8" +
+                "Le59WyBNolNbjXxIZCL7HGT3qKH1McUxHLJrhL4UWFbg2u4H\\nYBX+QbI5li7ugK+mTlXJZ/eW81PmSUFkaTVLM+BrWseGsbjmZBD" +
+                "PT8aBk9QAb1j1Wyka9yX6NZ20\\nQEeijYAUWU3KlsOsrfSPqyrVoO9deyc8sTPdtxUzbJCtxGcHKoNwEG04/WF1TrNa5eZrPoYW1F" +
+                "0Q\\ne9+U4BnPSn8Fe6M9KysLT5Xu0XTGhbYhuRGXJFlU1JbfYxywlUs4r0nznodZFrrhmWV7MzavKUGQ\\n+/i2nuQDbjdz3Fxz8Z" +
+                "05lH22WnYmiGEiK+fwb8Z7JINT6a5uEYGchpXJYQB6t/ucjPRnE+Emcyco\\nt4oLVP3jaSrebQgg7TIXL84Ib9we/YbT63u0LDZp95" +
+                "jnZkrmjBPSz9YhVuD/oRgznuVjm8L5VTkS\\nWCQZ0opBwYfaW/NVaZhg5cDVcv+4wRCLp4S3zmMerM02FaUtoxShK9VwQ6K4nq4al" +
+                "/1mgFRR4ktG\\nGyhT0WEhNbW08FWuet8=\",\n" +
+                "    \"waybillNo\": \"SF1011854328486\"\n" +
+                "}";
+        transferToImage(responseMsg);
+    }
+
+    @RequestMapping("is")
+    public String is(HttpServletRequest request) {
+        try {
+            String postString = CusutUtil.getPostString(request);
+            transferToImage( postString);
+            return postString;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return  "";
+        }
+
+    }
+
+    @RequestMapping("getFileName")
+    public   HashMap<String, Object>    getfileName(String waybillNo)
+    {
+        HashMap<String, Object> map = new HashMap<>();
+        List<String> fileNameList = new ArrayList<>();//文件名列表
+        List<String> folderNameList = new ArrayList<>();//文件夹名列表
+        File f = new File("/usr/SF");
+        if (!f.exists()) { //路径不存在
+            map.put("retType", "1");
+        }else{
+            boolean flag = f.isDirectory();
+            if(flag==false){ //路径为文件
+                map.put("retType", "2");
+                map.put("fileName", f.getName());
+            }else{ //路径为文件夹
+                map.put("retType", "3");
+                File fa[] = f.listFiles();
+                waybillNo = waybillNo==null ? "" : waybillNo;//若queryStr传入为null,则替换为空(indexOf匹配值不能为null)
+                for (int i = 0; i < fa.length; i++) {
+                    File fs = fa[i];
+                    if(fs.getName().indexOf(waybillNo)!=-1){
+                        if (fs.isDirectory()) {
+                            folderNameList.add(fs.getName());
+                        } else {
+                            fileNameList.add(fs.getName());
+                        }
+                    }
+                }
+                map.put("fileNameList", fileNameList);
+                map.put("folderNameList", folderNameList);
+            }
+        }
+        return map;
+    }
+
+
+    @RequestMapping("FileRemove")
+        public   void filedelete()   {
+            File directory = new File("/usr/SF");
+            try {
+                FileUtils.cleanDirectory(directory);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+
+
+    public static void transferToImage(String msg) throws Exception {
+        //json报文解析;
+        JSONObject s = new JSONObject(msg);
+        byte[] decode = Base64.decodeBase64(s.getString("content"));
+        decode = AES_Decode(decode, SECRET);
+        decode = Base64.decodeBase64(new String(decode, "utf-8"));
+
+        Files.write(Paths.get("/usr/SF/"+s.getString("waybillNo")+CusutUtil.getRandomString(8) +".png"), decode);
+    }
+
+    //解密
+    public static byte[] AES_Decode(byte[] textBytes, String key) throws Exception {
+        Cipher cipherDncrypt;
+        Cipher cipherEncrypt;
+        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+        SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+        cipherEncrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        cipherEncrypt.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
+        cipherDncrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        cipherDncrypt.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
+        return cipherDncrypt.doFinal(textBytes);
+    }
+
+}

+ 745 - 0
src/main/java/com/tyson/util/dingUtil.java

@@ -0,0 +1,745 @@
+package com.tyson.util;
+
+import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse;
+import com.aliyun.tea.*;
+import com.aliyun.teautil.*;
+import com.aliyun.teautil.models.*;
+import com.aliyun.dingtalkyida_1_0.*;
+import com.aliyun.dingtalkyida_1_0.models.*;
+import com.aliyun.teaopenapi.*;
+import com.aliyun.teaopenapi.models.*;
+import com.sun.xml.bind.v2.model.core.ID;
+import com.tyson.consts.dingConst;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.springframework.aop.scope.ScopedProxyUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+/*
+ * Decription:
+ * dingding util
+ * @author hzk
+ * @ClassName dingUtil
+ * @Date 2022/3/29 14:29
+ */
+@Component
+public class dingUtil {
+    @Autowired
+    private dingConst dingConst;
+
+    /**
+     * 使用 Token 初始化账号DingClient
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dingtalkoauth2_1_0.Client createDingClient() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkoauth2_1_0.Client(config);
+    }
+
+    /**
+     * 使用 Token 初始化账号YiDaClient
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dingtalkyida_1_0.Client createYiDaClient() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkyida_1_0.Client(config);
+    }
+
+    /***
+     * 获取在职人员50人的UserId
+     * ByPage
+     * @return
+     */
+    public String getEmployeeQueryonjob(int page) {
+        JSONObject object = new JSONObject();
+        object.put("status_list", "2,3,5,-1");
+        object.put("size", 50);
+        object.put("offset", page);
+        try {
+
+            return HttpUtil.post("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob?access_token=" + getAccessToken(), null, object.toString(), null);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return "";
+    }
+
+
+    /**
+     * 获取企业内部应用的accessToken
+     *
+     * @return
+     */
+    public String getAccessToken() throws Exception {
+        String token = "";
+        com.aliyun.dingtalkoauth2_1_0.Client client = dingUtil.createDingClient();
+        GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
+                .setAppKey(dingConst.getAppKey())
+                .setAppSecret(dingConst.getAppSecret());
+        try {
+            GetAccessTokenResponse accessToken = client.getAccessToken(getAccessTokenRequest);
+            //    System.out.println(accessToken.getBody().getExpireIn());
+            token = accessToken.getBody().getAccessToken();
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+
+        }
+        return token;
+    }
+
+    /***
+     * 解析附件-将宜搭附件下载至本地
+     * @param downloadUrl 附件下载地址 /ossFileHandle
+     * @param fileName 附件名称  xxx.jpg
+     * @param filePath 附件下载路径   C:/HIH3WEB_IMG_CACHE/
+     * @return
+     */
+    public String downloadFj(String downloadUrl, String fileName, String filePath) throws Exception {
+        String fileName_OR = filePath + System.currentTimeMillis() + "_" + fileName;
+        HttpUtil.downloadUsingNIO(getFjNotLoginUrl(dingConst.getUrl() + downloadUrl), fileName_OR);
+        return fileName_OR;
+    }
+
+    /***
+     * 解析附件-将宜搭附件批量下载至本地
+     * @param files 宜搭附件字段数组
+     * @param filePath 附件下载路径   C:/HIH3WEB_IMG_CACHE/
+     * @return 附件地址数组
+     */
+    public JSONArray downloadFjs(JSONArray files, String filePath) throws Exception {
+        JSONArray jsonArray = new JSONArray();
+        for (int i = 0; i < files.length(); i++) {
+            String downloadUrl = files.getJSONObject(i).getString("downloadUrl");
+            String name = files.getJSONObject(i).getString("name");
+            String s = downloadFj(downloadUrl, name, filePath);
+            jsonArray.put(s);
+        }
+        return jsonArray;
+    }
+
+    /**
+     * 获取附件免登地址
+     *
+     * @return
+     */
+    public String getFjNotLoginUrl(String Url) throws Exception {
+        if (!Url.contains(dingConst.getUrl())) {
+            Url = dingConst.getUrl() + Url;
+        }
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        GetOpenUrlHeaders getOpenUrlHeaders = new GetOpenUrlHeaders();
+        getOpenUrlHeaders.xAcsDingtalkAccessToken = getAccessToken();
+        GetOpenUrlRequest getOpenUrlRequest = new GetOpenUrlRequest()
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN")
+                .setFileUrl(Url)
+                .setTimeout(60000L);
+        try {
+            GetOpenUrlResponse openUrlWithOptions = client.getOpenUrlWithOptions(dingConst.getAppType(), getOpenUrlRequest, getOpenUrlHeaders, new RuntimeOptions());
+            return openUrlWithOptions.getBody().getResult();
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 查询表单实例数据
+     *
+     * @return
+     */
+    public String yiDaSearch(String FormUuid, JSONObject searchFieldJson) throws Exception {
+        String reluert = "";
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        SearchFormDatasHeaders searchFormDatasHeaders = new SearchFormDatasHeaders();
+        String accessToken = this.getAccessToken();
+        searchFormDatasHeaders.xAcsDingtalkAccessToken = accessToken;
+        SearchFormDatasRequest searchFormDatasRequest = new SearchFormDatasRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN")
+                .setFormUuid(FormUuid)
+                .setPageSize(100)
+                .setCurrentPage(1)
+                .setSearchFieldJson(searchFieldJson.toString());
+        try {
+            SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
+            reluert = new JSONArray(searchFormDatasResponse.getBody().getData()).toString();
+
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return reluert;
+    }
+
+
+    public long yiDaSearch2(String FormUuid, JSONObject searchFieldJson) throws Exception {
+        String reluert = "";
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        SearchFormDatasHeaders searchFormDatasHeaders = new SearchFormDatasHeaders();
+        String accessToken = this.getAccessToken();
+        searchFormDatasHeaders.xAcsDingtalkAccessToken = accessToken;
+        SearchFormDatasRequest searchFormDatasRequest = new SearchFormDatasRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN")
+                .setFormUuid(FormUuid)
+                .setPageSize(100)
+                .setCurrentPage(1)
+                .setSearchFieldJson(searchFieldJson.toString());
+        try {
+            SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
+            return searchFormDatasResponse.getBody().getTotalCount();
+
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return 0l;
+            }
+
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return 0l;
+            }
+        }
+        return 0l;
+    }
+
+    public String yiDaSearch(String FormUuid, JSONObject searchFieldJson, int page) throws Exception {
+        String reluert = "";
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        SearchFormDatasHeaders searchFormDatasHeaders = new SearchFormDatasHeaders();
+        String accessToken = this.getAccessToken();
+        searchFormDatasHeaders.xAcsDingtalkAccessToken = accessToken;
+        SearchFormDatasRequest searchFormDatasRequest = new SearchFormDatasRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN")
+                .setFormUuid(FormUuid)
+                .setPageSize(100)
+                .setCurrentPage(page)
+                .setSearchFieldJson(searchFieldJson.toString());
+        try {
+            SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
+            reluert = new JSONArray(searchFormDatasResponse.getBody().getData()).toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return reluert;
+    }
+
+    /**
+     * @return : String
+     * @Description : 获取时间段内数据
+     * @Author : Lizzy
+     * @Param : FormUuid
+     * @Param : modifiedFromTimeGMT
+     * @Param : modifiedToTimeGMT
+     * @Param : page
+     * @Date : 2024/7/29 18:56
+     */
+    public String yiDaSearch(String FormUuid, String modifiedFromTimeGMT, String modifiedToTimeGMT, int page) throws Exception {
+        String reluert = "";
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        SearchFormDatasHeaders searchFormDatasHeaders = new SearchFormDatasHeaders();
+        String accessToken = this.getAccessToken();
+        searchFormDatasHeaders.xAcsDingtalkAccessToken = accessToken;
+        SearchFormDatasRequest searchFormDatasRequest = new SearchFormDatasRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN")
+                .setFormUuid(FormUuid)
+                .setPageSize(100)
+                .setCurrentPage(page)
+                .setModifiedFromTimeGMT(modifiedFromTimeGMT)
+                .setModifiedToTimeGMT(modifiedToTimeGMT);
+        try {
+            SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
+            reluert = new JSONArray(searchFormDatasResponse.getBody().getData()).toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return reluert;
+    }
+
+    /**
+     * 获取多个表单实例ID
+     *
+     * @return
+     * @throws Exception
+     */
+    public String getYiDaIds(String fromUuid) throws Exception {
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        SearchFormDataIdListHeaders searchFormDataIdListHeaders = new SearchFormDataIdListHeaders();
+        searchFormDataIdListHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+        SearchFormDataIdListRequest searchFormDataIdListRequest = new SearchFormDataIdListRequest()
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId());
+        try {
+            SearchFormDataIdListResponse searchFormDataIdListResponse = client.searchFormDataIdListWithOptions(dingConst.getAppType(), fromUuid, searchFormDataIdListRequest, searchFormDataIdListHeaders, new RuntimeOptions());
+            Long totalCount = searchFormDataIdListResponse.getBody().getPageNumber();
+            //  System.out.println(totalCount);
+            return searchFormDataIdListResponse.getBody().getData().toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        }
+        return "";
+    }
+
+    /**
+     * 根据ID查询宜搭数据
+     *
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    public String getYidaById(String id) throws Exception {
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        GetFormDataByIDHeaders getFormDataByIDHeaders = new GetFormDataByIDHeaders();
+        getFormDataByIDHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+        GetFormDataByIDRequest getFormDataByIDRequest = new GetFormDataByIDRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN");
+        try {
+            GetFormDataByIDResponse formDataByIDWithOptions = client.getFormDataByIDWithOptions(id, getFormDataByIDRequest, getFormDataByIDHeaders, new RuntimeOptions());
+            return new JSONObject(formDataByIDWithOptions.getBody().getFormData()).put("userId", formDataByIDWithOptions.body.getOriginator().getUserId()).toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+
+            }
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+
+    public JSONArray innerTables(String id, String formuuid, String fieldId) throws Exception {
+        JSONArray jarr = new JSONArray();
+        int page = 1;
+        while (true) {
+            com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+            ListTableDataByFormInstanceIdTableIdHeaders listTableDataByFormInstanceIdTableIdHeaders = new ListTableDataByFormInstanceIdTableIdHeaders();
+            listTableDataByFormInstanceIdTableIdHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+            ListTableDataByFormInstanceIdTableIdRequest listTableDataByFormInstanceIdTableIdRequest = new ListTableDataByFormInstanceIdTableIdRequest()
+                    .setFormUuid(formuuid)
+                    .setTableFieldId(fieldId)
+                    .setPageNumber(page)
+                    .setPageSize(50)
+                    .setAppType(dingConst.getAppType())
+                    .setSystemToken(dingConst.getSystemToken())
+                    .setUserId(dingConst.getUserId());
+            try {
+                ListTableDataByFormInstanceIdTableIdResponse listTableDataByFormInstanceIdTableIdResponse = client.listTableDataByFormInstanceIdTableIdWithOptions(id, listTableDataByFormInstanceIdTableIdRequest, listTableDataByFormInstanceIdTableIdHeaders, new RuntimeOptions());
+
+
+                if (jarr.length() == 0) {
+                    jarr = new JSONArray(listTableDataByFormInstanceIdTableIdResponse.getBody().data);
+                } else {
+                    for (int i = 0; i < listTableDataByFormInstanceIdTableIdResponse.getBody().data.size(); i++) {
+                        jarr.put(listTableDataByFormInstanceIdTableIdResponse.getBody().data.get(i));
+                    }
+                }
+
+
+//                System.out.println(page);
+//                System.out.println(jarr.length());
+//                System.out.println(listTableDataByFormInstanceIdTableIdResponse.getBody().totalCount);
+
+                if (listTableDataByFormInstanceIdTableIdResponse.getBody().totalCount > jarr.length()) {
+                    page++;
+                    continue;
+                }
+
+
+                return jarr;
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    break;
+                }
+
+            } catch (Exception _err) {
+                TeaException err = new TeaException(_err.getMessage(), _err);
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    break;
+                }
+
+            }
+        }
+        return jarr;
+    }
+
+    /***
+     * 发起流程数据
+     * @param jsonObject
+     * @param userId 发起人
+     * @param FormUuid 表单编码
+     * @return
+     * @throws Exception
+     */
+    public String startInstance(JSONObject jsonObject, String userId, String FormUuid) throws Exception {
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        StartInstanceHeaders startInstanceHeaders = new StartInstanceHeaders();
+        startInstanceHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+        StartInstanceRequest startInstanceRequest = new StartInstanceRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(userId)
+                .setLanguage("zh_CN")
+                .setFormUuid(FormUuid)
+                .setFormDataJson(jsonObject.toString());
+        try {
+            StartInstanceResponse startInstanceResponse = client.startInstanceWithOptions(startInstanceRequest, startInstanceHeaders, new RuntimeOptions());
+            return new JSONObject(startInstanceResponse.getBody().toMap()).toString();
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+
+        }
+        return "";
+    }
+
+    /**
+     * 保存
+     *
+     * @param FormUuid
+     * @param jo
+     * @return
+     * @throws Exception
+     */
+    public String saveYiDa(String FormUuid, JSONObject jo, String userId) throws Exception {
+        if ("".equals(userId)) {
+            userId = dingConst.getUserId();
+        }
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        SaveFormDataHeaders saveFormDataHeaders = new SaveFormDataHeaders();
+        saveFormDataHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+        SaveFormDataRequest saveFormDataRequest = new SaveFormDataRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(userId)
+                .setLanguage("zh_CN")
+                .setFormUuid(FormUuid)
+                .setFormDataJson(jo.toString());
+        try {
+            SaveFormDataResponse saveFormDataResponse = client.saveFormDataWithOptions(saveFormDataRequest, saveFormDataHeaders, new RuntimeOptions());
+            return new JSONObject(saveFormDataResponse.getBody().toMap()).toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param formInstanceId
+     * @param jo
+     * @return
+     * @throws Exception
+     */
+    public String UpdateYiDa(String formInstanceId, JSONObject jo) throws Exception {
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        UpdateFormDataHeaders updateFormDataHeaders = new UpdateFormDataHeaders();
+        updateFormDataHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+        UpdateFormDataRequest updateFormDataRequest = new UpdateFormDataRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setLanguage("zh_CN")
+                .setFormInstanceId(formInstanceId)
+                .setUpdateFormDataJson(jo.toString());
+        try {
+            UpdateFormDataResponse updateFormDataResponse = client.updateFormDataWithOptions(updateFormDataRequest, updateFormDataHeaders, new RuntimeOptions());
+            return new JSONObject(updateFormDataResponse.getHeaders()).toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+
+    public String UpdateYiDa_String(String formInstanceId, String joStr) throws Exception {
+        com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+        UpdateFormDataHeaders updateFormDataHeaders = new UpdateFormDataHeaders();
+        updateFormDataHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+        UpdateFormDataRequest updateFormDataRequest = new UpdateFormDataRequest()
+                .setAppType(dingConst.getAppType())
+                .setSystemToken(dingConst.getSystemToken())
+                .setUserId(dingConst.getUserId())
+                .setUseLatestVersion(true)
+                .setLanguage("zh_CN")
+                .setFormInstanceId(formInstanceId)
+                .setUpdateFormDataJson(joStr);
+        try {
+            UpdateFormDataResponse updateFormDataResponse = client.updateFormDataWithOptions(updateFormDataRequest, updateFormDataHeaders, new RuntimeOptions());
+            return new JSONObject(updateFormDataResponse.getHeaders()).toString();
+        } catch (TeaException err) {
+            err.printStackTrace();
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        } catch (Exception _err) {
+            _err.printStackTrace();
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+    public String delete(String instanceid) {
+        try {
+            com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+            DeleteFormDataHeaders deleteFormDataHeaders = new DeleteFormDataHeaders();
+            deleteFormDataHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+            DeleteFormDataRequest deleteFormDataRequest = new DeleteFormDataRequest()
+                    .setAppType(dingConst.getAppType())
+                    .setSystemToken(dingConst.getSystemToken())
+                    .setUserId(dingConst.getUserId())
+                    .setLanguage("zh_CN")
+                    .setFormInstanceId(instanceid);
+
+            DeleteFormDataResponse deleteFormDataResponse = client.deleteFormDataWithOptions(deleteFormDataRequest, deleteFormDataHeaders, new RuntimeOptions());
+            return deleteFormDataResponse.toString();
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+
+    /**
+      * @Description : 获取实例id列表
+      * @Author : Lizzy
+      * @Param : null
+      * @return : null
+      * @Date : 2024/9/11 13:57
+      */
+    public String getInstanceIds(int pageNumber) {
+        try {
+            com.aliyun.dingtalkyida_1_0.Client client = dingUtil.createYiDaClient();
+            GetInstanceIdListHeaders getInstanceIdListHeaders = new GetInstanceIdListHeaders();
+            getInstanceIdListHeaders.xAcsDingtalkAccessToken = this.getAccessToken();
+            com.aliyun.dingtalkyida_1_0.models.GetInstanceIdListRequest getInstanceIdListRequest = new com.aliyun.dingtalkyida_1_0.models.GetInstanceIdListRequest()
+                    .setSystemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW")
+                    .setFormUuid("FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ")
+                    .setUserId("01021447385039757257")
+                    .setInstanceStatus("COMPLETED")
+                    .setCreateToTimeGMT("2024-09-09")
+                    .setAppType("APP_N9NPHVTQLPBPO8MR6WFG")
+                    .setPageNumber(pageNumber)
+                    .setPageSize(100);
+            GetInstanceIdListResponse instanceIdListWithOptions = client.getInstanceIdListWithOptions(getInstanceIdListRequest, getInstanceIdListHeaders, new RuntimeOptions());
+            return instanceIdListWithOptions.getBody().getData().toString();
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.out.println(err.message);
+                System.out.println(err.toString());
+                return err.toString();
+            }
+        }
+        return "";
+    }
+}
+

+ 84 - 0
src/main/java/com/tyson/util/sendEmail.java

@@ -0,0 +1,84 @@
+package com.tyson.util;
+
+import java.util.Date;
+import java.util.Properties;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+/**
+ * JavaMail 版本: 1.6.0
+ * JDK 版本: JDK 1.7 以上(必须)
+ */
+public class sendEmail {
+    //发件人的邮箱和密码(替换为自己的邮箱和密码)
+    //PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
+    //对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
+    public static String myEmailAccount = "zhekang.huang@hih3.com";
+    public static String myEmailPassword = "ZVbTvY7f1b3yF5py";
+
+    //发件人邮箱的 SMTP服务器地址,必须准确,不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
+    //网易163邮箱的 SMTP 服务器地址为: smtp.163.com
+    public static String myEmailSMTPHost = "smtp.hih3.com";
+
+
+    /***
+     * 发送邮件
+     * @param receiveMailAccount 收件人邮箱
+     * @param subject           邮件标题
+     * @param content           邮件内容
+     * @throws Exception
+     */
+    public static void sendmail(String receiveMailAccount,String subject,String content) throws Exception{
+        //1.创建参数配置, 用于连接邮件服务器的参数配置
+        Properties props = new Properties();                    //参数配置
+        props.setProperty("mail.transport.protocol", "smtp");   //使用的协议(JavaMail规范要求)
+        props.setProperty("mail.smtp.host", myEmailSMTPHost);   //发件人的邮箱的 SMTP 服务器地址
+        props.setProperty("mail.smtp.auth", "true");            //需要请求认证
+
+        //2.根据配置创建会话对象, 用于和邮件服务器交互
+        Session session = Session.getInstance(props);
+        //session.setDebug(true);                                 //设置为debug模式,可以查看详细的发送log
+        //3.创建一封邮件
+        MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount, subject, content);
+
+        //4.根据 Session获取邮件传输对象
+        Transport transport = session.getTransport();
+
+        //PS_03:仔细看log,认真看log,看懂log,错误原因都在log已说明。
+        transport.connect(myEmailAccount, myEmailPassword);
+        //6.发送邮件,发到所有的收件地址,message.getAllRecipients()获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
+        transport.sendMessage(message, message.getAllRecipients());
+        System.out.println("邮件发送成功");
+        // 7. 关闭连接
+        transport.close();
+    }
+
+    /**
+     * 创建一封只包含文本的简单邮件
+     *
+     * @param session     和服务器交互的会话
+     * @param sendMail    发件人邮箱
+     * @param receiveMail 收件人邮箱
+     * @return
+     * @throws Exception
+     */
+    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String subject, String content) throws Exception {
+        // 1.创建一封邮件
+        MimeMessage message = new MimeMessage(session);
+        // 2.From:发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
+        message.setFrom(new InternetAddress(sendMail, "中间件log", "UTF-8"));
+        // 3.To:收件人(可以增加多个收件人、抄送、密送)
+        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
+        // 4.Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
+        message.setSubject(subject, "UTF-8");
+        // 5.Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
+        message.setContent(content, "text/html;charset=UTF-8");
+        // 6.设置发件时间
+        message.setSentDate(new Date());
+        // 7.保存设置
+        message.saveChanges();
+        return message;
+    }
+}

+ 23 - 0
src/main/java/com/tyson/vo/DeductionVo.java

@@ -0,0 +1,23 @@
+package com.tyson.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @ClassName DeductionVo
+ * @Description
+ * @Author MZ
+ * @Date 2024/1/11 23:27
+ */
+@Data
+public class DeductionVo {
+
+    private String id;
+
+    private LocalDate date;
+
+    private BigDecimal money;
+
+}

+ 25 - 0
src/main/resources/application.yml

@@ -0,0 +1,25 @@
+ding:
+  agentId: '1782962089'
+  appKey: 'dingfnrpklgoaoynrbsw'
+  appSecret: '6FxZudtXjdYeHNQN7-Os_A-zXGF7slS7UX9d3alu9uIsK56w4gXiZN0yXPp67FDh'
+  appType: "APP_N9NPHVTQLPBPO8MR6WFG"
+  systemToken: "UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW"
+  userId: "0128190612251172008042"
+  url: "https://www.aliwork.com"
+  hanxingUrl: 'http://106.15.251.153:8095/stms_xocr/pxocr/'
+
+server:
+  port: 8020
+
+spring:
+  main:
+    allow-circular-references: true
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher
+
+#允许访问 接口开发文档
+swagger:
+#  enable: false
+  #开启
+  enable: true

+ 23 - 0
src/main/resources/log4j.properties

@@ -0,0 +1,23 @@
+#log4j.rootLogger = debug,stdout,D,E
+#
+#### ???????? ###
+#log4j.appender.stdout = org.apache.log4j.ConsoleAppender
+#log4j.appender.stdout.Target = System.out
+#log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
+#log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
+#
+#### ??DEBUG ????????=F://logs/error.log ###
+#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
+#log4j.appender.D.File = D:/var/log/log.log
+#log4j.appender.D.Append = true
+#log4j.appender.D.Threshold = DEBUG
+#log4j.appender.D.layout = org.apache.log4j.PatternLayout
+#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
+#
+#### ??ERROR ????????=F://logs/error.log ###
+#log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
+#log4j.appender.E.File =D:/var/log/error.log
+#log4j.appender.E.Append = true
+#log4j.appender.E.Threshold = ERROR
+#log4j.appender.E.layout = org.apache.log4j.PatternLayout
+#log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

+ 33 - 0
src/main/resources/logback.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <property name="CONSOLE_LOG_PATTERN"
+              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
+
+    <!--编码-->
+    <property name="ENCODING"
+              value="UTF-8" />
+
+    <!-- 输出到控制台 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss.SSS}) %highlight([%-5level]) %green(%logger) %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 输出到文件 -->
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/yida.log</file>
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/yida.%d{yyyy-MM-dd}.log</fileNamePattern>
+        </rollingPolicy>
+    </appender>
+    <!-- 设置日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="console" />
+        <appender-ref ref="file" />
+    </root>
+</configuration>

File diff suppressed because it is too large
+ 420 - 0
src/test/java/com/tyson/tysonapi/TysonapiApplicationTests.java


+ 5 - 0
src/test/java/com/tyson/tysonapi/test.java

@@ -0,0 +1,5 @@
+package com.tyson.tysonapi;
+
+
+public class test {
+}