Browse Source

合同审核项目,无权限版本,和60保持一致。

jessie 5 years ago
commit
3fb6d72c79
49 changed files with 2779 additions and 0 deletions
  1. 310 0
      mvnw
  2. 182 0
      mvnw.cmd
  3. 174 0
      pom.xml
  4. 19 0
      src/main/java/com/pavis/ai/app/crocr/CrOcrApplication.java
  5. 31 0
      src/main/java/com/pavis/ai/app/crocr/common/config/CorsFilterConfig.java
  6. 21 0
      src/main/java/com/pavis/ai/app/crocr/common/config/FeignConfig.java
  7. 21 0
      src/main/java/com/pavis/ai/app/crocr/common/config/MybatisPlusConfig.java
  8. 31 0
      src/main/java/com/pavis/ai/app/crocr/common/config/RabbitMqConfig.java
  9. 37 0
      src/main/java/com/pavis/ai/app/crocr/common/config/Swagger2Config.java
  10. 24 0
      src/main/java/com/pavis/ai/app/crocr/common/config/WebMvcConfig.java
  11. 20 0
      src/main/java/com/pavis/ai/app/crocr/common/config/constants/Constants.java
  12. 16 0
      src/main/java/com/pavis/ai/app/crocr/common/config/crConfig.java
  13. 18 0
      src/main/java/com/pavis/ai/app/crocr/common/config/properties/CommonProperties.java
  14. 16 0
      src/main/java/com/pavis/ai/app/crocr/common/config/properties/Dir.java
  15. 15 0
      src/main/java/com/pavis/ai/app/crocr/common/config/properties/Url.java
  16. 22 0
      src/main/java/com/pavis/ai/app/crocr/common/exception/AlertException.java
  17. 37 0
      src/main/java/com/pavis/ai/app/crocr/common/exception/BaseException.java
  18. 106 0
      src/main/java/com/pavis/ai/app/crocr/common/http/ErrorCode.java
  19. 155 0
      src/main/java/com/pavis/ai/app/crocr/common/http/ResultBody.java
  20. 38 0
      src/main/java/com/pavis/ai/app/crocr/common/utils/DateUtils.java
  21. 24 0
      src/main/java/com/pavis/ai/app/crocr/common/utils/IgnoreUtils.java
  22. 76 0
      src/main/java/com/pavis/ai/app/crocr/controller/Controller.java
  23. 242 0
      src/main/java/com/pavis/ai/app/crocr/controller/TestController.java
  24. 27 0
      src/main/java/com/pavis/ai/app/crocr/form/ResData.java
  25. 17 0
      src/main/java/com/pavis/ai/app/crocr/form/SendUrl.java
  26. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractAddressMapper.java
  27. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractAmountCheckMapper.java
  28. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractClassificationMapper.java
  29. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractEnterpriseMapper.java
  30. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractSubjectDateMapper.java
  31. 16 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractSubjectMobileMapper.java
  32. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/ContractSubjectNameMapper.java
  33. 15 0
      src/main/java/com/pavis/ai/app/crocr/mapper/UploadMapper.java
  34. 29 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractAddress.java
  35. 32 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractAmountCheck.java
  36. 28 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractClassification.java
  37. 31 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractEnterprise.java
  38. 29 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractSubjectDate.java
  39. 29 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractSubjectMobile.java
  40. 29 0
      src/main/java/com/pavis/ai/app/crocr/model/ContractSubjectName.java
  41. 26 0
      src/main/java/com/pavis/ai/app/crocr/model/Upload.java
  42. 25 0
      src/main/java/com/pavis/ai/app/crocr/service/InternalSendService.java
  43. 15 0
      src/main/java/com/pavis/ai/app/crocr/service/UploadService.java
  44. 596 0
      src/main/java/com/pavis/ai/app/crocr/service/impl/UploadServiceImpl.java
  45. 33 0
      src/main/resources/application-dev.yml
  46. 23 0
      src/main/resources/application-prod.yml
  47. 16 0
      src/main/resources/application.yml
  48. 22 0
      src/main/resources/error.properties
  49. 16 0
      src/test/java/com/pavis/ai/app/crocr/CrOcrApplicationTests.java

+ 310 - 0
mvnw

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

+ 182 - 0
mvnw.cmd

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

+ 174 - 0
pom.xml

@@ -0,0 +1,174 @@
+<?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.1.13.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.pavis.ai.app</groupId>
+    <artifactId>cr-ocr</artifactId>
+    <version>0.0.1</version>
+    <name>cr-ocr</name>
+    <description>合同审核项目 无权限版本。</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Greenwich.SR5</spring-cloud.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
+        </dependency>
+        <!-- 带权限使用 -->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.cloud</groupId>-->
+        <!--            <artifactId>spring-cloud-starter-oauth2</artifactId>-->
+        <!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </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.amqp</groupId>
+            <artifactId>spring-rabbit-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- 通用包 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-ui</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>27.0.1-jre</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.14</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>1.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 19 - 0
src/main/java/com/pavis/ai/app/crocr/CrOcrApplication.java

@@ -0,0 +1,19 @@
+package com.pavis.ai.app.crocr;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@MapperScan("com.pavis.ai.app.crocr.mapper")
+@EnableAsync
+@SpringBootApplication
+@EnableFeignClients
+public class CrOcrApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CrOcrApplication.class, args);
+    }
+
+}

+ 31 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/CorsFilterConfig.java

@@ -0,0 +1,31 @@
+package com.pavis.ai.app.crocr.common.config;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class CorsFilterConfig implements Filter {
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
+        httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+        httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
+        httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
+        httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
+        if ("OPTIONS".equalsIgnoreCase(httpServletRequest.getMethod())) {
+            httpServletResponse.setStatus(HttpServletResponse.SC_OK);
+        } else {
+            chain.doFilter(httpServletRequest, httpServletResponse);
+        }
+    }
+}

+ 21 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/FeignConfig.java

@@ -0,0 +1,21 @@
+package com.pavis.ai.app.crocr.common.config;
+
+import feign.codec.Encoder;
+import feign.form.spring.SpringFormEncoder;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FeignConfig {
+    @Autowired
+    private ObjectFactory<HttpMessageConverters> messageConverters;
+
+    @Bean
+    public Encoder feignFormEncoder() {
+        return new SpringFormEncoder(new SpringEncoder(messageConverters));
+    }
+}

+ 21 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/MybatisPlusConfig.java

@@ -0,0 +1,21 @@
+package com.pavis.ai.app.crocr.common.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@EnableTransactionManagement
+public class MybatisPlusConfig {
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // 设置请求的页面大于最大页后操作,true调回到首页,false 继续请求  默认false
+        paginationInterceptor.setOverflow(false);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        paginationInterceptor.setLimit(-1);
+        return paginationInterceptor;
+    }
+}

+ 31 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/RabbitMqConfig.java

@@ -0,0 +1,31 @@
+// package com.pavis.ai.app.crocr.common.config;
+//
+// import com.pavis.ai.app.crocr.common.config.constants.Constants;
+// import org.springframework.amqp.core.Binding;
+// import org.springframework.amqp.core.BindingBuilder;
+// import org.springframework.amqp.core.DirectExchange;
+// import org.springframework.amqp.core.Queue;
+// import org.springframework.context.annotation.Bean;
+// import org.springframework.context.annotation.Configuration;
+//
+// @Configuration
+// public class RabbitMqConfig {
+//
+//     @Bean
+//     public DirectExchange directExchange() {
+//         return new DirectExchange(Constants.EXCHANGE_NAME, true, false);
+//     }
+//
+//     @Bean
+//     public Queue fjsOpQueue() {
+//         return new Queue(Constants.QUEUE_OP_NAME, true);
+//     }
+//
+//     @Bean
+//     public Binding bindingOpQueue() {
+//         return BindingBuilder
+//                 .bind(fjsOpQueue())
+//                 .to(directExchange())
+//                 .with(Constants.ROUTING_OP_KEY);
+//     }
+// }

+ 37 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/Swagger2Config.java

@@ -0,0 +1,37 @@
+package com.pavis.ai.app.crocr.common.config;
+
+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.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class Swagger2Config {
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.pavis.ai.app.crocr.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("富士通合同识别平台")
+                .description("无权限版接口文档说明<生产环境>")
+                .contact(new Contact("管慧娟", "", "ghj@s-privacy.com"))
+                .version("1.0")
+                .build();
+    }
+}
+

+ 24 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/WebMvcConfig.java

