Browse Source

泓浒erp和ehr数据访问中间程序

QuYueTing 1 month ago
parent
commit
f49c929d0d
24 changed files with 2464 additions and 0 deletions
  1. 2 0
      fhKeeper/formulahousekeeper/collectdata/.gitattributes
  2. 33 0
      fhKeeper/formulahousekeeper/collectdata/.gitignore
  3. 19 0
      fhKeeper/formulahousekeeper/collectdata/.mvn/wrapper/maven-wrapper.properties
  4. 259 0
      fhKeeper/formulahousekeeper/collectdata/mvnw
  5. 149 0
      fhKeeper/formulahousekeeper/collectdata/mvnw.cmd
  6. 96 0
      fhKeeper/formulahousekeeper/collectdata/pom.xml
  7. 15 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/CollectdataApplication.java
  8. 405 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java
  9. 172 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/BusinessTrip.java
  10. 42 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/ErpOrderInfo.java
  11. 166 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/LeaveSheet.java
  12. 390 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/Project.java
  13. 68 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/UserFvTime.java
  14. 9 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/bo/PageBO.java
  15. 15 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/BusinessTripMapper.java
  16. 15 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/ErpOrderInfoMapper.java
  17. 15 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/LeaveSheetMapper.java
  18. 15 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/UserFvTimeMapper.java
  19. 479 0
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/task/TimeTask.java
  20. 25 0
      fhKeeper/formulahousekeeper/collectdata/src/main/resources/application.yml
  21. 21 0
      fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/BusinessTripMapper.xml
  22. 18 0
      fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/ErpOrderInfoMapper.xml
  23. 20 0
      fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/LeaveSheetMapper.xml
  24. 16 0
      fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/UserFvTimeMapper.xml

+ 2 - 0
fhKeeper/formulahousekeeper/collectdata/.gitattributes

@@ -0,0 +1,2 @@
+/mvnw text eol=lf
+*.cmd text eol=crlf

+ 33 - 0
fhKeeper/formulahousekeeper/collectdata/.gitignore

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

+ 19 - 0
fhKeeper/formulahousekeeper/collectdata/.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,19 @@
+# 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
+#
+#   http://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.
+wrapperVersion=3.3.2
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

+ 259 - 0
fhKeeper/formulahousekeeper/collectdata/mvnw

@@ -0,0 +1,259 @@
+#!/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
+#
+#    http://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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.2
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  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"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+trim() {
+  # MWRAPPER-139:
+  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
+  #   Needed for removing poorly interpreted newline sequences when running in more
+  #   exotic environments such as mingw bash on Windows.
+  printf "%s" "${1}" | tr -d '[:space:]'
+}
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl=$(trim "${value-}") ;;
+  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
+  esac
+done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
+MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"

+ 149 - 0
fhKeeper/formulahousekeeper/collectdata/mvnw.cmd

@@ -0,0 +1,149 @@
+<# : batch portion
+@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    http://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 Apache Maven Wrapper startup batch script, version 3.3.2
+@REM
+@REM Optional ENV vars
+@REM   MVNW_REPOURL - repo url base for downloading maven distribution
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
+@REM ----------------------------------------------------------------------------
+
+@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
+@SET __MVNW_CMD__=
+@SET __MVNW_ERROR__=
+@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
+@SET PSModulePath=
+@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
+  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
+)
+@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
+@SET __MVNW_PSMODULEP_SAVE=
+@SET __MVNW_ARG0_NAME__=
+@SET MVNW_USERNAME=
+@SET MVNW_PASSWORD=
+@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
+@echo Cannot start maven from wrapper >&2 && exit /b 1
+@GOTO :EOF
+: end batch / begin powershell #>
+
+$ErrorActionPreference = "Stop"
+if ($env:MVNW_VERBOSE -eq "true") {
+  $VerbosePreference = "Continue"
+}
+
+# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
+$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
+if (!$distributionUrl) {
+  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+}
+
+switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
+  "maven-mvnd-*" {
+    $USE_MVND = $true
+    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
+    $MVN_CMD = "mvnd.cmd"
+    break
+  }
+  default {
+    $USE_MVND = $false
+    $MVN_CMD = $script -replace '^mvnw','mvn'
+    break
+  }
+}
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+if ($env:MVNW_REPOURL) {
+  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
+  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
+}
+$distributionUrlName = $distributionUrl -replace '^.*/',''
+$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
+$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
+if ($env:MAVEN_USER_HOME) {
+  $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
+}
+$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
+$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
+
+if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
+  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+  exit $?
+}
+
+if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
+  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
+}
+
+# prepare tmp dir
+$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
+$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
+$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
+trap {
+  if ($TMP_DOWNLOAD_DIR.Exists) {
+    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+  }
+}
+
+New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
+
+# Download and Install Apache Maven
+Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+Write-Verbose "Downloading from: $distributionUrl"
+Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+$webclient = New-Object System.Net.WebClient
+if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
+  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
+}
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
+if ($distributionSha256Sum) {
+  if ($USE_MVND) {
+    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
+  }
+  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
+  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
+    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
+  }
+}
+
+# unzip and move
+Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
+Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
+try {
+  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
+} catch {
+  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
+    Write-Error "fail to move MAVEN_HOME"
+  }
+} finally {
+  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+}
+
+Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

+ 96 - 0
fhKeeper/formulahousekeeper/collectdata/pom.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.5.6</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.management</groupId>
+    <artifactId>collectdata</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>collectdata</name>
+    <description>collectdata</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>com.fasterxml.jackson.core</groupId>-->
+<!--            <artifactId>jackson-databind</artifactId>-->
+<!--            <version>2.9.8</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>10.2.1.jre8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/CollectdataApplication.java

@@ -0,0 +1,15 @@
+package com.management.collectdata;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+//@EnableAsync
+public class CollectdataApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CollectdataApplication.class, args);
+    }
+
+}

