Browse Source

Merge remote-tracking branch 'origin/master'

yusm 1 month ago
parent
commit
fab6dbfbc5
66 changed files with 4758 additions and 181 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
  25. 6 0
      fhKeeper/formulahousekeeper/management-platform/pom.xml
  26. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/RefererInterceptor.java
  27. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ErpOrderInfoController.java
  28. 105 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/QRCodeController.java
  29. 40 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  30. 11 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BusinessTrip.java
  31. 14 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ErpOrderInfo.java
  32. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  33. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserFvTime.java
  34. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/OtherTaskFileInfoVO.java~
  35. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java
  36. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BustripProjectMapper.java
  37. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ErpOrderInfoMapper.java
  38. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java
  39. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectCategoryMapper.java
  40. 2 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  41. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserFvTimeMapper.java
  42. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ErpOrderInfoService.java
  43. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  44. 50 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ErpOrderInfoServiceImpl.java
  45. 287 99
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  46. 1088 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java~
  47. 8 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  48. 213 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java
  49. 11 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  50. 21 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/QRCodeUtil.java
  51. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml
  52. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BustripProjectMapper.xml
  53. 29 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ErpOrderInfoMapper.xml
  54. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml
  55. 13 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCategoryMapper.xml
  56. 13 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  57. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  58. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml
  59. 9 14
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  60. 11 3
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  61. 11 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  62. 8 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue
  63. 46 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  64. 5 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  65. 214 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/qrCodeManagement.vue
  66. 5 1
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

+ 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>

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/pom.xml

@@ -15,6 +15,12 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.21</version>
+        </dependency>
+
         <dependency>
             <groupId>com.google.zxing</groupId>
             <artifactId>core</artifactId>

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/RefererInterceptor.java

@@ -78,6 +78,7 @@ public class RefererInterceptor extends HandlerInterceptorAdapter {
                         }
                     }
                 }
+                LOGGER.warn("请求来源IP不在白名单中, refer host="+url.getHost());
                 return false;
             }
         }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ErpOrderInfoController.java

@@ -1,5 +1,6 @@
 package com.management.platform.controller;
 