@@ -0,0 +1,24 @@
+package com.pavis.ai.app.crocr.common.config;
+
+import com.pavis.ai.app.crocr.common.config.properties.CommonProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private CommonProperties commonProperties;
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // 对已上传的文件地址做映射访问
+        registry.addResourceHandler("/down/**").addResourceLocations("file:" + commonProperties.getDir().getDown());
+
+    }
+
+
+}

+ 20 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/constants/Constants.java

@@ -0,0 +1,20 @@
+package com.pavis.ai.app.crocr.common.config.constants;
+
+/**
+ * 通用常量
+ */
+public class Constants {
+
+    public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    public static final String DATE_FORMAT_1 = "yyyy-MM-dd";
+    public static final String DATE_FORMAT_2 = "yyyyMMdd";
+
+    public static final String NO_DATA_CODE = "10001";
+    public static final String NO_DATA_MES = "文件内容为空。";
+    public static final String TYPE_ERR_CODE = "10000";
+    public static final String TYPE_ERR_CODE_MES = "上传文件类型不符,请上传docx类型的文件后重试。";
+    public static final String CHANGE_PDF_ERR_CODE = "10002";
+    public static final String CHANGE_PDF_ERR_CODE_MES = "文件转换PDF错误。";
+    public static final String UPLOAD_ERR_CODE = "-1";
+    public static final String UPLOAD_ERR_CODE_MES = "文件上传失败。";
+}

+ 16 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/crConfig.java

@@ -0,0 +1,16 @@
+package com.pavis.ai.app.crocr.common.config;
+
+import com.pavis.ai.app.crocr.common.config.properties.CommonProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+import javax.sql.DataSource;
+
+
+@Configuration
+@EnableConfigurationProperties({CommonProperties.class})
+public class crConfig {
+}

+ 18 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/properties/CommonProperties.java

@@ -0,0 +1,18 @@
+package com.pavis.ai.app.crocr.common.config.properties;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@ConfigurationProperties(prefix = "cr.common")
+public class CommonProperties {
+    private Dir dir;
+    private Url url;
+}

+ 16 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/properties/Dir.java