+ 405 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -0,0 +1,405 @@
+package com.management.collectdata.controller;
+
+import com.management.collectdata.entity.*;
+import com.management.collectdata.entity.bo.PageBO;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+@RequestMapping("/dataCollect")
+@RestController
+public class DataCollectController {
+
+    @Value("${company.companyid}")
+    private Integer companyId;
+
+    @Value("${company.creatorid}")
+    private String creatorid;
+
+    @Value("${company.creatorname}")
+    private String creatorname;
+    private static HikariDataSource sqlServerDataSource;
+
+    private static HikariDataSource mysqlDataSource;
+
+    private static final int BATCH_SIZE = 1000;
+
+    static {
+        HikariConfig sqlServerConfig = new HikariConfig();
+        sqlServerConfig.setJdbcUrl("jdbc:sqlserver://172.168.10.84:1433;databaseName=UFDATA_001_2023;encrypt=true;trustServerCertificate=true");
+        sqlServerConfig.setUsername("zhangyuhua");
+        sqlServerConfig.setPassword("ZC12zyh18");
+        sqlServerConfig.setMaximumPoolSize(5);
+        sqlServerDataSource = new HikariDataSource(sqlServerConfig);
+
+
+        HikariConfig mysqlConfig = new HikariConfig();
+        mysqlConfig.setJdbcUrl("jdbc:mysql://172.168.10.37:3306/DHG?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false");
+        mysqlConfig.setUsername("readonly");
+        mysqlConfig.setPassword("pasWsordL23");
+        sqlServerConfig.setMaximumPoolSize(5);
+        mysqlDataSource = new HikariDataSource(mysqlConfig);
+    }
+
+//    @Autowired
+//    private UserFvTimeMapper userFvTimeMapper;
+//    @Autowired
+//    private BusinessTripMapper businessTripMapper;
+//    @Autowired
+//    private LeaveSheetMapper leaveSheetMapper;
+//    @Autowired
+//    private ErpOrderInfoMapper erpOrderInfoMapper;
+
+    @RequestMapping("/getSqlServerProjectTypeDataSum")
+    public String getSqlServerProjectTypeDataSum() {
+        String sqlCount = "select count(distinct citemccode) from fitemss97  where bclose = 0";
+        int totalCount = 0;
+        try (Connection connection = sqlServerDataSource.getConnection()) {
+            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+            ResultSet countRs = countStmt.executeQuery();
+            if (countRs.next()) {
+                totalCount = countRs.getInt(1);
+            }
+            System.out.println("项目类别总记录数: " + totalCount);
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return String.valueOf(totalCount);
+    }
+
+    @RequestMapping("/getSqlServerProjectTypeDataList")
+    public List<String> getSqlServerProjectTypeDataList(@RequestBody PageBO pageBO) {
+        String sqlQuery = " select distinct citemccode " +
+                " from fitemss97  where bclose = 0 ORDER BY citemccode OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
+        List<String> resList = new ArrayList<>();
+        try (Connection connection = sqlServerDataSource.getConnection()) {
+            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+            int pageSize = pageBO.getPageSize();
+            int offset = pageBO.getPageNo();
+            queryStmt.setInt(1, offset);
+            queryStmt.setInt(2, pageSize);
+            try (ResultSet resultSet = queryStmt.executeQuery()) {
+                while (resultSet.next()) {
+                    resList.add(resultSet.getString("citemccode"));
+                }
+            }
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return resList;
+    }
+
+
+    @RequestMapping("/getSqlServerProjectDataSum")
+    public String getSqlServerProjectDataSum() {
+        String sqlCount = "select count(*) from fitemss97  where bclose = 0";
+        int totalCount = 0;
+        try (Connection connection = sqlServerDataSource.getConnection()) {
+            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+            ResultSet countRs = countStmt.executeQuery();
+            if (countRs.next()) {
+                totalCount = countRs.getInt(1);
+            }
+            System.out.println("项目总记录数: " + totalCount);
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return String.valueOf(totalCount);
+    }
+
+    @RequestMapping("/getSqlServerProjectDataList")
+    public List<Project> getSqlServerProjectDataList(@RequestBody PageBO pageBO) {
+        String sqlQuery = " select citemcode ,citemname " +
+                " from fitemss97  where bclose = 0 ORDER BY I_id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
+        List<Project> resList = new ArrayList<>();
+        try (Connection connection = sqlServerDataSource.getConnection()) {
+            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+            int pageSize = pageBO.getPageSize();
+            int offset = pageBO.getPageNo();
+            queryStmt.setInt(1, offset);
+            queryStmt.setInt(2, pageSize);
+            try (ResultSet resultSet = queryStmt.executeQuery()) {
+                while (resultSet.next()) {
+                    Project project = new Project();
+                    project.setCompanyId(companyId);
+                    project.setProjectCode(resultSet.getString("citemcode"));
+                    project.setProjectName(resultSet.getString("citemname"));
+                    project.setCreatorId(creatorid);
+                    project.setCreatorName(creatorname);
+                    project.setCreateDate(LocalDate.now());
+                    resList.add(project);
+                }
+            }
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return resList;
+    }
+
+
+    @RequestMapping("/getSqlServerDataSum")
+    public String getSqlServerDataSum() {
+        String sqlCount = "select count(*) from mom_orderdetail where status in (3,4) ";
+        int totalCount = 0;
+        try (Connection connection = sqlServerDataSource.getConnection()) {
+            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+            ResultSet countRs = countStmt.executeQuery();
+            if (countRs.next()) {
+                totalCount = countRs.getInt(1);
+            }
+            System.out.println("工时申请单总记录数: " + totalCount);
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return String.valueOf(totalCount);
+    }
+
+    @RequestMapping("/getSqlServerDataList")
+    public List<ErpOrderInfo> getSqlServerData(@RequestBody PageBO pageBO) {
+        String sqlQuery = " select MoDId ,SUBSTRING(cbSysBarCode, 8, 15) as orderId,Define24 as projectId,Define25 as projectName,RIGHT(cbSysBarCode,1) as line,status,relsdate " +
+                " from mom_orderdetail " +
+                " where status in (3,4) "
+                +" ORDER BY MoDId OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
+        List<ErpOrderInfo> resList = new ArrayList<>();
+        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try (Connection connection = sqlServerDataSource.getConnection()) {
+            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+            int pageSize = pageBO.getPageSize();
+            int offset = pageBO.getPageNo();
+            queryStmt.setInt(1, offset);
+            queryStmt.setInt(2, pageSize);
+            try (ResultSet resultSet = queryStmt.executeQuery()) {
+                while (resultSet.next()) {
+                    ErpOrderInfo erpOrderInfo = new ErpOrderInfo();
+                    erpOrderInfo.setMoDId(resultSet.getString("MoDId"));
+                    erpOrderInfo.setOrderId(resultSet.getString("orderId"));
+                    erpOrderInfo.setProjectId(resultSet.getString("projectId"));
+                    erpOrderInfo.setProjectName(resultSet.getString("projectName"));
+                    erpOrderInfo.setLine(resultSet.getInt("line"));
+                    erpOrderInfo.setStatus(resultSet.getInt("status"));
+                    erpOrderInfo.setRelsDate(resultSet.getDate("relsdate"));
+                    resList.add(erpOrderInfo);
+                }
+            }
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return resList;
+    }
+
+
+
+    @RequestMapping("/getWorkDayDataSum")
+    public String getWorkDayDataSum() {
+        String sqlCount = "select count(*) from att_work_hour_day where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) ";
+        int totalCount = 0;
+        try (Connection connection = mysqlDataSource.getConnection()) {
+            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+            ResultSet countRs = countStmt.executeQuery();
+            if (countRs.next()) {
+                totalCount = countRs.getInt(1);
+            }
+            System.out.println("打卡总记录数: " + totalCount);
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return String.valueOf(totalCount);
+    }
+
+    @RequestMapping("/getWorkDayDataList")
+    public List<UserFvTime> getWorkDayDataList(@RequestBody PageBO pageBO) {
+        String sqlQuery = " select id,emp_no,attendance_date,earliest_clock_date,last_clock_date,worktime_total_hour,overtime_total_hour " +
+                " from att_work_hour_day  where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)  order by id limit ?,? ";
+        List<UserFvTime> resList = new ArrayList<>();
+        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd");
+        try (Connection connection = mysqlDataSource.getConnection()) {
+            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+            int pageSize = pageBO.getPageSize();
+            int offset = pageBO.getPageNo();
+            queryStmt.setInt(1, offset);
+            queryStmt.setInt(2, pageSize);
+            try (ResultSet resultSet = queryStmt.executeQuery()) {
+                while (resultSet.next()) {
+                    UserFvTime userFvTime = new UserFvTime();
+                    userFvTime.setCompanyId(companyId);
+                    userFvTime.setProcinstId(resultSet.getString("id"));
+                    userFvTime.setUserId(resultSet.getString("emp_no"));
+                    userFvTime.setWorkDate(null==resultSet.getDate("attendance_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("attendance_date")), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                    userFvTime.setStartTime(null==resultSet.getDate("earliest_clock_date")?null:sdfAll.format(resultSet.getDate("earliest_clock_date")));
+                    userFvTime.setEndTime(null==resultSet.getDate("last_clock_date")?null:sdfAll.format(resultSet.getDate("last_clock_date")));
+                    userFvTime.setWorkHours(null==resultSet.getBigDecimal("worktime_total_hour")?null:resultSet.getBigDecimal("worktime_total_hour").setScale(2, RoundingMode.HALF_UP).floatValue());
+                    userFvTime.setOverTimeSeconds(null==resultSet.getBigDecimal("worktime_total_hour")?null:resultSet.getBigDecimal("worktime_total_hour").setScale(1,RoundingMode.HALF_UP)
+                            .multiply(new BigDecimal("3600")).longValue());
+
+                    resList.add(userFvTime);
+                }
+            }
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+
+        return resList;
+    }
+
+
+
+
+    @RequestMapping("/getLeaveSheetDataSum")
+    public String getLeaveSheetDataSum() {
+        String sqlCount = "select count(*) from att_holiday_leave_order where audit_status = 3 and is_delete = 0 and create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
+        int totalCount = 0;
+        try (Connection connection = mysqlDataSource.getConnection()) {
+            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+            ResultSet countRs = countStmt.executeQuery();
+            if (countRs.next()) {
+                totalCount = countRs.getInt(1);
+            }
+            System.out.println("请假总记录数: " + totalCount);
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return String.valueOf(totalCount);
+    }
+
+    @RequestMapping("/getLeaveSheetDataList")
+    public List<LeaveSheet> getLeaveSheetDataList(@RequestBody PageBO pageBO) {
+        String sqlQuery = "select ahlo.id,ahlo.company_id,ahlo.emp_no,ahlo.emp_name " +
+                " ,ahlo.begin_date,ahlo.end_date,ahlo.leave_category_name " +
+                " ,ahlo.audit_status,ahlo.reason, eic.emp_no as operator_id " +
+                " ,ahlo.total_hour,ahlo.total_day,eie.mobile " +
+                " from att_holiday_leave_order ahlo " +
+                " left join emp_info eie on ahlo.emp_origin_id = eie.origin_id " +
+                " left join emp_info eic on ahlo.create_id = eic.origin_id " +
+                " where ahlo.audit_status = 3 and ahlo.is_delete = 0 and ahlo.create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) order by ahlo.id limit ?,? ";
+        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd");
+        List<LeaveSheet> resList = new ArrayList<>();
+        try (Connection connection = mysqlDataSource.getConnection()) {
+            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+            int pageSize = pageBO.getPageSize();
+            int offset = pageBO.getPageNo();
+            queryStmt.setInt(1, offset);
+            queryStmt.setInt(2, pageSize);
+            try (ResultSet resultSet = queryStmt.executeQuery()) {
+                while (resultSet.next()) {
+                    LeaveSheet leaveSheet = new LeaveSheet();
+                    leaveSheet.setCompanyId(companyId);
+                    leaveSheet.setOwnerId(resultSet.getString("emp_no"));
+                    leaveSheet.setOwnerName(resultSet.getString("emp_name"));
+                    leaveSheet.setStartDate(null==resultSet.getDate("begin_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("begin_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                    leaveSheet.setEndDate(null==resultSet.getDate("end_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("end_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                    switch (resultSet.getString("leave_category_name")){
+                        case "调休假" : leaveSheet.setLeaveType(6); break;
+                        case "年假" : leaveSheet.setLeaveType(2); break;
+                        case "事假" : leaveSheet.setLeaveType(0); break;
+                        case "病假" : leaveSheet.setLeaveType(1);break;
+                        case "婚假" : leaveSheet.setLeaveType(4);break;
+                        case "产假" : leaveSheet.setLeaveType(3);break;
+                        case "哺乳假" : leaveSheet.setLeaveType(3);break;
+                        case "陪产假" : leaveSheet.setLeaveType(7);break;
+                        case "丧假" : leaveSheet.setLeaveType(5);break;
+                        case "工伤假" : leaveSheet.setLeaveType(1);break;
+                        case "育儿假" : leaveSheet.setLeaveType(3);break;
+                        case "福利病假" : leaveSheet.setLeaveType(1);break;
+                        default: leaveSheet.setLeaveType(8);break;
+                    }
+                    leaveSheet.setStatus(0);
+                    leaveSheet.setRemark(resultSet.getString("reason"));
+                    leaveSheet.setOperatorId(resultSet.getString("operator_id"));
+                    leaveSheet.setTimeHours(null==resultSet.getBigDecimal("total_hour")?null:resultSet.getBigDecimal("total_hour").setScale(1,RoundingMode.HALF_UP).floatValue());
+                    leaveSheet.setTimeDays(null==resultSet.getBigDecimal("total_day")?null:resultSet.getBigDecimal("total_day").setScale(0,RoundingMode.HALF_UP).floatValue());
+                    leaveSheet.setIndate(LocalDateTime.now());
+                    leaveSheet.setTimeType(0);
+                    leaveSheet.setTel(resultSet.getString("mobile"));
+                    leaveSheet.setProcinstId(resultSet.getString("id"));
+                    resList.add(leaveSheet);
+                }
+            }
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return resList;
+    }
+
+
+    @RequestMapping("/getBusinessTripDataSum")
+    public String getBusinessTripDataSum() {
+        String sqlCount = "select count(*) from att_business_trip_order where audit_status = 3 and is_delete = 0 and create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) ";
+
+        int totalCount = 0;
+        try (Connection connection = mysqlDataSource.getConnection()) {
+            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+            ResultSet countRs = countStmt.executeQuery();
+            if (countRs.next()) {
+                totalCount = countRs.getInt(1);
+            }
+            System.out.println("出差总记录数: " + totalCount);
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return String.valueOf(totalCount);
+    }
+
+    @RequestMapping("/getBusinessTripDataList")
+    public List<BusinessTrip> getBusinessTripDataList(@RequestBody PageBO pageBO) {
+        String sqlQuery = "select id,emp_no,emp_name,reason,begin_date,end_date,c_departure_place_city " +
+                " ,c_destination_place_city,trip_day,c_ccxm_no " +
+                " from att_business_trip_order abto " +
+                " where abto.audit_status = 3 and abto.is_delete = 0 and abto.create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) order by id limit ?,? ";
+
+        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd");
+        List<BusinessTrip> resList = new ArrayList<>();
+        try (Connection connection = mysqlDataSource.getConnection()) {
+            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+            int pageSize = pageBO.getPageSize();
+            int offset = pageBO.getPageNo();
+            queryStmt.setInt(1, offset);
+            queryStmt.setInt(2, pageSize);
+            try (ResultSet resultSet = queryStmt.executeQuery()) {
+                while (resultSet.next()) {
+                    BusinessTrip businessTrip = new BusinessTrip();
+                    businessTrip.setCCcxmNo(resultSet.getString("c_ccxm_no"));
+                    businessTrip.setCompanyId(companyId);
+                    businessTrip.setWay(4);
+                    businessTrip.setOwnerId(resultSet.getString("emp_no"));
+                    businessTrip.setOwnerName(resultSet.getString("emp_name"));
+                    businessTrip.setReason(resultSet.getString("reason"));
+                    businessTrip.setStatus(0);
+                    businessTrip.setStartDate(null==resultSet.getDate("begin_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("begin_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                    businessTrip.setEndDate(null==resultSet.getDate("end_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("end_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                    businessTrip.setCityFrom(resultSet.getString("c_departure_place_city"));
+                    businessTrip.setCityTo(resultSet.getString("c_destination_place_city"));
+                    businessTrip.setDayCount(null==resultSet.getBigDecimal("trip_day")?null:resultSet.getBigDecimal("trip_day").setScale(0,RoundingMode.HALF_UP).intValue());
+                    businessTrip.setIndate(LocalDateTime.now());
+                    businessTrip.setProcinstId(resultSet.getString("id"));
+
+                    resList.add(businessTrip);
+                }
+            }
+        } catch (SQLException e) {
+            System.err.println("数据库操作错误: " + e.getMessage());
+        }
+        return resList;
+    }
+
+
+
+}

+ 172 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/BusinessTrip.java

@@ -0,0 +1,172 @@
+package com.management.collectdata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class BusinessTrip extends Model<BusinessTrip> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 申请人id
+     */
+    @TableField("owner_id")
+    private String ownerId;
+
+    /**
+     * 申请人姓名
+     */
+    @TableField("owner_name")
+    private String ownerName;
+
+    /**
+     * 出差事由
+     */
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 开始时间
+     */
+    @TableField("start_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 结束时间
+     */
+    @TableField("end_date")
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 0-飞机,1-火车,2-汽车,3-轮船,4-其他
+     */
+    @TableField("way")
+    private Integer way;
+
+    /**
+     * 出发城市
+     */
+    @TableField("city_from")
+    private String cityFrom;
+
+    /**
+     * 目的城市
+     */
+    @TableField("city_to")
+    private String cityTo;
+
+    /**
+     * 0-单程,1-往返
+     */
+    @TableField("go_back")
+    private Integer goBack;
+
+    /**
+     * 出差天数
+     */
+    @TableField("day_count")
+    private Integer dayCount;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 0-审核通过,1-待审核,2-驳回,3-已撤回
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 驳回原因
+     */
+    @TableField("deny_reason")
+    private String denyReason;
+
+    /**
+     * 申请时间
+     */
+    @TableField("indate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime indate;
+
+    /**
+     * 是否已经关联
+     */
+    @TableField("is_linked")
+    private Integer isLinked;
+
+    /**
+     * 钉钉审批实例procInst_id
+     */
+    @TableField("procinst_id")
+    private String procinstId;
+
+    /**
+     * 钉钉审批实例的审批通过时间
+     */
+    @TableField("gmt_finished")
+    private String gmtFinished;
+
+    /**
+     * 审核人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
+    /**
+     * 审核人姓名
+     */
+    @TableField("auditor_name")
+    private String auditorName;
+
+    /**
+     * 1-部门审核,2-指定人员审核
+     */
+    @TableField("auditor_type")
+    private Integer auditorType;
+
+    /**
+     * 当前审核节点id
+     */
+    @TableField("cur_audit_setting_id")
+    private Integer curAuditSettingId;
+
+    @TableField(exist = false)
+    private String cCcxmNo;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 42 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/ErpOrderInfo.java

@@ -0,0 +1,42 @@
+package com.management.collectdata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ErpOrderInfo extends Model<ErpOrderInfo> {
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("order_id")
+    private String orderId;
+
+    @TableField("project_id")
+    private String projectId;
+
+    @TableField("project_name")
+    private String projectName;
+
+    @TableField("line")
+    private Integer line;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("moDId")
+    private String MoDId;
+
+    @TableField("rels_date")
+    private Date relsDate;
+}

+ 166 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/LeaveSheet.java

@@ -0,0 +1,166 @@
+package com.management.collectdata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class LeaveSheet extends Model<LeaveSheet> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 填报人id
+     */
+    @TableField("owner_id")
+    private String ownerId;
+
+    /**
+     * 填报人姓名
+     */
+    @TableField("owner_name")
+    private String ownerName;
+
+    /**
+     * 开始日期
+     */
+    @TableField("start_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    @TableField("end_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 假期类型:0-事假,1-病假,2-年假,3-产假
+     */
+    @TableField("leave_type")
+    private Integer leaveType;
+
+    /**
+     * 0-审核通过,1-待审核,2-驳回,3-已撤回
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 录入人
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
+    /**
+     * 请假时长
+     */
+    @TableField("time_hours")
+    private Float timeHours;
+
+    /**
+     * 请假天数
+     */
+    @TableField("time_days")
+    private Float timeDays;
+
+    /**
+     * 时间
+     */
+    @TableField("indate")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime indate;
+
+    /**
+     * 0-按天,1-按小时
+     */
+    @TableField("time_type")
+    private Integer timeType;
+
+    /**
+     * 手机号
+     */
+    @TableField("tel")
+    private String tel;
+
+    /**
+     * 审核人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
+    /**
+     * 审核人姓名
+     */
+    @TableField("auditor_name")
+    private String auditorName;
+
+    /**
+     * 1-部门审核,2-指定人员审核
+     */
+    @TableField("auditor_type")
+    private Integer auditorType;
+
+    /**
+     * 钉钉审批实例procInst_id
+     */
+    @TableField("procinst_id")
+    private String procinstId;
+
+    /**
+     * 钉钉审批实例的审批通过时间
+     */
+    @TableField("gmt_finished")
+    private String gmtFinished;
+
+    /**
+     * 当前审核节点id
+     */
+    @TableField("cur_audit_setting_id")
+    private Integer curAuditSettingId;
+
+    @TableField(exist = false)
+    private String dept;
+
+    /**请假凭证 逗号分隔*/
+    @TableField("file_urls")
+    private String fileUrls;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
+

+ 390 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/Project.java

@@ -0,0 +1,390 @@
+package com.management.collectdata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Project extends Model<Project> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目名称
+     */
+    @TableField("project_name")
+    private String projectName;
+
+    /**
+     * 公司表外键
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 项目编码
+     */
+    @TableField("project_code")
+    private String projectCode;
+
+    /**
+     * 负责人id
+     */
+    @TableField("incharger_id")
+    private String inchargerId;
+
+    /**
+     * 计划开始日期
+     */
+    @TableField("plan_start_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate planStartDate;
+
+    /**
+     * 计划结束日期
+     */
+    @TableField("plan_end_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate planEndDate;
+
+
+    /**
+     * 项目进度
+     */
+    @TableField("progress")
+    private Integer progress;
+
+    /**
+     * 0-全部,1-正常,2-紧急,3-重要,4-重要且紧急 5-低风险 6-中风险 7-高风险
+     */
+    @TableField("level")
+    private Integer level;
+
+    /**
+     * 0-全部,1-进行中,2-已完成,3-已撤销 4-暂停
+     */
+    @TableField("status")
+    private Integer status;
+
+
+    /**
+     * 实际完成日期
+     */
+    @TableField("finish_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate finishDate;
+
+    /**
+     * 创建人id
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 创建人姓名
+     */
+    @TableField("creator_name")
+    private String creatorName;
+
+    /**
+     * 创建日期
+     */
+    @TableField("create_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createDate;
+
+
+    /**
+     * 项目金额:单位元
+     */
+    @TableField("contract_amount")
+    private Double contractAmount;
+
+    /**
+     * 基线总成本:单位元
+     */
+    @TableField("budget")
+    private Double budget;
+
+    /**
+     * 人员成本:单位元
+     */
+    @TableField("base_man")
+    private Integer baseMan;
+
+    /**
+     * 外包费用
+     */
+    @TableField("base_outsourcing")
+    private Integer baseOutsourcing;
+
+    /**
+     * 风险预留资金1
+     */
+    @TableField("base_risk1")
+    private Integer baseRisk1;
+
+    /**
+     * 风险预留资金1
+     */
+    @TableField("base_risk2")
+    private Integer baseRisk2;
+
+    /**
+     * 基线费用
+     */
+    @TableField("base_fee")
+    private Integer baseFee;
+    /**
+     * 人工成本
+     */
+    @TableField("fee_man")
+    private Double feeMan;
+
+    @TableField(exist = false)
+    private String inchargerName;
+
+    @TableField(exist = false)
+    private List<Map<String, Object>> participationList;
+
+    /**
+     * 客户id
+     */
+    @TableField("customer_id")
+    private Integer customerId;
+
+    /**
+     * 客户名称
+     */
+    @TableField("customer_name")
+    private String customerName;
+
+    /**
+     * 是否是公共项目 0-否  1-是
+     */
+    @TableField("is_public")
+    private Integer isPublic;
+
+
+    /**
+     * 关联的自定义维度
+     */
+    @TableField("associate_degrees")
+    private String associateDegrees;
+
+    /**
+     * 关联的自定义维度名称
+     */
+    @TableField("associate_degree_names")
+    private String associateDegreeNames;
+    /**
+     * 下放日报审核权限到分组负责人
+     */
+    @TableField("task_gp_incharge")
+    private Integer taskGpIncharge;
+
+    /**
+     * 分类id
+     */
+    @TableField("category")
+    private Integer category;
+
+    /**
+     * 分类名称
+     */
+    @TableField("category_name")
+    private String categoryName;
+
+
+    /**
+     * 项目描述
+     */
+    @TableField("project_desc")
+    private String projectDesc;
+
+    /**
+     * 主项目id
+     */
+    @TableField("project_main_id")
+    private Integer projectMainId;
+
+    /**
+     * 主项目名称
+     */
+    @TableField("project_main_name")
+    private String projectMainName;
+
+    /**
+     * 供应商id
+     */
+    @TableField("provider_ids")
+    private String providerIds;
+
+    /**
+     * 供应商名称
+     */
+    @TableField("provider_names")
+    private String providerNames;
+
+    /**
+     * 阶段id
+     */
+    @TableField("current_stage_id")
+    private Integer currentStageId;
+
+    /**
+     * 当前任务阶段名称
+     */
+    @TableField("current_stage_name")
+    private String currentStageName;
+
+    /**
+     * 项目产值
+     */
+    @TableField("output_value")
+    private Double outputValue;
+
+    /**
+     * 部门Id
+     */
+    @TableField("dept_id")
+    private Integer deptId;
+
+    /**
+     * 部门层级
+     */
+    @TableField("dept_cascade")
+    private String deptCascade;
+
+    /**
+     * buId
+     */
+    @TableField("bu_id")
+    private String buId;
+
+    /**
+     * 项目人天
+     */
+    @TableField("man_day")
+    private Double manDay;
+
+    /**
+     * 项目人天管控开始日期
+     */
+    @TableField("man_day_start_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate manDayStartDate;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate1")
+    private String plate1;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate2")
+    private String plate2;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate3")
+    private String plate3;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate4")
+    private String plate4;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate5")
+    private String plate5;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate6")
+    private String plate6;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate7")
+    private String plate7;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate8")
+    private String plate8;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate9")
+    private String plate9;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate10")
+    private String plate10;
+
+    /**
+     * 是否是从外部系统同步的项目
+     */
+    @TableField("from_outside")
+    private Integer fromOutside;
+
+    /**
+     * 立项id
+     */
+    @TableField("approve_id")
+    private Integer approveId;
+
+    @TableField(exist = false)
+    private String groupName;
+    /**
+     * 项目复审人
+     */
+    @TableField("reviwer_id")
+    private String reviwerId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 68 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/UserFvTime.java

@@ -0,0 +1,68 @@
+package com.management.collectdata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class UserFvTime extends Model<UserFvTime> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("work_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate workDate;
+
+    @TableField("user_id")
+    private String userId;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("start_time")
+    private String startTime;
+
+    @TableField("end_time")
+    private String endTime;
+
+    @TableField("work_hours")
+    private Float workHours;
+
+    @TableField("procinst_id")
+    private String procinstId;
+
+//    @TableField("overtime_hours")
+//    private Float overTimeHours;
+
+
+    @TableField("overtime_seconds")
+    private Long overTimeSeconds;
+
+    /**
+     * 是否被标记排除异常范围
+     */
+    @TableField("cancel_normal")
+    private Integer cancelNormal;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 9 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/bo/PageBO.java

@@ -0,0 +1,9 @@
+package com.management.collectdata.entity.bo;
+
+import lombok.Data;
+
+@Data
+public class PageBO {
+    private int pageNo = 0;
+    private int pageSize = 10;
+}

+ 15 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/BusinessTripMapper.java

@@ -0,0 +1,15 @@
+package com.management.collectdata.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.collectdata.entity.BusinessTrip;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
+    void batchInsert(@Param("resList") List<BusinessTrip> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
+}

+ 15 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/ErpOrderInfoMapper.java

@@ -0,0 +1,15 @@
+package com.management.collectdata.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.collectdata.entity.ErpOrderInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ErpOrderInfoMapper extends BaseMapper<ErpOrderInfo> {
+    void batchInsert(@Param("resList") List<ErpOrderInfo> resList);
+
+    List<String> getExistIds(@Param("moIds") List<String> moIds);
+}

+ 15 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/LeaveSheetMapper.java

@@ -0,0 +1,15 @@
+package com.management.collectdata.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.collectdata.entity.LeaveSheet;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface LeaveSheetMapper extends BaseMapper<LeaveSheet> {
+    void batchInsert(@Param("resList") List<LeaveSheet> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
+}

+ 15 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/mapper/UserFvTimeMapper.java

@@ -0,0 +1,15 @@
+package com.management.collectdata.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.collectdata.entity.UserFvTime;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface UserFvTimeMapper extends BaseMapper<UserFvTime> {
+    void batchInsert(@Param("resList") List<UserFvTime> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
+}

+ 479 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/task/TimeTask.java

@@ -0,0 +1,479 @@
+//package com.management.collectdata.task;
+//
+//import com.management.collectdata.entity.BusinessTrip;
+//import com.management.collectdata.entity.ErpOrderInfo;
+//import com.management.collectdata.entity.LeaveSheet;
+//import com.management.collectdata.entity.UserFvTime;
+//import com.management.collectdata.mapper.BusinessTripMapper;
+//import com.management.collectdata.mapper.ErpOrderInfoMapper;
+//import com.management.collectdata.mapper.LeaveSheetMapper;
+//import com.management.collectdata.mapper.UserFvTimeMapper;
+//import com.zaxxer.hikari.HikariConfig;
+//import com.zaxxer.hikari.HikariDataSource;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.scheduling.annotation.EnableScheduling;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//import org.springframework.util.CollectionUtils;
+//
+//import javax.annotation.Resource;
+//import java.math.BigDecimal;
+//import java.math.RoundingMode;
+//import java.sql.Connection;
+//import java.sql.PreparedStatement;
+//import java.sql.ResultSet;
+//import java.sql.SQLException;
+//import java.text.SimpleDateFormat;
+//import java.time.LocalDate;
+//import java.time.LocalDateTime;
+//import java.time.format.DateTimeFormatter;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.stream.Collectors;
+//
+//@Component
+//@EnableScheduling
+//public class TimeTask {
+//
+//    @Value("${company.companyid}")
+//    private Integer companyId;
+//
+//    @Resource
+//    private ErpOrderInfoMapper erpOrderInfoMapper;
+//
+//    private static HikariDataSource sqlServerDataSource;
+//
+//    private static HikariDataSource mysqlDataSource;
+//
+//    private static final int BATCH_SIZE = 1000;
+//
+//    static {
+//        HikariConfig sqlServerConfig = new HikariConfig();
+//        sqlServerConfig.setJdbcUrl("jdbc:sqlserver://1.94.62.58:1433;databaseName=dbo_test;encrypt=true;trustServerCertificate=true");
+//        sqlServerConfig.setUsername("sa");
+//        sqlServerConfig.setPassword("HuoShi@Test");
+//        sqlServerConfig.setMaximumPoolSize(5);
+//        sqlServerDataSource = new HikariDataSource(sqlServerConfig);
+//
+//
+//        HikariConfig mysqlConfig = new HikariConfig();
+//        mysqlConfig.setJdbcUrl("jdbc:mysql://1.94.62.58:17089/ehr?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false");
+//        mysqlConfig.setUsername("root");
+//        mysqlConfig.setPassword("P011430@Huoshi*");
+//        sqlServerConfig.setMaximumPoolSize(5);
+//        mysqlDataSource = new HikariDataSource(mysqlConfig);
+//    }
+//
+//    @Autowired
+//    private UserFvTimeMapper userFvTimeMapper;
+//    @Autowired
+//    private BusinessTripMapper businessTripMapper;
+//    @Autowired
+//    private LeaveSheetMapper leaveSheetMapper;
+//
+//    @Scheduled(cron = "0 0 1 * * ?")
+//    public void sqlServerTask() {
+//        String sqlCount = "select count(*) from mom_orderdetail where status in (3,4) ";
+//
+//        String sqlQuery = " select MoDId ,SUBSTRING(cbSysBarCode, 8, 15) as orderId,Define24 as projectId,Define25 as projectName,RIGHT(cbSysBarCode,1) as line,status " +
+//                " from mom_orderdetail " +
+//                " where status in (3,4) "
+//                +" ORDER BY MoDId OFFSET ? ROWS FETCH NEXT ? ROWS ONLY "
+//                ;
+//
+//        try (Connection connection = sqlServerDataSource.getConnection()) {
+//            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+//            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+//
+//            List<ErpOrderInfo> resList = new ArrayList<>();
+//            List<ErpOrderInfo> toAddList = new ArrayList<>();
+//            List<ErpOrderInfo> toUpdateList = new ArrayList<>();
+//            int pageSize = 4000;
+//            int offset = 0;
+//            int totalCount = 0;
+//            ResultSet countRs = countStmt.executeQuery();
+//            if (countRs.next()) {
+//                totalCount = countRs.getInt(1);
+//            }
+//            System.out.println("开始迁移工时申请单,总记录数: " + totalCount);
+//            if(totalCount > 0){
+//                while (offset < totalCount) {
+//                    queryStmt.setInt(1, offset);
+//                    queryStmt.setInt(2, pageSize);
+//                    try (ResultSet resultSet = queryStmt.executeQuery()) {
+//                        int batchCount = 0;
+//                        while (resultSet.next()) {
+//                            ErpOrderInfo erpOrderInfo = new ErpOrderInfo();
+//                            erpOrderInfo.setMoDId(resultSet.getString("MoDId"));
+//                            erpOrderInfo.setOrderId(resultSet.getString("orderId"));
+//                            erpOrderInfo.setProjectId(resultSet.getString("projectId"));
+//                            erpOrderInfo.setProjectName(resultSet.getString("projectName"));
+//                            erpOrderInfo.setLine(resultSet.getInt("line"));
+//                            erpOrderInfo.setStatus(resultSet.getInt("status"));
+//                            resList.add(erpOrderInfo);
+//                            batchCount++;
+//                            if (batchCount % BATCH_SIZE == 0) {
+//                                List<String> collect = resList.stream().map(ErpOrderInfo::getMoDId).collect(Collectors.toList());
+//                                List<String> existIds = erpOrderInfoMapper.getExistIds(collect);
+//                                if(!CollectionUtils.isEmpty(existIds)){
+//                                    toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+//                                    toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+//                                }
+//                                if(!CollectionUtils.isEmpty(toAddList)){
+//                                    erpOrderInfoMapper.batchInsert(toAddList);
+//                                }
+//                                if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                    for (ErpOrderInfo orderInfo : toUpdateList) {
+//                                        erpOrderInfoMapper.updateById(orderInfo);
+//                                    }
+//                                }
+//                                resList.clear();
+//                                toUpdateList.clear();
+//                                toAddList.clear();
+//                            }
+//                            offset += pageSize;
+//                        }
+//                        if(!resList.isEmpty()){
+//                            List<String> collect = resList.stream().map(ErpOrderInfo::getMoDId).collect(Collectors.toList());
+//                            List<String> existIds = erpOrderInfoMapper.getExistIds(collect);
+//                            if(!CollectionUtils.isEmpty(existIds)){
+//                                toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+//                                toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+//                            }
+//                            if(!CollectionUtils.isEmpty(toAddList)){
+//                                erpOrderInfoMapper.batchInsert(toAddList);
+//                            }
+//                            if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                for (ErpOrderInfo orderInfo : toUpdateList) {
+//                                    erpOrderInfoMapper.updateById(orderInfo);
+//                                }
+//                            }
+//                            resList.clear();
+//                            toUpdateList.clear();
+//                            toAddList.clear();
+//                        }
+//                    }
+//                }
+//            }
+//            System.out.println("工时申请单数据迁移完成");
+//        } catch (SQLException e) {
+//            System.err.println("数据库操作错误: " + e.getMessage());
+//        }
+//    }
+//
+//
+//    @Scheduled(cron = "0 30 1 * * ?")
+//    public void workDayTask(){
+//        String sqlCount = "select count(*) from att_work_hour_day where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) ";
+//
+//        String sqlQuery = " select id,emp_no,attendance_date,earliest_clock_date,last_clock_date,worktime_total_hour,overtime_total_hour " +
+//                " from att_work_hour_day  where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)  order by id limit ?,? ";
+//
+//        try (Connection connection = mysqlDataSource.getConnection()) {
+//            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+//            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+//            List<UserFvTime> resList = new ArrayList<>();
+//            List<UserFvTime> toAddList = new ArrayList<>();
+//            List<UserFvTime> toUpdateList = new ArrayList<>();
+//            int pageSize = 4000;
+//            int offset = 0;
+//            int totalCount = 0;
+//            ResultSet countRs = countStmt.executeQuery();
+//            if (countRs.next()) {
+//                totalCount = countRs.getInt(1);
+//            }
+//            System.out.println("开始迁移打卡数据,总记录数: " + totalCount);
+//
+//            if(totalCount > 0){
+//                SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                while (offset < totalCount) {
+//                    queryStmt.setInt(1, offset);
+//                    queryStmt.setInt(2, pageSize);
+//                    try (ResultSet resultSet = queryStmt.executeQuery()) {
+//                        int batchCount = 0;
+//                        while (resultSet.next()) {
+//                            UserFvTime userFvTime = new UserFvTime();
+//                            userFvTime.setCompanyId(companyId);
+//                            userFvTime.setProcinstId(resultSet.getString("id"));
+//                            userFvTime.setUserId(resultSet.getString("emp_no"));
+//                            userFvTime.setWorkDate(LocalDate.parse(sdfAll.format(resultSet.getDate("attendance_date")), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//                            userFvTime.setStartTime(sdfAll.format(resultSet.getDate("earliest_clock_date")));
+//                            userFvTime.setEndTime(sdfAll.format(resultSet.getDate("last_clock_date")));
+//                            userFvTime.setWorkHours(resultSet.getBigDecimal("worktime_total_hour").setScale(2, RoundingMode.HALF_UP).floatValue());
+//                            userFvTime.setOverTimeSeconds(resultSet.getBigDecimal("worktime_total_hour").setScale(1,RoundingMode.HALF_UP)
+//                                    .multiply(new BigDecimal("3600")).longValue());
+//
+//                            resList.add(userFvTime);
+//                            batchCount++;
+//                            if (batchCount % BATCH_SIZE == 0) {
+//                                List<String> collect = resList.stream().map(UserFvTime::getProcinstId).collect(Collectors.toList());
+//                                List<String> existIds = userFvTimeMapper.getExistIds(collect);
+//                                if(!CollectionUtils.isEmpty(existIds)){
+//                                    toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                    toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                }
+//                                if(!CollectionUtils.isEmpty(toAddList)){
+//                                    userFvTimeMapper.batchInsert(toAddList);
+//                                }
+//                                if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                    for (UserFvTime tmp : toUpdateList) {
+//                                        userFvTimeMapper.updateById(tmp);
+//                                    }
+//                                }
+//                                resList.clear();
+//                                toUpdateList.clear();
+//                                toAddList.clear();
+//                            }
+//                            offset += pageSize;
+//                        }
+//                        if(!resList.isEmpty()){
+//                            List<String> collect = resList.stream().map(UserFvTime::getProcinstId).collect(Collectors.toList());
+//                            List<String> existIds = userFvTimeMapper.getExistIds(collect);
+//                            if(!CollectionUtils.isEmpty(existIds)){
+//                                toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                            }
+//
+//                            if(!CollectionUtils.isEmpty(toAddList)){
+//                                userFvTimeMapper.batchInsert(toAddList);
+//                            }
+//                            if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                for (UserFvTime tmp : toUpdateList) {
+//                                    userFvTimeMapper.updateById(tmp);
+//                                }
+//                            }
+//                            resList.clear();
+//                            toUpdateList.clear();
+//                            toAddList.clear();
+//                        }
+//                    }
+//                }
+//            }
+//
+//            System.out.println("打卡数据数据迁移完成");
+//        } catch (SQLException e) {
+//            System.err.println("数据库操作错误: " + e.getMessage());
+//        }
+//    }
+//
+//    @Scheduled(cron = "0 0 2 * * ?")
+//    public void leaveSheetTask(){
+//        String sqlCount = "select count(*) from att_holiday_leave_order where audit_status = 3 and is_delete = 0 and create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
+//
+//        String sqlQuery = "select ahlo.id,ahlo.company_id,ahlo.emp_no,ahlo.emp_name " +
+//                " ,ahlo.begin_date,ahlo.end_date,ahlo.leave_category_name " +
+//                " ,ahlo.audit_status,ahlo.reason, eic.emp_no as operator_id " +
+//                " ,ahlo.total_hour,ahlo.total_day,eie.mobile " +
+//                " from att_holiday_leave_order ahlo " +
+//                " left join emp_info eie on ahlo.emp_origin_id = eie.origin_id " +
+//                " left join emp_info eic on ahlo.create_id = eic.origin_id " +
+//                " where ahlo.audit_status = 3 and ahlo.is_delete = 0 and ahlo.create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) order by ahlo.id limit ?,? ";
+//
+//        try (Connection connection = mysqlDataSource.getConnection()) {
+//            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+//            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+//            List<LeaveSheet> resList = new ArrayList<>();
+//            List<LeaveSheet> toAddList = new ArrayList<>();
+//            List<LeaveSheet> toUpdateList = new ArrayList<>();
+//            int pageSize = 4000;
+//            int offset = 0;
+//            int totalCount = 0;
+//            ResultSet countRs = countStmt.executeQuery();
+//            if (countRs.next()) {
+//                totalCount = countRs.getInt(1);
+//            }
+//            System.out.println("开始迁移出差数据,总记录数: " + totalCount);
+//            SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//            SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//            if(totalCount > 0){
+//                while (offset < totalCount) {
+//                    queryStmt.setInt(1, offset);
+//                    queryStmt.setInt(2, pageSize);
+//                    try (ResultSet resultSet = queryStmt.executeQuery()) {
+//                        int batchCount = 0;
+//                        while (resultSet.next()) {
+//                            LeaveSheet leaveSheet = new LeaveSheet();
+//                            leaveSheet.setCompanyId(companyId);
+//                            leaveSheet.setOwnerId(resultSet.getString("emp_no"));
+//                            leaveSheet.setOwnerName(resultSet.getString("emp_name"));
+//                            leaveSheet.setStartDate(LocalDate.parse(sdfYmd.format(resultSet.getDate("begin_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//                            leaveSheet.setEndDate(LocalDate.parse(sdfYmd.format(resultSet.getDate("end_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//                            switch (resultSet.getString("leave_category_name")){
+//                                case "调休假" : leaveSheet.setLeaveType(6); break;
+//                                case "年假" : leaveSheet.setLeaveType(2); break;
+//                                case "事假" : leaveSheet.setLeaveType(0); break;
+//                                case "病假" : leaveSheet.setLeaveType(1);break;
+//                                case "婚假" : leaveSheet.setLeaveType(4);break;
+//                                case "产假" : leaveSheet.setLeaveType(3);break;
+//                                case "哺乳假" : leaveSheet.setLeaveType(3);break;
+//                                case "陪产假" : leaveSheet.setLeaveType(7);break;
+//                                case "丧假" : leaveSheet.setLeaveType(5);break;
+//                                case "工伤假" : leaveSheet.setLeaveType(1);break;
+//                                case "育儿假" : leaveSheet.setLeaveType(3);break;
+//                                case "福利病假" : leaveSheet.setLeaveType(1);break;
+//                                default: leaveSheet.setLeaveType(8);break;
+//                            }
+//                            leaveSheet.setStatus(0);
+//                            leaveSheet.setRemark(resultSet.getString("reason"));
+//                            leaveSheet.setOperatorId(resultSet.getString("operator_id"));
+//                            leaveSheet.setTimeHours(resultSet.getBigDecimal("total_hour").setScale(1,RoundingMode.HALF_UP).floatValue());
+//                            leaveSheet.setTimeDays(resultSet.getBigDecimal("total_day").setScale(0,RoundingMode.HALF_UP).floatValue());
+//                            leaveSheet.setIndate(LocalDateTime.now());
+//                            leaveSheet.setTimeType(0);
+//                            leaveSheet.setTel(resultSet.getString("mobile"));
+//                            leaveSheet.setProcinstId(resultSet.getString("id"));
+//
+//                            resList.add(leaveSheet);
+//                            batchCount++;
+//                            if (batchCount % BATCH_SIZE == 0) {
+//                                List<String> collect = resList.stream().map(LeaveSheet::getProcinstId).collect(Collectors.toList());
+//                                List<String> existIds = leaveSheetMapper.getExistIds(collect);
+//                                if(!CollectionUtils.isEmpty(existIds)){
+//                                    toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                    toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                }
+//                                if(!CollectionUtils.isEmpty(toAddList)){
+//                                    leaveSheetMapper.batchInsert(toAddList);
+//                                }
+//                                if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                    for (LeaveSheet tmp : toUpdateList) {
+//                                        leaveSheetMapper.updateById(tmp);
+//                                    }
+//                                }
+//                                resList.clear();
+//                                toUpdateList.clear();
+//                                toAddList.clear();
+//                            }
+//                            offset += pageSize;
+//                        }
+//                        if(!resList.isEmpty()){
+//                            List<String> collect = resList.stream().map(LeaveSheet::getProcinstId).collect(Collectors.toList());
+//                            List<String> existIds = leaveSheetMapper.getExistIds(collect);
+//                            if(!CollectionUtils.isEmpty(existIds)){
+//                                toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                            }
+//                            if(!CollectionUtils.isEmpty(toAddList)){
+//                                leaveSheetMapper.batchInsert(toAddList);
+//                            }
+//                            if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                for (LeaveSheet tmp : toUpdateList) {
+//                                    leaveSheetMapper.updateById(tmp);
+//                                }
+//                            }
+//                            resList.clear();
+//                            toUpdateList.clear();
+//                            toAddList.clear();
+//                        }
+//                    }
+//                }
+//            }
+//
+//            System.out.println("出差数据迁移完成");
+//        } catch (SQLException e) {
+//            System.err.println("数据库操作错误: " + e.getMessage());
+//        }
+//    }
+//
+//    @Scheduled(cron = "0 30 2 * * ?")
+//    public void businessTripTask(){
+//        String sqlCount = "select count(*) from att_business_trip_order where audit_status = 3 and is_delete = 0 and create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) ";
+//
+//        String sqlQuery = "select id,emp_no,emp_name,reason,begin_date,end_date,c_departure_place_city " +
+//                " ,c_destination_place_city,trip_day " +
+//                " from att_business_trip_order abto " +
+//                " where abto.audit_status = 3 and abto.is_delete = 0 and abto.create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) order by id limit ?,? ";
+//
+//        try (Connection connection = mysqlDataSource.getConnection()) {
+//            PreparedStatement countStmt = connection.prepareStatement(sqlCount);
+//            PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
+//            List<BusinessTrip> resList = new ArrayList<>();
+//            List<BusinessTrip> toAddList = new ArrayList<>();
+//            List<BusinessTrip> toUpdateList = new ArrayList<>();
+//            int pageSize = 4000;
+//            int offset = 0;
+//            int totalCount = 0;
+//            ResultSet countRs = countStmt.executeQuery();
+//            if (countRs.next()) {
+//                totalCount = countRs.getInt(1);
+//            }
+//            System.out.println("开始迁移出差数据,总记录数: " + totalCount);
+//            if(totalCount > 0){
+//                SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                while (offset < totalCount) {
+//                    queryStmt.setInt(1, offset);
+//                    queryStmt.setInt(2, pageSize);
+//                    try (ResultSet resultSet = queryStmt.executeQuery()) {
+//                        int batchCount = 0;
+//                        while (resultSet.next()) {
+//                            BusinessTrip businessTrip = new BusinessTrip();
+//                            businessTrip.setCompanyId(companyId);
+//                            businessTrip.setWay(4);
+//                            businessTrip.setOwnerId(resultSet.getString("emp_no"));
+//                            businessTrip.setOwnerName(resultSet.getString("emp_name"));
+//                            businessTrip.setReason(resultSet.getString("reason"));
+//                            businessTrip.setStatus(0);
+//                            businessTrip.setStartDate(LocalDate.parse(sdfYmd.format(resultSet.getDate("begin_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//                            businessTrip.setEndDate(LocalDate.parse(sdfYmd.format(resultSet.getDate("end_date")),DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//                            businessTrip.setCityFrom(resultSet.getString("c_departure_place_city"));
+//                            businessTrip.setCityTo(resultSet.getString("c_destination_place_city"));
+//                            businessTrip.setDayCount(resultSet.getBigDecimal("trip_day").setScale(0,RoundingMode.HALF_UP).intValue());
+//                            businessTrip.setIndate(LocalDateTime.now());
+//                            businessTrip.setProcinstId(resultSet.getString("id"));
+//
+//                            resList.add(businessTrip);
+//                            batchCount++;
+//                            if (batchCount % BATCH_SIZE == 0) {
+//                                List<String> collect = resList.stream().map(BusinessTrip::getProcinstId).collect(Collectors.toList());
+//                                List<String> existIds = businessTripMapper.getExistIds(collect);
+//                                if(!CollectionUtils.isEmpty(existIds)){
+//                                    toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                    toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                }
+//                                if(!CollectionUtils.isEmpty(toAddList)){
+//                                    businessTripMapper.batchInsert(toAddList);
+//                                }
+//                                if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                    for (BusinessTrip tmp : toUpdateList) {
+//                                        businessTripMapper.updateById(tmp);
+//                                    }
+//                                }
+//                                resList.clear();
+//                                toUpdateList.clear();
+//                                toAddList.clear();
+//                            }
+//                            offset += pageSize;
+//                        }
+//                        if(!resList.isEmpty()){
+//                            List<String> collect = resList.stream().map(BusinessTrip::getProcinstId).collect(Collectors.toList());
+//                            List<String> existIds = businessTripMapper.getExistIds(collect);
+//                            if(!CollectionUtils.isEmpty(existIds)){
+//                                toUpdateList.addAll(resList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                                toAddList.addAll(resList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+//                            }
+//                            if(!CollectionUtils.isEmpty(toAddList)){
+//                                businessTripMapper.batchInsert(toAddList);
+//                            }
+//                            if(!CollectionUtils.isEmpty(toUpdateList)){
+//                                for (BusinessTrip tmp : toUpdateList) {
+//                                    businessTripMapper.updateById(tmp);
+//                                }
+//                            }
+//                            resList.clear();
+//                            toUpdateList.clear();
+//                            toAddList.clear();
+//                        }
+//                    }
+//                }
+//            }
+//
+//            System.out.println("出差数据迁移完成");
+//        } catch (SQLException e) {
+//            System.err.println("数据库操作错误: " + e.getMessage());
+//        }
+//    }
+//
+//
+//}

+ 25 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/resources/application.yml

@@ -0,0 +1,25 @@
+spring:
+  application:
+    name: collectdata
+#  datasource:
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    url: jdbc:mysql://1.94.62.58:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+#    username: root
+#    password: P011430@Huoshi*
+server:
+  port: 10020
+
+logging:
+  level:
+    root: info
+    org.mybatis: debug
+    java.sql: debug
+    org.springframework.web: trace
+    com.management.collectdata.mapper: debug
+mybatis:
+  type-aliases-package: com.management.collectdata.entity
+  mapper-locations: mappers/*Mapper.xml
+company:
+  companyid: 7536
+  creatorid: 8522511242253246464
+  creatorname: woy9TkCAAAZCNRk2UbgTRxl5GxQDFNEg

+ 21 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/BusinessTripMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.management.collectdata.mapper.BusinessTripMapper">
+
+    <insert id="batchInsert">
+        insert into business_trip(company_id, owner_id, owner_name, reason, start_date, end_date
+        , way, city_from, city_to,day_count, status, indate,  procinst_id)
+        VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.companyId},#{res.ownerId},#{res.ownerName},#{res.reason},#{res.startDate},#{res.endDate}
+            ,#{res.way},#{res.cityFrom},#{res.cityTo},#{res.dayCount},#{res.status},#{res.indate},#{res.procinstId})
+        </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id
+        from business_trip
+        where procinst_id in
+              <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
+</mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/ErpOrderInfoMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.management.collectdata.mapper.ErpOrderInfoMapper">
+
+    <insert id="batchInsert">
+        insert into erp_order_info(order_id, project_id, project_name, line, status)
+        VALUES
+            <foreach collection="resList" separator="," item="res">
+                (#{res.orderId},#{res.projectId},#{res.projectName},#{res.line},#{res.status})
+            </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select moDId
+        from erp_order_info
+        where moDId in <foreach collection="moIds" item="moId" separator="," open="(" close=")">#{moId}</foreach>
+    </select>
+</mapper>

+ 20 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/LeaveSheetMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.management.collectdata.mapper.LeaveSheetMapper">
+
+    <insert id="batchInsert">
+        insert into leave_sheet(company_id, owner_id, owner_name,start_date, end_date, leave_type, status, remark
+        , operator_id, time_hours, time_days, indate, time_type, tel, procinst_id) VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.companyId},#{res.ownerId},#{res.ownerName},#{res.startDate},#{res.endDate}
+            ,#{res.leaveType},#{res.status},#{res.remark},#{res.operatorId},#{res.timeHours},#{res.timeDays}
+            ,#{res.indate},#{res.timeType},#{res.tel},#{res.procinstId})
+        </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id
+        from leave_sheet
+        where procinst_id in <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
+</mapper>

+ 16 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/resources/mapper/UserFvTimeMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.management.collectdata.mapper.UserFvTimeMapper">
+
+    <insert id="batchInsert">
+        insert into user_fv_time(work_date, user_id, company_id, start_time, end_time,work_hours,overtime_seconds,procinst_id) VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.workDate},#{res.userId},#{res.companyId},#{res.startTime},#{res.endTime},#{res.workHours},#{res.overTimeSeconds},#{res.procinstId})
+        </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id from user_fv_time where procinst_id in
+        <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
+</mapper>