+import com.management.platform.entity.ErpOrderInfo;
 import com.management.platform.service.ErpOrderInfoService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,6 +18,11 @@ public class ErpOrderInfoController {
     @Resource
     private ErpOrderInfoService erpOrderInfoService;
 
+    @RequestMapping("/getInfoPage")
+    public HttpRespMsg getInfoPage(ErpOrderInfo erpOrderInfo, HttpServletRequest request) {
+        return erpOrderInfoService.getInfoPage(erpOrderInfo,request);
+    }
+
 
     @RequestMapping("/getInfoByProjectId")
     public HttpRespMsg getInfoByProjectId(@RequestParam String projectId, HttpServletRequest request) {

+ 105 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/QRCodeController.java

@@ -3,17 +3,23 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.zxing.WriterException;
-import com.management.platform.entity.Report;
-import com.management.platform.mapper.ReportMapper;
+import com.management.platform.entity.ErpOrderInfo;
+import com.management.platform.mapper.ErpOrderInfoMapper;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.QRCodeUtil;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.io.IOException;
+import java.io.*;
+import java.util.Arrays;
+import java.util.List;
 
 @RestController
 @RequestMapping("/qrCode")
@@ -21,19 +27,90 @@ public class QRCodeController {
 
 
     @Resource
-    private ReportMapper reportMapper;
+    private ErpOrderInfoMapper erpOrderInfoMapper;
 
     @Value("${upload.path}")
     private String uploadPath;
 
-    @RequestMapping("/generateQRCodeByReportId")
-    public HttpRespMsg generateQRCode(@RequestParam("reportId")String reportId){
+    private static final int specialCompanyId = 7536;
+
+    @RequestMapping("/generateQRCodeByErpIds")
+    public HttpRespMsg generateQRCodeByErpIds(@RequestParam("erpIds")String erpIds){
         HttpRespMsg msg = new HttpRespMsg();
-        Report report = reportMapper.selectById(reportId);
-        String data = JSON.toJSONString(report);
+        String[] split = erpIds.split(",");
+        List<String> list = Arrays.asList(split);
+        if(StringUtils.isBlank(erpIds) || list.isEmpty()){
+            msg.setError("编号不能为空");
+            return msg;
+        }
+        List<ErpOrderInfo> erpList = erpOrderInfoMapper.getWithProject(list,specialCompanyId);
+//        List<ErpOrderInfo> erpList = erpOrderInfoMapper.selectList(new LambdaQueryWrapper<ErpOrderInfo>()
+//                .in(ErpOrderInfo::getId,list)
+//        );
+        String[] filesToZip = new String[erpList.size()];
+        int index = 0;
+        for (ErpOrderInfo erpOrderInfo : erpList) {
+            String data = JSON.toJSONString(erpOrderInfo);
+            int width = 300; // 二维码宽度
+            int height = 300; // 二维码高度
+            String s = null != erpOrderInfo.getMoDId() ? erpOrderInfo.getMoDId() : "";
+            String fileName = "项目二维码_"+s+System.currentTimeMillis()+".png";
+            try {
+                QRCodeUtil.generateQRCodeImage(data, width, height, uploadPath+fileName);
+            } catch (WriterException e) {
+                e.printStackTrace();
+                msg.setError("二维码生成失败,请联系管理员");
+                return msg;
+            } catch (IOException e) {
+                e.printStackTrace();
+                msg.setError("二维码生成失败,请联系管理员");
+                return msg;
+            }
+            filesToZip[index] = uploadPath+fileName;
+            index++;
+        }
+
+        String zipFile = uploadPath+System.currentTimeMillis()+".zip";
+        try (FileOutputStream fos = new FileOutputStream(zipFile);
+             ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(fos)) {
+
+            for (String file : filesToZip) {
+                File fileToZip = new File(file);
+                try (FileInputStream fis = new FileInputStream(fileToZip)) {
+                    ZipArchiveEntry entry = new ZipArchiveEntry(fileToZip, fileToZip.getName());
+                    zaos.putArchiveEntry(entry);
+
+                    byte[] buffer = new byte[1024];
+                    int len;
+                    while ((len = fis.read(buffer)) > 0) {
+                        zaos.write(buffer, 0, len);
+                    }
+                    zaos.closeArchiveEntry();
+                }
+            }
+            zaos.finish();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            msg.setError("二维码压缩包生成失败,请联系管理员");
+            return msg;
+        } catch (IOException e) {
+            e.printStackTrace();
+            msg.setError("二维码压缩包生成失败,请联系管理员");
+            return msg;
+        }
+        msg.setData(zipFile);
+        return msg;
+    }
+
+
+    @RequestMapping("/generateQRCodeByErpId")
+    public HttpRespMsg generateQRCodeByErpId(@RequestParam("erpId")String erpId){
+        HttpRespMsg msg = new HttpRespMsg();
+        ErpOrderInfo erpOrderInfo = erpOrderInfoMapper.selectById(erpId);
+        String data = JSON.toJSONString(erpOrderInfo);
         int width = 300; // 二维码宽度
         int height = 300; // 二维码高度
-        String fileName = "日报二维码_"+System.currentTimeMillis()+".png";
+        String fileName = "项目二维码_"+System.currentTimeMillis()+".png";
         try {
             QRCodeUtil.generateQRCodeImage(data, width, height, uploadPath+fileName);
         } catch (WriterException e) {
@@ -50,12 +127,28 @@ public class QRCodeController {
     }
 
 
-    @RequestMapping("/decodeQRCode")
-    public HttpRespMsg decodeQRCode(@RequestParam("filePath")String filePath){
+    @RequestMapping("/decodeQRCodeByPath")
+    public HttpRespMsg decodeQRCodeByPath(@RequestParam("filePath")String filePath){
+        HttpRespMsg msg = new HttpRespMsg();
+        String res = null;
+        try {
+            res = QRCodeUtil.decodeQRCodeByPath(filePath);
+        } catch (IOException e) {
+            e.printStackTrace();
+            msg.setError("文件解析失败,请联系管理员");
+            return msg;
+        }
+        JSONObject jsonObject = JSON.parseObject(res);
+        msg.setData(jsonObject);
+        return msg;
+    }
+
+    @RequestMapping("/decodeQRCodeByFile")
+    public HttpRespMsg decodeQRCodeByFile(@RequestParam("file") MultipartFile file){
         HttpRespMsg msg = new HttpRespMsg();
         String res = null;
         try {
-            res = QRCodeUtil.decodeQRCode(filePath);
+            res = QRCodeUtil.decodeQRCodeByFile(file);
         } catch (IOException e) {
             e.printStackTrace();
             msg.setError("文件解析失败,请联系管理员");

+ 40 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -36,6 +36,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -374,7 +375,9 @@ public class ReportController {
                                   String summary,         //针对工作总结的字段
                                   String[] multiDegrId,
                                   Integer[] reportTargetDeptId,
-                                  String weeklyAttachment
+                                  String weeklyAttachment,
+                                  String[] extraField4,
+                                  String[] extraField5
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -537,6 +540,18 @@ public class ReportController {
                 extraField3[i] = null;
             }
         }
+        if (extraField4 == null) {
+            extraField4 = new String[projectId.length];
+            for(int i=0;i<extraField4.length; i++) {
+                extraField4[i] = null;
+            }
+        }
+        if (extraField5 == null) {
+            extraField5 = new String[projectId.length];
+            for(int i=0;i<extraField5.length; i++) {
+                extraField5[i] = null;
+            }
+        }
         if (professionProgress == null) {
             professionProgress = new String[projectId.length];
             for(int i=0;i<professionProgress.length; i++) {
@@ -1005,6 +1020,8 @@ public class ReportController {
                             report.setExtraField3(extraField3[i]);
                             report.setSapServiceId(sapServiceId[i]);
                             report.setMultiDegrId(multiDegrId[i]);
+                            report.setExtraField4(extraField4[i]);
+                            report.setExtraField5(extraField5[i]);
                             //如果是员工自由选择审批流程的方式,需要处理一下
                             if (comTimeType.getReportAuditType() == 3) {
                                 report.setAuditorSetting(auditorSettingList.get(i));
@@ -1061,6 +1078,8 @@ public class ReportController {
                                 report.setExtraField3(extraField3[i]);
                                 report.setSapServiceId(sapServiceId[i]);
                                 report.setMultiDegrId(multiDegrId[i]);
+                                report.setExtraField4(extraField4[i]);
+                                report.setExtraField5(extraField5[i]);
                                 //如果是员工自由选择审批流程的方式,需要处理一下
                                 if (comTimeType.getReportAuditType() == 3) {
                                     report.setAuditorSetting(auditorSettingList.get(i));
@@ -1118,6 +1137,8 @@ public class ReportController {
                         report.setExtraField3(extraField3[i]);
                         report.setSapServiceId(sapServiceId[i]);
                         report.setMultiDegrId(multiDegrId[i]);
+                        report.setExtraField4(extraField4[i]);
+                        report.setExtraField5(extraField5[i]);
                         //如果是员工自由选择审批流程的方式,需要处理一下
                         if (comTimeType.getReportAuditType() == 3) {
                             report.setAuditorSetting(auditorSettingList.get(i));
@@ -1182,6 +1203,8 @@ public class ReportController {
                             report.setExtraField3(extraField3[i]);
                             report.setSapServiceId(sapServiceId[i]);
                             report.setMultiDegrId(multiDegrId[i]);
+                            report.setExtraField4(extraField4[i]);
+                            report.setExtraField5(extraField5[i]);
                             //如果是员工自由选择审批流程的方式,需要处理一下
                             if (comTimeType.getReportAuditType() == 3) {
                                 report.setAuditorSetting(auditorSettingList.get(i));
@@ -3082,9 +3105,24 @@ public class ReportController {
         return reportService.getCurAuditNode(date,userId);
     }
 
+
+    @RequestMapping("/checkAndAlertFVReportTimeLessThanCardTimeList")
+    public HttpRespMsg checkAndAlertFVReportTimeLessThanCardTimeList() {
+        LocalDate yestoday = LocalDate.now().minusDays(1);
+        LocalDate startDate = yestoday.minusDays(7);
+        Integer companyId = 7536;//泓浒(苏州)公司Id
+        reportService.checkAndAlertFVReportTimeLessThanCardTimeList(startDate, yestoday, companyId);
+        return new HttpRespMsg();
+    }
     @RequestMapping("/getReportTimeLessThanCardTimeList")
     public HttpRespMsg getReportTimeLessThanCardTimeList(String date, Integer deptId, String userId) {
-        return reportService.getReportTimeLessThanCardTimeList(date, deptId, userId);
+        //date格式为2024-09, 需要获取该月的第一天和最后一天
+        LocalDate firstDay = LocalDate.parse(date + "-01");
+        LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
+        User user = userMapper.selectById(request.getHeader("TOKEN"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(reportService.getReportTimeLessThanCardTimeList(firstDay, lastDay, deptId, userId, user.getCompanyId(), false));
+        return msg;
     }
 
 

+ 11 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BusinessTrip.java

@@ -1,20 +1,20 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import java.time.LocalDate;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.util.List;
-
+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;
+import java.util.List;
+
 /**
  * <p>
  * 
@@ -33,6 +33,10 @@ public class BusinessTrip extends Model<BusinessTrip> {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+
+    @TableField(exist = false)
+    private String cCcxmNo;
+
     @TableField("company_id")
     private Integer companyId;
 

+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ErpOrderInfo.java

@@ -8,6 +8,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.util.Date;
+
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
@@ -34,4 +36,16 @@ public class ErpOrderInfo extends Model<ErpOrderInfo> {
 
     @TableField("moDId")
     private String MoDId;
+
+    @TableField("rels_date")
+    private Date relsDate;
+
+    @TableField(exist = false)
+    private Integer pageIndex;
+
+    @TableField(exist = false)
+    private Integer pageSize;
+
+    @TableField(exist = false)
+    private String trueProjectId;
 }

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2025-04-13
+ * @since 2025-04-14
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -668,6 +668,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("report_extra_field5_name")
     private String reportExtraField5Name;
 
+    /**
+     * 审核提醒方式:0-定时提醒,1-实时提醒
+     */
+    @TableField("alert_audit_mode")
+    private Integer alertAuditMode;
+
 
     @TableField(exist = false)
     private List<User> userList;

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserFvTime.java

@@ -66,6 +66,9 @@ public class UserFvTime extends Model<UserFvTime> {
     @TableField("cancel_normal")
     private Integer cancelNormal;
 
+    @TableField(exist = false)
+    private String name;
+
 
     @Override
     protected Serializable pkVal() {

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/OtherTaskFileInfoVO.java~

@@ -0,0 +1,22 @@
+package com.management.platform.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+@Data
+public class OtherTaskFileInfoVO {
+    private Integer projectId;
+    private String projectName;
+    private Integer taskId;
+    private String taskName;
+    @JsonIgnore
+    private String creatorId;//文件上传人id
+    private String creatorName;
+
+    private String documentName;
+    private String fileUrl;
+    private String finalChargeId;
+    private String finalChargeName;
+
+    private Integer groupId;
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java

@@ -23,5 +23,5 @@ public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
 
     void batchInsert(@Param("resList") List<BusinessTrip> resList);
 
-    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds,@Param("companyId") Integer companyId);
 }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BustripProjectMapper.java

@@ -2,6 +2,9 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.BustripProject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface BustripProjectMapper extends BaseMapper<BustripProject> {
 
+    List<BustripProject> getByDate(@Param("date") String date, @Param("userId") String userId);
 }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ErpOrderInfoMapper.java

@@ -12,4 +12,8 @@ public interface ErpOrderInfoMapper extends BaseMapper<ErpOrderInfo> {
     void batchInsert(@Param("resList") List<ErpOrderInfo> resList);
 
     List<String> getExistIds(@Param("moIds") List<String> moIds);
+
+    List<ErpOrderInfo> getPageInfo(@Param("erpOrderInfo") ErpOrderInfo erpOrderInfo);
+
+    List<ErpOrderInfo> getWithProject(@Param("erpIds") List<String> erpIds,@Param("specialCompanyId") int specialCompanyId);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java

@@ -30,5 +30,5 @@ public interface LeaveSheetMapper extends BaseMapper<LeaveSheet> {
 
     void batchInsert(@Param("resList") List<LeaveSheet> resList);
 
-    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds,@Param("companyId") Integer companyId);
 }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectCategoryMapper.java

@@ -2,6 +2,9 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.ProjectCategory;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ProjectCategoryMapper extends BaseMapper<ProjectCategory> {
 
+    List<String> getExistIds(@Param("citemccodes") List<String> citemccodes, @Param("companyId") Integer companyId);
+
+    void batchInsert(@Param("toAddList") List<ProjectCategory> toAddList);
 }

+ 2 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -2,16 +2,13 @@ package com.management.platform.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.Project;
-import com.management.platform.entity.TaskGroup;
 import com.management.platform.entity.vo.CustomerProject;
 import com.management.platform.entity.vo.ProjectWithStage;
 import com.management.platform.entity.vo.StageCost;
 import com.management.platform.entity.vo.UserCateTimeVo;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
-import org.omg.CORBA.INTERNAL;
 
-import java.time.LocalDate;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -265,5 +262,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
     public List<Integer> getRelatedProjectIds(@Param("userId")String userId,@Param("companyId") Integer companyId);
 
 
+    List<String> getExistIds(@Param("projectCodes") List<String> projectCodes,@Param("companyId") Integer companyId);
 
+    void batchInsert(@Param("toAddList") List<Project> toAddList);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserFvTimeMapper.java

@@ -20,5 +20,5 @@ public interface UserFvTimeMapper extends BaseMapper<UserFvTime> {
 
     void batchInsertCollect(@Param("resList") List<UserFvTime> resList);
 
-    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds,@Param("companyId") Integer companyId);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ErpOrderInfoService.java

@@ -8,4 +8,6 @@ import javax.servlet.http.HttpServletRequest;
 
 public interface ErpOrderInfoService extends IService<ErpOrderInfo> {
     HttpRespMsg getInfoByProjectId(String projectId, HttpServletRequest request);
+
+    HttpRespMsg getInfoPage(ErpOrderInfo erpOrderInfo, HttpServletRequest request);
 }

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -171,8 +171,10 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getCurAuditNode(String date, String userId);
 
-    HttpRespMsg getReportTimeLessThanCardTimeList(String date, Integer deptId, String userId);
+    List<Map<String, Object>> getReportTimeLessThanCardTimeList(LocalDate firstDay, LocalDate lastDay, Integer deptId, String userId, Integer companyId, boolean getAll);
 
     HttpRespMsg listByStateNew(Integer state, Integer departmentId, Integer projectId, String date, String startDate, String endDate, String userId, String auditUserId, HttpServletRequest request);
 
+    void checkAndAlertFVReportTimeLessThanCardTimeList(LocalDate startDate, LocalDate endDate, Integer companyId);
+
 }

+ 50 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ErpOrderInfoServiceImpl.java

@@ -7,11 +7,17 @@ import com.management.platform.mapper.ErpOrderInfoMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ErpOrderInfoService;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class ErpOrderInfoServiceImpl extends ServiceImpl<ErpOrderInfoMapper, ErpOrderInfo> implements ErpOrderInfoService {
@@ -31,7 +37,50 @@ public class ErpOrderInfoServiceImpl extends ServiceImpl<ErpOrderInfoMapper, Erp
                 .eq(ErpOrderInfo::getProjectId, projectId)
                 .ne(ErpOrderInfo::getStatus, 4)
         );
-        httpRespMsg.setData(erpOrderInfos);
+        List<String> orderIds = new ArrayList<>();
+        List<Integer> lines = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(erpOrderInfos)){
+            orderIds = erpOrderInfos.stream().map(ErpOrderInfo::getOrderId).distinct().collect(Collectors.toList());
+            lines = erpOrderInfos.stream().map(ErpOrderInfo::getLine).distinct().collect(Collectors.toList());
+        }
+        Map<String,Object> map = new HashMap<>();
+        map.put("orderIds",orderIds);
+        map.put("lines",lines);
+        httpRespMsg.setData(map);
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getInfoPage(ErpOrderInfo erpOrderInfo, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+//        User user = userMapper.selectById(request.getHeader("Token"));
+//        int i = (erpOrderInfo.getPageIndex() - 1) * erpOrderInfo.getPageSize();
+//        System.out.println("i==== "+i);
+//        IPage<ErpOrderInfo> page = new Page<>(i,erpOrderInfo.getPageSize());
+////        page.setCurrent();
+////        page.setSize(erpOrderInfo.getPageSize());
+        LambdaQueryWrapper<ErpOrderInfo> lqw = new LambdaQueryWrapper<>();
+        if(StringUtils.isNotBlank(erpOrderInfo.getOrderId())){
+            lqw.like(ErpOrderInfo::getOrderId, erpOrderInfo.getOrderId());
+        }
+        if(StringUtils.isNotBlank(erpOrderInfo.getProjectId())){
+            lqw.like(ErpOrderInfo::getProjectId, erpOrderInfo.getProjectId());
+        }
+        if(StringUtils.isNotBlank(erpOrderInfo.getProjectName())){
+            lqw.like(ErpOrderInfo::getProjectName, erpOrderInfo.getProjectName());
+        }
+        if(null != erpOrderInfo.getLine()){
+            lqw.eq(ErpOrderInfo::getLine, erpOrderInfo.getLine());
+        }
+        lqw.eq(ErpOrderInfo::getStatus, 3);
+        Integer count = erpOrderInfoMapper.selectCount(lqw);
+//        lqw.eq(ErpOrderInfo::getStatus, 3).orderByDesc(ErpOrderInfo::getRelsDate).orderByDesc(ErpOrderInfo::getId);
+//        IPage<ErpOrderInfo> erpOrderInfoIPage = erpOrderInfoMapper.selectPage(page, lqw);
+        List<ErpOrderInfo> list = erpOrderInfoMapper.getPageInfo(erpOrderInfo);
+        Map<String,Object> map = new HashMap<>();
+        map.put("total",count);
+        map.put("data",list);
+        httpRespMsg.setData(map);
         return httpRespMsg;
     }
 }

+ 287 - 99
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -91,6 +91,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private TaskGroupMapper taskGroupMapper;
     @Resource
     private ReportDeleteService reportDeleteService;
+    @Resource
+    private UserFvTimeMapper userFvTimeMapper;
 
     @Resource
     private DepartmentService departmentService;
@@ -111,8 +113,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private SysFunctionMapper sysFunctionMapper;
     @Resource
-    private UserFvTimeMapper userFvTimeMapper;
-    @Resource
     private ProjectBasecostSettingMapper projectBasecostSettingMapper;
     @Resource
     private UserDingdingTimeMapper userDingdingTimeMapper;
@@ -229,6 +229,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private CompanyDictMapper companyDictMapper;
     @Value(value = "${upload.path}")
     private String path;
+    @Autowired
+    private BusinessTripMapper businessTripMapper;
+    @Autowired
+    private BustripProjectMapper bustripProjectMapper;
 
 
     //获取报告列表
@@ -848,6 +852,19 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             });
             resultMap.put("report", reports);
+            if(CollectionUtils.isEmpty(reports)){
+                List<BustripProject> businessTrips = bustripProjectMapper.getByDate(date,userId);
+//                List<BusinessTrip> businessTrips = bustripProjectMapper.selectList(new LambdaQueryWrapper<BusinessTrip>()
+//                        .eq(BusinessTrip::getOwnerId, userId)
+//                        .lt(BusinessTrip::getStartDate,date)
+//                        .gt(BusinessTrip::getEndDate,date)
+//                );
+//                if(CollectionUtils.isNotEmpty(businessTrips)){
+//                    resultMap.put("businessTrips",businessTrips);
+//                }
+                resultMap.put("businessTrips",businessTrips);
+
+            }
             boolean showRefresh = false;
             if (timeType.getShowDdCardtime() == 1) {
                 List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
@@ -1321,6 +1338,44 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
                 }
             }
+            //如果是实时提醒审核,需要立即发送消息通知
+            if (timeType.getAlertAuditMode() == 1 && reportList.get(0).getState() == 0) {
+                //检查是否为企业微信用户
+                WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+                if (wxCorpInfo != null) {
+                    for (Report report : reportList) {
+                        String corpwxUserid = userMapper.selectById(report.getProjectAuditorId()).getCorpwxUserid();
+                        //推送到企业微信
+                        JSONObject json=new JSONObject();
+                        JSONArray dataJson=new JSONArray();
+                        JSONObject jsonObj=new JSONObject();
+                        if (timeType.getAlertType() == 4) {
+                            jsonObj.put("key", "提示");
+                            String msgContent = timeType.getAlertCheckMsg();
+                            if (StringUtils.isEmpty(msgContent)) {
+                                msgContent = "待审核数量:"+1;
+                            } else {
+                                msgContent = msgContent.replace("{0}", "1");
+                            }
+                            jsonObj.put("value",msgContent);
+                        } else {
+                            jsonObj.put("key", "待审核数量");
+                            jsonObj.put("value","1");
+                        }
+                        dataJson.add(jsonObj);
+//                        if(isPrivateDeploy){
+//                            json.put("content","待审核数量: "+1+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去审核</a>");
+//                        }else {
+                            String templateId = timeType.getAlertType() == 4 ? "tty9TkCAAAtDDCqY796mGulF9c5Jmwng":"tty9TkCAAAuPvPjabDdQXGocnG0K24EQ";
+                            json.put("template_id",templateId);
+                            json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=review#wechat_redirect");
+                            json.put("content_item",dataJson);
+//                        }
+//                        System.out.println("发送企业微信消息==用户:"+corpwxUserid+", "+json.toJSONString());
+                        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpwxUserid, json);
+                    }
+                }
+            }
         } else {
             //没有需要更新的,则
         }
@@ -1993,6 +2048,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+
+
     //获取待审核项目报告列表
     @Override
     public HttpRespMsg getListByState(Integer state, Integer departmentId,
@@ -10775,83 +10832,166 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg getReportTimeLessThanCardTimeList(String date, Integer deptId, String userId) {
+    public void checkAndAlertFVReportTimeLessThanCardTimeList(LocalDate startDate, LocalDate endDate, Integer companyId) {
+        List<Map<String, Object>> data = getReportTimeLessThanCardTimeList(startDate, endDate, null,null, companyId, true);
+        if (data.size() > 0) {
+            //发送企业微信消息提醒,给员工和系统管理员
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            String wxUserIds = userList.stream().map(User::getCorpwxUserid).collect(Collectors.joining("|"));
+            wxCorpInfoService.sendWXCorpMsg(wxCorpInfo, wxUserIds,  "您最近一周内考勤工时填报存在异常,请及时修正!", null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_ABNOEMAL);
+
+//            for (Map<String, Object> map : data) {
+//                String userId = String.valueOf(map.get("userId"));
+//                String userName = String.valueOf(map.get("userName"));
+//                }
+            //给管理员发送
+            List<User> adminList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("role_name", "系统管理员"));
+            String adminIds = adminList.stream().map(User::getCorpwxUserid).collect(Collectors.joining("|"));
+            wxCorpInfoService.sendWXCorpMsg(wxCorpInfo, adminIds, "员工最近一周内考勤工时填报存在异常,请关注!", null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_ABNOEMAL);
+
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> getReportTimeLessThanCardTimeList(LocalDate firstDay, LocalDate lastDay, Integer deptId, String userId, Integer companyId, boolean getAll) {
         //获取自己的考勤未填满的记录
-        User user = userMapper.selectById(request.getHeader("token"));
-        Integer companyId = user.getCompanyId();
-        //获取考勤表记录
-        List<UserCorpwxTime> userCorpwxTimeList = new ArrayList<>();
-        //date格式为2024-09, 需要获取该月的第一天和最后一天
-        LocalDate firstDay = LocalDate.parse(date + "-01");
-        LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
-        //检查权限,有查看全公司数值的权限
-        boolean canViewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全公司工时");
+        boolean canViewAll = getAll;
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        User user = !canViewAll ? userMapper.selectById(request.getHeader("token")) : null;
+        if (!canViewAll) {
+            //检查权限,有查看全公司数值的权限
+            canViewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全公司工时");
+        }
+
         List<User> manageUserList = new ArrayList<>();
-        if (canViewAll) {
-            if (!StringUtils.isEmpty(userId)) {
-                User findUser = userMapper.selectById(userId);
-                if (findUser != null) {
-                    userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).eq("corpwx_userid", findUser.getCorpwxUserid()).between("create_date", firstDay, lastDay));
-                    manageUserList.add(findUser);
-                }
-            } else  if (deptId != null) {
-                //按部门过滤
-                List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                List<Integer> allSubDeptIds = departmentService.getDeptIncludeSubDeptIds(deptId, allDeptList);
-                manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allSubDeptIds));
-                if (manageUserList.size() > 0) {
-                    List<String> collect = manageUserList.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
-                    userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("corpwx_userid", collect).between("create_date", firstDay, lastDay));
-                }
-            } else {
-                userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).between("create_date", firstDay, lastDay));
-                manageUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-            }
-        } else {
-            //是否是部门负责人
-            List<Integer> allDeptIds = getAllVisibleDeptIdList(user, departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId)));
-            if (allDeptIds.size() > 0) {
+        List<UserCorpwxTime> userCorpwxTimeList = new ArrayList<>();
+        List<UserFvTime> userFvTimeList = new ArrayList<>();
+        if (timeType.getSyncCorpwxTime() == 1) {
+            //获取考勤表记录
+            if (canViewAll) {
                 if (!StringUtils.isEmpty(userId)) {
                     User findUser = userMapper.selectById(userId);
                     if (findUser != null) {
+                        userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).eq("corpwx_userid", findUser.getCorpwxUserid()).between("create_date", firstDay, lastDay));
                         manageUserList.add(findUser);
                     }
-                } else if (deptId != null) {
+                } else  if (deptId != null) {
                     //按部门过滤
-                    if (allDeptIds.contains(deptId)) {
-                        List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                        List<Integer> allSubDeptIds = departmentService.getDeptIncludeSubDeptIds(deptId, allDeptList);
-                        manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allSubDeptIds));
+                    List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                    List<Integer> allSubDeptIds = departmentService.getDeptIncludeSubDeptIds(deptId, allDeptList);
+                    manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allSubDeptIds));
+                    if (manageUserList.size() > 0) {
+                        List<String> collect = manageUserList.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+                        userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("corpwx_userid", collect).between("create_date", firstDay, lastDay));
                     }
                 } else {
-                    //取部门的人员
-                    manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allDeptIds));
+                    userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).between("create_date", firstDay, lastDay));
+                    manageUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 }
-                //如果自己不在manageUserList中,加进去
-                if (!manageUserList.stream().anyMatch(u -> u.getId().equals(user.getId()))) {
+            } else {
+                //是否是部门负责人
+                List<Integer> allDeptIds = getAllVisibleDeptIdList(user, departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId)));
+                if (allDeptIds.size() > 0) {
+                    if (!StringUtils.isEmpty(userId)) {
+                        User findUser = userMapper.selectById(userId);
+                        if (findUser != null) {
+                            manageUserList.add(findUser);
+                        }
+                    } else if (deptId != null) {
+                        //按部门过滤
+                        if (allDeptIds.contains(deptId)) {
+                            List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                            List<Integer> allSubDeptIds = departmentService.getDeptIncludeSubDeptIds(deptId, allDeptList);
+                            manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allSubDeptIds));
+                        }
+                    } else {
+                        //取部门的人员
+                        manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allDeptIds));
+                    }
+                    //如果自己不在manageUserList中,加进去
+                    if (!manageUserList.stream().anyMatch(u -> u.getId().equals(user.getId()))) {
+                        manageUserList.add(user);
+                    }
+                    List<String> userCorpwxidList = manageUserList.stream().filter(u->u.getCorpwxUserid() != null).map(User::getCorpwxUserid).collect(Collectors.toList());
+                    if (userCorpwxidList.size() > 0) {
+                        userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("corpwx_userid", userCorpwxidList).between("create_date", firstDay, lastDay));
+                    }
+                    //如果存在corpwxUserid位空的用户,按姓名匹配
+                    List<String> nameList = manageUserList.stream().filter(u->u.getCorpwxUserid() == null).map(User::getName).collect(Collectors.toList());
+                    if (nameList.size() == 0) {
+                        userCorpwxTimeList.addAll(userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("name", nameList).between("create_date", firstDay, lastDay)));
+                    }
+                } else {
+                    //个人看自己的
+                    if (user.getCorpwxUserid() != null) {
+                        userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).eq("corpwx_userid", user.getCorpwxUserid()).between("create_date", firstDay, lastDay));
+                    } else {
+                        userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).eq("name", user.getName()).between("create_date", firstDay, lastDay));
+                    }
                     manageUserList.add(user);
                 }