@@ -0,0 +1,16 @@
+package com.pavis.ai.app.crocr.common.config.properties;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class Dir {
+    private String base;
+    private String upload;
+    private String down;
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/common/config/properties/Url.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.common.config.properties;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class Url {
+    private String base;
+    private String path;
+}

+ 22 - 0
src/main/java/com/pavis/ai/app/crocr/common/exception/AlertException.java

@@ -0,0 +1,22 @@
+package com.pavis.ai.app.crocr.common.exception;
+
+/**
+ * 消息提示异常
+ */
+public class AlertException extends BaseException {
+
+    public AlertException() {
+    }
+
+    public AlertException(String msg) {
+        super(msg);
+    }
+
+    public AlertException(int code, String msg) {
+        super(code, msg);
+    }
+
+    public AlertException(int code, String msg, Throwable cause) {
+        super(code, msg, cause);
+    }
+}

+ 37 - 0
src/main/java/com/pavis/ai/app/crocr/common/exception/BaseException.java

@@ -0,0 +1,37 @@
+package com.pavis.ai.app.crocr.common.exception;
+
+
+import com.pavis.ai.app.crocr.common.http.ErrorCode;
+
+/**
+ * 基础错误异常
+ */
+public class BaseException extends RuntimeException {
+
+    private int code = ErrorCode.ERROR.getCode();
+
+    public BaseException() {
+    }
+
+    public BaseException(String msg) {
+        super(msg);
+    }
+
+    public BaseException(int code, String msg) {
+        super(msg);
+        this.code = code;
+    }
+
+    public BaseException(int code, String msg, Throwable cause) {
+        super(msg, cause);
+        this.code = code;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+}

+ 106 - 0
src/main/java/com/pavis/ai/app/crocr/common/http/ErrorCode.java

@@ -0,0 +1,106 @@
+package com.pavis.ai.app.crocr.common.http;
+
+/**
+ * 自定义返回码
+ */
+
+public enum ErrorCode {
+
+    /**
+     * 成功
+     */
+    OK(0, "success"),
+    FAIL(1000, "fail"),
+    ALERT(1001, "alert"),
+
+    /**
+     * oauth2返回码
+     */
+    INVALID_TOKEN(2000, "invalid_token"),
+    INVALID_SCOPE(2001, "invalid_scope"),
+    INVALID_REQUEST(2002, "invalid_request"),
+    INVALID_CLIENT(2003, "invalid_client"),
+    INVALID_GRANT(2004, "invalid_grant"),
+    REDIRECT_URI_MISMATCH(2005, "redirect_uri_mismatch"),
+    UNAUTHORIZED_CLIENT(2006, "unauthorized_client"),
+    EXPIRED_TOKEN(2007, "expired_token"),
+    UNSUPPORTED_GRANT_TYPE(2008, "unsupported_grant_type"),
+    UNSUPPORTED_RESPONSE_TYPE(2009, "unsupported_response_type"),
+    UNAUTHORIZED(2012, "unauthorized"),
+    SIGNATURE_DENIED(2013, "signature_denied"),
+
+    ACCESS_DENIED(4030, "access_denied"),
+    ACCESS_DENIED_BLACK_LIMITED(4031, "access_denied_black_limited"),
+    ACCESS_DENIED_WHITE_LIMITED(4032, "access_denied_white_limited"),
+    ACCESS_DENIED_AUTHORITY_EXPIRED(4033, "access_denied_authority_expired"),
+    ACCESS_DENIED_UPDATING(4034, "access_denied_updating"),
+    ACCESS_DENIED_DISABLED(4035, "access_denied_disabled"),
+    ACCESS_DENIED_NOT_OPEN(4036, "access_denied_not_open"),
+
+    /**
+     * 账号错误
+     */
+    BAD_CREDENTIALS(3000, "bad_credentials"),
+    ACCOUNT_DISABLED(3001, "account_disabled"),
+    ACCOUNT_EXPIRED(3002, "account_expired"),
+    CREDENTIALS_EXPIRED(3003, "credentials_expired"),
+    ACCOUNT_LOCKED(3004, "account_locked"),
+    USERNAME_NOT_FOUND(3005, "username_not_found"),
+
+    /**
+     * 请求错误
+     */
+    BAD_REQUEST(4000, "bad_request"),
+    NOT_FOUND(4004, "not_found"),
+    METHOD_NOT_ALLOWED(4005, "method_not_allowed"),
+    MEDIA_TYPE_NOT_ACCEPTABLE(4006, "media_type_not_acceptable"),
+    TOO_MANY_REQUESTS(4029, "too_many_requests"),
+
+    /**
+     * 系统错误
+     */
+    ERROR(5000, "error"),
+    GATEWAY_TIMEOUT(5004, "gateway_timeout"),
+    SERVICE_UNAVAILABLE(5003, "service_unavailable");
+
+
+    private int code;
+    private String message;
+
+    ErrorCode() {
+    }
+
+    private ErrorCode(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public static ErrorCode getResultEnum(int code) {
+        for (ErrorCode type : ErrorCode.values()) {
+            if (type.getCode() == code) {
+                return type;
+            }
+        }
+        return ERROR;
+    }
+
+    public static ErrorCode getResultEnum(String message) {
+        for (ErrorCode type : ErrorCode.values()) {
+            if (type.getMessage().equals(message)) {
+                return type;
+            }
+        }
+        return ERROR;
+    }
+
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+
+}

+ 155 - 0
src/main/java/com/pavis/ai/app/crocr/common/http/ResultBody.java

@@ -0,0 +1,155 @@
+package com.pavis.ai.app.crocr.common.http;
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.google.common.collect.Maps;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Map;
+import java.util.ResourceBundle;
+
+@ApiModel(value = "响应结果")
+public class ResultBody {
+
+    /**
+     * 响应编码
+     */
+    @ApiModelProperty(value = "响应编码:0-请求处理成功")
+    private int code = 0;
+
+    /**
+     * 提示消息
+     */
+    @ApiModelProperty(value = "提示消息")
+    private String message;
+
+    /**
+     * 请求路径
+     */
+    @ApiModelProperty(value = "请求路径")
+    private String path;
+
+    /**
+     * 响应数据
+     */
+    @ApiModelProperty(value = "响应数据")
+    private Object data;
+
+    /**
+     * http状态码
+     */
+    private int httpStatus;
+
+    /**
+     * 附加数据
+     */
+    @ApiModelProperty(value = "附加数据")
+    private Map<String, Object> extra;
+
+    /**
+     * 响应时间
+     */
+    @ApiModelProperty(value = "响应时间")
+    private long timestamp = System.currentTimeMillis();
+
+    public ResultBody() {
+
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public Map<String, Object> getExtra() {
+        return extra;
+    }
+
+    public long getTimestamp() {
+        return timestamp;
+    }
+
+    @JSONField(serialize = false, deserialize = false)
+    @JsonIgnore
+    public int getHttpStatus() {
+        return httpStatus;
+    }
+
+    @JSONField(serialize = false, deserialize = false)
+    @JsonIgnore
+    public boolean isOk() {
+        return this.code == ErrorCode.OK.getCode();
+    }
+
+
+    public static ResultBody ok() {
+        return new ResultBody().code(ErrorCode.OK.getCode()).msg(ErrorCode.OK.getMessage());
+    }
+
+    public static ResultBody failed() {
+        return new ResultBody().code(ErrorCode.FAIL.getCode()).msg(ErrorCode.FAIL.getMessage());
+    }
+
+    public ResultBody code(int code) {
+        this.code = code;
+        return this;
+    }
+
+    public ResultBody msg(String message) {
+        this.message = i18n(ErrorCode.getResultEnum(this.code).getMessage(), message);
+        return this;
+    }
+
+    public ResultBody data(Object data) {
+        this.data = data;
+        return this;
+    }
+
+    public ResultBody path(String path) {
+        this.path = path;
+        return this;
+    }
+
+    public ResultBody httpStatus(int httpStatus) {
+        this.httpStatus = httpStatus;
+        return this;
+    }
+
+    public ResultBody put(String key, Object value) {
+        if (this.extra == null) {
+            this.extra = Maps.newHashMap();
+        }
+        this.extra.put(key, value);
+        return this;
+    }
+
+    /**
+     * 错误信息配置
+     */
+    @JSONField(serialize = false, deserialize = false)
+    @JsonIgnore
+    private static ResourceBundle resourceBundle = ResourceBundle.getBundle("error");
+
+    /**
+     * 提示信息国际化
+     */
+    @JSONField(serialize = false, deserialize = false)
+    @JsonIgnore
+    private static String i18n(String message, String defaultMessage) {
+        return resourceBundle.containsKey(message) ? resourceBundle.getString(message) : defaultMessage;
+    }
+
+}

+ 38 - 0
src/main/java/com/pavis/ai/app/crocr/common/utils/DateUtils.java

@@ -0,0 +1,38 @@
+package com.pavis.ai.app.crocr.common.utils;
+
+import com.pavis.ai.app.crocr.common.config.constants.Constants;
+import org.joda.time.DateTime;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+public class DateUtils {
+
+    public static String now() {
+        return DateTime.now().toString(Constants.DEFAULT_DATETIME_FORMAT);
+    }
+
+    /**
+     * 根据当天日期创建文件夹。
+     * @return
+     */
+    public static String createFilesByDate(){
+        LocalDate today = LocalDate.now();
+        LocalTime time = LocalTime.now();
+        LocalDateTime now = LocalDateTime.of(today, time);
+        return now.format(DateTimeFormatter.BASIC_ISO_DATE);
+    }
+
+    /**
+     * 获取当前时间并格式化。
+     * @return
+     */
+    public static String getCurrentTime(){
+        LocalDate today = LocalDate.now();
+        LocalTime time = LocalTime.now();
+        LocalDateTime now = LocalDateTime.of(today, time);
+        return now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    }
+}

+ 24 - 0
src/main/java/com/pavis/ai/app/crocr/common/utils/IgnoreUtils.java

@@ -0,0 +1,24 @@
+package com.pavis.ai.app.crocr.common.utils;
+
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
+
+import java.beans.PropertyDescriptor;
+import java.util.HashSet;
+import java.util.Set;
+
+public class IgnoreUtils {
+    public static String[] getNullPropertyNames(Object source) {
+        BeanWrapper src = new BeanWrapperImpl(source);
+        PropertyDescriptor[] pds = src.getPropertyDescriptors();
+        Set<String> emptyNames = new HashSet<>();
+        for (PropertyDescriptor pd : pds) {
+            Object srcValue = src.getPropertyValue(pd.getName());
+            if (srcValue == null){
+                emptyNames.add(pd.getName());
+            }
+        }
+        return emptyNames.toArray(new String[emptyNames.size()]);
+    }
+
+}

+ 76 - 0
src/main/java/com/pavis/ai/app/crocr/controller/Controller.java

@@ -0,0 +1,76 @@
+package com.pavis.ai.app.crocr.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.pavis.ai.app.crocr.common.config.constants.Constants;
+import com.pavis.ai.app.crocr.common.config.properties.CommonProperties;
+import com.pavis.ai.app.crocr.common.http.ResultBody;
+import com.pavis.ai.app.crocr.form.ResData;
+import com.pavis.ai.app.crocr.service.InternalSendService;
+import com.pavis.ai.app.crocr.service.UploadService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-17 13:49
+ * @desc Controller
+ **/
+@Slf4j
+@RestController
+@RequestMapping("/api")
+public class Controller {
+
+    @Autowired
+    private UploadService uploadService;
+
+    @Autowired
+    private CommonProperties commonProperties;
+    @Autowired
+    private InternalSendService internalSendService;
+
+    @ApiOperation("合同审核上传接口")
+    @PostMapping(value = "/cr/uplaod", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "合同文件,支持docx/doc", required = true, dataType = "file", paramType = "formData")
+    })
+    public ResultBody uplaod(@RequestPart("file") MultipartFile file) throws IOException {
+        if (file.isEmpty()){
+            return ResultBody.failed().path("/api/cr/uplaod").data(uploadService.upload(file)).msg("文件内容不能为空,请选择正确文件后重试。");
+        }else {
+            String suffix = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
+            System.err.println(suffix);
+            if(suffix.equals("docx") || suffix.equals("doc")){
+
+                ResData resData = uploadService.upload(file);
+                if (resData.getFileUrl().equals(Constants.NO_DATA_CODE)){
+                    return ResultBody.failed().path("/api/cr/uplaod").data(Constants.NO_DATA_MES);
+                }else if (resData.getFileUrl().equals(Constants.TYPE_ERR_CODE)){
+                    return ResultBody.failed().path("/api/cr/uplaod").data(Constants.TYPE_ERR_CODE_MES);
+                }else if (resData.getFileUrl().equals(Constants.CHANGE_PDF_ERR_CODE)){
+                    return ResultBody.failed().path("/api/cr/uplaod").data(Constants.CHANGE_PDF_ERR_CODE_MES);
+                }else if (resData.getFileUrl().equals(Constants.UPLOAD_ERR_CODE)){
+                    return ResultBody.failed().path("/api/cr/uplaod").data(Constants.UPLOAD_ERR_CODE_MES);
+                }else {
+                    return ResultBody.ok().path("/api/cr/uplaod").data(resData);
+                }
+            }else {
+                return ResultBody.failed().path("/api/cr/uplaod").data(Constants.TYPE_ERR_CODE_MES);
+            }
+        }
+    }
+}

+ 242 - 0
src/main/java/com/pavis/ai/app/crocr/controller/TestController.java

@@ -0,0 +1,242 @@
+package com.pavis.ai.app.crocr.controller;// package com.pavis.ai.app.cr.controller;
+//
+//
+// import com.alibaba.fastjson.JSON;
+// import com.alibaba.fastjson.JSONObject;
+// import com.pavis.ai.app.cr.common.config.properties.CommonProperties;
+// import com.pavis.ai.app.cr.common.http.ResultBody;
+// import com.pavis.ai.app.cr.common.utils.IgnoreUtils;
+// import com.pavis.ai.app.cr.service.SendService;
+// import feign.Feign;
+// import feign.Headers;
+// import io.swagger.annotations.ApiImplicitParam;
+// import io.swagger.annotations.ApiImplicitParams;
+// import io.swagger.annotations.ApiOperation;
+// import lombok.extern.slf4j.Slf4j;
+// import okhttp3.*;
+// import okhttp3.RequestBody;
+// import org.apache.commons.fileupload.disk.DiskFileItem;
+// import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+// import org.apache.commons.io.IOUtils;
+// import org.apache.commons.lang3.StringUtils;
+// import org.springframework.beans.BeanUtils;
+// import org.springframework.beans.factory.annotation.Autowired;
+// import org.springframework.http.MediaType;
+// import org.springframework.web.bind.annotation.*;
+// import org.springframework.web.multipart.MultipartFile;
+// import org.springframework.web.multipart.commons.CommonsMultipartFile;
+//
+// import javax.servlet.http.HttpServletRequest;
+// import java.io.*;
+// import java.util.HashMap;
+// import java.util.Map;
+// import java.util.concurrent.TimeUnit;
+//
+// import okhttp3.MultipartBody;
+// import okhttp3.OkHttpClient;
+// import okhttp3.Request;
+// import okhttp3.RequestBody;
+// import okhttp3.Response;
+//
+// /**
+//  * @author guanhuijuan
+//  * @create 2020-03-04 14:03
+//  * @desc
+//  **/
+// @Slf4j
+// @RestController
+// @RequestMapping("/api")
+// public class TestController {
+//
+//     // @Autowired
+//     // private SendService sendService;
+//
+//
+//     @Autowired
+//     private SendService sendService;
+//
+//     @Autowired
+//     private CommonProperties commonProperties;
+//
+//     @ApiOperation("测试文件接口")
+//     // @PostMapping("/cr/handle")
+//     @RequestMapping(value = "/cr/handle", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+//     public ResultBody handle(@RequestPart("file") MultipartFile file) throws IOException {
+//         System.err.println(file.getOriginalFilename());
+//         ocr(file);
+//
+//         // DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",
+//         //         MediaType.MULTIPART_FORM_DATA_VALUE, true, file.getOriginalFilename());
+//         // InputStream input = file.getInputStream();
+//         // OutputStream os = fileItem.getOutputStream();
+//         // IOUtils.copy(input, os);
+//         // MultipartFile multi = new CommonsMultipartFile(fileItem);
+//
+//         // Map<String,Object> map = new HashMap<>();
+//         // map.put("file",file);
+//         // String s = sendService.sendFile(map);
+//         // System.err.println(JSON.toJSONString(s));
+//
+//         // String str = sendService.send(file);
+//         // System.err.println(str);
+//
+//
+//         // File f = null;
+//         // String fileUrl = commonProperties.getDir().getUpload();
+//         // String parsedFilePath = fileUrl + file.getOriginalFilename();
+//         // System.err.println(parsedFilePath);
+//         // try {
+//         //     f = new File(parsedFilePath + file.getOriginalFilename());
+//         //     file.transferTo(f);
+//         // } catch (IllegalStateException e) {
+//         //     e.printStackTrace();
+//         // } catch (IOException e) {
+//         //     e.printStackTrace();
+//         // }
+//
+//
+//         // String str = "";
+//         return ResultBody.ok().data(null);
+//     }
+//
+//
+//     private String ocr(MultipartFile file) {
+//         File f = null;
+//         String fileUrl = commonProperties.getDir().getUpload();
+//         String parsedFilePath = fileUrl + file.getOriginalFilename();
+//         System.err.println(parsedFilePath);
+//         try {
+//             f = new File(parsedFilePath + file.getOriginalFilename());
+//             file.transferTo(f);
+//         } catch (IllegalStateException e) {
+//             e.printStackTrace();
+//         } catch (IOException e) {
+//             e.printStackTrace();
+//         }
+//         RequestBody fileBody = RequestBody.create(okhttp3.MediaType.parse("application/octet-stream"), f);
+//
+//         RequestBody requestBody = new MultipartBody.Builder()
+//                 .setType(MultipartBody.FORM)
+//                 // 添加上传的参数
+//                 .addFormDataPart("file", file.getOriginalFilename(), fileBody)
+//                 .build();
+//         Request request = new Request.Builder()
+//                 .post(requestBody)
+//                 .url("http://180.76.156.164:9955/handel")
+//                 .addHeader("Content-Type", "multipart/form-data")
+//                 .build();
+//         OkHttpClient client = new OkHttpClient.Builder()
+//                 .readTimeout(5, TimeUnit.MINUTES)
+//                 .writeTimeout(5, TimeUnit.MINUTES)
+//                 .connectTimeout(5, TimeUnit.MINUTES)
+//                 .build();
+//         try {
+//             Response response = client.newCall(request).execute();
+//             String res = response.body().string();
+//             System.err.println(res);
+//             return res;
+//         } catch (IOException e) {
+//             e.printStackTrace();
+//         }
+//         return "";
+//     }
+//
+//
+//     @ApiOperation("test-file接口")
+//     @PostMapping("/cr/file")
+//     public ResultBody file(@RequestPart("file") MultipartFile file) throws IOException {
+//         System.err.println(file.getOriginalFilename());
+//         return ResultBody.ok().data(file.getOriginalFilename());
+//     }
+//
+//     @ApiOperation("test-file接口")
+//     @PostMapping("/cr/files")
+//     public ResultBody files(@RequestPart("file") MultipartFile file) throws IOException {
+//         System.err.println(file.getOriginalFilename());
+//         return ResultBody.ok().data(file.getOriginalFilename());
+//     }
+//
+//     @ApiOperation("测试接口1")
+//     @GetMapping("/cr")
+//     public ResultBody get() {
+//         // ResData resData = new ResData();
+//         // resData.setReqId("01");
+//         // sendService.send(resData);
+//         return ResultBody.ok().data(System.currentTimeMillis());
+//     }
+//
+//     @ApiOperation("测试接口1")
+//     @PostMapping("/cr/test/{id}")
+//     @ApiImplicitParams({
+//             @ApiImplicitParam(name = "id", value = "唯一标识id", required = false, dataType = "string", paramType = "path")
+//     })
+//     public ResultBody testOne(@PathVariable("id") String id) {
+//         // ResData resData = new ResData();
+//         // resData.setReqId("01");
+//         // sendService.send(resData);
+//         return ResultBody.ok().data(id);
+//     }
+//
+//     @ApiOperation("测试接口2")
+//     @PostMapping("/cr/data")
+//     public ResultBody testTwo(@org.springframework.web.bind.annotation.RequestBody ResultBody resultBody) {
+//         System.err.println("tes<>" + JSON.toJSONString(resultBody));
+//         return ResultBody.ok().data(resultBody);
+//     }
+//
+//
+//     // @ApiOperation("测试文件接口")
+//     // @PostMapping(value = "/cr/test", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+//     // public ResultBody test(@RequestParam("file") MultipartFile file) throws IOException {
+//     //     JSONObject js = new JSONObject();
+//     //     js.put("file",file);
+//     //     startNlp(js.toJSONString());
+//     //     try {
+//     //         DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",
+//     //                 MediaType.MULTIPART_FORM_DATA_VALUE, true, file.getOriginalFilename());
+//     //         InputStream input = file.getInputStream();
+//     //         OutputStream os = fileItem.getOutputStream();
+//     //         IOUtils.copy(input, os);
+//     //         MultipartFile multi = new CommonsMultipartFile(fileItem);
+//     //         String str = sendService.send(multi);
+//     //
+//     //         return ResultBody.ok().data(str);
+//     //     } catch (Exception e) {
+//     //         e.getMessage();
+//     //     }
+//     //     return ResultBody.failed().data(null);
+//     //
+//     //     // String fileUrl = commonProperties.getDir().getUpload();
+//     //     // String parsedFilePath = fileUrl + file.getOriginalFilename();
+//     //     // try {
+//     //     //     File f = new File(parsedFilePath);
+//     //     //     file.transferTo(f);
+//     //     // } catch (IllegalStateException e) {
+//     //     //     e.printStackTrace();
+//     //     // } catch (IOException e) {
+//     //     //     e.printStackTrace();
+//     //     // }
+//     //     // String str = sendService.send(file);
+//     //     // System.err.println(str);
+//     //     // return ResultBody.ok().data(str);
+//     // }
+//
+//     private Response startNlp(String json) throws IOException {
+//         okhttp3.MediaType JSON = okhttp3.MediaType.parse("application/json; charset=utf-8");
+//         OkHttpClient client = new OkHttpClient.Builder()
+//                 .readTimeout(10, TimeUnit.MINUTES)
+//                 .writeTimeout(10, TimeUnit.MINUTES)
+//                 .connectTimeout(10, TimeUnit.MINUTES)
+//                 .build();
+//         okhttp3.RequestBody body = okhttp3.RequestBody.create(JSON, json);
+//         Request request = new Request.Builder()
+//                 .addHeader("Content-Type", "multipart/form-data")
+//                 .url("http://180.76.156.164:9955/handel")
+//                 .post(body)
+//                 // .get()
+//                 .build();
+//         Response response = client.newCall(request).execute();
+//         return response;
+//     }
+//
+// }

+ 27 - 0
src/main/java/com/pavis/ai/app/crocr/form/ResData.java

@@ -0,0 +1,27 @@
+package com.pavis.ai.app.crocr.form;
+
+import lombok.*;
+
+import java.io.Serializable;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 16:53
+ * @desc 返回信息
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ResData<T> implements Serializable {
+    private String fileUrl;
+    private T locations;
+    private T person;
+    private T times;
+    private T amount;
+    private T orgs_info;
+    private T phone_numbers;
+    private T classification;
+    private T disclaimer;
+}

+ 17 - 0
src/main/java/com/pavis/ai/app/crocr/form/SendUrl.java

@@ -0,0 +1,17 @@
+package com.pavis.ai.app.crocr.form;
+
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-21 15:38
+ * @desc SendUrl
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SendUrl {
+    private String fileUrl;
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractAddressMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractAddress;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractAddressMapper
+ **/
+@Component
+public interface ContractAddressMapper extends BaseMapper<ContractAddress> {
+    
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractAmountCheckMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractAmountCheck;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractAmountCheckMapper
+ **/
+@Component
+public interface ContractAmountCheckMapper extends BaseMapper<ContractAmountCheck> {
+    
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractClassificationMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractClassification;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractClassificationMapper
+ **/
+@Component
+public interface ContractClassificationMapper extends BaseMapper<ContractClassification> {
+    
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractEnterpriseMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractEnterprise;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractEnterpriseMapper
+ **/
+@Component
+public interface ContractEnterpriseMapper extends BaseMapper<ContractEnterprise> {
+    
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractSubjectDateMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractSubjectDate;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractSubjectDateMapper
+ **/
+@Component
+public interface ContractSubjectDateMapper extends BaseMapper<ContractSubjectDate> {
+    
+}

+ 16 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractSubjectMobileMapper.java

@@ -0,0 +1,16 @@
+package com.pavis.ai.app.crocr.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractSubjectMobile;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractSubjectMobileMapper
+ **/
+@Component
+public interface ContractSubjectMobileMapper extends BaseMapper<ContractSubjectMobile> {
+    
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/ContractSubjectNameMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.ContractSubjectName;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc ContractSubjectNameMapper
+ **/
+@Component
+public interface ContractSubjectNameMapper extends BaseMapper<ContractSubjectName> {
+    
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/mapper/UploadMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.crocr.model.Upload;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-09 12:37
+ * @desc UploadMapper
+ **/
+@Component
+public interface UploadMapper extends BaseMapper<Upload> {
+    
+}

+ 29 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractAddress.java

@@ -0,0 +1,29 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractAddress
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractAddress {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String locationParagraph;
+    private String locationPosition;
+    private String address;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 32 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractAmountCheck.java

@@ -0,0 +1,32 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractAmountCheck
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractAmountCheck {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String locationParagraph;
+    private String locationPosition;
+    private String capital;
+    private String lower;
+    private String unit;
+    private String result;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 28 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractClassification.java

@@ -0,0 +1,28 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractClassification
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractClassification {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String contractClassification;
+    private String disclaimer;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 31 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractEnterprise.java

@@ -0,0 +1,31 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractEnterprise
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractEnterprise {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String agency;
+    private String locationParagraph;
+    private String locationPosition;
+    private String enterpriseName;
+    private String result;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 29 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractSubjectDate.java

@@ -0,0 +1,29 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractSubjectDate
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractSubjectDate {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String dateLocationParagraph;
+    private String dateLocationPosition;
+    private String subjectDate;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 29 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractSubjectMobile.java

@@ -0,0 +1,29 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractSubjectMobile
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractSubjectMobile {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String mobileLocationParagraph;
+    private String mobileLocationPosition;
+    private String subjectMobile;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 29 - 0
src/main/java/com/pavis/ai/app/crocr/model/ContractSubjectName.java

@@ -0,0 +1,29 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc ContractSubjectName
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ContractSubjectName {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String cId;
+    private String nameLocationParagraph;
+    private String nameLocationPosition;
+    private String subjectName;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 26 - 0
src/main/java/com/pavis/ai/app/crocr/model/Upload.java

@@ -0,0 +1,26 @@
+package com.pavis.ai.app.crocr.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-04 15:12
+ * @desc Upload
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class Upload {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    private String fileName;
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 25 - 0
src/main/java/com/pavis/ai/app/crocr/service/InternalSendService.java

@@ -0,0 +1,25 @@
+package com.pavis.ai.app.crocr.service;
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.Map;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-04-17 12:30
+ * @desc 内部算法调用。
+ **/
+// 测试
+// @FeignClient(value = "internalSendService",url = "http://192.168.1.60:9955")
+// 线上
+@FeignClient(value = "internalSendService",url = "http://alg:9955")
+public interface InternalSendService {
+
+    @PostMapping(value = "/handel",
+            consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    String cr(Map<String, ?> params);
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/crocr/service/UploadService.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.crocr.service;
+
+import com.pavis.ai.app.crocr.form.ResData;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-16 15:41
+ * @desc UploadService
+ **/
+public interface UploadService {
+
+    ResData upload(MultipartFile file);
+
+}

+ 596 - 0
src/main/java/com/pavis/ai/app/crocr/service/impl/UploadServiceImpl.java

@@ -0,0 +1,596 @@
+package com.pavis.ai.app.crocr.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import com.pavis.ai.app.crocr.common.config.properties.CommonProperties;
+import com.pavis.ai.app.crocr.common.utils.DateUtils;
+import com.pavis.ai.app.crocr.form.ResData;
+import com.pavis.ai.app.crocr.mapper.*;
+import com.pavis.ai.app.crocr.model.*;
+import com.pavis.ai.app.crocr.service.InternalSendService;
+import com.pavis.ai.app.crocr.service.UploadService;
+import lombok.extern.slf4j.Slf4j;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-03-16 15:42
+ * @desc UploadServiceImpl
+ **/
+@Slf4j
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class UploadServiceImpl implements UploadService {
+
+    @Autowired
+    private CommonProperties commonProperties;
+
+    @Autowired
+    private UploadMapper uploadMapper;
+
+    @Autowired
+    private ContractAddressMapper contractAddressMapper;
+
+    @Autowired
+    private ContractAmountCheckMapper contractAmountCheckMapper;
+
+    @Autowired
+    private ContractClassificationMapper contractClassificationMapper;
+
+    @Autowired
+    private ContractEnterpriseMapper contractEnterpriseMapper;
+
+    @Autowired
+    private ContractSubjectNameMapper contractSubjectNameMapper;
+
+    @Autowired
+    private ContractSubjectMobileMapper contractSubjectMobileMapper;
+
+    @Autowired
+    private ContractSubjectDateMapper contractSubjectDateMapper;
+
+    @Autowired
+    private InternalSendService internalSendService;
+
+    @Override
+    public ResData upload(MultipartFile file) {
+        String fileUrl = commonProperties.getDir().getUpload();
+        String uuid = UUID.randomUUID().toString();
+        String suffix = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
+        String pathName = uuid + "." + suffix;
+        String parsedFilePath = fileUrl + pathName;
+        File f = new File(parsedFilePath);
+        try {
+            file.transferTo(f);
+        } catch (IllegalStateException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        // 上传文件入库
+        int upload = save(file);
+        if (upload > 0) {
+            // todo 调用算法,获取解析结果。
+            Map<String, Object> ocrMap = new HashMap<>();
+            ocrMap.put("file", new File(parsedFilePath));
+            // String resStr = JSON.toJSONString(JSON.parseObject(sendService.ocr(ocrMap)));
+            String resStr = internalSendService.cr(ocrMap);
+
+            // okhttp远程发送文件,formdata形式
+            // String resStr = ocrByFormData(f,file.getOriginalFilename());
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("code","-1");
+            String logRes = resStr.contains("<!DOCTYPE HTML PUBLIC") ? jsonObject.toJSONString() :
+                    JSON.toJSONString(JSON.parseObject(resStr));
+            log.info("resStr>" + logRes);
+
+            // 测试用
+            // int rd = Math.random() > 0.5 ? 1 : 0;
+            // String resStr = "";
+            // if (rd == 0){
+            //     resStr = OcrUtils.getStrEmptyFinal();
+            // }else {
+            //     resStr = OcrUtils.getStrFinal();
+            // }
+            // 将解析结果入库,判断是否有结果。
+            // return parseRes(JSON.toJSONString(resStr), String.valueOf(upload), uuid + ".pdf");
+            return parseRes(logRes, String.valueOf(upload), uuid + ".pdf");
+            // return parseRes(resStr2, upload, "广告公司合同范本" + ".pdf");
+        }
+        return new ResData();
+    }
+
+    /**
+     * 文件上传入库。
+     *
+     * @param file
+     * @return
+     */
+    public int save(MultipartFile file) {
+        Upload upload = Upload.builder()
+                .fileName(file.getOriginalFilename())
+                .operator("")
+                .operatorId("")
+                .operateIp("")
+                .operateTime(DateUtils.now())
+                .remarks("")
+                .build();
+        ;
+        return uploadMapper.insert(upload);
+    }
+
+    /**
+     * 解析返回数据,便于前端作展示。
+     * @param resStr
+     * @param upload
+     * @param fileName
+     * @return
+     */
+    public ResData parseRes(String resStr, String upload, String fileName) {
+        JSONObject strJson = JSONObject.parseObject(resStr);
+        String code = strJson.containsKey("code") ? strJson.get("code").toString() : "-1";
+        if (code.equals("1")) {
+            // 解析成功
+            JSONObject dataJson = JSONObject.parseObject(strJson.get("data").toString());
+
+            // 地址解析
+            JSONArray addressJa = JSONArray.parseArray(dataJson.get("locations").toString());
+            List<ContractAddress> contractAddresss = parseAddress(addressJa, upload);
+            // 合同主体解析
+            JSONArray subjectPersonJa = JSONArray.parseArray(dataJson.get("person").toString());
+            List<ContractSubjectName> contractSubjectNames = parseSubjectName(subjectPersonJa, upload);
+            JSONArray subjectTimesJa = JSONArray.parseArray(dataJson.get("times").toString());
+            List<ContractSubjectDate> contractSubjectDates = parseSubjectDate(subjectTimesJa, upload);
+            JSONArray subjectPhoneJa = JSONArray.parseArray(dataJson.get("phone_numbers").toString());
+            List<ContractSubjectMobile> contractSubjectMobiles = parseSubjectMobile(subjectPhoneJa, upload);
+
+            // 金额核验解析
+            JSONArray amountCheckJa = JSONArray.parseArray(dataJson.get("amount").toString());
+            List<ContractAmountCheck> contractAmountChecks = parseAmountCheck(amountCheckJa, upload);
+
+            // 企业名称解析
+            JSONArray enterpriseJa = JSONArray.parseArray(dataJson.get("orgs_info").toString());
+            List<ContractEnterprise> contractEnterprises = parseEnterprise(enterpriseJa, upload);
+
+            // 合同分类、免责声明解析
+            List<ContractClassification> contractClassifications = parseClassification(dataJson, upload);
+
+            // 返回结果封装。
+            ResData  resData = ResData.builder()
+                    .fileUrl(code.equals("1") ? strJson.get("pdffilename").toString() : code)
+                    // .fileUrl(commonProperties.getUrl().getPath() + fileName)
+                    .locations(contractAddresss.size() > 0 ? resCa(contractAddresss) : getEmpty())
+                    .person(contractSubjectNames.size() > 0 ? resCsn(contractSubjectNames) : getEmpty())
+                    .times(contractSubjectDates.size() > 0 ? resCsd(contractSubjectDates) : getEmpty())
+                    .amount(contractAmountChecks.size() > 0 ? resCac(contractAmountChecks) : getEmpty())
+                    .orgs_info(contractEnterprises.size() > 0 ? resCe(contractEnterprises) : getEmpty())
+                    .phone_numbers(contractSubjectMobiles.size() > 0 ? resCsm(contractSubjectMobiles) : getEmpty())
+                    .classification(contractClassifications.size() > 0 ? contractClassifications.get(0).getContractClassification() : "无")
+                    .disclaimer(contractClassifications.size() > 0 ? resCcd(contractClassifications) : getEmpty())
+                    .build();
+            log.info("res>" + JSON.toJSONString(resData));
+            return resData;
+        } else {
+            // 解析失败。
+            ResData resData = ResData.builder()
+                    .fileUrl(strJson.get("code").toString())
+                    .build();
+            return resData;
+        }
+    }
+
+
+    public List<ContractClassification> parseClassification(JSONObject dataJson, String upload) {
+        String classification = dataJson.get("classification").toString();
+        List<ContractClassification> contractClassifications = new ArrayList<>();
+        JSONArray classificationJa = JSONArray.parseArray(dataJson.get("disclaimer").toString());
+        if (classificationJa.size() >= 1) {
+            ContractClassification contractClassification;
+            for (int i = 0; i < classificationJa.size(); i++) {
+                if (!classificationJa.get(i).toString().equals("") || !classificationJa.get(i).toString().equals("[]")) {
+                    contractClassification = ContractClassification.builder()
+                            .cId(upload)
+                            .contractClassification(classification)
+                            .disclaimer(classificationJa.get(i).toString())
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractClassificationMapper.insert(contractClassification);
+                    contractClassifications.add(contractClassification);
+                } else {
+                    contractClassification = ContractClassification.builder()
+                            .cId(upload)
+                            .contractClassification("无")
+                            .disclaimer("无")
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractClassificationMapper.insert(contractClassification);
+                    contractClassifications.add(contractClassification);
+                }
+            }
+        }
+        return contractClassifications;
+    }
+
+    public List<ContractAddress> parseAddress(JSONArray addressJa, String upload) {
+        List<ContractAddress> contractAddresss = new ArrayList<>();
+        if (addressJa.size() > 0) {
+            ContractAddress contractAddress;
+            for (int i = 0; i < addressJa.size(); i++) {
+                if (!addressJa.get(i).toString().equals("") || !addressJa.get(i).toString().equals("[]")) {
+                    JSONArray address = JSONArray.parseArray(addressJa.get(i).toString());
+                    String[] arr = StringUtils.remove(StringUtils.remove(address.toString(), "["), "]").split(",");
+                    contractAddress = ContractAddress.builder()
+                            .cId(upload)
+                            .locationParagraph(StringUtils.remove(arr[0], "\""))
+                            .locationPosition(StringUtils.remove(arr[1], "\""))
+                            .address(StringUtils.remove(arr[2], "\""))
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractAddressMapper.insert(contractAddress);
+                    contractAddresss.add(contractAddress);
+                } else {
+                    contractAddresss.add(new ContractAddress());
+                }
+            }
+        } else {
+            ContractAddress contractAddress = ContractAddress.builder()
+                    .cId(upload)
+                    .locationParagraph("无")
+                    .locationPosition("无")
+                    .address("无")
+                    .operator("")
+                    .operatorId("")
+                    .operateIp("")
+                    .operateTime(DateUtils.now())
+                    .remarks("")
+                    .build();
+            contractAddressMapper.insert(contractAddress);
+        }
+        return contractAddresss;
+    }
+
+    public List<ContractSubjectName> parseSubjectName(JSONArray subjectPersonJa, String upload) {
+        List<ContractSubjectName> contractSubjectNames = new ArrayList<>();
+        if (subjectPersonJa.size() > 0) {
+            ContractSubjectName contractSubjectName;
+            for (int i = 0; i < subjectPersonJa.size(); i++) {
+                if (!subjectPersonJa.get(i).toString().equals("") || !subjectPersonJa.get(i).toString().equals("[]")) {
+                    JSONArray address = JSONArray.parseArray(subjectPersonJa.get(i).toString());
+                    String[] arr = StringUtils.remove(StringUtils.remove(address.toString(), "["), "]").split(",");
+                    contractSubjectName = ContractSubjectName.builder()
+                            .cId(upload)
+                            .nameLocationParagraph(StringUtils.remove(arr[0], "\""))
+                            .nameLocationPosition(StringUtils.remove(arr[1], "\""))
+                            .subjectName(StringUtils.remove(arr[2], "\""))
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractSubjectNameMapper.insert(contractSubjectName);
+                    contractSubjectNames.add(contractSubjectName);
+                } else {
+
+                    contractSubjectNames.add(new ContractSubjectName());
+                }
+
+            }
+        } else {
+            ContractSubjectName contractSubjectName = ContractSubjectName.builder()
+                    .cId(upload)
+                    .nameLocationParagraph("无")
+                    .nameLocationPosition("无")
+                    .subjectName("无")
+                    .operator("")
+                    .operatorId("")
+                    .operateIp("")
+                    .operateTime(DateUtils.now())
+                    .remarks("")
+                    .build();
+            contractSubjectNameMapper.insert(contractSubjectName);
+        }
+        return contractSubjectNames;
+    }
+
+    public List<ContractSubjectDate> parseSubjectDate(JSONArray subjectDateJa, String upload) {
+        List<ContractSubjectDate> contractSubjectDates = new ArrayList<>();
+        if (subjectDateJa.size() > 0) {
+            ContractSubjectDate contractSubjectDate;
+            for (int i = 0; i < subjectDateJa.size(); i++) {
+                if (!subjectDateJa.get(i).toString().equals("") || !subjectDateJa.get(i).toString().equals("[]")) {
+                    JSONArray address = JSONArray.parseArray(subjectDateJa.get(i).toString());
+                    String[] arr = StringUtils.remove(StringUtils.remove(address.toString(), "["), "]").split(",");
+                    contractSubjectDate = ContractSubjectDate.builder()
+                            .cId(upload)
+                            .dateLocationParagraph(StringUtils.remove(arr[0], "\""))
+                            .dateLocationPosition(StringUtils.remove(arr[1], "\""))
+                            .subjectDate(StringUtils.remove(arr[2], "\""))
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractSubjectDateMapper.insert(contractSubjectDate);
+                    contractSubjectDates.add(contractSubjectDate);
+                } else {
+                    contractSubjectDates.add(new ContractSubjectDate());
+                }
+            }
+        } else {
+            ContractSubjectDate contractSubjectDate = ContractSubjectDate.builder()
+                    .cId(upload)
+                    .dateLocationParagraph("无")
+                    .dateLocationPosition("无")
+                    .subjectDate("无")
+                    .operator("")
+                    .operatorId("")
+                    .operateIp("")
+                    .operateTime(DateUtils.now())
+                    .remarks("")
+                    .build();
+            contractSubjectDateMapper.insert(contractSubjectDate);
+        }
+        return contractSubjectDates;
+    }
+
+    public List<ContractSubjectMobile> parseSubjectMobile(JSONArray subjectMobileJa, String upload) {
+        List<ContractSubjectMobile> contractSubjectMobiles = new ArrayList<>();
+        if (subjectMobileJa.size() > 0) {
+            ContractSubjectMobile contractSubjectMobile;
+            for (int i = 0; i < subjectMobileJa.size(); i++) {
+                if (!subjectMobileJa.get(i).toString().equals("") || !subjectMobileJa.get(i).toString().equals("[]")) {
+                    JSONArray address = JSONArray.parseArray(subjectMobileJa.get(i).toString());
+                    String[] arr = StringUtils.remove(StringUtils.remove(address.toString(), "["), "]").split(",");
+                    contractSubjectMobile = ContractSubjectMobile.builder()
+                            .cId(upload)
+                            .mobileLocationParagraph(StringUtils.remove(arr[0], "\""))
+                            .mobileLocationPosition(StringUtils.remove(arr[1], "\""))
+                            .subjectMobile(StringUtils.remove(arr[2], "\""))
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractSubjectMobileMapper.insert(contractSubjectMobile);
+                    contractSubjectMobiles.add(contractSubjectMobile);
+                } else {
+                    contractSubjectMobiles.add(new ContractSubjectMobile());
+                }
+
+            }
+        } else {
+            ContractSubjectMobile contractSubjectMobile = ContractSubjectMobile.builder()
+                    .cId(upload)
+                    .mobileLocationParagraph("无")
+                    .mobileLocationPosition("无")
+                    .subjectMobile("无")
+                    .operator("")
+                    .operatorId("")
+                    .operateIp("")
+                    .operateTime(DateUtils.now())
+                    .remarks("")
+                    .build();
+            contractSubjectMobileMapper.insert(contractSubjectMobile);
+        }
+        return contractSubjectMobiles;
+    }
+
+    public List<ContractAmountCheck> parseAmountCheck(JSONArray amountCheckJa, String upload) {
+        List<ContractAmountCheck> contractAmountChecks = new ArrayList<>();
+        if (amountCheckJa.size() > 0) {
+
+            ContractAmountCheck contractAmountCheck;
+            for (int i = 0; i < amountCheckJa.size(); i++) {
+                if (!amountCheckJa.get(i).toString().equals("") || !amountCheckJa.get(i).toString().equals("[]")) {
+                    JSONArray address = JSONArray.parseArray(amountCheckJa.get(i).toString());
+                    String[] arr = StringUtils.remove(StringUtils.remove(address.toString(), "["), "]").split(",");
+                    contractAmountCheck = ContractAmountCheck.builder()
+                            .cId(upload)
+                            .locationParagraph(StringUtils.remove(arr[0], "\""))
+                            .locationPosition(StringUtils.remove(arr[1], "\""))
+                            .capital(StringUtils.remove(arr[2], "\""))
+                            .lower(StringUtils.remove(arr[3], "\""))
+                            .unit(StringUtils.remove(arr[4], "\""))
+                            .result(StringUtils.remove(arr[5], "\""))
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractAmountCheckMapper.insert(contractAmountCheck);
+                    contractAmountChecks.add(contractAmountCheck);
+                } else {
+                    contractAmountChecks.add(new ContractAmountCheck());
+                }
+
+            }
+        } else {
+            ContractAmountCheck contractAmountCheck = ContractAmountCheck.builder()
+                    .cId(upload)
+                    .locationParagraph("无")
+                    .locationPosition("无")
+                    .capital("无")
+                    .lower("无")
+                    .unit("无")
+                    .result("无")
+                    .operatorId("")
+                    .operateIp("")
+                    .operateTime(DateUtils.now())
+                    .remarks("")
+                    .build();
+            contractAmountCheckMapper.insert(contractAmountCheck);
+        }
+        return contractAmountChecks;
+    }
+
+    public List<ContractEnterprise> parseEnterprise(JSONArray enterpriseJa, String upload) {
+        List<ContractEnterprise> contractEnterprises = new ArrayList<>();
+        if (enterpriseJa.size() > 0) {
+
+            ContractEnterprise contractEnterprise;
+            for (int i = 0; i < enterpriseJa.size(); i++) {
+                if (!enterpriseJa.get(i).toString().equals("") || !enterpriseJa.get(i).toString().equals("[]")) {
+                    JSONArray address = JSONArray.parseArray(enterpriseJa.get(i).toString());
+                    String[] arr = StringUtils.remove(StringUtils.remove(address.toString(), "["), "]").split(",");
+                    contractEnterprise = ContractEnterprise.builder()
+                            .cId(upload)
+                            .agency(StringUtils.remove(arr[0], "\""))
+                            .locationParagraph(StringUtils.remove(arr[1], "\""))
+                            .locationPosition(StringUtils.remove(arr[2], "\""))
+                            .enterpriseName(StringUtils.remove(arr[3], "\""))
+                            .result(StringUtils.remove(arr[4], "\""))
+                            .operator("")
+                            .operatorId("")
+                            .operateIp("")
+                            .operateTime(DateUtils.now())
+                            .remarks("")
+                            .build();
+                    contractEnterpriseMapper.insert(contractEnterprise);
+                    contractEnterprises.add(contractEnterprise);
+                } else {
+                    contractEnterprises.add(new ContractEnterprise());
+                }
+            }
+        } else {
+            ContractEnterprise contractEnterprise = ContractEnterprise.builder()
+                    .cId(upload)
+                    .agency("无")
+                    .locationParagraph("无")
+                    .locationPosition("无")
+                    .enterpriseName("无")
+                    .result("无")
+                    .operator("")
+                    .operatorId("")
+                    .operateIp("")
+                    .operateTime(DateUtils.now())
+                    .remarks("")
+                    .build();
+            contractEnterpriseMapper.insert(contractEnterprise);
+        }
+        return contractEnterprises;
+    }
+
+
+    public List<List<String>> getEmpty() {
+        List<String> resList = new ArrayList<>();
+        resList.add("无");
+        List<List<String>> res = new ArrayList<>();
+        res.add(resList);
+        return res;
+    }
+
+    public List<List<String>> resCa(List<ContractAddress> contractAddresss) {
+        List<List<String>> res = new ArrayList<>();
+        for (ContractAddress addresss : contractAddresss) {
+            List<String> data = new ArrayList<>();
+            data.add(addresss.getLocationParagraph());
+            data.add(addresss.getLocationPosition());
+            data.add(addresss.getAddress());
+            res.add(data);
+        }
+
+        return res;
+    }
+
+    public List<List<String>> resCsn(List<ContractSubjectName> contractSubjectNames) {
+        List<List<String>> res = new ArrayList<>();
+        for (ContractSubjectName subjectName : contractSubjectNames) {
+            List<String> data = new ArrayList<>();
+            data.add(subjectName.getNameLocationParagraph());
+            data.add(subjectName.getNameLocationPosition());
+            data.add(subjectName.getSubjectName());
+            res.add(data);
+        }
+        return res;
+    }
+
+    public List<List<String>> resCsd(List<ContractSubjectDate> contractSubjectDates) {
+        List<List<String>> res = new ArrayList<>();
+        for (ContractSubjectDate subjectDate : contractSubjectDates) {
+            List<String> data = new ArrayList<>();
+            data.add(subjectDate.getDateLocationParagraph());
+            data.add(subjectDate.getDateLocationPosition());
+            data.add(subjectDate.getSubjectDate());
+            res.add(data);
+        }
+        return res;
+    }
+
+    public List<List<String>> resCac(List<ContractAmountCheck> contractAmountChecks) {
+        List<List<String>> res = new ArrayList<>();
+        for (ContractAmountCheck amountCheck : contractAmountChecks) {
+            List<String> data = new ArrayList<>();
+            data.add(amountCheck.getLocationParagraph());
+            data.add(amountCheck.getLocationPosition());
+            data.add(amountCheck.getCapital());
+            data.add(amountCheck.getLower());
+            data.add(amountCheck.getUnit());
+            data.add(amountCheck.getResult());
+            res.add(data);
+        }
+        return res;
+    }
+
+    public List<List<String>> resCe(List<ContractEnterprise> contractEnterprises) {
+        List<List<String>> res = new ArrayList<>();
+        for (ContractEnterprise enterprise : contractEnterprises) {
+            List<String> data = new ArrayList<>();
+            data.add(enterprise.getAgency());
+            data.add(enterprise.getLocationParagraph());
+            data.add(enterprise.getLocationPosition());
+            data.add(enterprise.getEnterpriseName());
+            data.add(enterprise.getResult());
+            res.add(data);
+        }
+        return res;
+    }
+
+    public List<List<String>> resCsm(List<ContractSubjectMobile> contractSubjectMobiles) {
+        List<List<String>> res = new ArrayList<>();
+        for (ContractSubjectMobile mobile : contractSubjectMobiles) {
+            List<String> data = new ArrayList<>();
+            data.add(mobile.getMobileLocationParagraph());
+            data.add(mobile.getMobileLocationPosition());
+            data.add(mobile.getSubjectMobile());
+            res.add(data);
+        }
+        return res;
+    }
+
+    public List<String> resCcd(List<ContractClassification> contractClassifications) {
+        List<List<String>> res = new ArrayList<>();
+        List<String> data = new ArrayList<>();
+        for (ContractClassification contractClassification : contractClassifications) {
+            data.add(contractClassification.getDisclaimer());
+            res.add(data);
+        }
+        return data;
+    }
+
+}

+ 33 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,33 @@
+spring:
+  datasource:
+#    url: jdbc:mysql://192.168.1.73/fjs_ocr?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
+    url: jdbc:mysql://192.168.1.73/cr?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
+#    url: jdbc:mysql://192.168.1.60/cr?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: root
+cr:
+  common:
+    dir:
+      base: D:\proooject\prooooject\home\privacy\projects\cr
+      # 上传文件存储文件夹
+      upload: ${cr.common.dir.base}\upload\rec\
+      down: ${cr.common.dir.base}\upload\file_down\
+    url:
+      # ip
+      base: http://192.168.1.73:10084
+      path: ${cr.common.url.base}/down/
+logging:
+  level:
+    org.springframework.cloud: info
+    org.springframework.boot: info
+    com.pavis.ai.app.cr.mapper: trace
+#security:
+#  oauth2:
+#    client:
+#      client-id: pavis-upms
+#      client-secret: pavis@2019*
+#      access-token-uri: http://localhost:8090/oauth/token
+#      user-authorization-uri: http://localhost:8090/oauth/authorize
+#    resource:
+#      token-info-uri: http://localhost:8090/oauth/check_token

+ 23 - 0
src/main/resources/application-prod.yml

@@ -0,0 +1,23 @@
+spring:
+  datasource:
+    url: jdbc:mysql://mysql:3306/cr?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: jste21
+cr:
+  common:
+    dir:
+      # 上传文件存储文件夹
+      base: /cr/upload
+      # 上传文件存储文件夹
+      upload: ${cr.common.dir.base}/rec/
+      down: ${cr.common.dir.base}/file_down/
+    url:
+      # ip
+      base: http://127.0.0.1:80
+      path: ${cr.common.url.base}/down/
+logging:
+  level:
+    org.springframework.cloud: info
+    org.springframework.boot: info
+    com.pavis.ai.app.fjs_ocr.mapper: trace

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

@@ -0,0 +1,16 @@
+server:
+#  port: 10084
+  port: 80
+spring:
+  application:
+    name: cr-ocr-server
+  profiles:
+    active: dev
+#    active: prod
+  servlet:
+    multipart:
+      max-file-size: 50MB
+      max-request-size: 20MB
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/*Mapper.xml
+  typeAliasesPackage: com.pavis.ai.app.crocr.model

+ 22 - 0
src/main/resources/error.properties

@@ -0,0 +1,22 @@
+credentials_expired=\u51ED\u8BC1\u5DF2\u8FC7\u671F!
+bad_request=\u65E0\u6548\u7684\u8BF7\u6C42!
+not_found=\u65E0\u6548\u7684\u8BBF\u95EE\u5730\u5740\uFF01
+service_unavailable=\u670D\u52A1\u6682\u65F6\u65E0\u6CD5\u8BBF\u95EE\uFF01
+method_not_allowed=\u8BF7\u6C42\u65B9\u5F0F\u4E0D\u652F\u6301!
+media_type_not_acceptable=\u5A92\u4F53\u7C7B\u578B\u4E0D\u652F\u6301!
+username_not_found=\u8D26\u53F7\u4E0D\u5B58\u5728!
+bad_credentials=\u8D26\u53F7\u6216\u5BC6\u7801\u9519\u8BEF!
+account_disabled=\u8D26\u53F7\u5DF2\u88AB\u7981\u7528!
+account_expired=\u8D26\u53F7\u5DF2\u8FC7\u671F!
+account_locked=\u8D26\u53F7\u5DF2\u88AB\u9501\u5B9A!
+error=\u670D\u52A1\u5668\u7E41\u5FD9,\u8BF7\u7A0D\u540E\u518D\u8BD5!
+unauthorized=\u8BA4\u8BC1\u5931\u8D25,\u8BF7\u91CD\u65B0\u767B\u5F55!
+too_many_requests=\u8BBF\u95EE\u592A\u8FC7\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5!
+access_denied=\u6743\u9650\u4E0D\u8DB3,\u62D2\u7EDD\u8BBF\u95EE!
+access_denied_black_limited=IP\u6216\u57DF\u540D\u62D2\u7EDD\u8BBF\u95EE!
+access_denied_white_limited=IP\u6216\u57DF\u540D\u4E0D\u5728\u767D\u540D\u5355\u5185,\u62D2\u7EDD\u8BBF\u95EE!
+access_denied_authority_expired=\u6388\u6743\u5DF2\u8FC7\u671F,\u62D2\u7EDD\u8BBF\u95EE!
+access_denied_updating=\u6B63\u5728\u5347\u7EA7\u7EF4\u62A4\u4E2D,\u8BF7\u7A0D\u540E\u518D\u8BD5!
+access_denied_disabled=\u8BF7\u6C42\u5730\u5740,\u7981\u6B62\u8BBF\u95EE!
+access_denied_not_open=\u8BF7\u6C42\u5730\u5740,\u62D2\u7EDD\u8BBF\u95EE!
+invalid_token=\u65E0\u6548\u7684\u8BBF\u95EE\u4EE4\u724C!

+ 16 - 0
src/test/java/com/pavis/ai/app/crocr/CrOcrApplicationTests.java

@@ -0,0 +1,16 @@
+// package com.pavis.ai.app.crocr;
+//
+// import org.junit.Test;
+// import org.junit.runner.RunWith;
+// import org.springframework.boot.test.context.SpringBootTest;
+// import org.springframework.test.context.junit4.SpringRunner;
+//
+// @RunWith(SpringRunner.class)
+// @SpringBootTest
+// public class CrOcrApplicationTests {
+//
+//     @Test
+//     public void contextLoads() {
+//     }
+//
+// }