-                List<String> userCorpwxidList = manageUserList.stream().filter(u->u.getCorpwxUserid() != null).map(User::getCorpwxUserid).collect(Collectors.toList());
-                if (userCorpwxidList.size() > 0) {
-                    userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("corpwx_userid", userCorpwxidList).between("create_date", firstDay, lastDay));
-                }
-                //如果存在corpwxUserid位空的用户,按姓名匹配
-                List<String> nameList = manageUserList.stream().filter(u->u.getCorpwxUserid() == null).map(User::getName).collect(Collectors.toList());
-                if (nameList.size() == 0) {
-                    userCorpwxTimeList.addAll(userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("name", nameList).between("create_date", firstDay, lastDay)));
+            }
+        } else if (timeType.getSyncFanwei() == 1) {
+            //获取user_fv_time表的考勤记录
+            if (canViewAll) {
+                if (!StringUtils.isEmpty(userId)) {
+                    User findUser = userMapper.selectById(userId);
+                    if (findUser != null) {
+                        userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>().eq("company_id", companyId).eq("user_id", userId).between("create_date", firstDay, lastDay));
+                        manageUserList.add(findUser);
+                    }
+                } else  if (deptId != null) {
+                    //按部门过滤
+                    List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                    List<Integer> allSubDeptIds = departmentService.getDeptIncludeSubDeptIds(deptId, allDeptList);
+                    manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allSubDeptIds));
+                    if (manageUserList.size() > 0) {
+                        List<String> collect = manageUserList.stream().map(User::getId).collect(Collectors.toList());
+                        userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>().eq("company_id", companyId).in("user_id", collect).between("create_date", firstDay, lastDay));
+                    }
+                } else {
+                    userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>().eq("company_id", companyId).between("create_date", firstDay, lastDay));
+                    manageUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 }
             } else {
-                //个人看自己的
-                if (user.getCorpwxUserid() != null) {
-                    userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).eq("corpwx_userid", user.getCorpwxUserid()).between("create_date", firstDay, lastDay));
+                //是否是部门负责人
+                List<Integer> allDeptIds = getAllVisibleDeptIdList(user, departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId)));
+                if (allDeptIds.size() > 0) {
+                    if (!StringUtils.isEmpty(userId)) {
+                        User findUser = userMapper.selectById(userId);
+                        if (findUser != null) {
+                            manageUserList.add(findUser);
+                        }
+                    } else if (deptId != null) {
+                        //按部门过滤
+                        if (allDeptIds.contains(deptId)) {
+                            List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                            List<Integer> allSubDeptIds = departmentService.getDeptIncludeSubDeptIds(deptId, allDeptList);
+                            manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allSubDeptIds));
+                        }
+                    } else {
+                        //取部门的人员
+                        manageUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", allDeptIds));
+                    }
+                    //如果自己不在manageUserList中,加进去
+                    if (!manageUserList.stream().anyMatch(u -> u.getId().equals(user.getId()))) {
+                        manageUserList.add(user);
+                    }
+                    List<String> userIdList = manageUserList.stream().map(User::getId).collect(Collectors.toList());
+                    if (userIdList.size() > 0) {
+                        userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>().eq("company_id", companyId).in("user_id", userIdList).between("create_date", firstDay, lastDay));
+                    }
                 } else {
-                    userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).eq("name", user.getName()).between("create_date", firstDay, lastDay));
+                    //个人看自己的
+                    userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>().eq("company_id", companyId).eq("user_id", user.getId()).between("create_date", firstDay, lastDay));
+                    manageUserList.add(user);
                 }
-                manageUserList.add(user);
             }
         }
 
 
+
         //获取填报工时记录表
         List<Report> reportList = new ArrayList<>();
         if (canViewAll && StringUtils.isEmpty(userId) && deptId == null) {
@@ -10871,47 +11011,82 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //比对userCorpwxTimeList和reportList,找出工时未填满的记录
         List<Map<String, Object>> resultList = new ArrayList<>();
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        for (UserCorpwxTime corpwxTime : userCorpwxTimeList) {
-            boolean isMatch = true;
-            double reportTime = 0;
-            User targetUser = null;
-            if (corpwxTime.getCorpwxUserid() != null) {
-                Optional<User> first = manageUserList.stream().filter(u -> corpwxTime.getCorpwxUserid().equals(u.getCorpwxUserid())).findFirst();
-                if (first.isPresent()) {
-                    targetUser = first.get();
+        if (timeType.getSyncCorpwxTime() == 1) {
+            for (UserCorpwxTime corpwxTime : userCorpwxTimeList) {
+                boolean isMatch = true;
+                double reportTime = 0;
+                User targetUser = null;
+                if (corpwxTime.getCorpwxUserid() != null) {
+                    Optional<User> first = manageUserList.stream().filter(u -> corpwxTime.getCorpwxUserid().equals(u.getCorpwxUserid())).findFirst();
+                    if (first.isPresent()) {
+                        targetUser = first.get();
+                    }
+                } else {
+                    Optional<User> first = manageUserList.stream().filter(u -> u.getName().equals(corpwxTime.getName())).findFirst();
+                    if (first.isPresent()) {
+                        targetUser = first.get();
+                    }
+                }
+                if (targetUser != null) {
+                    for (Report report : reportList) {
+                        if (report.getCreatorId().equals(targetUser.getId()) && corpwxTime.getCreateDate().isEqual(report.getCreateDate())) {
+                            reportTime = report.getWorkingTime();
+                            //不一致
+                            if (Math.abs(corpwxTime.getWorkHours() - report.getWorkingTime()) > 0.01) {
+                                isMatch = false;
+                                //设置人员姓名
+                                if (corpwxTime.getName() == null) {
+                                    corpwxTime.setName(targetUser.getName());
+                                }
+                            }
+                            break;
+                        }
+                    }
                 }
-            } else {
-                Optional<User> first = manageUserList.stream().filter(u -> u.getName().equals(corpwxTime.getName())).findFirst();
-                if (first.isPresent()) {
-                    targetUser = first.get();
+
+                if (!isMatch) {
+                    Map<String, Object> map = new HashMap<>();
+                    if (targetUser != null) {
+                        map.put("userId", targetUser.getId());
+                    }
+                    map.put("name", corpwxTime.getName());
+                    map.put("createDate", dateTimeFormatter.format(corpwxTime.getCreateDate()));
+                    map.put("workHours", corpwxTime.getWorkHours());
+                    map.put("reportTime", reportTime);
+                    resultList.add(map);
                 }
             }
-            if (targetUser != null) {
-                for (Report report : reportList) {
-                    if (report.getCreatorId().equals(targetUser.getId()) && corpwxTime.getCreateDate().isEqual(report.getCreateDate())) {
-                        reportTime = report.getWorkingTime();
-                        //不一致
-                        if (Math.abs(corpwxTime.getWorkHours() - report.getWorkingTime()) > 0.01) {
-                            isMatch = false;
-                            //设置人员姓名
-                            if (corpwxTime.getName() == null) {
-                                corpwxTime.setName(targetUser.getName());
+        } else if (timeType.getSyncFanwei() == 1) {
+            for (UserFvTime fvTime : userFvTimeList) {
+                boolean isMatch = true;
+                double reportTime = 0;
+                User targetUser = manageUserList.stream().filter(u -> fvTime.getUserId().equals(u.getId())).findFirst().get();;
+                if (targetUser != null) {
+                    for (Report report : reportList) {
+                        if (report.getCreatorId().equals(targetUser.getId()) && fvTime.getWorkDate().isEqual(report.getCreateDate())) {
+                            reportTime = report.getWorkingTime();
+                            //不一致
+                            if (Math.abs(fvTime.getWorkHours() - report.getWorkingTime()) > 0.01) {
+                                isMatch = false;
+                                fvTime.setName(targetUser.getName());
                             }
+                            break;
                         }
-                        break;
                     }
                 }
-            }
 
-            if (!isMatch) {
-                Map<String, Object> map = new HashMap<>();
-                map.put("name", corpwxTime.getName());
-                map.put("createDate", dateTimeFormatter.format(corpwxTime.getCreateDate()));
-                map.put("workHours", corpwxTime.getWorkHours());
-                map.put("reportTime", reportTime);
-                resultList.add(map);
+                if (!isMatch) {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("userId", fvTime.getUserId());
+                    map.put("name", fvTime.getName());
+                    map.put("createDate", dateTimeFormatter.format(fvTime.getWorkDate()));
+                    map.put("workHours", fvTime.getWorkHours());
+                    map.put("reportTime", reportTime);
+                    resultList.add(map);
+                }
             }
         }
+
         //反向,检测有填报日报但是没有考勤的数据
         for (Report report : reportList) {
             boolean hasCardTime = false;
@@ -10920,29 +11095,42 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 continue;
             }
             User targetUser = first.get();
-            for (UserCorpwxTime corpwxTime : userCorpwxTimeList) {
-                if ((targetUser.getCorpwxUserid() != null && targetUser.getCorpwxUserid().equals(corpwxTime.getCorpwxUserid()))
-                    || (targetUser.getCorpwxUserid() == null && targetUser.getName().equals(corpwxTime.getName()))) {
-                    //人员匹配上了,匹配日期
-                    if (corpwxTime.getCreateDate().isEqual(report.getCreateDate())) {
-                        if (corpwxTime.getWorkHours() > 0) {
+            if (timeType.getSyncCorpwxTime() == 1) {
+                for (UserCorpwxTime corpwxTime : userCorpwxTimeList) {
+                    if ((targetUser.getCorpwxUserid() != null && targetUser.getCorpwxUserid().equals(corpwxTime.getCorpwxUserid()))
+                            || (targetUser.getCorpwxUserid() == null && targetUser.getName().equals(corpwxTime.getName()))) {
+                        //人员匹配上了,匹配日期
+                        if (corpwxTime.getCreateDate().isEqual(report.getCreateDate())) {
+                            if (corpwxTime.getWorkHours() > 0) {
+                                hasCardTime = true;
+                            }
+                            break;
+                        }
+                    }
+                }
+            } else if (timeType.getSyncFanwei() == 1) {
+                for (UserFvTime fvTime : userFvTimeList) {
+                    //人员/日期匹配
+                    if (targetUser.getId().equals(fvTime.getUserId()) && fvTime.getWorkDate().isEqual(report.getCreateDate())) {
+                        if (fvTime.getWorkHours() > 0) {
                             hasCardTime = true;
                         }
                         break;
                     }
                 }
             }
+
             if (!hasCardTime) {
                 Map<String, Object> map = new HashMap<>();
-                map.put("name", user.getName());
+                map.put("userId", targetUser.getId());
+                map.put("name", targetUser.getName());
                 map.put("createDate", dateTimeFormatter.format(report.getCreateDate()));
                 map.put("workHours", 0);
                 map.put("reportTime", report.getWorkingTime());
                 resultList.add(map);
             }
         }
-        HttpRespMsg msg = new HttpRespMsg();
-        msg.setData(resultList);
-        return msg;
+
+        return resultList;
     }
 }

File diff suppressed because it is too large
+ 1088 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java~


+ 8 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1145,6 +1145,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     if (time < 0) {
                         time = 0;
                     } else {
+                        //盛立
                         if (corpInfo.getCompanyId() == 481) {
                             time = DateTimeUtil.getHalfHoursFromDouble(time);
                         } else {
@@ -1306,6 +1307,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     //获取上下午考勤规则中的工作时长
                     double baseMorningWorkTime = 0;
                     double baseAfternoonWorkTime = 0;
+                    //赛元微电子的处理
                     if (corpInfo.getCorpid().equals("wpy9TkCAAAgNp4jvqxKTpXrhvwFvyFHg")) {
                         if (workRules.size() > 0) {
                             JSONObject morTime = workRules.getJSONObject(0);
@@ -1347,7 +1349,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     } else {
                         restTime = 1.0 * (workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec")) / 3600;
                     }
-
                     LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
                     UserCorpwxTime ct = new UserCorpwxTime();
                     ct.setCompanyId(corpInfo.getCompanyId());
@@ -1629,6 +1630,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 }
                             }
                         }
+                        if (corpInfo.getCompanyId() == 469 || corpInfo.getCompanyId() == 7) {
+                            needRecaculate = true;//赛元微电子,都需要重新计算
+                        }
                         double timeDelta = 0;
                         //时间有变化,需要重新计算
                         if (needRecaculate) {
@@ -1811,7 +1815,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                         workTime -= restTime;
                                     }
                                     ct.setCardTime(workTime);
-                                    double calTime = DateTimeUtil.getHoursFromDouble(workTime) - ct.getAskLeaveTime();
+                                    double calTime = workTime - ct.getAskLeaveTime();
                                     if (calTime < 8.0 && ct.getOutdoorTime() > 0) {
                                         calTime += ct.getOutdoorTime();
                                     }
@@ -1819,7 +1823,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                         //给盛立安元0.5单位进位
                                         ct.setWorkHours(DateTimeUtil.getHalfHoursFromDouble(calTime));
                                     } else {
-                                        ct.setWorkHours(calTime);
+                                        ct.setWorkHours(DateTimeUtil.getHoursFromDouble(calTime));
                                     }
                                     if (showLog) System.out.println("workTime="+workTime+", 二次校正后workHours="+ct.getWorkHours());
                                 }
@@ -1871,7 +1875,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     //有工作时长或者打卡时长或者请假时长,外出时长,都算有效时间
                     boolean hasTimeRecord = ct.getWorkHours() > 0 || ct.getCardTime() >= 1.0 || ct.getAskLeaveTime() > 0 || ct.getOutdoorTime() > 0;
                     //对于赛元微电子,2025年4月1日之前的都不做处理,防止把数据覆盖掉
-                    if(corpInfo.getCompanyId() == 469 && ct.getCreateDate().isBefore(LocalDate.of(2025, 4, 1))) {
+                    if(corpInfo.getCompanyId() == 469 && ct.getCreateDate().isBefore(LocalDate.of(2025, 4, 14))) {
                         System.out.println("赛元微电子Skip");
                         continue;
                     }

+ 213 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java

@@ -1,15 +1,12 @@
 package com.management.platform.task;
 
-import com.management.platform.entity.BusinessTrip;
-import com.management.platform.entity.ErpOrderInfo;
-import com.management.platform.entity.LeaveSheet;
-import com.management.platform.entity.UserFvTime;
-import com.management.platform.mapper.BusinessTripMapper;
-import com.management.platform.mapper.ErpOrderInfoMapper;
-import com.management.platform.mapper.LeaveSheetMapper;
-import com.management.platform.mapper.UserFvTimeMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.*;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -37,13 +34,25 @@ public class DataCollectTask {
     @Resource
     private ErpOrderInfoMapper erpOrderInfoMapper;
 
+    @Resource
+    private ProjectMapper projectMapper;
+
+    @Resource
+    private ProjectCategoryMapper projectCategoryMapper;
+
     private static final String PREFIX_URL = "http://58.210.104.138:10020";
 
+    private static final int specialCompanyId = 7536;
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private BustripProjectMapper bustripProjectMapper;
 
 
     @Scheduled(cron = "0 0 1 * * ?")
+    @Async
     public void sqlServerTask() {
-        System.out.println("开始测试任务定时=======================");
         RestTemplate restTemplate = new RestTemplate();
         String sumUrl = PREFIX_URL+"/dataCollect/getSqlServerDataSum";
         String listUrl = PREFIX_URL+"/dataCollect/getSqlServerDataList";
@@ -137,6 +146,9 @@ public class DataCollectTask {
                 int offset = 0;
                 List<UserFvTime> toAddList = new ArrayList<>();
                 List<UserFvTime> toUpdateList = new ArrayList<>();
+                List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, specialCompanyId));
+                Map<String, User> userMap = users.stream().filter(t -> StringUtils.isNotBlank(t.getJobNumber()))
+                        .collect(Collectors.toMap(User::getJobNumber, t -> t));
                 while (offset < totalNum) {
                     HttpHeaders headers = new HttpHeaders();
                     headers.setContentType(MediaType.APPLICATION_JSON);
@@ -153,8 +165,12 @@ public class DataCollectTask {
                     if (listResponse.getStatusCode() == HttpStatus.OK) {
                         List<UserFvTime> dataList = listResponse.getBody();
                         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            for (UserFvTime userFvTime : dataList) {
+                                User tmp = userMap.get(userFvTime.getUserId());
+                                userFvTime.setUserId(null==tmp?null:tmp.getId());
+                            }
                             List<String> collect = dataList.stream().map(UserFvTime::getProcinstId).distinct().collect(Collectors.toList());
-                            List<String> existIds = userFvTimeMapper.getExistIds(collect);
+                            List<String> existIds = userFvTimeMapper.getExistIds(collect,specialCompanyId);
                             if(!CollectionUtils.isEmpty(existIds)){
                                 toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
                                 toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
@@ -185,6 +201,7 @@ public class DataCollectTask {
     }
 
     @Scheduled(cron = "0 0 2 * * ?")
+    @Async
     public void leaveSheetTask(){
         RestTemplate restTemplate = new RestTemplate();
         String sumUrl = PREFIX_URL + "/dataCollect/getLeaveSheetDataSum";
@@ -208,6 +225,9 @@ public class DataCollectTask {
                 int offset = 0;
                 List<LeaveSheet> toAddList = new ArrayList<>();
                 List<LeaveSheet> toUpdateList = new ArrayList<>();
+                List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, specialCompanyId));
+                Map<String, User> userMap = users.stream().filter(t -> StringUtils.isNotBlank(t.getJobNumber()))
+                        .collect(Collectors.toMap(User::getJobNumber, t -> t));
                 while (offset < totalNum) {
                     HttpHeaders headers = new HttpHeaders();
                     headers.setContentType(MediaType.APPLICATION_JSON);
@@ -224,8 +244,14 @@ public class DataCollectTask {
                     if (listResponse.getStatusCode() == HttpStatus.OK) {
                         List<LeaveSheet> dataList = listResponse.getBody();
                         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            for (LeaveSheet leaveSheet : dataList) {
+                                User ownerTmp = userMap.get(leaveSheet.getOwnerId());
+                                User opTmp = userMap.get(leaveSheet.getOperatorId());
+                                leaveSheet.setOwnerId(null==ownerTmp?null:ownerTmp.getId());
+                                leaveSheet.setOperatorId(null==opTmp?null:opTmp.getId());
+                            }
                             List<String> collect = dataList.stream().map(LeaveSheet::getProcinstId).distinct().collect(Collectors.toList());
-                            List<String> existIds = leaveSheetMapper.getExistIds(collect);
+                            List<String> existIds = leaveSheetMapper.getExistIds(collect,specialCompanyId);
                             if(!CollectionUtils.isEmpty(existIds)){
                                 toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
                                 toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
@@ -255,6 +281,161 @@ public class DataCollectTask {
     }
 
     @Scheduled(cron = "0 30 2 * * ?")
+    @Async
+    public void sqlServerProjectTypeTask() {
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getSqlServerProjectTypeDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getSqlServerProjectTypeDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<ProjectCategory> toAddList = new ArrayList<>();
+                List<ProjectCategory> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<String>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<String>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<String> dataList = listResponse.getBody();
+                        List<ProjectCategory> tmpList = new ArrayList<>();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> existIds = projectCategoryMapper.getExistIds(dataList,specialCompanyId);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                for (String name : dataList) {
+                                    ProjectCategory tmp = new ProjectCategory();
+                                    tmp.setName(name);
+                                    tmp.setCompanyId(specialCompanyId);
+                                    tmpList.add(tmp);
+                                }
+                                toUpdateList.addAll(tmpList.stream().filter(t -> existIds.contains(t.getName())).collect(Collectors.toList()));
+                                toAddList.addAll(tmpList.stream().filter(t -> !existIds.contains(t.getName())).collect(Collectors.toList()));
+                            }else{
+                                for (String name : dataList) {
+                                    ProjectCategory tmp = new ProjectCategory();
+                                    tmp.setName(name);
+                                    tmp.setCompanyId(specialCompanyId);
+                                    tmpList.add(tmp);
+                                }
+                                toAddList.addAll(tmpList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                projectCategoryMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (ProjectCategory projectCategory : toUpdateList) {
+                                    projectCategoryMapper.updateById(projectCategory);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    @Scheduled(cron = "0 0 3 * * ?")
+    @Async
+    public void sqlServerProjectTask() {
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getSqlServerProjectDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getSqlServerProjectDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<Project> toAddList = new ArrayList<>();
+                List<Project> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<Project>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<Project>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<Project> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(Project::getProjectCode).distinct().collect(Collectors.toList());
+                            List<String> existIds = projectMapper.getExistIds(collect,specialCompanyId);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProjectCode())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProjectCode())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                projectMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (Project orderInfo : toUpdateList) {
+                                    projectMapper.updateById(orderInfo);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    @Scheduled(cron = "0 30 3 * * ?")
+    @Async
     public void businessTripTask(){
         RestTemplate restTemplate = new RestTemplate();
         String sumUrl = PREFIX_URL+"/dataCollect/getBusinessTripDataSum";
@@ -278,6 +459,11 @@ public class DataCollectTask {
                 int offset = 0;
                 List<BusinessTrip> toAddList = new ArrayList<>();
                 List<BusinessTrip> toUpdateList = new ArrayList<>();
+                List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, specialCompanyId));
+                Map<String, User> userMap = users.stream().filter(t -> StringUtils.isNotBlank(t.getJobNumber()))
+                        .collect(Collectors.toMap(User::getJobNumber, t -> t));
+                List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, specialCompanyId));
+                Map<String, Project> projectCodeMap = projects.stream().collect(Collectors.toMap(Project::getProjectCode, t -> t));
                 while (offset < totalNum) {
                     HttpHeaders headers = new HttpHeaders();
                     headers.setContentType(MediaType.APPLICATION_JSON);
@@ -294,8 +480,12 @@ public class DataCollectTask {
                     if (listResponse.getStatusCode() == HttpStatus.OK) {
                         List<BusinessTrip> dataList = listResponse.getBody();
                         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            for (BusinessTrip businessTrip : dataList) {
+                                User ownerTmp = userMap.get(businessTrip.getOwnerId());
+                                businessTrip.setOwnerId(null==ownerTmp?null:ownerTmp.getId());
+                            }
                             List<String> collect = dataList.stream().map(BusinessTrip::getProcinstId).distinct().collect(Collectors.toList());
-                            List<String> existIds = businessTripMapper.getExistIds(collect);
+                            List<String> existIds = businessTripMapper.getExistIds(collect,specialCompanyId);
                             if(!CollectionUtils.isEmpty(existIds)){
                                 toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
                                 toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
@@ -303,7 +493,17 @@ public class DataCollectTask {
                                 toAddList.addAll(dataList);
                             }
                             if(!CollectionUtils.isEmpty(toAddList)){
-                                businessTripMapper.batchInsert(toAddList);
+//                                businessTripMapper.batchInsert(toAddList);
+                                for (BusinessTrip businessTrip : toAddList) {
+                                    businessTripMapper.insert(businessTrip);
+                                    BustripProject bustripProject = new BustripProject();
+                                    bustripProject.setBustripId(businessTrip.getId());
+                                    Project project = projectCodeMap.get(businessTrip.getCCcxmNo());
+                                    bustripProject.setProjectId(null == project?null:project.getId());
+                                    bustripProject.setStartDate(businessTrip.getStartDate());
+                                    bustripProject.setEndDate(businessTrip.getEndDate());
+                                    bustripProjectMapper.insert(bustripProject);
+                                }
                             }
                             if(!CollectionUtils.isEmpty(toUpdateList)){
                                 for (BusinessTrip tmp : toUpdateList) {

+ 11 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -952,7 +952,7 @@ public class TimingTask {
         if (isDev) return;
         LocalDateTime now = LocalDateTime.now();
         DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm");
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("wait_check_alert_time", df.format(now.toLocalTime())));
+        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("wait_check_alert_time", df.format(now.toLocalTime())).eq("alert_audit_mode", 0));
         List<Integer> companyIds = timeTypeList.stream().map(TimeType::getCompanyId).distinct().collect(Collectors.toList());
         companyIds.add(-1);
         List<CompanyDingding> list = companyDingdingMapper.getDingdingCompanyList(companyIds);
@@ -2407,4 +2407,14 @@ public class TimingTask {
 
         }
     }
+
+    //每天9点左右针对泓浒(苏州)发送考勤不合规的提醒消息
+    @Scheduled(cron = "0 8 9 ? * *")
+    private void checkHongHuCardTime() {
+        if (isDev) return;
+        LocalDate yestoday = LocalDate.now().minusDays(1);
+        LocalDate startDate = yestoday.minusDays(7);
+        Integer companyId = 7536;//泓浒(苏州)公司Id
+        reportService.checkAndAlertFVReportTimeLessThanCardTimeList(startDate, yestoday, companyId);
+    }
 }

+ 21 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/QRCodeUtil.java

@@ -6,12 +6,14 @@ import com.google.zxing.common.BitMatrix;
 import com.google.zxing.common.HybridBinarizer;
 import com.google.zxing.qrcode.QRCodeWriter;
 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -47,7 +49,7 @@ public class QRCodeUtil {
     }
 
     /**根据路径解析二维码图片*/
-    public static String decodeQRCode(String filePath) throws IOException {
+    public static String decodeQRCodeByPath(String filePath) throws IOException {
         BufferedImage qrCodeImage = ImageIO.read(new File(filePath));
         LuminanceSource source = new BufferedImageLuminanceSource(qrCodeImage);
         BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
@@ -64,4 +66,22 @@ public class QRCodeUtil {
         }
     }
 
+    public static String decodeQRCodeByFile(MultipartFile multipartFile) throws IOException {
+        InputStream inputStream = multipartFile.getInputStream();
+        BufferedImage qrCodeImage = ImageIO.read(inputStream);
+        LuminanceSource source = new BufferedImageLuminanceSource(qrCodeImage);
+        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+
+        try {
+            Map<DecodeHintType, Object> hints = new HashMap<>();
+            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
+
+            Result result = new MultiFormatReader().decode(bitmap, hints);
+            return result.getText();
+        } catch (NotFoundException e) {
+            System.out.println("未找到二维码: " + e.getMessage());
+            return null;
+        }
+    }
+
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml

@@ -77,7 +77,7 @@
     <select id="getExistIds" resultType="java.lang.String">
         select procinst_id
         from business_trip
-        where procinst_id in
+        where company_id = #{companyId} and procinst_id in
         <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
     </select>
 </mapper>

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BustripProjectMapper.xml

@@ -17,5 +17,13 @@
     <sql id="Base_Column_List">
         id, bustrip_id, project_id, start_date, end_date, degree_id, degree_name
     </sql>
+    <select id="getByDate" resultType="com.management.platform.entity.BustripProject">
+        select bp.*
+        from bustrip_project bp
+        left join business_trip bt on bp.bustrip_id = bt.id
+        where bt.owner_id = #{userId}
+        and bp.start_date &lt; str_to_date(#{date},'%Y-%m-%d')
+        and bp.end_date &gt; str_to_date(#{date},'%Y-%m-%d')
+    </select>
 
 </mapper>

+ 29 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ErpOrderInfoMapper.xml

@@ -4,10 +4,10 @@
 <mapper namespace="com.management.platform.mapper.ErpOrderInfoMapper">
 
     <insert id="batchInsert">
-        insert into erp_order_info(order_id, project_id, project_name, line, status)
+        insert into erp_order_info(order_id, project_id, project_name, line, status,rels_date)
         VALUES
             <foreach collection="resList" separator="," item="res">
-                (#{res.orderId},#{res.projectId},#{res.projectName},#{res.line},#{res.status})
+                (#{res.orderId},#{res.projectId},#{res.projectName},#{res.line},#{res.status},#{res.relsDate})
             </foreach>
     </insert>
     <select id="getExistIds" resultType="java.lang.String">
@@ -15,4 +15,31 @@
         from erp_order_info
         where moDId in <foreach collection="moIds" item="moId" separator="," open="(" close=")">#{moId}</foreach>
     </select>
+    <select id="getPageInfo" resultType="com.management.platform.entity.ErpOrderInfo">
+        SELECT id,order_id,project_id,project_name,line,status,moDId,rels_date FROM erp_order_info
+        <where>
+            status = 3
+            <if test="erpOrderInfo.orderId != null and erpOrderInfo.orderId != ''">
+                and order_id like concat('%',#{erpOrderInfo.orderId},'%')
+            </if>
+            <if test="erpOrderInfo.projectId != null and erpOrderInfo.projectId != ''">
+                and project_id like concat('%',#{erpOrderInfo.projectId},'%')
+            </if>
+            <if test="erpOrderInfo.projectName != null and erpOrderInfo.projectName != ''">
+                and project_name like concat('%',#{erpOrderInfo.projectName},'%')
+            </if>
+            <if test="erpOrderInfo.line != null">
+                and line = #{erpOrderInfo.line}
+            </if>
+            ORDER BY rels_date DESC , id DESC
+        </where>
+    </select>
+    <select id="getWithProject" resultType="com.management.platform.entity.ErpOrderInfo">
+        select eoi.id,eoi.order_id,eoi.project_id,eoi.project_name,eoi.line,eoi.status,eoi.moDId,
+               p.id as trueProjectId
+        from erp_order_info eoi
+                 left join project p on eoi.project_id = p.project_code
+        where p.company_id = #{specialCompanyId}
+        and eoi.id in <foreach collection="erpIds" item="erpId" open="(" close=")" separator=",">#{erpId}</foreach>
+    </select>
 </mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml

@@ -111,6 +111,6 @@
     <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>
+        where company_id = #{companyId} and procinst_id in <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
     </select>
 </mapper>

+ 13 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCategoryMapper.xml

@@ -15,5 +15,18 @@
     <sql id="Base_Column_List">
         id, name, company_id, pro_incharger_audit, pro_bu_audit
     </sql>
+    <insert id="batchInsert">
+        insert into project_category(name,company_id)
+        values
+        <foreach collection="toAddList" separator="," item="res">
+            (#{res.name},#{res.companyId})
+        </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select *
+        from project_category
+        where company_id = #{companyId}
+          and name in <foreach collection="citemccodes" item="citemccode" separator="," open="(" close=")">#{citemccode}</foreach>
+    </select>
 
 </mapper>

File diff suppressed because it is too large
+ 13 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml


File diff suppressed because it is too large
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml

@@ -33,7 +33,7 @@
         </foreach>
     </insert>
     <select id="getExistIds" resultType="java.lang.String">
-        select procinst_id from user_fv_time where procinst_id in
+        select procinst_id from user_fv_time where company_id = #{companyId} and procinst_id in
         <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
     </select>
 

+ 9 - 14
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -52,20 +52,15 @@
                 <el-form-item label="任务完成校验" v-if="user.timeType.taskFileCharge">
                     <el-checkbox v-model="addForm.attachFileRequired" >是否必须上传成果文件</el-checkbox>
                 </el-form-item>
-                <el-form-item label="审核人" v-if="showMmeiLaiDe && user.roleId != 2283" prop="checkSecondId">
-                    <div class="customizedReviewer">
-                        <el-select v-model="addForm.checkFirstId" :disabled="true" size="small">
-                            <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                        </el-select>
-                        <div class="reviewImages"> 
-                            <img src="../assets/image/shenhejianto.png" alt="">
-                            <img src="../assets/image/shenhejianto.png" alt="">
-                        </div> 
-                        <el-select v-model="addForm.checkSecondId" :disabled="!addForm.checkFirstId || doYouWantToDisableAll" size="small">
-                            <el-option v-for="item in pmUserList" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                        </el-select>
-                    </div>
-                    
+                <el-form-item label="第一审核人" v-if="showMmeiLaiDe" prop="checkSecondId">
+                    <el-select v-model="addForm.checkFirstId" :disabled="true" size="small">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="第二审核人" v-if="showMmeiLaiDe" prop="checkSecondId">
+                    <el-select v-model="addForm.checkSecondId" :disabled="!addForm.checkFirstId || doYouWantToDisableAll" size="small">
+                        <el-option v-for="item in pmUserList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
                 </el-form-item>
                 <el-form-item  :label="$t('taskdefinition')" prop="name">
                     <el-input v-model="addForm.name" :maxlength="40" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !permissions.editAnyTask && !(groupResponsibleId == user.id)" :placeholder="$t('enterthetaskcontent')" clearable></el-input>

+ 11 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -75,7 +75,7 @@
                     <el-table :data="popoverData" :height="tableHeight" size="small">
                         <el-table-column property="type" :label="$t('other.messageContent')" align="left">
                             <template slot-scope="scope">
-                                <el-link type="primary" :underline="false" @click="locationHerf(scope.row.id,scope.row.content, scope.row.type)">
+                                <el-link type="primary" :underline="false" @click="locationHerf(scope.row.id, scope.row.content, scope.row.type, scope.row)">
                                     <span style="font-size:13px;">
                                         <span v-if="scope.row.msg == null">
                                             {{msgTypeTxt[scope.row.type]}}
@@ -716,7 +716,7 @@
             },
 
             //点击消息的跳转
-            locationHerf(id, date, type) {
+            locationHerf(id, date, type, row) {
                 this.http.post( this.port.manage.check, { id: id },
                 res => {
                     if (res.code == "ok") {
@@ -772,7 +772,15 @@
                             this.$router.push("/projectInside/"+date);
                             this.drawer = false;
                         } else if(type == 11) {
-                            this.$router.push("/list");
+                            console.log(row, '<====== ganttData')
+                            const { taskId, ganttData } = row
+                            this.$router.push({
+                                path: '/list',
+                                query: { 
+                                    messageTaskId: taskId,
+                                    ganttData: JSON.stringify(ganttData || {}) 
+                                }
+                            });
                             this.drawer = false;
                         }
                         

+ 11 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -539,9 +539,10 @@ export default {
                                     if (!name) {
                                         return ''
                                     }
-                                    const unit = yAxisValue == 0 ? _this.$t('yuan') : _this.$t('time.hour');
+                                    const unit = yAxisValue == 0 ? _this.$t('yuan') : 'h';
                                     const totalValue = yAxisValue == 0 ? nameObj[name] && nameObj[name].moneyTol : nameObj[name] && nameObj[name].timeTol;
-                                    return seriesName === cerName ? `${totalValue ? totalValue.toFixed(0) : 0} ${unit}` : '';
+                                    const dayValue = yAxisValue == 0 ? 0 : nameObj[name] && (nameObj[name].timeTol/_this.user.timeType.allday).toFixed(1);
+                                    return seriesName === cerName ? `${totalValue ? totalValue.toFixed(1) : 0} ${unit}${yAxisValue == 0?'':('/'+dayValue+'人天')}` : '';
                                 }
                             }
                         }
@@ -739,7 +740,7 @@ export default {
             const { countCost, countHours } = this.permissions
             const { userNameNeedTranslate } = this.user
             chartData.title = {
-                text: `工时成本总计:${countCost ? `成本 ${totalMoneyCost},` : ''} ${countHours ? `时长 ${totalHours} 小时` : ''}`,
+                text: `工时成本总计:${countCost ? `成本 ${totalMoneyCost},` : ''} ${countHours ? `时长 ${totalHours} 小时/${(totalHours/_this.user.timeType.allday).toFixed(1)}人天` : ''}`,
                 left: 'left',
             }
 
@@ -781,7 +782,7 @@ export default {
             chartData.yAxis = {
                 type: 'value',
                 axisLabel: {
-                    formatter: yAxisValue == 0 ? '{value} (' + '元' + ')' : '{value}' + '小时'
+                    formatter: yAxisValue == 0 ? '{value} (' + '元' + ')' : ('{value}' + '小时')
                 }
             }
 
@@ -794,7 +795,12 @@ export default {
                     normal: {
                         show: true,
                         position: 'top',
-                        formatter: `{c} ${yAxisValue == 0 ? '元' : '小时'}`,
+                        // formatter: ` ${yAxisValue == 0 ? '{c}元' : '{c}小时/{{c}/8}人天'}`,
+
+                        formatter: function(params) {
+                            var dayValue = yAxisValue == 0?0:(params.value/_this.user.timeType.allday).toFixed(1);
+                            return ` ${yAxisValue == 0 ? (params.value + '元') : (params.value + 'h/'+dayValue+'人天')}`; // params.value 等价于 {c}
+                        }
                     }
                 }
             }]

+ 8 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue

@@ -60,6 +60,14 @@ export default {
   },
 
   methods: {
+    detaliTaskExposure(row) {
+      const { taskId, ganttData } = row
+      this.title = '编辑计划'
+      this.showMmeiLaiDeData = JSON.parse(ganttData || '{}')
+      setTimeout(() => {
+        this.editTask({ taskId })
+      }, 1000)
+    },
     getDistanceToParent(element, parent) {
       let distance = 0;
       while (element && element !== parent) {
@@ -141,7 +149,6 @@ export default {
               taskVue: data.projectId ? false : true,
               meetingId: this.addForm.meetingId
             }
-
             this.addFormVisible = true
           } else {
             this.$message({ message: res.msg, type: "error" });

+ 46 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -76,6 +76,11 @@
                             <el-dropdown-item v-if="permissions.projectClassification">
                                 <el-link type="primary" :underline="false" @click="showClfDialog = true">{{ $t('classificationmanagement') }}</el-link>
                             </el-dropdown-item>
+                            <el-dropdown-item v-if="user.companyId == '7536'">
+                                <el-link type="primary" :underline="false" @click="qrCodeClickEvent()">
+                                    二维码管理
+                                </el-link>
+                            </el-dropdown-item>
                             <el-dropdown-item v-if="user.timeType.mainProjectState == 1">
                                 <el-link type="primary" :underline="false" @click="mainProjectDialog = true">{{ $t('masterprojectmanagement') }}</el-link>
                             </el-dropdown-item>
@@ -109,7 +114,7 @@
                         <el-link type="primary" :underline="false" @click="isganttshow = true">{{ $t('resourceallocation') }}</el-link>
                     <!-- </router-link> -->
                     <el-dialog v-if="isganttshow" :visible.sync="isganttshow" width="90vw" top="3vh" style="height:96%" class="ganttdialog">
-                        <projectgantt></projectgantt>
+                        <projectgantt ref="projectganttRef"></projectgantt>
                     </el-dialog>
                 </el-form-item>
 
@@ -1754,6 +1759,13 @@
                 </el-link>
             </div>
         </el-dialog>
+
+        <!-- 二维码管理 -->
+        <el-dialog title="二维码管理" show-header="false" :visible.sync="qrCodeManagementVisable" top="60px" :close-on-click-modal="false" width="1200px">
+            <div>
+                <QrCodeManagement ref="qrCodeManagementRef"></QrCodeManagement>
+            </div>
+        </el-dialog>
         <!-- 选择人 -->
         <DepartmentSelectionPersonnel :visible="batchProjectTaskParticipantVisible" @changeParticipant="changeTaskParticipantVisible" @submitParticipant="addProjectTaskParticipant"></DepartmentSelectionPersonnel>
     </section>
@@ -1793,6 +1805,7 @@ a {
     import vueCascader from "@/components/cascader.vue"
     import vueCascadeSelection from "@/components/cascadeSelection.vue"
     import DepartmentSelectionPersonnel from "@/components/departmentSelectionPersonnel.vue"
+    import QrCodeManagement from './qrCodeManagement.vue'
 
     // 尝试字段
     import selectPersonnel from "@/components/selectPersonnel.vue"
@@ -1803,7 +1816,8 @@ a {
             vueCascader,
             vueCascadeSelection,
             DepartmentSelectionPersonnel,
-            selectPersonnel
+            selectPersonnel,
+            QrCodeManagement
         },
         data() {
             return {
@@ -2078,7 +2092,8 @@ a {
                 batchChangeStageDialogVisible: false,
                 batchChangeStageLoading: false,
                 batchProjectTaskParticipantVisible: false,
-                batchDepartment: []
+                batchDepartment: [],
+                qrCodeManagementVisable: false
             };
         },
         // 过滤器
@@ -2121,6 +2136,15 @@ a {
             },
             filterText2(val) {
                 this.$refs.chooseMembTree2.filter(val);
+            },
+            '$route'(to, from) {
+                if (to.path === '/list') {
+                    const { messageTaskId, ganttData } = to.query
+                    console.log(messageTaskId, ganttData, '<======== messageTaskId')
+                    if(messageTaskId && this.user.companyId == 876) {
+                        this.openTheReviewPopUpWindowSeparately(messageTaskId, ganttData)
+                    }
+                }
             }
         },
         updated () {
@@ -2130,6 +2154,19 @@ a {
             })
         },
         methods: {
+            openTheReviewPopUpWindowSeparately(taskId, ganttData) {
+                this.isganttshow = true
+                setTimeout(() => {
+                    console.log(this.$refs.projectganttRef, ',=========== this.$refs.projectganttRef')
+                    this.$refs.projectganttRef.parentLevelOpensPopUpWindowGantt({ taskId, ganttData })
+                }, 300)
+            },
+            qrCodeClickEvent() {
+                this.qrCodeManagementVisable = true
+                this.$nextTick(()=>{
+                    this.$refs.qrCodeManagementRef.resetData()
+                })
+            },
             addProjectTaskParticipant(userList) {
                 const userIds = userList.map(item => item.id).join(',')
                 const projectIds = this.checkedProjectArr.map(a => a.id).join(',')
@@ -6277,6 +6314,12 @@ a {
             if (this.user.timeType.projectManDay == 1) {
                 this.getManDaySetting();
             }
+
+            const { messageTaskId, ganttData } = this.$route.query
+            if(this.user.companyId == 876 && messageTaskId) {
+                console.log(ganttData)
+                this.openTheReviewPopUpWindowSeparately(messageTaskId, ganttData)
+            }
         },
     };
 </script>

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -242,6 +242,11 @@ export default {
     this.isDataLoaded = true
   },
   methods: {
+    parentLevelOpensPopUpWindowGantt(row) {
+      setTimeout(() => {
+        this.$refs.ganttTable1.detaliTaskExposure(row);
+      }, 1000)
+    },
     closeBounced(obj) {
       if(obj.submitInsert) {
         this.dateupdata()

+ 214 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/qrCodeManagement.vue

@@ -0,0 +1,214 @@
+<template>
+  <div class="qrCodeManagement">
+    <di class="qrCodeManagement-header">
+      <div class="header-filter">
+        <div>项目号:</div>
+        <el-input v-model="filterValForm.orderId" placeholder="请输入" size="small" style="width: 150px;"></el-input>
+      </div>
+      <div class="header-filter">
+        <div>项目名:</div>
+        <el-input v-model="filterValForm.projectId" placeholder="请输入" size="small" style="width: 150px;"></el-input>
+      </div>
+      <div class="header-filter">
+        <div>生产工单号:</div>
+        <el-input v-model="filterValForm.projectName" placeholder="请输入" size="small" style="width: 150px;"></el-input>
+      </div>
+      <div class="header-filter">
+        <div>行号:</div>
+        <el-input v-model="filterValForm.line" placeholder="请输入" size="small" style="width: 150px;"></el-input>
+      </div>
+      <div class="header-filter">
+        <div>生产工单日期:</div>
+        <el-date-picker v-model="filterValForm.relsDate" type="date" placeholder="选择日期" size="small"
+          style="width: 150px;" value-format="YYYY-MM-dd">
+        </el-date-picker>
+      </div>
+    </di>
+    <div class="qrCodeManagement-con">
+      <el-table :data="tableData" style="width: 100%;height: 100%" border @selection-change="handleSelectionChange" :loading="tableLoading">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="orderId" label="项目号" />
+        <el-table-column prop="projectId" label="项目名" />
+        <el-table-column prop="projectName" label="生产工单号" />
+        <el-table-column prop="line" label="行号" />
+      </el-table>
+    </div>
+    <div class="qrCodeManagement-bon">
+      <el-button type="primary" size="small" :disabled="!multipleSelection.length" @click="exportQrCode()"
+        :loading="exportQrCodeLoading">导出二维码</el-button>
+      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageIndex"
+        :page-sizes="[100, 200, 300, 400, 500]" :page-size="pageSize" layout="total, prev, pager, next, sizes, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+
+export default {
+  components: {},
+  data() {
+    return {
+      user: JSON.parse(sessionStorage.getItem("user")),
+      permissions: JSON.parse(sessionStorage.getItem("permissions")),
+      tableData: [],
+      multipleSelection: [],
+      filterValForm: {
+        orderId: '',
+        projectId: '',
+        projectName: '',
+        line: '',
+        relsDate: ''
+      },
+      pageIndex: 1,
+      pageSize: 100,
+      total: 0,
+      exportQrCodeLoading: false,
+      tableLoading: false,
+      debounceTimer: null,
+    };
+  },
+  watch: {
+    filterValForm: {
+      handler() {
+        this.debounceGeTableData();
+      },
+      deep: true
+    }
+  },
+  mounted() { },
+  methods: {
+    // 重置数据并加载
+    resetData() {
+      this.filterValForm = {
+        orderId: '',
+        projectId: '',
+        projectName: '',
+        line: '',
+        relsDate: ''
+      }
+      this.pageIndex = 1
+      this.pageSize = 100
+      this.debounceGeTableData()
+    },
+    exportQrCode() {
+      this.exportQrCodeLoading = true
+      this.postData('/qrCode/generateQRCodeByErpIds', {
+        erpIds: this.multipleSelection.map(item => item.id).join(',')
+      }).then(res => {
+        console.log('res', res)
+        this.$message({
+          message: '导出成功,下载中...',
+          type: 'success'
+        });
+        var filePath = res.data;
+        const a = document.createElement('a'); // 创建a标签
+        a.setAttribute('download', this.$t('projectexport') + '.xlsx');// download属性
+        a.setAttribute('href', filePath);// href链接
+        a.click(); //自执行点击事件
+        a.remove();
+      }).finally(() => {
+        this.exportQrCodeLoading = false
+      })
+    },
+    // 赛选条件改动执行
+    debounceGeTableData() {
+      clearTimeout(this.debounceTimer);
+      this.debounceTimer = setTimeout(() => {
+        this.geTableData();
+      }, 500);
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val
+    },
+    handleSizeChange(val) {
+      this.pageIndex = 1
+      this.pageSize = val
+      this.geTableData()
+    },
+    handleCurrentChange(val) {
+      this.pageIndex = val
+      this.geTableData()
+    },
+    geTableData() {
+      const filteredParams = {};
+      for (const key in this.filterValForm) {
+        const val = this.filterValForm[key];
+        if (val !== '' && val !== null && val !== undefined) {
+          filteredParams[key] = val;
+        }
+      }
+
+      this.tableLoading = true
+      this.postData('/erpOrderInfo/getInfoPage', {
+        pageIndex: this.pageIndex,
+        pageSize: this.pageSize,
+        ...this.filteredParams
+      }).then(res => {
+        console.log('res', res)
+        console.log(res.data.data, '<======= 数据')
+        this.tableData = res.data.data || []
+        this.total = res.data.total || 0
+      }).finally(() => {
+        this.tableLoading = false
+      })
+    },
+    async postData(urls, param) {
+      return new Promise((resolve, reject) => {
+        this.http.post(urls, { ...param },
+          res => {
+            if (res.code == 'ok') {
+              resolve(res)
+            } else {
+              this.$message({
+                message: res.msg,
+                type: 'error'
+              })
+              reject(res)
+            }
+            resolve(res)
+          },
+          error => {
+            this.$message({
+              message: error,
+              type: "error"
+            });
+            reject(error)
+          }
+        )
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.qrCodeManagement {
+  width: 100%;
+  height: 70vh;
+
+  .qrCodeManagement-header {
+    display: flex;
+    align-items: center;
+    height: 8%;
+
+    .header-filter {
+      display: flex;
+      align-items: center;
+      margin-left: 14px;
+    }
+  }
+
+  .qrCodeManagement-con {
+    height: 84%;
+  }
+
+  .qrCodeManagement-bon {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    height: 8%;
+  }
+}
+</style>

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -258,7 +258,11 @@
 
                         <div style="width:100%;margin-top: 10px;">
                             <span style="color: #606266;margin-right: 5px">{{ $t('checkRemindertime') }}</span>
-                            <el-time-picker 
+                            <el-radio-group v-model="timeType.alertAuditMode">
+                                <el-radio :label="1" class="rala2">实时提醒</el-radio>
+                                <el-radio :label="0" class="rala1">定时提醒</el-radio>
+                            </el-radio-group>
+                            <el-time-picker v-if="timeType.alertAuditMode == 0"
                                     v-model="timeType.waitCheckAlertTime"
                                     :placeholder="$t('checkRemindertime')"
                                     style="width:150px;"